PDO Select Abfrage mit mehreren Wörtern

Thomas_Jung

Erfahrenes Mitglied
Erstmal vielen Dank für eure hilfreichen Antworten (y)
Kann das sein das man mehrerer WHERE in einem SQL-String verwenden kann?
Ich erhalte folgende Fehlermeldung:confused:
PHP:
Fatal error:  Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE artist REGEXP ? OR    WHERE album REGEXP ? OR    WHERE genre REGEXP ? ' at line 3 i
 

Sempervivum

Erfahrenes Mitglied
Ups, wie ich sehe ist der Code, den ich früher gepostet habe, fehlerhaft. WHERE darf natürlich nur einmal auftreten. So sollte es richtig sein:
Code:
$search = 'AC/DC|Kiss|Queen';
$stmt = $pdo->prepare("
SELECT * FROM `abc_mp3_songs`
    WHERE name REGEXP :exp OR
        artist REGEXP :exp OR
        album REGEXP :exp OR
        genre REGEXP :exp OR
        year REGEXP :exp
");
$stmt->execute([':exp' => $search]);
 

Thomas_Jung

Erfahrenes Mitglied
Jetzt habe ich wieder das Problem mit den Parameter :confused:

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in


PHP:
$search = 'AC/DC|Kiss|Queen';
$stmt = $pdo->prepare("
SELECT * FROM `abc_mp3_songs`
    WHERE name REGEXP :exp OR
        artist REGEXP :exp OR
        album REGEXP :exp OR
        genre REGEXP :exp OR
        year REGEXP :exp
");
$stmt->execute([':exp' => $search]);
$count =  $stmt->rowCount();
echo 'count: '.$count . '<br />';
$entries = $stmt->fetchAll();
 

Sempervivum

Erfahrenes Mitglied
Siehe hier:
PHP: PDO::prepare - Manual
You cannot use a named parameter marker of the same name more than once in a prepared statement, unless emulation mode is on.
In PHP 8, das ich selber benutze ist dies jedoch möglich. Es gibt eine Option für PDO, der genannte Emulation Mode, durch die man es auch in PHP < 8 ermöglichen kann:
PHP: PDO::setAttribute - Manual
Die Option ist PDO::ATTR_EMULATE_PREPARES
AFAIK ist der Grund ein unterschiedlicher Defaut-Wert für diese Option in den verschiedenen PHP-Versionen.
 

Thomas_Jung

Erfahrenes Mitglied
Wieder was gelernt:)

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

Vielen Dank erstmal an alle.
Probiere mal, ob ich so weiter komme.