MySQLi Prepared Statements: Umgang mit Arrays

Parantatatam

mag Cookies & Kekse
Guten Abend,

ich stehe wohl mal wieder auf den Schlauch, jedenfalls habe ich momentan ein Problem auf dem Gebiet der Prepared Statements von MySQLi. Dazu habe ich folgenden Ausschnitt aus einem Skript meinerseits:
PHP:
$sql = 'SELECT
			a.`name`      AS `name`,
			b.`id`        AS `id`,
			b.`timestamp` AS `timestamp`,
			b.`message`   AS `message`
		FROM
			`dat_user`    a,
			`dat_message` b,
			`dat_talk`    c
		WHERE
			b.`id`        > ? AND
			c.`id_to`     = ? AND
			c.`id_from`   IN(?) AND
			c.`id_from`   = a.`id` AND
			b.`id`        = c.`id`
		ORDER BY
			b.`timestamp`';

if($stmt->prepare($sql)) {
	$stmt->bind_param('iis', $id, $to, implode(', ', $from));
	$stmt->execute();
	$stmt->bind_result($name, $id, $timestamp, $message);
	
	while($stmt->fetch()) {
		$data[] = array('name' => $name, 'id' => $id, 'timestamp' => $timestamp, 'message' => $message);
	}
	
	return empty($data) ? NULL : $data;
}
Mein Problem besteht jetzt darin, dass $from ein Array mit Zahlenwerten ist, die eben, wie es sich für IN(...) gehört, mit Kommata separiert dort stehen sollen. Jedoch wird mir nur der Datensatz des ersten Zahlenwertes ausgeben und danach kein weiterer. Ich vermute deshalb, dass es an meiner Übergabe liegt, kann es aber nicht überprüfen, da ich keine Methode kenne mit der ich mir den fertigen String ausgeben lassen kann. Weiß jemand Rat?
 
Zuletzt bearbeitet:
Ja, meinte er.
Und der Link führt leider zu PDO, die Methode existiert bei MySQLi meines Wissens leider nicht.

Funktioniert es denn, wenn du eine feste Liste benutzt? Oder streikt er da auch?
 
Moin,

das wird so nicht funktionieren.

Der Parameter wird als (einzelner) String ausgewert werden.

Mal angenommen, du hast da einen Array [a,b,c]

Übersetzt würde das in
Code:
c.`id_from`   IN('a,b,c')

...du benötigst aber

Code:
c.`id_from`   IN('a','b','c')

Versuche es mal mit FIND_IN_SET()

Code:
   FIND_IN_SET(c.`id_from`,?)

übersetzt würde dies in
Code:
   FIND_IN_SET(c.`id_from`,'a,b,c')
...und sollte funktionieren, da FIND_IN_SET() die Argumentliste in dieser Form benötigt(als einzigelnen String mit kommaseparierten Werten).
 
Um die Frage zu beantworten, ob es funktioniert, wenn ich die Werte direkt in IN(...) schreibe: ja, dass funktioniert problemlos.

EDIT: Ich danke dir vielmals, Sven. Du hast meinen Tag gerettet und mir wieder mal etwas neues gelernt. Problem gelöst, aber ich hätte in diesem Zusammenhang noch ein Problem mit JOINS, welches ich in dem oben genannten Schnipsel auf folgende Weise gelöst habe:
SQL:
c.`id_from` = a.`id` AND b.`id` = c.`id`
Ich hatte es vorher versucht mit JOIN zu lösen, also dem direkten Ausdruck dafür in MySQL. Kann mir jemand erklären, warum er mir in diesem Zusammenhang immer sagt, dass die Spalte id nicht existiert? Ich hatte es so gelöst:
SQL:
INNER JOIN `dat_talk` ON `dat_talk`.`id_from` = `dat_user`.`id`
INNER JOIN `dat_message` ON `dat_message`.`id` = `dat_talk`.`id`
 
Zuletzt bearbeitet:
Zurück