Mysql
 sql >> база данни >  >> RDS >> Mysql

PDO bindParam за дата не работи

Това е основният ви проблем:

if ($stmt->fetchColumn()>=1) {
    $result = $stmt->fetchAll();
}
else{
    $result = 'nope';
}

Извикването на fetchColumn() придвижва набора от резултати след първия му ред. След това, когато извикате fetchAll(), той извлича само останалото редове. Не може да се върне и да извлече първия ред, това е загубено. Така че, ако резултатът от вашата заявка има само един ред, никога няма да го видите.

Вместо това бих предложил този код:

$result = $stmt->fetchAll();
if (empty($result)) {
  $result = "nope";
}

Други съвети:

Никога не поставяйте контейнери за параметри в кавички. Ако го направите, те вече не са заместители на параметри, те са просто буквални низове като ":befDate". Това не са валидни литерали за дата.

Параметрите в израз като BETWEEN :befDate AND :aftDate не произвеждайте BETWEEN 2016-07-17 AND 2016-07-25 като запитване. Параметрите никога не се превръщат в такива изрази, те винаги се превръщат в скаларна стойност (напр. цитиран литерал на дата) за параметър.

Опитах вашия код. Първо активирах общия регистър на заявките на MySQL:

mysql> SET GLOBAL general_log = ON;

Сега мога да видя точно какво според MySQL е заявката, изпратена от PDO. Изпълних PHP скрипта и прочетох общия си регистър на заявките (/var/lib/mysql/localhost.log на моята виртуална машина):

160716 19:26:16     8 Connect   [email protected] on test
            8 Query SELECT * FROM `flights` WHERE `date` BETWEEN NULL AND NULL 
                     AND `from` = NULL 
                     AND `to` = NULL 
                     AND `weight` >= NULL
            8 Quit  

А, забравих да задам стойности за променливите, свързани с параметрите. Ако нямате стойност в нито една от тези променливи, това би обяснило защо вашият резултат е празен, защото всяко сравнение с NULL не е вярно. Затова редактирах PHP, за да задам първо примерни стойности на променливите.

$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;

Пуснах заявката отново и в регистрационния файл виждам следното:

160716 19:33:17    13 Query SELECT * FROM `flights` WHERE `date` BETWEEN '2016-07-21' AND '2016-07-28' 
                     AND `from` = 1 
                     AND `to` = 2 
                     AND `weight` >= 10

Това доказва, че PDO поставя кавички около параметризирана стойност (ако е низ или дата).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обърнете естествения ред на MySQL таблица без ORDER BY?

  2. Как да се свържете с IPv6 адреси в Kubernetes, работещ на Google Container Engine?

  3. Изглежда, че не мога да предотвратя въвеждането на дублирани имена

  4. Защо отварянето на връзка хвърля грешка при разпределени транзакции в MySQL? (.NET конектор)

  5. Как мога да задам сесия в базата данни codeigniter 3?