Php code nach html-display ausführen

Liebe/-r Experte/-in,
ich habe eine php-seite, in der viele SQL-Speicher-Abfragen ausgeführt werden müssen.

Ist es technisch möglich, das Speichern der Werte durchzuführen, nachdem die letzten „html“-Daten an den Browser gesendet wurden?

Beispiel:

<?php echo "Hallo Welt!";?><?php sende_fertig_meldung_an_browser();
mysql\_query("INSERT INTO results VALUES('Hallo Welt")); ?\>

Ich möchte den User nämlich ungern die „Speicherzeit“ warten lassen.

Vielen Dank,

Sven Schulze

Flush.

http://at.php.net/flush
bzw die ob_… sachen - siehe
http://at.php.net/ob_flush

Falls die Scripts lange laufen:
http://us2.php.net/manual/en/function.set-time-limit…

Alternativ: PHP mit SQL per system()-call aufrufen

Alternativ:
Forken.
http://us2.php.net/manual/en/function.set-time-limit…

Das Script rennt i.d.R. aber auch weiter, wenn der User was andres tut.

was ginge:
schick ihm ein JavaScript, das ihn auf eine andre Seite schickt oder mach ein META Redirect auf eine Bestätigungsseite, wenn der User das Ergebnis nicht braucht.

Hallo Sven,

generell ist das schon möglich. So wie es in dem
Codebeispiel beschrieben ist, wird das aber nicht
funktionieren. Wir benötigen dafür Javascript und AJAX.
Der PHP-Code muss vollkommen in eine externe PHP-Datei
ausgelagert werden.

Die PHP Datei beinhaltet dann den Datenbankzugriff, z.B.
so:

