23 Stimmen

Verwendung benannter Parameter mit PDO für LIKE

Ich versuche, die name Feld in meiner Datenbank mit LIKE . Wenn ich das SQL "von Hand" wie folgt gestalte:

$query = "SELECT * \n"
        . "FROM `help_article` \n"
        . "WHERE `name` LIKE '%how%'\n"
        . "";
$sql = $db->prepare($query);
$sql->setFetchMode(PDO::FETCH_ASSOC);
$sql->execute();

Dann wird es relevante Ergebnisse für "wie" zurückgeben.
Wenn ich es jedoch in eine vorbereitete Erklärung verwandle:

$query = "SELECT * \n"
        . "FROM `help_article` \n"
        . "WHERE `name` LIKE '%:term%'\n"
        . "";
$sql->execute(array(":term" => $_GET["search"]));
$sql->setFetchMode(PDO::FETCH_ASSOC);
$sql->execute();

Ich erhalte immer null Ergebnisse.

Was mache ich falsch? Ich verwende vorbereitete Anweisungen an anderen Stellen in meinem Code und sie funktionieren gut.

40voto

mario Punkte 141130

Die Grenze :placeholders sind nicht in einfache Anführungszeichen zu setzen. Auf diese Weise werden sie nicht interpretiert, sondern als rohe Zeichenketten behandelt.

Wenn Sie eine als LIKE Muster, dann übergeben Sie die % zusammen mit dem Wert:

$query = "SELECT * 
          FROM `help_article` 
          WHERE `name` LIKE :term ";

$sql->execute(array(":term" => "%" . $_GET["search"] . "%"));

Oh, und eigentlich müssen Sie die Eingabezeichenfolge hier zuerst bereinigen (addcslashes). Wenn der Benutzer eine fremde % Zeichen innerhalb des Parameters, dann werden sie Teil des LIKE-Übereinstimmungsmusters. Denken Sie daran, dass die Gesamtheit der :term wird als String-Wert übergeben, und alle % s innerhalb dieser Zeichenkette werden zu Platzhaltern für die LIKE-Klausel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X