PDO Select Abfrage mit mehreren Wörtern

Thomas_Jung

Erfahrenes Mitglied
Hallo zusammen,
ich habe folgende Abfrage:

PHP:
$keyword = "%AC/DC%";

$sql = "SELECT name, artist, album, genre, year FROM `abc_mp3_songs` WHERE name LIKE :name OR artist LIKE :artist OR album LIKE :album OR genre LIKE :genre OR year LIKE :year";
$statement = $pdo->prepare($sql);
$statement->bindValue(':name', $keyword);
$statement->bindValue(':artist', $keyword);
$statement->bindValue(':album', $keyword);
$statement->bindValue(':genre', $keyword);
$statement->bindValue(':year', $keyword);
$statement->execute();
$entries = $statement->fetchAll();
print_r($entries);

Wie muss ich den Code ändern das er mir bei $keyword = "%AC/DC, Kiss%"; nach AC/DC und nach Kiss sucht?

PHP:
$keywords = addslashes($keyword);
$keywords = trim($keywords);
$keywords = preg_split("/[\s,]+/", $keywords);  
$totalKeywords = count($keywords);

for($i=1 ; $i < $totalKeywords; $i++){
?????????

Gruß Thomas
 
Urggg.... schau zu dass du die Wildcards in deinen SQL-String bekommst, und nicht als Inhalt des Parameters sendest
SQL:
.... WHERE blablablablabla OR artist LIKE CONCAT('%', :artist, '%') OR ... blablabla

Wie semper sagte: REGEX wohl die "eleganteste" Lösung.
Weil manuell das Ding auseinander zu dröseln impliziert, dass du für jedes KeyWord ("AC/DC" und "Kiss") du einen eigenen Parameter bräuchtest.
Also in der Art:
SQL:
.... WHERE artist LIKE CONCAT('%', :artist1, '%') OR artist LIKE CONCAT('%', :artist2, '%') OR ... usw...
//artist1 für "AC/DC", artist2 für "Kiss" usw.
 
Zuletzt bearbeitet:
Wäre das eine Richtige Lösung? (Nur mit mehrern Feldern)

PHP:
$sql = "SELECT * FROM `abc_mp3_songs` WHERE name LIKE CONCAT('%', :artist1, '%') OR name LIKE CONCAT('%', :artist2, '%') OR artist LIKE CONCAT('%', :artist3, '%') OR artist LIKE CONCAT('%', :artist4, '%')";
$statement = $pdo->prepare($sql);
$statement->bindValue(':artist1', $keyword1);
$statement->bindValue(':artist2', $keyword2);
$statement->bindValue(':artist3', $keyword1);
$statement->bindValue(':artist4', $keyword2);
$statement->execute();
 
Nein,
wenn du gleichzeitig (!!) nach 4 keywords suchst, musst du jedes keyword mit jedem suchfeld vergleichen.
also im beispiel 4 x mit name, 4 mal mit artist usw.
je mehr keywords, desto höher potenziert sich dein SQL
 
Das wächst über alle Grenzen. Mit Regexp dagegen sehr kompakt:
Code:
$search = 'AC/DC|Kiss|Queen';
$stmt = $pdo->prepare("
SELECT * FROM `abc_mp3_songs`
    WHERE name REGEXP :exp OR
    WHERE artist REGEXP :exp OR
    WHERE album REGEXP :exp OR
    WHERE genre REGEXP :exp OR
    WHERE year REGEXP :exp
");
$stmt->execute([':exp' => $search]);
 
... möglicher Weise mit preg_quote wobei zu prüfen wäre, ob die Sonderzeichen zwischen PHP und MySql übereinstimmen.
 
Zurück