PDO/MySQL Statement funktioniert nicht

xtramen01

Erfahrenes Mitglied
Hallo Leute,

ich habe folgende Abfrage die nicht funktionieren will:

PHP:
$groups = array("'" . strtolower(Site::content()) . "'", "'" . strtolower(Site::site()) . "'", "'" . strtolower(Site::subsite()) . "'");
$this->_content = array_filter($groups);
$content_group = implode(',', $this->_content);

$select = $db->prepare("select id, content_group, definition, value from :table_language_definitions where content_group in (:content_group) and language_id = :language_id");
$select->bindValue(':content_group', (string) $content_group);
$select->bindValue(':language_id', $this->getLanguage('id'));
$select->execute();
while($select->fetch()){
define(strtoupper($select->value('definition')), $select->value('value'));
}

Es geht um die IN Clause.
Der String $content_group sieht so aus:

Code:
'shop','index'

Wenn ich es händisch eintrage, also so:

Code:
.....where content_group in ('shop','index')....

Dann klappt es.
Hat da jemand eine Idee warum das mit der Variable nicht funktioniert?
Die Ausgabe ist ja vollkommen gleich. Ich verstehe es nicht.

Gruß und Danke
 
Das geht so nicht direkt, da jede Variable innerhalb des IN() einzel gebunden werden müsste und im SQL die entsprechende Anzahl Parameter gesetzt sein solten.

Aber du hast Glück, MySQL bietet die Nette Funktion FIND_IN_SET() an. Das SET ist eine Kommaseparierte Liste als Ein String. Ergo auch eine gebundene Variable

SQL:
WHERE FIND_IN_SET(content_group, 'shop,index')

Das heisst für dich:
PHP:
//Den Array ohne die Anführungszeichen:
$groups[] = Site::content();
$groups[] = Site::site();
$groups[] = Site::subsite();
//Leere ausfiltern
$this->_content = array_filter($groups);
//Alle Einträge auf Lowercase umstellen
array_walk($this->_content, 'strtolower');
//Set fürs FIND_IN_SET zuammenstellen
$content_group_set = implode(',', $this->_content);

//SQL in lesbarer Form
$sql = <<<SQL
SELECT
	id,
	content_group,
	definition,
	value 
FROM
	:table_language_definitions
WHERE
	FIND_IN_SET(content_group, :content_group_set)
	AND language_id = :language_id
SQL;

$select = $db->prepare($sql);
//Das Set als einen String übergeben
$select->bindValue(':content_group_set', (string) $content_group_set);
$select->bindValue(':language_id', $this->getLanguage('id'));
$select->execute();
while($select->fetch()){
	define(strtoupper($select->value('definition')), $select->value('value'));
}
 
Zuletzt bearbeitet von einem Moderator:
Zurück