Suchscript bricht bei unterordner ohne fehler ab...
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anhand
bedingung
beitrag
bild
count
daten
ergebnis
fehler
folgendes bild
fragen
funktion
hauptfunktion
lsung
ordner
po
schleifen
schreiten
stehen
suchbegriff
weiterer fehler
-
Hallo, ich habe ein Suchscript, und wenn ich damit einen Ordner durchsuche, in dem sich kein Unterordner befindet, dann klappt alles wunderbar.
Wenn es dort aber einen Unterordner gibt, dann bricht das Script ab, ohne ein Fehler oder ähnliches nicht einmal der Text hinter dem Script wird ausgeführt.
CODE:
<?php error_reporting(E_ALL); if($_POST['suchbegriff'] != "") { $treffer = array(); $treffer_final = array(); $subdirs = array(); function search($dir) { global $treffer, $treffer_final, $subdirs; $dirh=opendir($dir); while($filename=readdir($dirh)) { if($filename!=".." && $filename!=".") { if(is_file($dir.$filename)) { $pos = strpos($filename, $_POST['suchbegriff']); if ($pos === false) { } else { $treffer[] = $dir.$filename; } } elseif(is_dir($dir.$filename)) { $subdirs[]=$dir.$filename."/"; $pos = strpos($filename, $_POST['suchbegriff']); if ($pos === false) { } else { $treffer[] = $dir.$filename; } } } } foreach($treffer as $ziel) { $treffer_final[] = $ziel; } closedir($dirh); for($i=0;$i<count($subdirs);$i++) { search($subdirs[$i]); } } search($rootdir.$_POST['dir']); echo"<pre>"; print_r($treffer); print_r($subdirs); print_r($treffer_final); echo"</pre>"; } ?>
Beitrag geändert: 19.8.2007 4:59:09 von speedtouch92 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich habe mir erlaubt deinen Code zu kopieren und bei mir zu testen. Ich habe auch gleich eine Lösung deines Problems gefunden.
<?php error_reporting(E_ALL); if($_POST['suchbegriff'] != "") { $treffer = array(); $treffer_final = array(); $subdirs = array(); //Hauptfunktion der suche //Schritt 1: Alle vorhanden Unterordner aufspüren //Schritt 2:: Alle nach den gesuchten Dateien durchsuchen function search($dir) { global $subdirs, $treffer, $treffer_final; $subdirs[] = $dir; $dirh = opendir($dir); while($filename=readdir($dirh)) { if($filename!=".." && $filename!=".") { if(is_dir($dir.$filename)) { $subdirs[]=$dir.$filename."/"; searchSubdirs($dir.$filename."/"); } } } for($i=0;$i<count($subdirs);$i++) { findFile($subdirs[$i]); } foreach($treffer as $ziel) { $treffer_final[] = $ziel; } } //Durchsucht auschließlich die Ordner und prüft ob dort Unterordner enthalten sind function searchSubdirs($dir) { global $subdirs; $dirh = opendir($dir); while($filename=readdir($dirh)) { if($filename!=".." && $filename!=".") { if(is_dir($dir.$filename)) { $subdirs[]=$dir.$filename."/"; searchSubdirs($dir.$filename."/"); } } } closedir($dirh); } //Durchsucht einen Ordner nach der gesuchten Datei function findFile($dir) { global $treffer; $dirh=opendir($dir); while($filename=readdir($dirh)) { if($filename!=".." && $filename!=".") { if(is_file($dir.$filename)) { $pos = strpos($filename, $_POST['suchbegriff']); if ($pos === false) { } else { $treffer[] = $dir.$filename; } } } } closedir($dirh); } search($_POST['dir']); //Am Ende alles schön auf dem Bildschirm anzeigen echo"<pre>"; print_r($treffer); print_r($subdirs); print_r($treffer_final); echo"</pre>"; } else { echo("Ohne Suchbegriff keine suche :-("); } ?>
Es gab keine Fehlermeldung da dein Script den Server überlastet hat. Deine Funktion war so konstruiert, dass es merhfach eine for Schleife erzeugt. Wenn man alle diese Schleifen aufschreiben würde, hätte sich folgendes Bild ergeben:
for($i=0;$i<count($subdirs);$i++) //Schleife 1 { for($i=0;$i<count($subdirs);$i++) //Schleife 2 { for($i=0;$i<count($subdirs);$i++) //Schleife 3 { //Es könnten noch mehr folgen } } }
Der Fehler ist folgender. Jede for Schleife testet die selbe Bedingung anhand der selben globalen Variable, stimmts? Das ist das Problem: Die Bedingung verändert sich innerhalb der for-Schleife. Denn deine Funktion search hängt ja an $subdirs ja weitere Daten ran, wenn sie Unterordner findet. Somit verändert sich das Ergebnis von count. So was ist nicht zu empfehlen, da sowas schnell auser kontrolle geraten kann und dann hängt sich das Script eben auf.
Ein weiterer Fehler war, wie du sehen kannst beginnt jede for-schleife mit einer neuen.
Ist jetzt schwer zu erklären, in einem Handbuch stehen 2 Seiten darüber drinne. Merke dir einfach, dass in einem Script immer nur eine for-Schleife gleichzeitig laufen darf. So ein Bild hier ist für den Server viel besser:
for(bedingung) { //Tu was } for(bedingung) { //Tu was }
Der Server wirds dir danken^^
Solltest du etwas nicht verstanden haben frage einfach.
mfg draconien
Beitrag geändert: 19.8.2007 8:24:38 von draconien -
Danke, alles perfekt.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage