查询不能按预期使用 bindParam 但它可以使用原始输入?

Query does not work as expected with bindParam but it does with raw input?

我有一个查询应该显示特定日期的所有内容,例如 "show me all articles from 01-01-2020 to now"。

日期在 unix 中。我正在使用 PHP 7.2.

如果我使用 bindParam 而不是实际数字,它也会显示该日期及更早的内容。

如果我只输入数字(unix日期),它显示内容ok,意味着内容都在日期范围内。

这是我的问题:

  $y = $conectarDB->prepare("
      SELECT DISTINCT SQL_CACHE
      contenidos.contenidoID AS contID, 
      titulo, 
      fecha, 
      tipoContenidoID
      WHERE fecha > ?
      ORDER BY contenidoID DESC
  ");
  $y->bindParam(1, $fecha);
  $y->execute();
  $resultado = $y->fetchAll(PDO::FETCH_ASSOC);

为了对它进行排序,我将日期($fecha 变量)强制为整数,以防万一问题是它被解释为字符串:

$fecha = (int)$fecha;

MySQL 和 PHP 均未显示任何错误,查询已执行,但也显示较旧的结果,不符合范围。

以防万一以后对某人有帮助...

问题是数据库字段是字符类型,而不是整数。

因此,即使在 PHP 中进行了显式声明,MySQL 仍将其内容视为字符串。

它被解读为:

  $y = $conectarDB->prepare("
      SELECT DISTINCT SQL_CACHE
      contenidos.contenidoID AS contID, 
      titulo, 
      fecha, 
      tipoContenidoID
      WHERE fecha > '1577847600'
      ORDER BY contenidoID DESC
  ");

而不是:

  $y = $conectarDB->prepare("
      SELECT DISTINCT SQL_CACHE
      contenidos.contenidoID AS contID, 
      titulo, 
      fecha, 
      tipoContenidoID
      WHERE fecha > 1577847600
      ORDER BY contenidoID DESC
  ");

所以,不只是使用:

  $y->bindParam(1, $fecha);

我已将其更改为:

  $y->bindParam(1, $fecha, PDO::PARAM_INT);

为了让MySQL明白它确实是一个整数