Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PDO bindParam dla daty nie działa

To jest twój główny problem:

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

Wywołanie fetchColumn() przesuwa zbiór wyników poza jego pierwszy wiersz. Następnie, gdy wywołujesz fetchAll(), pobiera tylko pozostałe wydziwianie. Nie może wrócić i pobrać pierwszego rzędu, to stracone. Więc jeśli wynik zapytania miał tylko jeden wiersz, nigdy go nie zobaczysz.

Zamiast tego proponowałbym ten kod:

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

Inne wskazówki:

Nigdy nie umieszczaj symboli zastępczych parametrów w cudzysłowie. Jeśli to zrobisz, nie są już symbolami zastępczymi parametrów, są tylko dosłownymi ciągami, takimi jak ":befDate". To nie są prawidłowe literały daty.

Parametry w wyrażeniu takim jak BETWEEN :befDate AND :aftDate nie produkuj BETWEEN 2016-07-17 AND 2016-07-25 jako zapytanie. Parametry nigdy nie stają się takimi wyrażeniami, zawsze stają się wartościami skalarnymi (np. literałem daty w cudzysłowie) na parametr.

Wypróbowałem twój kod. Najpierw włączyłem ogólny dziennik zapytań MySQL:

mysql> SET GLOBAL general_log = ON;

Teraz widzę dokładnie, co MySQL myśli o zapytaniu przesłanym przez PDO. Uruchomiłem skrypt PHP i przeczytałem mój ogólny dziennik zapytań (/var/lib/mysql/localhost.log na mojej maszynie wirtualnej):

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  

Ach, zapomniałem ustawić wartości dla zmiennych powiązanych z parametrami. Jeśli nie masz żadnej wartości w żadnej z tych zmiennych, wyjaśniałoby to, dlaczego Twój wynik jest pusty, ponieważ każde porównanie z NULL nie jest prawdziwe. Zmodyfikowałem więc PHP, aby najpierw ustawić przykładowe wartości na zmienne.

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

Uruchomiłem zapytanie ponownie i w dzienniku widzę:

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

To dowodzi, że PDO umieszcza cudzysłowy wokół sparametryzowanej wartości (jeśli jest to ciąg znaków lub data).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można dodać pola... rozmiar wiersza... większy niż maksymalny dozwolony rozmiar

  2. Jak wyczyścić ekran MySQL otwarty za pomocą klienta wiersza poleceń MySQL w systemie Windows XP?

  3. Jak dołączyć tabelę do tego kodu SQL?

  4. UNION 2 Select-zapytania z wyliczonymi kolumnami

  5. jak zoptymalizować zapytanie mysql, jeśli mam w zapytaniu zbyt wiele operatorów OR?