Funktionen "überholen" sich

Prengepower

Mitglied
Hallo!

Ich habe ein mächtiges Problem. Mein PHP-Script dient dazu XML-Dateien auszuwerten und diese dann nacheinander in eine MySQL-Datenbank zu schreiben. Dabei muss teilweise auch der ein oder andere Wert auch wieder aus der Datenbank ermittelt werden.

Allerdings klappt das nicht so ganz, da manchmal eine Funktion die andere "überholt" und nicht wartet bis die davor fertig ist.

So kommt es beispielsweise vor, dass ein Album hinzugefügt wird, obwohl noch kein Artist angelegt wurde. Dadurch kann dessen ID nicht ermittelt werden, weshalb beides nicht verknüpft ist. Selbiges passiert auch bei den Liedern vom Album...

Was kann ich dagegen tun? Wenn ihr das PHP-Script sehen wollt sagt bescheid - ist aber gut 400 Zeilen lang ^^

Grüße ;)
 
Ohne den Code zu kennen frag ich mich wie eine Funktion eine andere überholen kann.

Eine Funktion wird doch Zeile für Zeile abgearbeitet (verbessert mich wenn ich mich irre) und wenn du dann als letzte Anweisung in Funktion 1 den Aufruf der Funktion 2 enträgst, wie kann dann die zweite schon aufgerufen werden wenn die erste noch nicht fertig ist!?

Wenn ich falsch liege, sorry. Dann hoffe ich auch zu erfahren woran es liegt.
 
Also das irgendwelche Funktionen nicht warten, bis die davor fertig ist, kann ich mir kaum bis niemals vorstellen. PHP würde ja dann parallel irgendwelche Funktionen abarbeiten -> und das ist schlichtweg nicht möglich. // Korrigiert und prügelt mich, wenn ich falsch liege..

Da du aber von MySQL sprichst, könnte es höchstens daran liegen, dass da irgendwelche Querys nicht hinter her kommen, wenn du große Datenmengen verarbeitest.

Vllt. würde ich es an einigen Stellen mal mit usleep() oder sleep() versuchen..

string

edit: Ich meine mich zu erinnern wie tombe und ich schonmal kurz hintereinander auf ein anderes Thema mit ähnlicher / gleichen antwort geantwortet haben... so langsam macht mir das angst :P
 
Zuletzt bearbeitet:
Also ich zeig euch mal ein Beispiel von der besagten Schose mit den Liedern und dem Album:

