PHP mysqli vorbereitete statement LIKE

Wie kann ich mit mysqli eine Abfrage mit LIKE machen und alle Ergebnisse bekommen?

Das ist mein Code, aber es funktioniert nicht:

$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(); 

Dieser Code scheint nicht zu funktionieren. Ich habe es viel gesucht. Es kann auch mehr als 1 Zeile zurückgeben. Wie kann ich also alle Ergebnisse erhalten, auch wenn es mehr als 1 Reihe zurückgibt?

   

Hier ist, wie Sie das Ergebnis richtig abrufen

 $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}"; } 

oder Sie können auch tun:

 $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"; } 

Ich hoffe, dir ist klar, dass ich die Antwort direkt aus dem Handbuch hier und hier bekommen habe , wo du als erster hätte gehen sollen.


Aktualisiert

In Kommentaren wird festgestellt, dass LIKE-Platzhalterzeichen ( _ und % ) standardmäßig bei Paramaterized-Abfragen nicht maskiert sind und daher zu unerwarteten Ergebnissen führen können.

Verwenden Sie daher bei der Verwendung von “LIKE” -statementen diesen “negativen Lookahead” Regex, um sicherzustellen, dass diese Zeichen maskiert sind:

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

Alternativ zu der obigen Antwort können Sie auch die MySQL CONCAT- function verwenden:

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

Das bedeutet, dass Sie Ihren $param Wert nicht bearbeiten $param , aber für etwas längere Abfragen sorgen.