Gewünschte "Endlosschleife" endet zu früh

spinnerle

Grünschnabel
Hallo zusammen,

Ich hab hier folgendes Problem: Ich möchte ein einer Datenbank "dynamisch" alle Links zusammenfangen, die ich auf einer Website finde. Derzeit sieht das ungefähr so aus:
PHP:
<?
$geturls2check=("SELECT url_id, url, keywords from url_table WHERE(spider_lastrun < $timeminimum OR spider_lastrun IS NULL) AND kd_nr IS NOT NULL");
$queryurls2check=mysql_query($geturls2check) OR die (mysql_error());
while ($urls2check = mysql_fetch_object($queryurls2check))
	{
			$howmuchisthefish = "1";
			$url_idtotal = "0";
			$url2check = $urls2check->url_id;
			echo "Url2check: $url2check $urls2check->url\n";
			// Auf Existenz der Tabelle prüfen:
			$result = mysql_query("SHOW TABLES LIKE 'spider_$url2check'");
			if (mysql_num_rows($result) > 0) 
				{
			  		$spalteleeren =mysql_query("UPDATE spider_$url2check SET checked = NULL");
				} 
			else 
				{
			  		echo "Tabelle erstellen";
			  		$tabelleerstellen = mysql_query("CREATE TABLE `spider_$url2check` (
													`file` varchar(256) NULL default '',								
											  		`checked` varchar(20) NULL default '',
													`modified_date` varchar(20) default '',
													`feld1` varchar(250) default NULL
													) TYPE=MyISAM;");
					$initialcheck = "true";
			  	}  
		
			
			if ($initialcheck == "true")
				{
					echo "Initialen Check 1 von $url2check gestartet \n";
					$file = "http://www.$urls2check->url";
					include 'modul_spider.php';
					echo "Initialen Check 2 von $url2check gestartet \n";
					$file = "http://$urls2check->url";
					include 'modul_spider.php';
		    		//hier werden die Links der Startseite gesammelt und in die Tabelle sider_$url2check eingetragen (das geht definitiv)
					echo "Ersterfassung von $url2check beendet \n";
		    		$initialcheck = '';
		    			    		
		    	}
			
			$getnexturls=("SELECT * FROM spider_$url2check WHERE checked IS NULL ");
			$querynexturls=mysql_query($getnexturls) OR die (mysql_error());
			$howmuchisthefish = mysql_num_rows($querynexturls);
			echo "Einträge: $howmuchisthefish";
			while ($howmuchisthefish>0)
			    {
					echo "--> Suche nach spider_$url2check Einträgen \n";
			    	sleep (1);
					$getnexturls=("SELECT * FROM spider_$url2check WHERE checked IS NULL");
			    	$querynexturls=mysql_query($getnexturls) OR die (mysql_error());
			    	$howmuchisthefish = mysql_num_rows($querynexturls);
			    	echo "So viele Einträge: $howmuchisthefish \n";
			    	while ($nexturls =mysql_fetch_object($querynexturls))
					{
				    	echo "Normaler Check von $url2check gestartet \n";
				    	$file = $nexturls->file;
						$checked=time();
				    	$updatechecked="UPDATE spider_$url2check SET checked = '$checked' WHERE file = '$file'";
				    	$update = (mysql_query($updatechecked) OR die (mysql_error()));
				    	include 'modul_spider.php';	
						$url_idtotal++;
						echo "Bisher wurden $url_idtotal Seiten von $howmuchisthefish für $urls2check->url gespidert \n";
						
					}
					mysql_free_result($querynexturls);
				
		    	$updatechecked=(mysql_query("UPDATE spider_log SET errors = '$url_idfehler' WHERE url_id = '$urls2check->url_id'"));

				}
			    
			    

			
			
			    	
	}

Mein Problem ist nun folgendes:
Das Script erkennt nur nach einem neuen Aufruf, dass neue Einträge in der Tabelle vorhanden sind.... Werden zum Beispiel durch die Initialen Checks X neue Links in der Tabelle angelegt bekommt der Select
PHP:
 $getnexturls=("SELECT * FROM spider_$url2check WHERE checked IS NULL");
nur ein mysql_num_rows = 0 und dementsprechend stirbt die while schleife wunschgemäß. Beim nächsten Start sind es dann wieder mysql_num_rows = X und die while schleife wird abgearbeitet.... wenn dann allerdings wieder die anzahl der zeilen abgefragt wird --> 0

Hat irgendwer eine Idee wo mein Fehler liegen könnte?

Hoffe ich hab mich verständlich ausdrücken können :-)

LG
spinnerle
 
Ich weiß nicht so recht, ob ich deine Fehlerbeschreibung nachvollziehen kann, was mir allerdings als aller erstes auffällt ist, dass in der inneren while-Schleife die Variablen, von der die äußere while-Schleife abhängt überschrieben und damit verändert werden. Ist das gewollt?
 
Hi,
Also wenn du die $howmuchisthefish meinst, dann ist das so gewollt... bei den ganzen Zählern hab ich mich noch nicht damit beschäftigt....

Ich versuch hier nochmal in klareren Worten auszudrücken was ich erreichen will:
PHP:
hole alle einträge aus url tabelle

while (für jeden Eintrag in der urlabelle)
{
	$howmuchisthefish = 1
	if (für diesen Eintrag noch keine Ergebnistabelle vorhanden)
		{ erstelle tabelle, mache initialen Check und trage die Links in Ergbnistabelle ein}

	hole alle Links aus der Ergebnistabelle
	$howmuchisthefish = anzahl der ergebnisse
	while ($howmuchisthefish > 0)
		{ 
		hole alle Links aus der Ergebnistabelle
		$howmuchisthefish = anzahl der Ergebnisse

		mache Check auf die Links und trage neu gefundene Links (unique)  in Ergebnistabelle ein
		}

}

