2017-09-17 9 views
1

J'utilise beaucoup d'instructions sql avec PostgreSQL et PHP et beaucoup d'entre elles contiennent des variables dans la clause 'WHERE'. Je peux obtenir des instructions préparées à exécuter juste bien pour INSERT et UPDATE mais je ne peux pas le faire fonctionner pour les instructions SELECT avec des variables dans la clause WHERE. J'ai parcouru google pour une réponse sans succès. S'il vous plaît jeter un oeil à l'exemple ci-dessous. Ceci permet de sélectionner un solde bancaire réconcilié récent à partir d'une table appelée bankrec. Qu'est-ce que je rate?Impossible de lier les paramètres à la clause WHERE PDO

$rec = $dbh->prepare('SELECT clearedbal FROM bankrec WHERE bankno = :bankno '); 
$result = $rec->execute(['bankno'=>$bankno])->fetch(PDO::FETCH_ASSOC); 

Quand je lance ce que je reçois:

"Fatal error: Call to a member function fetch() on boolean" 

Cependant, je sais que la requête est correcte, car tout simplement l'exécution d'une requête sans une déclaration préparée moi obtient le résultat que je veux, mais il est vulnérable aux injection sql:

$rec = $dbh->query("SELECT clearedbal FROM bankrec WHERE bankno = '$bankno' ")->fetch(PDO::FETCH_ASSOC); 
+1

Ne pas le chaîner, il devrait être '$ rec-> récupérer (PDO :: FETCH_ASSOC);' mais l'exécution retourne 'bool' –

+0

@LawrenceCherone Eh bien, c'était une solution simple! Ça marche! Pourquoi puis-je l'enchaîner comme ça pour INSERT et UPDATE mais pas SELECT? Merci beaucoup! – AppreciateCo

+0

@AppreciateCo 'execute()' renvoie une valeur booléenne, tandis que 'query()' renvoie une valeur 'PDOStatement', ce qui permet de chaîner la méthode. – ishegg

Répondre

3

Comme vous pouvez le voir sur this lien que vous la méthode de PDO execute retourne booléenne par définition.

je recommande cette approche:

$rec = $dbh->prepare('SELECT clearedbal FROM bankrec WHERE bankno = :bankno '); 
if($rec->execute(['bankno'=>$bankno])){ 
    $result=$rec->fetch(PDO::FETCH_ASSOC); 
    //do another stuff there 
} else { 
    //Query failed handle error 
} 

Comme vous pouvez le voir, vous pouvez utiliser le execute afin de déterminer si la requête exécutée ou non sucessfully. Aussi, si vous devez chercher plus d'une ligne de résultat, vous devez utiliser la méthode fetchAll: http://php.net/manual/en/pdostatement.fetchall.php

+1

Merci Dimitrios. Vous avez dit essentiellement la même chose que Lawrence. Je ne peux pas marquer un commentaire comme une réponse, alors j'ai marqué le vôtre. Merci à vous deux. – AppreciateCo