web-dev-qa-db-fra.com

implémenter la requête LIKE dans PDO

Je rencontre des problèmes lors de l'implémentation de LIKE dans PDO

J'ai cette requête:

$query = "SELECT * FROM tbl WHERE address LIKE '%?%' OR address LIKE '%?%'";
$params = array($var1, $var2);
$stmt = $handle->prepare($query);
$stmt->execute($params);

J'ai vérifié le $var1 et $var2 ils contiennent à la fois les mots que je veux rechercher, mon AOP fonctionne bien puisque certaines de mes requêtes SELECTINSERT elles fonctionnent, c'est juste que je ne connais pas LIKE ici en AOP.

Le résultat n'est pas retourné. Faire mon $query est syntaxiquement correct?

35
Leandro Garcia

Vous devez inclure le % signe dans le $params, pas dans la requête:

$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);

Si vous regardiez la requête générée dans votre code précédent, vous verriez quelque chose comme SELECT * FROM tbl WHERE address LIKE '%"foo"%' OR address LIKE '%"bar"%', car l'instruction préparée cite vos valeurs à l'intérieur d'une chaîne déjà citée.

73
Carlos Campderrós

Non, vous n'avez pas besoin de citer des espaces réservés pour préparer. Incluez également les marques% à l'intérieur de vos variables.

LIKE ?

Et dans la variable: %string%

5
Madara Uchiha
$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);
4
Miqdad Ali

Vous pouvez voir l'exemple ci-dessous

$title = 'PHP%';
$author = 'Bobi%';
// query
$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";
$q = $conn->prepare($sql);
$q->execute(array($title,$author));

J'espère que cela fonctionnera.

2
Dinesh Goyal

Utilisez simplement ce qui suit:

$query = "SELECT * FROM tbl WHERE address LIKE CONCAT('%', :var1, '%')
            OR address LIKE CONCAT('%', :var2, '%')";

$ar_val = array(':var1'=>$var1, ':var2'=>$var2);
if($sqlprep->execute($ar_val)) { ... }
2
Grant