Irgendwann sollten ja keine neuen Links mehr gefunden werden und das Script sollte sich beenden. Derzeit beendet es sich aber zum Beispiel schon nach dem initialen Check, bei dem ca 70 Links gefunden werden. Allerdings sagt mit der Select auf die Ergebnistabelle, dass die Tabelle keine neuen Einträge enthält.
Bei nächsten Start des Scriptes findet er die neuen Ergebnisse des letzten Laufes, trägt 100e neue Links ein und verabschiedet sich nach dem ersten Durchlauf der zweiten while Schleife wieder, weil keine neuen Links vorhanden sein sollen... Irgendwas schlägt da bei meinem select fehl nachdem ich die neuen Links in der Datenbank abgelegt habe :-(


LG
spinnerle
 
Zuletzt bearbeitet:
Hm... also so ganz verstehe ich dein Script dann immer noch nicht. Es macht einfach keinen Sinn eine innere while-Schleife anzubringen, die absolut Identisch zur äußeren ist.

In deinem Fall sollte man denke ich über eine rekursive Funktion nachdenken.
 
Leider nicht ganz identisch... die erste while schleife holt sich die domains aus tabelle_1 ... die zweite holt sich dann die einzelnen urls aus der tabelle_url... sozusagen.... und die zweite schleife soll so lange laufen, bis keine neuen Einträge mehr in die tabelle:url eingetragen werden. Dann soll die erste Schleife wieder weiterlaufen und die urls der nächsten Domain abfragen.

lg
spinnerle
 
So langsam komm ich dahinter wo dein Problem ist glaube ich.
Und ich glaube du benötigst die dritte innere while-Schleife, also die innerste while-Schleife einfach nicht. Was du da machst ist meines erachtens Humbug.

Also einfach:
PHP:
<?
$geturls2check=("SELECT url_id, url, keywords from url_table WHERE(spider_lastrun < $timeminimum OR spider_lastrun IS NULL) AND kd_nr IS NOT NULL");
$queryurls2check=mysql_query($geturls2check) OR die (mysql_error());
while ($urls2check = mysql_fetch_object($queryurls2check))
    {
            $howmuchisthefish = "1";
            $url_idtotal = "0";
            $url2check = $urls2check->url_id;
            echo "Url2check: $url2check $urls2check->url\n";
            // Auf Existenz der Tabelle prüfen:
            $result = mysql_query("SHOW TABLES LIKE 'spider_$url2check'");
            if (mysql_num_rows($result) > 0) 
                {
                      $spalteleeren =mysql_query("UPDATE spider_$url2check SET checked = NULL");
                } 
            else 
                {
                      echo "Tabelle erstellen";
                      $tabelleerstellen = mysql_query("CREATE TABLE `spider_$url2check` (
                                                    `file` varchar(256) NULL default '',                                
                                                      `checked` varchar(20) NULL default '',
                                                    `modified_date` varchar(20) default '',
                                                    `feld1` varchar(250) default NULL
                                                    ) TYPE=MyISAM;");
                    $initialcheck = "true";
                  }  
        
            
            if ($initialcheck == "true")
                {
                    echo "Initialen Check 1 von $url2check gestartet \n";
                    $file = "http://www.$urls2check->url";
                    include 'modul_spider.php';
                    echo "Initialen Check 2 von $url2check gestartet \n";
                    $file = "http://$urls2check->url";
                    include 'modul_spider.php';
                    //hier werden die Links der Startseite gesammelt und in die Tabelle sider_$url2check eingetragen (das geht definitiv)
                    echo "Ersterfassung von $url2check beendet \n";
                    $initialcheck = '';
                                    
                }
            
            $getnexturls=("SELECT * FROM spider_$url2check WHERE checked IS NULL ");
            $querynexturls=mysql_query($getnexturls) OR die (mysql_error());
            $howmuchisthefish = mysql_num_rows($querynexturls);
            echo "Einträge: $howmuchisthefish";
            while ($howmuchisthefish>0)
                {
                    echo "--> Suche nach spider_$url2check Einträgen \n";
                    sleep (1);
                        echo "Normaler Check von $url2check gestartet \n";
                        $file = $nexturls->file;
                        $checked=time();
                        $updatechecked="UPDATE spider_$url2check SET checked = '$checked' WHERE file = '$file'";
                        $update = (mysql_query($updatechecked) OR die (mysql_error()));
                        include 'modul_spider.php';    
                        $url_idtotal++;
                        echo "Bisher wurden $url_idtotal Seiten von $howmuchisthefish für $urls2check->url gespidert \n";
                
                $updatechecked=(mysql_query("UPDATE spider_log SET errors = '$url_idfehler' WHERE url_id = '$urls2check->url_id'"));

                }
                mysql_free_result($querynexturls);
                

            
            
                    
    }
 
Herr schmeiss Hirn vom Himmel!!

Och mein Gott... endlich ist der Knoten im Hirn geplatzt....

ICh vermute die While schleifen und alles waren in Ordnung... aber in meinem Tran gestern Abend hab ich einfach übersehen, dass das Feld "checked" beim Anlegen einer URL nicht geNULLt wird sondern einfach leer ist.... deswegen kann $howmuchisthefish auch nicht >0 werden... es sind keine Links da die NULL im Feld checked haben.... und beim nächsten Durchlauf hab ich einfach die Spalte checked gedroppt und damit geNULLt und deswegen hat's funktioniert....

Sorry für die Mühe und vielen Dank für die Hilfe

lg
spinnerle
 
Zurück