PHP hängt bei for each
-
Ich habe in mein Code eine Foreach Schleife.
Diese prüft Checkboxes zwischen 15-50 an der Zahl.
Die Schleife klappt auch, aber es wird erst wenn alle Elemente ausgewertet wurden, der Text angezeigt der Pro Durchgang kommen sollte. So schliessen viele User die Seite oder reloaden und so werden nicht alle Aktionen ordnungsgemäß abgearbeitet.Ich frag pro foreach eine MYSQL DB ab, die Werte passenn auch. Aber 1-2 Minuten sind doch etwas zu lang. Wenn ein einzel Durchgang, maximal 3 Sekunden dauert.
-
Ohne Code bleibt zur Problembeurteilung wohl nur der Blick in die Glaskugel ...
-
foreach ($angebot as $value) { $result=mysql_query("SELECT * FROM anbieter WHERE name = '$value'",$connection) or die("Anfrage nicht erfolgreich"); $mailtext .=$value." , "; while ( $row = mysql_fetch_array ( $result ) ) { if($row['angebot']=="beispiel") { //coennect_to_host //Nur 1/3 aller Aufrufe werden abgebarbeitet } if($row['angebot']=="test") { //coennect_to_host //Nur 1/3 aller Aufrufe werden abgebarbeitet } } } {
Irgendwo muss ein Leck sein. Ich hab natürlich nicht nur ein if sondern rund 30.
Ich verliere pro falschen Aufruf(nicht ordnungsgemäß ausgeführt), bares Geld. Was die Sache so dringend macht.Wo ist der Fehler?
elseif statt immer nur if?
Oder lieber ne Case?Oder sorgt die immer wiederkehrende DB Abfrage, für die Lecks?
Man muss sich das Verhalten folgendermaßen vorstellen.
Die foreach läuft bei einen ordnungsgemäß ausgefüllten Formular los.
Greift einen Anbieter aus der DB ab.
Prüft ob der Anbieter, ein Beispielangebot besitzt. Ist dies der Fall, springt eer in die if. Nach der if sollte er etwas quittieren, dies tut er aber nicht sondern erst wenn alle foreachs Elemente geprüft sind. Dafür denn aber auch alle auf einmal.Meine Beobachtung, ist das er nicht alle if#s verarbeitet sondern irgendwie welche auslässt.
Bei 10 Beschwerden und mehrere Euro Verlust, ist das ein akutes Problem.
-
Was hast Du von einer Serversprache erwartet?
Die Anfrage wird an den Server gesendet und dieser verarbeitet sie.
Dies dauert nunmal seine Zeit. Insbesondere wenn du auch noch rund 50 Abfragen machst die vermutlich auch lange dauern.
IN der Zeit sieht vermutlich der Client (Browser) nur ein neuladen der Seite.
Du könntest auf AJAX umsteigen und dem Browser etwas anzeigen das er warten soll oder ähnliches.
Oder überlege Dir wie du die vielen Querys wegbekommst.
-
dazu noch:
hast du die maximum excecution time hochgesetzt?
wie ist dein server eingestellt?
-
Die while Schleife würde wegfallen, und nur ein einfaches abfragen, wäre ja etwas weniger(wobei ich bezweifel das es was bringt da nur einmal die while Schleife ausgeführt wird).
Was wäre jetzt weiter wichtig? Das nur eine DB Anfragge gestartet wird? Und ich alle aufeinmal einlese und zuweise? Würde ja rund 10-15 DB Anfragen weniger sein.
-
uU reicht auch ein flush() innerhalb der schleife damit du dem user zeigst dass sich etwas tut.
eine schoenere variante ist natuerlich ueber ajax - aber die ist auch umstaendlicher...