Hier mein Versuch dazu:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
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'];
}
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
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
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
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, '%')
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
Ö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