40 votes

Déclaration préparée par PHP PDO - Requête mysql LIKE

Ceci est mon premier post à Débordement de pile, mais je trouve l'ensemble actuel des connaissances très utiles. En tout cas, voici mon problème:

Je suis en train de faire une recherche par le biais de php est la classe PDO (pilote mysql). J'ai la requête suivante de travail avec le client mysql (tableau les noms ont été changés pour protéger les innocents):

SELECT    hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE "%searchTerm%"
LIMIT 25;

Cela fonctionne comme un charme quel que soit le terme de recherche que j'utilise. Cependant, quand je suis passer à php, je n'arrive pas à la retourner quoi que ce soit. J'ai essayé plusieurs syntaxes différentes qui semble logique de travailler, mais rien, j'ai essayé de travaux. voici mon code existant:

$handle = fopen('/foo/bar/test.log', 'w+');
fwrite($handle, "doSearch, with search term: $searchTerm\n");
$sql = 
'SELECT   hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE :searchTerm
LIMIT 25';

try {
 $dbh = new PDO('mysql:host=localhost;dbname=awdb', "user", "password");
 fwrite($handle, "connected to DB\n");
 $prep = $dbh->prepare($sql);
 $ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));

 while ($row = $prep->fetch(PDO::FETCH_ASSOC)) {
  $i++;
  $result[$i]['subText'] = $row['hs_pk'];
  $result[$i]['subText'] = $row['hs_text'];
  $result[$i]['subDid'] = $row['hs_did'];
  $result[$i]['devDid'] = $row['hd_did'];
  $result[$i]['devText'] = $row['hd_text'];
  $result[$i]['vendorText'] = $row['hv_text'];
  $result[$i]['classText'] = $row['hc_text'];
 }
    $dbh = null;
}   
catch (PDOException $e) {
  print "Error!: " . $e->getMessage() . "<br/>";
  die();
}

J'ai essayé le suivant ainsi (clause SQL where & prep->execute lignes sont tout ce qui change):

WHERE hs.hs_text LIKE CONCAT(\'%\', ?, \'%\') 
$ret = $prep->execute(array($searchTerm));

WHERE hs.hs_text LIKE "%:searchTerm%" 
$ret = $prep->execute(array(':searchTerm' => $searchTerm));

WHERE hs.hs_text LIKE ":searchTerm" 
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));

etc...

Merci d'avance, j'espère que le code n'est pas trop bâclée

-Tim

94voto

troelskn Points 51966
$ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));

Ce qui est faux. Vous n'avez pas besoin de guillemets doubles.

WHERE hs.hs_text LIKE ":searchTerm" 
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));

C'est également à tort. Essayez avec:

$prep = $dbh->prepare($sql);
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));

Explication: les requêtes Préparées ne pas simplement faire une chaîne à remplacer. Ils transportent les données totalement distincte de la requête. Les guillemets ne sont nécessaires que lors de l'incorporation de valeurs dans une requête.

-2voto

Micah Points 11
$prep = $dbh->prepare($sql);
$ret = $prep->execute(array('searchTerm' => $searchTerm));

-4voto

TIm Points 172

Eh bien, j'ai résolu ce un. Et franchement, je suis un idiot... Merci à vous tous pour avoir vu et donnant de bons commentaires. Le problème était une faute de frappe dans le nom d'une table (que j'ai changé, de sorte que personne, ici, ne serait en mesure de voir mon problème pour commencer...). Les suggestions ne me conduisent à trouver le problème, si, je vous remercie donc d'adam, jkndrkn et troelskn.

Pour l'enregistrement, la combinaison suivante qui fonctionne bien:

WHERE aw_hcl_subdevices.hs_text LIKE CONCAT(\'%\', ?, \'%\')
$ret = $prep->execute(array($searchTerm));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X