getData.php:

 $sql = "SELECT \* FROM TABELLE;";

 mysql\_connect("server", "benutzername", 
"passwort") or die("Fehler: Verbindung zur Datenbank 
konnte nicht hergestellt werden!");
 mysql\_select\_db("datenbankname") or die("Fehler: 
Verbindung zur Datenbank konnte nicht hergestellt 
werden!");

 $resQuery = mysql\_query($sql);
 $row = mysql\_fetch\_array($resQuery);

 $result = "

";

$result .= „Testdaten 1:blush:row[0]“;
$result .= „Testdaten 2:blush:row[1]“;
$result .= „“;

echo $result;
?>

Nun brauchen wir noch die HTML Datei in welcher per
Klick auf einen Button ein Javascript aufgerufen wird,
welches das PHP-File ausführt und das „echo“ der Datei
in einem bestimmten Bereich im body ausgibt.

mySite.html:

 function AJAXfunction()
 {
 var xmlHttp;
 try
 {
 xmlHttp=new 
XMLHttpRequest();
 }
 catch (e)
 {
 try
 {

xmlHttp=new ActiveXObject('Msxml2.XMLHTTP');
 }
 catch (e)
 {
 try
 {

xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
 }
 catch 
(e)
 {

alert('Dein Browser kann kein AJAX! Verwende bitte einen 
anderen Browser!');
 return 
false;
 }
 }
 }

xmlHttp.onreadystatechange=function()
 {

if(xmlHttp.readyState==4)
 {

document.getElementById('divContainer').innerHTML = 
xmlHttp.responseText;
 }
 }

xmlHttp.open('GET','getData.php',true);
 xmlHttp.send(null);
 }
 Noch nichts 
da... 

Wenn das ganze automatisch ausgeführt werden soll, kann
man das PHP-Skript auch in „“ einsetzen,
und eine Abfrage einbauen, das die Daten erst nachdem
laden der HTML-Seite ausgeführt wird.

Achtung: Wenn viele Daten abgeholt werden, rät es sich
beim Javascript im „if-Zweig“ von ReadyState, noch eine
else-Verzweigung einzubauen in welcher im angegebenen
Bereich eine Info angezeigt wird, in welcher über das
Laden der Daten informiert wird.

Ich hoffe ich konnte helfen.

Viele Grüße,
VBMichi

ich habe eine php-seite, in der viele SQL-Speicher-Abfragen
ausgeführt werden müssen.

Ich möchte den User nämlich ungern die „Speicherzeit“ warten
lassen.

Wie viele Millionen von „SQL-Speicher-Abfragen“ willst Du denn ausführen lassen, dass der User warten müsste?

Hallo Sven,

gute Frage, aber wenn man kurz darüber nachdenkt, eigentlich ganz einfach mit einem „normalerweise nicht“ zu beantworten.

Jede vom PHP-Prozessor zu interpretierende Datei wird ja zunächst vom PHP-Prozessor abgearbeitet. Direkt beim Aufruf der Datei zu bestimmen, dass irgend ein Teil vorab als HTML ausgegeben werden soll, wird daher nicht gehen.

Abgesehen davon, dass ich mir eigenlich gar nicht vorstellen kann, dass die Speicherzeit zu unerträglichen Wartezeiten führt (was speicherst Du denn da?) werden auch alle „Umwege“, mit denen man Dein Problem lösen könnte nur neue Probleme mit sich bringen.

Eine Möglichkeit wäre ja, die SQL-Abfragen in einem Frame oder Iframe auszuführen (geht natürlich nicht, wenn da POST-Daten verarbeitet werden müssen, sondern nur mit GET).
Oder man nutzt AJAX und weißt den Server im Hintergrund per JS an, die Abfragen auszuführen.

Der entscheidende große Haken in beiden Fällen dürfte der mögliche Verbindungsabbruch sein. Wenn ich auf dem Bildschirm lese „alles ok“, irgendein Skript aber noch 10 weitere Sekunden braucht, bin ich schon lange auf ner anderen Seite.
Deswegen macht es schon Sinn, die Erfolgsmeldung nicht vorzeitig zu liefern.

Und im Ajax-Fall hat man natürlich zusätzlich die Unsicherheit, dass der User im Browser zu hohe Sicherheitsbeschränkungen eingestellt haben könnte.

Viele Grüße,
Dietmar

Liebe/-r Experte/-in,
ich habe eine php-seite, in der viele SQL-Speicher-Abfragen
ausgeführt werden müssen.

Ist es technisch möglich, das Speichern der Werte
durchzuführen, nachdem die letzten „html“-Daten an den Browser
gesendet wurden?

Hallo Sven,
selbstverständlich kann man auch nach einer Ausgabe zum Browser die Daten per Datenbank speichern.

Der zu Speichernde Wert muss hierzu in einer Variable stehen:
Bsp:

<?php function sende_fertig_meldung_an_browser($var) {
print 'Es wurde **'.$var. angegeben'; return; } $var = "Hallo Welt"; # Ausgabe sende\_fertig\_meldung\_an\_browser($var); # Speichern mysql\_query("INSERT INTO results VALUES('$var')"); ?\> Meiner Meinung nach macht dies jedoch von der Usability wenig Sinn. Oftmals möchte man die korrekte Datenspeicherung vor Ausgabe überprüfen (Bsp. nach Eingabe von Daten in ein Formular). Dies ist bei vorigem Beispiel nicht möglich. Eleganter und sinnvoller: <?php function sende_fertig_meldung_an_browser($var) {
print 'Es wurde '.$var. angegeben'; } $var = "Hallo Welt"; # Speichern mysql\_query("INSERT INTO results VALUES('$var')); if (mysql\_errno == 0) { # Ausgabe sende\_fertig\_meldung\_an\_browser($var); } else { gebe\_fehlermeldung\_an\_browser(); } ?\> Bei extremen Datenbankzugriffen sollte eher das Datenbankdesign überdacht werden oder eine Optimierung der Datenbankabfragen durchgeführt werden (z.Bsp. mittels Joins in mehrere Tabellen schreiben). Gruss Frank**