ubuntuusers.de

[PHP]mehrdimensionales array aus Datenbank befüllen

Status: Gelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

Polowonix

Avatar von Polowonix

Anmeldungsdatum:
18. Juli 2012

Beiträge: 98

Wohnort: Mecklenburg

Moin, habe bei einem kleinen Hobby Projekt ein Problem, bei dem ich (die wahrscheinlich ganz offensichtliche) Lösung nicht finden kann und hoffe auf einen helfenden Hinweis aus der community. In folgendem Code (Datenbankverbindung ist hergestellt)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?PHP
$images=array("5","7","9","12","6");//Beispielhafte Daten für das Array, sonst aus nutzereingabe
$i=1;
$sqlimages="id_bild=".$images[0];
while(array_key_exists($i,$images)) {
	$sqlimages.=" OR id_bild=".$images[$i];
	$i++;
	}
$row=null;
$wpeimages=array();
$wpeimages=mysql_query("SELECT id_bild, dateiendung, untertitel FROM Bild WHERE geloescht=0 AND (".$sqlimages.")");
while($row=mysql_fetch_assoc($wpeimages)) { //sucht angegebene Bilder in db
	$wpeimages[]=array(	'bildid'=>$row['id_bild'],
				'dateiendung'=>$row['id_bild'],
				'untertitel'=>$row['untertitel']);
	}
var_dump($wpeimages);
?>

bekomme ich am Ende durch var_dump die Ausgabe

/var/www/html/test.php:26:resource(3, mysql result)

Normalerweise sollte es aber ein mehrdimensionales Array sein mit jeweils den daten zur bildid, dateiendung und untertitel zu den Bildern mit der ID 5,7,9,12 und 6. In diesem konkreten Beispiel liefert der auch oben verwendete SQL-Aufruf

1
SELECT id_bild, dateiendung, untertitel FROM Bild WHERE geloescht=0 AND (id_bild=5 OR id_bild=7 OR id_bild=9 OR id_bild=12 OR id_bild=6);

die Beispieldaten im angehängtem Screenshot zurück.

Über einen Hinweis, warum ich diese Daten nicht in ein mehrdimensionales array füllen kann, würde ich mich freuen.

PS: Ja, ich weiß das die mysql Funktion mittlerweile durch mysqli ersetzt wurde. Werde ich auch bald anpassen...

Bilder

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Polowonix schrieb:

1
2
3
4
5
6
7
8
9
$i=1;
$sqlimages="id_bild=".$images[0];
while(array_key_exists($i,$images)) {
	$sqlimages.=" OR id_bild=".$images[$i];
	$i++;
	}
$row=null;
$wpeimages=array();
$wpeimages=mysql_query("SELECT id_bild, dateiendung, untertitel FROM Bild WHERE geloescht=0 AND (".$sqlimages.")");

Das geht auch einfacher:

$images=array("5","7","9","12","6");//Beispielhafte Daten für das Array, sonst aus nutzereingabe
$wpeimages_query = mysql_query("SELECT id_bild, dateiendung, untertitel FROM Bild WHERE geloescht=0 AND id_bild IN (".mysql_real_escape_string(join(", ", $images)).");

Allerdings musst du natürlich, wenn Daten vom User kommen, immer ein Escaping durchführen, da du sonst SQL-Injections zulässt!

Polowonix schrieb:

1
2
3
4
5
6
while($row=mysql_fetch_assoc($wpeimages)) { //sucht angegebene Bilder in db
	$wpeimages[]=array(	'bildid'=>$row['id_bild'],
				'dateiendung'=>$row['id_bild'],
				'untertitel'=>$row['untertitel']);
	}
var_dump($wpeimages);

Du nimmst $wpeimages sowohl als MySQL-Query-Variable als auch als Ergebnisvariable. Das kann nicht funktionieren.

Polowonix schrieb:

PS: Ja, ich weiß das die mysql Funktion mittlerweile durch mysqli ersetzt wurde. Werde ich auch bald anpassen...

Ja, das solltest du 😉

Polowonix

(Themenstarter)
Avatar von Polowonix

Anmeldungsdatum:
18. Juli 2012

Beiträge: 98

Wohnort: Mecklenburg

Vielen Dank. Manchmal findet man die simpelsten Fehler auch nach 3 Stunden suchen nicht.... An den SQL-Operator "IN" hab ich gar nicht gedacht, ich sollte mich mal wieder etwas ausführlicher mit SQL beschäftigen... Ich habe es jetzt so realisiert (in deinem Bsp ist der Abschluss des Aufrufes nicht ganz richtig, da muss vor dem ; noch ein ") kommen):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?PHP
$images=array("5","7","9","12","6");//Beispielhafte Daten für das Array, sonst aus nutzereingabe

$wpeimages=array();
$row=null;
$wpeimages_query = mysql_query("SELECT id_bild, dateiendung, untertitel FROM Bild WHERE geloescht=0 AND id_bild IN (".implode(",", $images).")");
while($row=mysql_fetch_assoc($wpeimages_query)) { //sucht angegebene Bilder in db
	$wpeimages[]=array(	'bildid'=>$row['id_bild'],
				'dateiendung'=>$row['dateiendung'],
				'untertitel'=>$row['untertitel']);
	}
var_dump($wpeimages);
?>

Auf den mysql_real_escape_string hab ich verzichtet, da in der Verarbeitung im Vorfeld schon geprüft wurde, ob der Nutzer ausschließlich Ziffern eingegeben hat, wodurch eine SQL-Injection ebenfalls nicht möglich sein sollte und ich keine ungültigen Eingaben erhalte

1
2
3
4
<?PHP
	$array=array_map('ctype_digit',$images);
	$wpeadderror=!array_product($array);
?>

nur wenn $wpeadderror false ist, wird obiger code ausgeführt.

Noch mal ganz herzlichen Dank

Edit: Versehentlich id_bild beim array sowohl der bildid als auch der dateiendung zugewiesen... 🙄

Antworten |