Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Newbie braucht Hilfe bei Schleife [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Newbie braucht Hilfe bei Schleife


 
kerzendocht
02-08-2003, 08:08 
 
Hallo,

ich benutze folgende Schleife, um Datensätze aus MySQL auszulesen und zu bearbeiten:


$query = "SELECT * FROM tabelle1";
$result = mysql_query ($query);
while ($line = mysql_fetch_array($result)) {
extract($line);
$query2 = "SELECT * FROM tabelle2";
$result2 = mysql_query ($query2);
while ($line2 = mysql_fetch_array($result2)) {
extract($line2);
if ($feld1_aus_tabelle2 == $feld1_aus_tabelle1) {
$returncode = machwas($feld2_aus_tabelle1,$feld3_aus_tabelle1,$feld2_aus_tabelle2,$feld3_aus_tabelle2);
}
}
}


Mein Problem ist, daß ich etwa 5000 Datensätze so bearbeiten muß, das Script aber anscheinend einen Timeout hat, da es nicht bis zum Ende "durcharbeitet".

Kann mir jemand bitte erklären oder noch besser zeigen, wie ich in diese Abfrage eine Schleife einbauen kann, so daß z.B. immer 100 Datensätze bearbeitet werden und dann die nächsten 100 u.s.w.?

Vielen Dank!

 
Günni
02-08-2003, 09:56 
 
Mach es doch einfacher:

$result = mysql_query("SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.Feldname = tabelle2.Feldname");
while($row = mysql_fetch_array($result))
{
// Mache was
}


So bekommst du dann nur die betroffenen Datensätze heraus die miteinander übereinstimmen.

 
kerzendocht
02-08-2003, 11:33 
 
Hallo Günni,

danke erstmal für Deinen Tip!

Nun fehlt mir nur noch die Logik, wie ich Timeouts verhindern kann, also z.B. zuerst feststellen, wieviele Datensätze betroffen sind und dann diese irgendwie mit LIMIT dann jeweils 100 bearbeiten, ein kleines Päuschen machen und dann die nächsten 100 ... gibt es da für mich auch noch einen Tip?

Danke sehr!

 
Günni
02-08-2003, 12:42 
 
Lass einen Counter in der Whileschleife mitlaufen und bei 100 machen dann eine kleine Pause und setze den Counter wieder auf 0. Danach wieder was selbe spiel, bis alle Tupel durch sind.

 
Trashar
02-08-2003, 13:10 
 
für die pause wär sleep(10); ganz geeignet denk ich ma..

 
Günni
02-08-2003, 13:35 
 
@Trashar
Das war auch dies an was ich gedacht habe

 
Trashar
02-08-2003, 13:40 
 
Original geschrieben von Günni
@Trashar
Das war auch dies an was ich gedacht habe

wir ergänzen uns ganz gut! :D

 
kerzendocht
02-08-2003, 14:21 
 
Ihr ergänzt Euch ganz prima, wäre nur jetzt noch die Krönung, wenn mir als Newbie einer von Euch einen Beispiel-Code geben könnte ;)

 
Trashar
02-08-2003, 14:31 
 
$result = mysql_query("SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.Feldname = tabelle2.Feldname");
$i = 1;
while($row = mysql_fetch_array($result))
{
// Mache was

if($i == 100) {
sleep(10);
$i=1;
}
$i++;
}

 
Günni
02-08-2003, 14:32 
 
http://www.php.net/manual/de/function.sleep.php

 
kerzendocht
02-08-2003, 14:38 
 
Danke sehr!

Macht es nicht mehr Sinn, die MySQL-Abfrage in 100er Schritten (irgendwie mit LIMIT) durchzuführen, um dem Timeout entgegenzuwirken?

 
Günni
02-08-2003, 15:09 
 
Da gibt es mir sicherheit auch eine möglichkeit...


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:29 Uhr.