Запрос не работает должным образом с bindParam, но работает с необработанным вводом? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть запрос, который должен показывать все содержимое с указанной c даты, например «показать мне все статьи с 01-01-2020 по настоящее время».

Дата указана в unix. И я использую PHP 7.2.

Если я использую bindParam вместо действительного числа, оно показывает контент из этой даты и старше.

Если я просто наберу число (unix дата), оно покажет содержимое в порядке, что означает, что все содержимое находится в диапазоне дат.

ЗДЕСЬ МОЙ ЗАПРОС:

  $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 показать все ошибки, и запрос будет выполнен, но также показаны более старые результаты, не соответствующие диапазону.

1 Ответ

0 голосов
/ 12 февраля 2020

На всякий случай, если это кому-нибудь поможет в будущем ...

Проблема заключалась в том, что поле базы данных имело тип char, а не целое число.

Так что даже с явным объявлением в 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 понял, что это действительно целое число.

...