Browser bricht Ausführung eines Scripts ab

Foickert

Well-known member
9 August 2006
59
0
Hey Leute,

ich habe ein kleines PHP Script programmiert, mit dem ich rund 200.000 Zeilen aus einer Datenbank löschen möchte.

Wenn ich das Script mit dem Firefox oder auch IE starte, dann dauert es ungefähr 10 Sekunden, bis die Ausführung des Scripts gestoppt wird!

Der Firefox zeigt mir dann komischerweise an, dass er die .php Datei herunterladen will und der IE bringt eine Meldung "Seite kann nicht angezeigt werden", was ja gar nicht stimmt, da das Script tatsächlich ausgeführt wurde.

Da das Script eben nur ca. 10 Sekunden läuft, können immer nur rund 1.000 Zeilen gelöscht werden.

Woran liegt das?? Liegt der Fehler in den Browsern, an meinem Server (Hosteurope), oder kann man in das Script einen Code einplegen, der den Stopp des Scripts unterbindet?

Danke für eure Hilfe!!
 
(set_time_limit(0));
ignore_user_abort (0);


das erste setzt das limit vom server aus, und durch das zweite wird das script ausgeführt, selbst wenn der Browser geschlossen wird. Daher auch vorsicht mit dem zweiten, nicht das man eine endlosschleigfe nutzt!!

P.S. eigentlich sollte das löschen nicht so lange dauern, auser du gibst natürlich nach jedem löschen etwas aus, dann dauert das natürlich einiges länger... ansonsten sollte selbst löschen von 200k zeilen in ca. ner sek. ausgeführt werden (naja jenachdem wie das script aussieht...)
 
Das funktioniert leider noch nicht.

Hier nochmal mein Script:

PHP:
(set_time_limit(0)); 
ignore_user_abort(0);

include("DATENBANK");

$query = mysql_query("SELECT * FROM ..");
while ($result = mysql_fetch_assoc($query)) {
$jahr = $result["jahr"];

if ($jahr == 2006) {
$query2 = mysql_query("DELETE FROM .. WHERE jahr='$jahr'");
}

}
 
Ähm dein script ist ja auch sinnfrei...

Du nimmst erstmal alle daten aus der db, und wenn das jahr gleich 2006 ist, dann löscht du alle daten wo das jahr 2006 ist...

Wieso nicht also gleich alle nur löschen wo das jahr 2006 ist?

Kleines beispiel.

Du nimmst 5 zeilen wo folgende jahre vorkommen:

2006
2006
2006
2007
2007


Nach der ersten zeile werden bereits alle gelöscht die das jahr 2006 haben, aber dein script wird dennoch ncoh weitere 4 mal ausgeführt... Obwohl gar keins mehr mit 2006 vorhanden sein kann...
 
Für was das select? Wenns die gleiche Tabelle ist, ist das select doch unnötig... (selbst wenns nicht die gleiche Tabelle ist, kann man das mit einem Query machen)
Mal davon abgesehen dass "select *" schonmal nicht gerade toll ist. Wenn du nur das Jahr brauchst, selektiere auch nur das Jahr.

Ansonsten versteh ich dein Problem nicht. Das Script würde doch folgendermaßen das gleiche machen:

PHP:
set_time_limit(0);
ignore_user_abort(0); 
 
include("DATENBANK"); 
 
mysql_query("DELETE FROM .. WHERE jahr='2006'");

Wenn nicht, dann solltest du mal genau erklären was du willst. Dein Beispielcode ist auf jeden Fall nicht so toll. Der obige delete-query würde vollkommen ausreichen.
 
Ok, sorry!!

Ich habe das Script ein bisschen gekürzt, als ichs hier reingesetzt hatte.

Das Original sieht so aus:

PHP:
(set_time_limit(0)); 
ignore_user_abort(0);

include("DATENBANK");

$query = mysql_query("SELECT datum FROM ..");
while ($result = mysql_fetch_assoc($query)) {
$datum = $result["datum"];
$bla = explode("-",$datum);
$jahr = $bla[2];

if ($jahr == 2006) {
$query2 = mysql_query("DELETE FROM .. WHERE datum='$datum'");
}

}

Jetzt sollte es auch einen Sinn ergeben! ;)
 
Ähm auch die ungekürzte Fassung macht keinen Sinn?!

Außerdem: Wie ich sehe speicherst du das Datum so in der Datenbank: 01-01-2007
Schau dir mal das Thema timestamp an.
 
wie wäre es einfach mal mit
PHP:
DELETE FROM tabelle WHERE YEAR(datum) = 2006

dein script läuft ewig und 3 tage wenn du wirklich dort ein paar mehr datensätze drin hast.
 
Richtig! Ich speicher das Datum in diesem Format: 01-01-2007

Deshalb funktioniert das was ZeroCCC vorgeschlagen hat leider auch nicht. Sonst wärs schön!!

Ähm auch die ungekürzte Fassung macht keinen Sinn?!

Wieso macht die keinen Sinn?

Ok, Timestamp ist vielleicht eine bessere Lösung, aber ich werde meine Datenbank und Scripte jetzt nicht wegen diesem einen Löschvorhaben total umstellen.. da drück ich ja lieber 100x die Browser-Refresh-Taste.

Aber nun zurück zu meinem eigentlichen Problem!
Wieso wird das Script nach ca. 10 Sek abgebrochen, trotz der beiden Funktionen set_time_limit und ignore_user_abort?

Danke!
 
JUHUU!

Das ist der richtige Befehl! Danke.

Wenn ich jetzt alle Zeilen von Januar 07 löschen wollen würde,
dann

LIKE '%-01-2007'

oder?
 
Vielleicht noch als Erklärung dazu: Das % steht für etwas beliebigem. Es ist also ein Platzhalter.
Probiers im PHPMyadmin in der Suche aus. %test% findet alles, was das Wort test enthält. Egal ob davor oder dahinter etwas steht.