web-dev-qa-db-fra.com

php mysqli a préparé une déclaration COMME

Comment puis-je avec mysqli faire une requête avec LIKE et obtenir tous les résultats?

C'est mon code mais ça ne marche pas:

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);
$stmt->fetch();

Ce code ne semble pas fonctionner. Je l'ai beaucoup cherché. Il peut également renvoyer plus d'une ligne. Alors, comment puis-je obtenir tous les résultats même s'il renvoie plus d'une ligne?

38
user2493164

Voici comment récupérer correctement le résultat

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);

while ($stmt->fetch()) {
  echo "Id: {$id}, Username: {$username}";
}

ou vous pouvez également faire:

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM)) {
  foreach ($row as $r) {
    print "$r ";
  }
  print "\n";
}

J'espère que vous vous rendez compte que j'ai obtenu la réponse directement du manuel ici et ici , qui est l'endroit où vous auriez dû aller en premier.

60
roninblade

Mis à jour

D'après les commentaires, on constate que COMME les caractères génériques (_et %) ne sont pas échappés par défaut sur les requêtes paramétrées et peuvent donc entraîner des résultats inattendus.

Par conséquent, lorsque vous utilisez des instructions "LIKE", utilisez ceci 'lookahead négatif' Regex pour vous assurer que ces caractères sont échappés:

$param = preg_replace('/(?<!\\\)([%_])/', '\\\$1',$param);

Comme alternative à la réponse donnée ci-dessus, vous pouvez également utiliser la fonction MySQL CONCAT ainsi:

$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();

Vous n'avez donc pas besoin de modifier votre $param valeur mais rend les requêtes légèrement plus longues.

30
Martin