SQL Abfrage mit mehreren Werten einer WHERE Klausel

nchristoph

Erfahrenes Mitglied
Hallo Zusammen,

folgendes Problem.

Wie kann ich eine WHERE Klausel in PHP mit mehreren Werten erstellen?

Mein Code schaut so aus:

PHP:
$suchbegriff = str_replace(" ", "", $_POST["suchbegriff"]);
    $sql = ( "SELECT
                ID,
                Holzart,
                Klasse,
                Trockenheit,
                Partie,
                Starke,
                Pfad,
                DATE_FORMAT(Datum,'%d.%m.%Y')AS Datum,
                DATE_FORMAT(anderungsdatum,'%d.%m.%Y')AS anderungsdatum
            FROM
                suchmaschine
            WHERE
                Partie LIKE :suchbegriff
            ORDER BY
                Holzart, Starke, Klasse, Partie  ASC");
     
    include('../templates/suche/sucheheader.tpl');
    $stmt = $db_conn->prepare($sql);
    $stmt->bindValue(':suchbegriff', "%{$suchbegriff }%", PDO::PARAM_STR);
    $stmt->execute();

Funktioniert soweit so gut. Sobald ich allerdings ein OR Holzart LIKE :suchbegriff hinschreibe, kommt folgender Fehler:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number' in C:\xampp\suchmaschine\inc\suche.php:33 Stack trace: #0 C:\xampp\suchmaschine\inc\suche.php(33): PDOStatement->execute() #1 {main} thrown in C:\xampp\suchmaschine\inc\suche.php on line 33

Ich habe in den Verbindungseinstellungen die Emulierten Prepares abgeschaltet und lt. dem, was ich im Internet gefunden habe, hängt das damit zusammen.

Meine Fragen:
- Wie mache ich mehrere Werte bei der WHERE Klausel das meine Abfrage wieder funktioniert?
- Bringt das Abschalten von Emulate Prepares wirklich so viel, das sicher die Arbeit mit dem umschreiben lohnt?

mfg
Christoph.
 
Danke für die Antwort.

Leider kommt auch mit Klammern derselbe Fehler.

Einen Workaround habe ich gefunden:

PHP:
    $suchbegriff = str_replace(" ", "", $_POST["suchbegriff"]);
    $suchbegriff1 = str_replace(" ", "", $_POST["suchbegriff"]);
    $sql = ( "SELECT
                ID,
                Holzart,
                Klasse,
                Trockenheit,
                Partie,
                Starke,
                Pfad,
                DATE_FORMAT(Datum,'%d.%m.%Y')AS Datum,
                DATE_FORMAT(anderungsdatum,'%d.%m.%Y')AS anderungsdatum
            FROM
                suchmaschine
            WHERE
                Holzart LIKE :suchbegriff OR
                Partie LIKE :suchbegriff1
            ORDER BY
                Holzart, Starke, Klasse, Partie  ASC");
     
    include('../templates/suche/sucheheader.tpl');
    $stmt = $db_conn->prepare($sql);
    $stmt->bindValue(':suchbegriff', "%{$suchbegriff}%", PDO::PARAM_STR);
    $stmt->bindValue(':suchbegriff1', "%{$suchbegriff1}%", PDO::PARAM_STR);
    $stmt->execute();

Aber das muss doch schöner gehen oder?

mfg
Christoph
 
Aus meiner Sicht sieht es gut aus.
Funktioniert es denn, wenn Du den Befehl direkt gegen die Datenbank schickst, also mit eingetragenen Parameter direkt im SQL?
Ich kenne mySQL nicht so gut, aber unter MSSQL müsst es sein:
..WHERE (Holzart LIKE ('%BUCHE%') AND Partie LIKE ('%4711%'))
Die Hochkommata sind zu beachten.
 
Ich habe den Code etwas bereinigt damit die Felder, welche nicht benötigt werden nicht durchsucht werden.

Wenn ich den Code direkt ausführe, ohne Platzhalter sondern direkt mit werten, funktioniert es mit einem Wert in der Where Klausel schon, mit 2 kommt wieder der Fehler.

Mich beschleicht der Gedanke, das mit den zwei Werten bei Where Klauseln mit abgeschalteten Emulated Prepares nicht funktioniert ausser man macht 2 Platzhalter.

Leider habe ich aktuell keinen Zugriff auf PHPMyAdmin bzw. Konsole dass ich das direkt in MySql ausführen kann.
 
Zurück