sql >> Base de Datos >  >> RDS >> Mysql

PDO bindParam para la fecha no funciona

Este es su principal problema:

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

La llamada a fetchColumn() avanza el conjunto de resultados más allá de su primera fila. Luego, cuando llamas a fetchAll(), solo obtiene el restante filas No puede regresar y buscar la primera fila, eso está perdido. Entonces, si el resultado de su consulta solo tiene una fila, nunca la verá.

En su lugar, sugeriría este código:

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

Otros consejos:

Nunca coloque marcadores de posición de parámetros entre comillas. Si lo hace, ya no son marcadores de posición de parámetros, son solo cadenas literales como ":befDate". Estos no son literales de fecha válidos.

Los parámetros en una expresión como BETWEEN :befDate AND :aftDate no producir BETWEEN 2016-07-17 AND 2016-07-25 como consulta. Los parámetros nunca se convierten en expresiones como esa, siempre se convierten en un valor escalar (por ejemplo, un literal de fecha citado) por parámetro.

Probé tu código. Primero habilité el registro de consultas generales de MySQL:

mysql> SET GLOBAL general_log = ON;

Ahora puedo ver exactamente lo que MySQL cree que es la consulta enviada por PDO. Ejecuté el script PHP y leí mi registro de consultas general (/var/lib/mysql/localhost.log en mi 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, olvidé establecer valores para las variables vinculadas a los parámetros. Si no tuviera ningún valor en ninguna de estas variables, explicaría por qué su resultado está vacío, porque cualquier comparación con NULL no es cierta. Así que edité PHP para establecer valores de muestra en las variables primero.

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

Volví a ejecutar la consulta y en el registro veo lo siguiente:

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

Esto prueba que PDO pone comillas alrededor de un valor parametrizado (si es una cadena o una fecha).