Wie erstelle ich eine parametrisierte PDO-Abfrage mit einer LIKE-Anweisung?

Lesezeit: 6 Minuten

Wie erstelle ich eine parametrisierte PDO Abfrage mit einer LIKE Anweisung
Andrew G. Johnson

Hier mein Versuch dazu:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

$query->execute(array('value'));

while ($results = $query->fetch()) 
{
    echo $results['column'];
}

Wie erstelle ich eine parametrisierte PDO Abfrage mit einer LIKE Anweisung
Andrew G. Johnson

Gleich nach dem Posten habe ich es herausgefunden:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}

  • @Andrew: Was wäre, wenn mehrere like wird genutzt ? Wie soll das Execute-Array der Reihe nach ausgeführt werden?

    – Logan

    3. April 2014 um 18:00 Uhr

  • Danke. hatte ein ähnliches Problem mit csharp + Mysql + ODBC, als ob es keine Zeilen zurückgeben würde, wenn “select * from table where column like ‘%?%’;” aber wenn ich es tue, wie du es getan hast, “wähle * aus der Tabelle, in der die Spalte wie ?;” und setze den Parameter string so: string frag = $”%{searchFragment}%”; Verwenden Sie dann frag für den Parameterwert. Seltsam

    – sdjuan

    8. November 2016 um 19:34 Uhr

  • PDO sollte dieses % im Ausführungsaufruf maskieren. Kaqais Antwort ist besser

    – Peter Bagall

    13. November 2016 um 14:52 Uhr

  • Es scheint erwähnenswert, dass die Spitze Benutzerbeitrag auf der PDOStatement::bindParam-Dokumentationsseite bietet einen anderen Ansatz: Fügen Sie der Variablen das/die Prozentzeichen hinzu, bevor Sie sie binden.

    – Dan Robinson

    7. März 2018 um 16:31 Uhr

  • Werfen Sie einen Blick auf Gavins Lösung, die Sie der Seite von Your Common Sense am Ende dieses Threads entnommen haben. Einfach. Logisch.

    – RationalRabbit

    14. Dezember 2019 um 15:40 Uhr

Wie erstelle ich eine parametrisierte PDO Abfrage mit einer LIKE Anweisung
Kzqai

Für diejenigen, die benannte Parameter verwenden, erfahren Sie hier, wie Sie sie verwenden LIKE mit % Teilübereinstimmung für MySQL-Datenbanken:

WHERE column_name LIKE CONCAT('%', :dangerousstring, '%')

wo der benannte Parameter ist :dangerousstring.

Mit anderen Worten, verwenden Sie explizit unescaped % Zeichen in Ihrer eigenen Abfrage, die getrennt sind und definitiv nicht die Benutzereingabe.

Bearbeiten: Verkettungssyntax für Oracle-Datenbanken verwendet den Verkettungsoperator: ||also wird es einfach:

WHERE column_name LIKE '%' || :dangerousstring || '%'

Es gibt jedoch Einschränkungen, da @bobince hier erwähnt, dass:

Die Schwierigkeit tritt auf, wenn Sie ein Literal zulassen möchten % oder _ Zeichen in der Suchzeichenfolge, ohne dass es als Platzhalter fungiert.

Das ist also etwas anderes, worauf Sie achten sollten, wenn Sie like und Parametrisierung kombinieren.

  • +1 – Dies scheint mir ein guter Ansatz zu sein, da die gesamte Verkettung in der Datenbank erfolgt, nachdem der Platzhalter ersetzt wurde, und es bedeutet, dass benannte Platzhalter verwendet werden können. Es ist erwähnenswert, dass die obige Syntax für Oracle gilt – in MySQL ist die Syntax LIKE CONCAT('%', :something, '%'). Referenz: stackoverflow.com/a/661207/201648

    – Aaron Newton

    21. April 2015 um 12:59 Uhr

  • Das hat für mich nicht genau funktioniert, aber mich auf die richtige Spur gebracht. Ich musste LIKE ‘%’ :something ‘%’ machen, damit es funktionierte.

    – Christoph Smit

    17. Juni 2017 um 9:58 Uhr

  • Ich weiß, dass dies nicht zum Thema gehört, aber ich konnte die SQL-Injektion sogar mit dieser Anweisung durchführen. Warum?

    – Thiago Dias

    10. Januar 2018 um 2:13 Uhr

  • Das hat bei mir nicht funktioniert, ich habe es auch mit dem SQL-Befehl getestet SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' ) Dies würde mir Fehler geben.

    – Luzan Baral

    26. Oktober 2018 um 14:28 Uhr

  • @AaronNewton and it means named placeholders can be used. Wie ist es überhaupt ein Problem mit benannten Platzhaltern, wenn Sie in PHP verketten? Offensichtlich unterstützt das Verketten in PHP sowohl benannte als auch positionelle und portablere Abfragen, da Sie dieselbe Abfrage für jede Datenbank verwenden können. Ich verstehe nicht wirklich, warum so viele Leute denken, dass es so ist irgendein Unterschied zwischen benannten und positionellen Platzhaltern.

    – Ihr gesunder Menschenverstand

    2. Februar 2020 um 8:51 Uhr


