Hier ist mein Versuch:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Hier ist mein Versuch:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Antworten:
Ich habe es gleich nach dem Posten herausgefunden:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Für diejenigen , benannte Parameter verwenden, ist hier, wie die Verwendung LIKE
mit %
Teilübereinstimmung für MySQL - Datenbanken :
WHERE Spaltenname LIKE CONCAT ('%' ,: gefährliche Zeichenfolge, '%')
wo der genannte Parameter ist :dangerousstring
.
Mit anderen Worten, verwenden Sie %
in Ihrer eigenen Abfrage explizit nicht entkoppelte Zeichen, die getrennt sind und definitiv nicht die Benutzereingabe sind.
Bearbeiten: Die Verkettungssyntax für Oracle-Datenbanken verwendet den Verkettungsoperator : ||
, wird also einfach:
WHERE Spaltenname LIKE '%' || : gefährliche Saite || '%'
Es gibt jedoch Vorbehalte, da @bobince hier erwähnt , dass:
Die Schwierigkeit tritt auf, wenn Sie ein Literal
%
oder_
Zeichen in der Suchzeichenfolge zulassen möchten , ohne dass es als Platzhalter fungiert.
Das ist also etwas anderes, auf das Sie achten müssen, wenn Sie Like und Parametrisierung kombinieren.
LIKE CONCAT('%', :something, '%')
. Referenz: stackoverflow.com/a/661207/201648
SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )
dies würde mir einen Fehler geben.
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 die Verkettung in PHP sowohl Named als auch Positional und ist portabler, da Sie für jede Datenbank dieselbe Abfrage verwenden können. Ich verstehe nicht wirklich, warum so viele Leute denken, dass es einen Unterschied zwischen benannten und positionellen Platzhaltern gibt.
$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';
}
bindValue
vor Injektionsangriffen? Die akzeptierte Antwort negiert im Grunde den Wert der Verwendung von ?
Platzhaltern, indem die Suchzeichenfolge so verkettet wird, %
dass sie in den alten Tagen gefällt.
Sie können diesen auch ausprobieren. Ich stehe vor einem ähnlichen Problem, habe aber nach Recherchen ein Ergebnis erzielt.
$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);
Ich habe das von PHP-Wahnvorstellungen bekommen
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
Und es funktioniert bei mir sehr einfach. Wie er sagt, müssen Sie "zuerst unser vollständiges Literal vorbereiten", bevor Sie es an die Abfrage senden
PDO entgeht "%" (kann zu SQL-Injection führen) : Die Verwendung des vorherigen Codes führt zu den gewünschten Ergebnissen, wenn Teilzeichenfolgen abgeglichen werden sollen. ABER wenn ein Besucher das Zeichen "%" eingibt, erhalten Sie auch dann Ergebnisse, wenn Sie dies nicht tun. Sie haben nichts in der Datenbank gespeichert (dies kann zu SQL-Injektionen führen).
Ich habe viele Variationen ausprobiert, alle mit dem gleichen Ergebnis. PDO entgeht "%" und führt zu unerwünschten / nicht aufgeregten Suchergebnissen.
Ich dachte, es lohnt sich zu teilen, wenn jemand ein Wort darüber gefunden hat, teilen Sie es bitte
like
verwendet werden? Wie soll das Execute-Array der Reihe nach ausgeführt werden?