Nachdem die bisherigen Artikel über die PHP Data Objects (PDO) so gut angekommen sind und ich einigen Leuten damit ein ganzes Stück weiter helfen konnte, kommen wir nun auf die kleinen Tricks und Kniffe im Umgang mit PDO. Heute möchte ich Euch den Umang mit einem SQL Query, welches die Vergleichsfunktion LIKE im Zusammenhang mit PDO erklären.
Folgendes Query stellt an sich keine große Schwierigkeit dar und ist eigentlich im alltäglichen Umgang mit Datenbanken Gang und Gebe:
SELECT text FROM tabelle WHERE text LIKE '%suchbegriff%'
Angenommen wir haben eine Suchfunktion und möchten den eingegebenen Suchbegriff nun mit PHP verarbeiten und anhand dessen Inhalte aus einer Datenbank auslesen. So würde der PHP Code in etwa so aussehen:
$sql = "
SELECT
text
FROM
tabelle
WHERE
text LIKE '%:suchbegriff%'
";
try {
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':suchbegriff', $_POST['suchbegriff'], PDO::PARAM_STR);
$stmt->execute();
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
...
}
} catch (PDOException $e) {
...
}
Was habe ich jetzt falsch gemacht?
Das oben angeführte Beispiel wird keinerlei Ergebnisse erzielen, selbst wenn der Suchbegriff im entsprechenden Feld der Datenbanktabelle existent ist. Die Gründe dafür sind folgende:
- Achtet auf die richtige Schreibweise im Query
Im oben beschriebenen SQL Query sind die Prozentzeichen, welche für die SQL Vergleichsfunktion LIKE benutzt werden, im Query innerhalb einfacher Anführungszeichen selbst schon vorhanden. Das ist eigentlich unsinnig, da die Behandlung von Strings mit der Funktion bindParam() eigentlich schon gegeben ist und im Query selbst nur der Platzhalter :suchbegriff enthalten sein sollte. - bindValue statt bindParam
Da die PDO Statement Methode bindParam als zweiten Paramter nur eine Referenz und keine Strings entgegen nehmen kann, ist es eigentlich unsinnig auf diese Methode bei Queries mit der Vergleichsfunktion LIKE zurückzugreifen. Es ist zwar möglich, müsste aber in diesem Fall Speicherplatz für eine neue Variable bereitsgestellt werden. Viel einfacher erledigt diesen Job die PDO Statement Methode bindValue für uns, die als zweiten Parameter auch Strings entgegen nehmen kann. Somit können wir hier auch die Prozentzeichen unterbringen, die für die Suche mit LIKE in unserem Beispiel erforderlich sind.
Beachtet man diese beiden Tipps, sieht der PHP Codeschnippsel richtigerweise so aus:
$sql = "
SELECT
text
FROM
tabelle
WHERE
text LIKE :suchbegriff
";
try {
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':suchbegriff', "%{$_POST['suchbegriff']}%", PDO::PARAM_STR);
$stmt->execute();
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
...
}
} catch (PDOException $e) {
...
}
Wie man an diesem Beispiel sieht, beinhaltet das Query nur den Platzhalter. Mit der PDO Statement Methode bindValue wird nun der Suchbegriff aus dem POST Array umschlossen von einem anführendem und endenem Prozentzeichen an die Stelle des Platzhalters gesetzt. Sicherheitsrelevantes Escapen des übergebenen Wertes führt die bindValue Methode wie gewohnt selbst aus. Mit dieser Vorgehensweise erzielen wir dann auch das entsprechende Ergebnis.
Ich würde mich freuen, wenn ihr einen Kommentar hinterlasst, sofern ich Euch mit diesem Artikel ein wenig weiterhelfen konnte.
Vielen Dank für deinen Tipp, hat mir sehr weitergeholfen. Dieses Verhalten von PDO sollte eigentlich im PHP Manual besser beschrieben werden, denn ein SELECT mit LIKE ist ja keine Seltenheit.
Vielen Dank, damit hast du mir sehr geholfen!
alternativ hab ich’s so gemacht (Geschmackssache):
$stmt = $pdo->prepare($sql);
$stmt->execute( array(‚:suchbegriff‘ => „%{$_POST[’suchbegriff‘]}%“) );