1646981648 405 Wie erstelle ich eine parametrisierte PDO Abfrage mit einer LIKE Anweisung
Blazer

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0) 
{
    while ($results = $query->fetch()) 
    {
        echo $results['column'] . "<br />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}

  • Gibt es einen Vorteil gegenüber der akzeptierten Antwort? Benutzt bindValue vor Injektionsangriffen schützen? Die akzeptierte Antwort negiert im Grunde den Wert der Verwendung ? Platzhalter durch Verketten der Suchzeichenfolge zu % wie in alten Zeiten.

    – Felwite

    15. Mai 2015 um 13:40 Uhr

  • Was ist der Sinn der Verwendung einer Negation vor $query->rowCount() == 0 ? Ist dies tatsächlich sinnvoll?

    – ssi-anik

    4. Juli 2015 um 14:30 Uhr


Wie erstelle ich eine parametrisierte PDO Abfrage mit einer LIKE Anweisung
Vijaysinh Parmar

Sie können dies auch versuchen. Ich stehe vor einem ähnlichen Problem, habe aber nach der Recherche ein Ergebnis erhalten.

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);

Das funktioniert:

search `table` where `column` like concat('%', :column, '%')

1646981649 219 Wie erstelle ich eine parametrisierte PDO Abfrage mit einer LIKE Anweisung
Gavin

Ich habe das von php Wahnvorstellungen

$search = "%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();

Und es funktioniert für mich, sehr einfach. Wie er sagt, müssen Sie “zuerst unser vollständiges Literal vorbereiten”, bevor Sie es an die Abfrage senden

1646981650 892 Wie erstelle ich eine parametrisierte PDO Abfrage mit einer LIKE Anweisung
Özkar R

PDO entkommt “%” (kann zu einer SQL-Injektion führen)Hinweis: Die Verwendung des vorherigen Codes liefert die gewünschten Ergebnisse, wenn nach übereinstimmenden Teilzeichenfolgen gesucht wird ABER Wenn ein Besucher das Zeichen “%” eingibt, erhalten Sie immer noch Ergebnisse, auch wenn Sie nichts in der Datenbank gespeichert haben (dies kann zu SQL-Injektionen führen).

Ich habe viele Variationen ausprobiert, alle mit dem gleichen Ergebnis, dass PDO “%” maskiert und zu unerwünschten/unaufgeregten Suchergebnissen führt.

Ich dachte, es wäre es wert, geteilt zu werden, wenn jemand ein Wort dazu gefunden hat, teile es bitte

  • Das ist aus dem Handbuch: us3.php.net/manual/en/pdo.prepared-statements.php Dies ist ein weiterer Beitrag zu diesem Thema: stackoverflow.com/questions/22030451/… Ich würde wirklich gerne Ihre Meinung zu diesem Thema wissen.

    – Özkar R

    27. September 2015 um 0:41 Uhr


  • Mögliche Lösung (nicht getestet) Verwenden KONKAT, like:$sql = „SELECT item_title FROM item WHERE item_title LIKE CONCAT(‘%’,?,’%’)“; Referenz: blog.mclaughlinsoftware.com/2010/02/21/php-binding-a-wildcard

    – Özkar R

    27. September 2015 um 1:37 Uhr


  • PDO entgeht % nicht. Es ist Ihr Code, der es falsch macht. Für die Lösung sollen Sie Lesen Sie die bereits hier bereitgestellten Antworten

    – Ihr gesunder Menschenverstand

    27. September 2015 um 8:34 Uhr


  • Danke für eure Vorschläge. Wie auch immer, der getestete Code war der Code aus dem Handbuch, wobei Platzhalter verwendet wurden, um eine SQL-Einschleusung zu vermeiden. Ich erhalte immer noch das gleiche Ergebnis Beispiel #6 Ungültige Verwendung von Platzhaltern PDO entkommt % mit dem obigen Code, nicht mit meinem Code. Ich bin neu im Forum und verstehe möglicherweise nicht, wie der Prozess des Kommentierens, Postens und Ansehens hier funktioniert. Ich werde es für meinen nächsten Kommentar berücksichtigen, da Sie basierend auf dem vorherigen Kommentar Ansehen benötigen, um anderen zu helfen oder Kommentare abzugeben. Danke.

    – Özkar R

    27. September 2015 um 14:52 Uhr


990140cookie-checkWie erstelle ich eine parametrisierte PDO-Abfrage mit einer LIKE-Anweisung?

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

Privacy policy