Seite 1 von 2

SQL Abfrage in Foreach

Verfasst: 23.04.2008 17:06
von phillip
Ich hab folgendes Problem:

Ich würde gerne in einer foreach-Schleife eine SQL Abfrage machen, bei dem jeder Wert des arrays überprüft wird, ob er in der Datenbank vorhanden ist.

angefangen hab ich das mal so:

Code: Alles auswählen

foreach ($artist as $key => $value) {


$sql = "SELECT * FROM artists_house WHERE artist_name = '$value'"; 

if (!($result = $db->sql_query($sql))) { 
        
          message_die(GENERAL_ERROR, 'Konnte die artists nicht laden!', '', __LINE__, __FILE__, $sql); 
        } 


if ( $row = $db->sql_fetchrow($result) ){
	echo $row['artist_name'];
	}

}
Das Problem ist nun, dass nur der erste Wert des Arrays ausgegeben wird...

Kann mir da jemand helfen?

Verfasst: 26.04.2008 11:14
von phillip
weiss hier niemand was?

Verfasst: 26.04.2008 16:04
von S2B

Code: Alles auswählen

while ($row = $db->sql_fetchrow($result))
{
   echo $row['artist_name'];
}
Die Abfrage ließe sich aber ganz sicher auch so umschreiben, dass sie nicht in einer Schleife ausgeführt werden muss (Performance-Killer...).

Verfasst: 26.04.2008 16:30
von phillip
Vielen Dank S2B, für deine Antwort.

Ja ich habs auch schon vorher mit der while versucht, aber auch das liefert mir nur immer die Ausgabe des ersten Elementes des Arrays.

Ich kanns sonst noch ein bisschen genauer schildern:

Code: Alles auswählen

$lineup = $row['lineup'];

$artist = explode(',', $lineup);

foreach ($artist as $key => $value) { 


$sql = "SELECT * FROM artists WHERE artist_name = '$value'"; 

if (!($result = $db->sql_query($sql))) { 
        
          message_die(GENERAL_ERROR, 'Konnte die artists nicht laden!', '', __LINE__, __FILE__, $sql); 
        } 


if ($db->sql_numrows($result)) { 

	while ( $row = $db->sql_fetchrow($result) ) 
	{ 
	echo $row['artist_name'];
	}
   } 

}

Ich hab das Array mal ausgeben lassen mit

Code: Alles auswählen

echo '<pre>';
print_r($artist);
echo '</pre>';
Es liefert mir das erwartete

Array
(
[0] => DJ SIGMA
[1] => House Rockers
[2] => DJ Alastair
[3] => Phil Guarana
)

Verfasst: 26.04.2008 17:11
von S2B
Eine performantere Alternative wäre sowas:

Code: Alles auswählen

$sql = 'SELECT * FROM artists WHERE artist_name IN(' . str_replace("'", "''", $lineup) . ')';

Verfasst: 26.04.2008 17:17
von phillip
Ja ist nicht schlecht, aber leider funktioniert das bei mir nicht.

Eigentlich will ich mit dem Ganzen erreichen, dass aus der langen stringkette $row['lineup'] alle artists durch einen Link ersetzt werden, die in unserer Datenbank stehen.

Und da jeder artist eine eigene Reihe hat, funktioniert das mit dem str_replace leider nicht...

Verfasst: 26.04.2008 17:20
von S2B
Irgendwie kann ich mir das gerade schlecht vorstellen... Könntest du mal einen größeren Ausschnitt aus deinem Code verlinken?

Verfasst: 26.04.2008 17:25
von phillip
Ja klar, ich hab den Ausschnitt zwar jetzt noch ziemlich verkürzt:

Code: Alles auswählen

$template->set_filenames(array(
		'body' => 'event.tpl')
	);


$sql = "SELECT e.*, SUBSTRING(e.date, 9, 2) AS day,
SUBSTRING(e.date, 6, 2) AS month,
SUBSTRING(e.date, 1, 4) AS year,
SUBSTRING(e.date, 11, 6) AS time,
lo.*
        FROM events as e, event_locations as lo, labels as la
   	WHERE event_id = '$event_id' AND eventname <> '' AND e.location_id = lo.loc_id"; 

if (!($result = $db->sql_query($sql))) { 
        
          message_die(GENERAL_ERROR, 'Konnte den Event nicht laden!', '', __LINE__, __FILE__, $sql); 
        } 


	if ( $row = $db->sql_fetchrow($result) ) 
	{ 


// So die üblichen Zuweisungen, aber jetzt kommts:



if ($row['lineup'] != '')
{
$lineup = $row['lineup'];

$artist = explode(',', $lineup);


foreach ($artist as $key => $value) { 

$sql = "SELECT * FROM artists_house WHERE artist_name = '$value'"; 

if (!($result = $db->sql_query($sql))) { 
        
          message_die(GENERAL_ERROR, 'Konnte die artists nicht laden!', '', __LINE__, __FILE__, $sql); 
        } 


if ($db->sql_numrows($result)) { 

	if ( $row = $db->sql_fetchrow($result) ) 
	{ 
	echo $row['artist_name']; // 'echo', um die Resultate anzuschauen
	}
   } 

}


// Noch ein paar weitere Zuweisungen


$template->assign_block_vars('event', array(
	'' => $
	
	)
	); 

	



Verfasst: 26.04.2008 17:33
von S2B
S2B hat geschrieben:Irgendwie kann ich mir das gerade schlecht vorstellen... Könntest du mal einen größeren Ausschnitt aus deinem Code verlinken?
Ist das eigentlich so schwer zu verstehen? :roll:

KB:knigge

Verfasst: 26.04.2008 17:35
von phillip
ok sorry, ich hab das 'verlinken' übersehen :oops:

ja ich gib dir sonst mal die ganze datei:

http://www.phillip.ch/underground-new/events.phps