Hier sollen die Alben abgerufen werden und dann der
PHP:
	#Hier sollen die Alben anhand des Artisten ermittelt werden
	function getAlbums($name) {
			try{
				$xml = simplexml_load_file('http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&artist='.urlencode($name).'&autocorrect=1&api_key='.$GLOBALS[api_key]);

				$albums = $xml->topalbums->album;
				$artist_id = getArtistid($name);
			
				foreach($albums as $album) {
					$album_name = removeUmlauts(utf8_decode($album->name));
					$artist = utf8_decode($album->artist->name);
					$image = 'no_image.jpg';
					$discs = 1;
					$genre = 0;
					$price = '0.00';
					$buylink = '';
					
					similar_text($artist, $name, $p);
										
					if ($p == 100){
						#Hier werden die Informationen über das Album ermittelt (Tracklist und dergleichen)
						$var= getAlbuminfo($artist, $album_name);
						$album = $var[album];
						$tracklist = $var[tracklist];
						
						echo 'Artist_Id: '.$artist_id.'<br>';
						echo 'Album_Name: '.$album_name.'<br>';
						
						#Hier wird das Album in die Datenbank geschrieben
						inputAlbum($artist_id, $album_name, $album[year], $album[month], getPicturealbum($album[image]), $discs, $album[length], $genre, $price, $buylink);
						
						echo 'Album_Id: '.getAlbumid($artist_id, $album_name).'<br>';
						#Hier wird die Tracklist in die Datenbank geschrieben, davor wird ermittelt, welche Album_ID vorliegt
						inputTrack($artist_id, getAlbumid($artist_id, $album_name), $tracklist);
					}
				}
			
			}catch (Exception $e){
				$artist = $name;
			}
	}
	
	#Hier werden die Albuminformationen aus der XML-Datei gelesen und dann in einem Array, welches aus 2 Arrays besteht zurückgegeben
	function getAlbuminfo($artist,$name){
			try{
				$xml = simplexml_load_file('http://ws.audioscrobbler.com/2.0/?method=album.getinfo&lang=de&autocorrect=1&api_key='.$GLOBALS[api_key].'&artist='.urlencode($artist).'&album='.urlencode($name));
								
				$release = utf8_decode($xml->album->releasedate);
				$year = 0000;
				$month = 0;
				$image = $xml->album->image[3];
				
				if (strlen(trim($image)) == '0') {
					$image = 'no_image.jpg';
				}
				
				$tracks = $xml->album->tracks->track;
				
				$position = 0;
				$length = 0;
				
				foreach($tracks as $track) {
					$position = $position + 1;
					$name = utf8_decode(removeUmlauts($track->name));
					$track_var = getTrackinfo($artist, $name);
					$dauer = $track_var[dauer];
					$genre_id = $track_var[genre_id];

					$tracklist[] = array(
										"position"=>$position,
										"name"=>$name,
										"dauer"=>$dauer,
										"genre_id"=>$genre_id,
					);
									
					$length = $length + intval($dauer / 100);
				}
				
				$album = array(
							"year"=>$year,
							"month"=>$month,
							"image"=>$image,
							"length"=>$length/1000,
				);
				
				$return = array(
							"album"=>$album,
							"tracklist"=>$tracklist,
				);
				
				return $return;
			
			}catch (Exception $e){
				echo "Konnte Albuminfos nicht abrufen";
			}		
	}
	
	#Hier werden die Informationen vom Track ermittelt
	function getTrackinfo($artist,$track){
			try{
				$xml = simplexml_load_file('http://ws.audioscrobbler.com/2.0/?method=track.getinfo&autocorrect=1&api_key='.$GLOBALS[api_key].'&artist='.urlencode($artist).'&track='.urlencode($track));
								
				$dauer = utf8_decode($xml->track->duration);
				$genre = utf8_decode($xml->track->toptags->tag[0]->name);				
				
				$genre_id = getTagid($genre);
				
				echo '<u>'.$genre.'</u>: '.$genre_id.'<br>';
				
				$return = array(
							"dauer"=>$dauer,
							"genre_id"=>$genre_id,
				);

			}catch (Exception $e){
				$artist = $name;
			}	

			return $return;
	}
	
	#Hier wird die ID vom Genre ermittelt
	function getTagid($tag) {
			$sql_befehl = "SELECT id FROM jos_muscol_genres WHERE genre_name = '".$tag."' ";
			
			if ($result = $GLOBALS[db]->query($sql_befehl)) {
				while($datensatz = $result->fetch_object() ){
					$ausgabe = $datensatz->id;
				};
				$result->close();
			} else {
				echo "Zugriff fehlgeschlagen (TagID)";
			}
			return $ausgabe;
	}
	
	#Hiermit wird das Album hinzugefügt
	function inputAlbum($artist_id,$album_name,$year,$month,$image,$discs,$length,$genre,$price,$buylink){
			$sql_befehl = "INSERT INTO jos_muscol_albums VALUES ('', '".$album_name."', '".$artist_id."', '".$year."', '".$month."', '".$year."', '".$month."', '',	'', '".$genre."', '', '', '".$length."', '1', '".$image."',	'".$discs."', '', '', '', '', '', '', 'si', '0', CURDATE(), CURDATE(), '".$price."', '', '0', 'Y', '', '".album_name."', '62', '0', '".$buylink."', '', '', '')";
			
			if (!$GLOBALS[db]->query($sql_befehl)){
				echo "Album konnte nicht hinzugefügt werden<br>";
			}
	}
	
	#Hier wird die Album_ID ermittelt
	function getAlbumid($artist_id,$album_name){
			$sql_befehl = "SELECT id FROM jos_muscol_albums WHERE artist_id = '".$artist_id."' AND name = '".$album_name."' ";

			echo $sql_befehl.'<br>';
			
			if ($result = $GLOBALS[db]->query($sql_befehl)) {
				while($datensatz = $result->fetch_object() ){
					$id = $datensatz->id;
				};
				$result->close();
			} else {
				echo "Zugriff fehlgeschlagen (getAlbumid)";
				$id = 0;
			}
			
			return $id;
	}
	
	#Hier wird der Track hinzugefügt
	function inputTrack($artist_id, $album_id, $tracklist){
		
		foreach ($tracklist as $track){
			$position = $track[position];
			$dauer = $track[dauer];
			$name = $track[name];
			$genre_id = $track[genre];
			
			$buylink = '';
			$video = '';
			
			$sql_befehl = "INSERT INTO jos_muscol_songs VALUES ('' , '".$album_id."', '".$position."', '1', '".$dauer."', '".$name."', '', 	'".$artist_id."', '0', '', '', CURDATE( ), '', '', '', '".$genre_id."', '0', '".$buylink."', '".$video."',	'', '0', '62')";
			
			if (!$GLOBALS[db]->query($sql_befehl)){
				echo "Track ".$name." konnte nicht hinzugefügt werden<br>";
			}
		}
		echo $sql_befehl.'<br><br>';
	}

Hoffe ihr seht einigermaßen durch ;)
 
also die AUsgabe deiner SQL-Statements erfolgt in der richtigigen Reihenfolge. Aber er findet ein EIntrag nicht?
 
Zurück