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

Lesezeit: 3 Minuten

Wie kann ich mit mysqli eine Abfrage mit LIKE machen
Benutzer2493164

Dies 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 viel gesucht. Es kann auch mehr als 1 Zeile zurückgeben. Wie kann ich also alle Ergebnisse erhalten, auch wenn mehr als 1 Zeile zurückgegeben wird?

  • Bitte “funktioniert nicht” definieren – PHP-Fehler? MySQL-Fehler? Kein Fehler, aber 0 Ergebnisse?

    – Molot

    30. August 2013 um 7:50 Uhr

  • Ich möchte alle Ergebnisse durchlaufen. Wie kann ich das machen? Wenn ich sage, funktioniert nicht. Es gibt nichts zurück…

    – Benutzer2493164

    30. August 2013 um 7:56 Uhr

  • In diesem Code gibt es keinen Rückgabeoperator. Wie soll es etwas zurückgeben?

    – Ihr gesunder Menschenverstand

    30. August 2013 um 8:00 Uhr

Wie kann ich mit mysqli eine Abfrage mit LIKE machen
Roninklinge

So rufen Sie das Ergebnis richtig ab

$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_assoc()) {
    echo "Id: {$row['id']}, Username: {$row['username']}";
}

Ich hoffe, Sie wissen, dass ich die Antwort direkt aus dem Handbuch erhalten habe Hier und Hierwo du zuerst hättest hingehen sollen.

  • Zur Verteidigung des OP erwähnt keine Handbuchseite die LIKE-Vergleichs-“Funktion”.

    – Brad Kent

    22. August 2017 um 0:12 Uhr

Wie kann ich mit mysqli eine Abfrage mit LIKE machen
Martin


Aktualisiert

Aus Kommentaren geht hervor, dass LIKE Platzhalterzeichen (_und %) werden bei parametrisierten Abfragen standardmäßig nicht maskiert und können daher zu unerwarteten Ergebnissen führen.

Verwenden Sie daher bei der Verwendung von „LIKE“-Anweisungen diesen „negativen Lookahead“-Regex, um sicherzustellen, dass diese Zeichen maskiert werden:

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

Alternativ zu der oben gegebenen Antwort können Sie auch MySQL verwenden KONKAT funktionieren so:

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

Das bedeutet, dass Sie Ihre nicht bearbeiten müssen $param Wert, sorgt aber für etwas längere Abfragen.

  • Hallo, ist concat sicher vor SQL-Injection? Ich frage, weil es Anführungszeichen hat. Danke

    – Mike Vorisis

    15. Februar 2017 um 23:29 Uhr

  • @mikevorisis Ja, es ist sicher, weil die Abfrage immer noch parametrisiert ist (verwenden ?) . die Anführungszeichen sind darauf zurückzuführen, dass MySQL drei Strings verkettet.

    – Martin

    16. Februar 2017 um 9:52 Uhr


  • Ich habe dies positiv bewertet, weil ich mir ziemlich sicher bin, dass Sie mit der akzeptierten Antwort nicht ‘beginnt mit’ oder ‘endet mit’ machen können (wie in, Sie müssen verwenden CONCAT).

    – Adam Rowe

    15. Juni 2018 um 13:01 Uhr

  • @MikeVorisis, CONCAT in vorbereiteten Erklärungen sind sicher von der Injektion, aber Sie sollten bei der Anwendung vorsichtig sein LIKE Klausel in vorbereiteten Anweisungen. Bedenken Sie: $stmt=$db->prepare("SELECT Kunde als suggestion WO customername LIKE CONCAT(‘cust_’, ?, ‘%’);”);` und dann $key='J%'; (Oder auch $key='';), $stmt->bind_param('s', $key);. Jetzt $stmt->execute(); wird zurückkehren ALLE Aufzeichnungen. Wenn Sie sich also mit vorbereiteten Anweisungen mit der ‘LIKE’-Klausel befassen, müssen Sie immer noch damit umgehen _ und % in richtiger Weise. Auch wenn Sie vorbereitete Anweisungen verwenden, entkommen Sie wie $key='J\%'; wird gebraucht.

    – Jay Dadhania

    13. Juli 2018 um 14:28 Uhr

  • @mikevorisis Obwohl ich denke, dass Sie sich dessen wahrscheinlich bewusst sind und bereits Schritte unternommen haben, um solche Anfragen richtig zu handhaben, dachte ich, dass es wichtig wäre, es zu teilen, da es anderen helfen kann, dies auch zu lesen.

    – Jay Dadhania

    13. Juli 2018 um 14:30 Uhr

Die Antwort ist offensichtlich veraltet, Sie müssen bind_param nicht einmal verwenden.

$querySql    = "SELECT * FROM table WHERE columnName LIKE :likeKeyWord";
$likeKeyWord = "%". $keyWord ."%";
$pdoStm      = $this -> db -> prepare($querySql);
$pdoStm -> execute([':likeKeyWord' => $likeKeyWord]);
return $pdoStm -> fetchAll();

  • Du hast die Frage falsch gelesen. Es fragt, wie man es mit MySQLi macht, nicht mit PDO.

    – Dharman

    16. März 2021 um 10:03 Uhr

987160cookie-checkWie kann ich mit mysqli eine Abfrage mit LIKE machen und alle Ergebnisse erhalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy