sql >> Database teknologi >  >> RDS >> Mysql

PDO bindParam for dato virker ikke

Dette er dit primære problem:

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

Kaldet til fetchColumn() fører resultatsættet forbi dets første række. Så når du kalder fetchAll(), henter den kun de resterende rækker. Den kan ikke gå tilbage og hente den første række, det er tabt. Så hvis dit forespørgselsresultat kun havde én række, vil du aldrig se det.

I stedet vil jeg foreslå denne kode:

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

Andre tips:

Sæt aldrig parameterpladsholdere inden for anførselstegn. Hvis du gør det, er de ikke længere parameterpladsholdere, de er blot bogstavelige strenge som ":befDate". Disse er ikke gyldige bogstaver for dato.

Parametrene i et udtryk som BETWEEN :befDate AND :aftDate producere ikke BETWEEN 2016-07-17 AND 2016-07-25 som en forespørgsel. Parametre bliver aldrig sådanne udtryk, de bliver altid en skalær værdi (f.eks. en citeret dato i bogstavelig forstand) pr. parameter.

Jeg prøvede din kode. Først aktiverede jeg MySQL's generelle forespørgselslog:

mysql> SET GLOBAL general_log = ON;

Nu kan jeg se præcis, hvad MySQL mener er forespørgslen indsendt af PDO. Jeg kørte PHP-scriptet og læste min generelle forespørgselslog (/var/lib/mysql/localhost.log på min virtuelle maskine):

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, jeg glemte at indstille værdier for variablerne bundet til parametrene. Hvis du ikke havde nogen værdi i nogen af ​​disse variable, ville det forklare, hvorfor dit resultat er tomt, fordi enhver sammenligning med NULL ikke er sand. Så jeg redigerede PHP for at indstille prøveværdier til variablerne først.

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

Jeg kørte forespørgslen igen, og i loggen ser jeg følgende:

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

Dette beviser, at PDO sætter anførselstegn omkring en parameteriseret værdi (hvis det er en streng eller en dato).




  1. vælg kun og kun specifik post i oracle

  2. Tips til lagring af PostgreSQL-sikkerhedskopier på Amazon AWS

  3. Betinget VED DUPLIKAT NØGLEOPDATERING (Opdater kun, hvis en bestemt betingelse er sand)

  4. MYSQL Bestil fra et andet bord