Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PDO bindParam para data não está funcionando


Este é o seu principal problema:
if ($stmt->fetchColumn()>=1) {
    $result = $stmt->fetchAll();
}
else{
    $result = 'nope';
}

A chamada para fetchColumn() avança o conjunto de resultados além de sua primeira linha. Então, quando você chama fetchAll(), ele busca apenas o restante linhas. Ele não pode voltar e buscar a primeira linha, isso está perdido. Portanto, se o resultado da sua consulta tiver apenas uma linha, você nunca a verá.

Em vez disso, sugiro este código:
$result = $stmt->fetchAll();
if (empty($result)) {
  $result = "nope";
}

Outras dicas:

Nunca coloque marcadores de parâmetro entre aspas. Se você fizer isso, eles não são mais marcadores de posição de parâmetro, são apenas strings literais como ":befDate". Estes não são literais de data válidos.

Os parâmetros em uma expressão como BETWEEN :befDate AND :aftDate não produza BETWEEN 2016-07-17 AND 2016-07-25 como uma consulta. Parâmetros nunca se tornam expressões assim, eles sempre se tornam um valor escalar (por exemplo, um literal de data entre aspas) por parâmetro.

Eu tentei seu código. Primeiro eu habilitei o log de consulta geral do MySQL:
mysql> SET GLOBAL general_log = ON;

Agora posso ver exatamente o que o MySQL acha que é a consulta enviada pelo PDO. Executei o script PHP e li meu log de consulta geral (/var/lib/mysql/localhost.log na minha máquina virtual):
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  

Ah, esqueci de definir valores para as variáveis ​​vinculadas aos parâmetros. Se você não tivesse valor em nenhuma dessas variáveis, isso explicaria porque seu resultado está vazio, pois qualquer comparação com NULL não é verdadeira. Então eu editei o PHP para definir valores de amostra para as variáveis ​​primeiro.
$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;

Executei a consulta novamente e no log vejo o seguinte:
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

Isso prova que o PDO coloca aspas em torno de um valor parametrizado (se for uma string ou uma data).