Code wird doppelt ausgeführt - warum?
Der Markus
- php
0 bleicher0 EKKi0 dedlfix
0 Der Markus0 dedlfix
Hallo an alle,
eigenartiges Problem: ein Codeschnipsel, der in keiner Schleife liegt, sondern für sich allein steht, wird offenbar doppel durchlaufen. Es ist in jede Fall browserunabhängig, FF und IE erzeugen das gleiche Verhalten. Kennt jemand dieses Phänomen. Vielleicht bin ich auch einfach nur zu blind.
// change sort order up
if(isset($_GET['categories_up'])) {
$categories_up = mysql_real_escape_string($_GET['categories_up']);
// get the current sort order
$categories_up_sort_order_query = mysql_query("SELECT categories_sort_order FROM categories WHERE categories_id = '$categories_up'");
while($row = mysql_fetch_object($categories_up_sort_order_query))
{
$categories_up_sort_order = $row->categories_sort_order;
}
// set category with sort order +1 to sort order -1
$categories_next_sort_order = $categories_up_sort_order + 1;
echo $categories_up_sort_order . $categories_next_sort_order;
$update_categories_next = "UPDATE categories SET categories_sort_order = '$categories_up_sort_order' WHERE categories_sort_order = '$categories_next_sort_order' && categories_parent = '$categories_parent'";
$update = mysql_query($update_categories_next);
// set own sort order 1 up
$update_categories_up = "UPDATE categories SET categories_sort_order = categories_sort_order + 1 WHERE categories_id = '$categories_up'";
$update = mysql_query($update_categories_up);
// nur zum testen, ob das Script doppelt durchlaufen wird, oder ob die db-operationen fehlerhaft sind
$fp = fopen('log.txt', 'a');
fputs($fp, 'X');
fclose($fp);
// output success
$message = 1;
output_success();
} // if(isset($_GET['categories_up']))
Auf der ganzen Seite finden sich mehrere solcher Segmente, die jedoch alle voneinander getrennt sind. Dies ist auch das einzige, das doppelt abgearbeitet wird. Alle anderen arbeiten einwandfrei.
Auf dem Server läuft php 4.3.8
Dank an alle, die sich das mal ansehen.
Grüße,
mod_rewrite aktiv? favicon fehlt?
hatte das nämlich mal - anfrage der favicon läief getrennt -und wurde von rewrite an die hauptdatei umgeleitet.
bleicher
mod_rewrite aktiv? favicon fehlt?
Danke fürs Ansehen. Nein, leider weder noch.
Mahlzeit Der Markus,
Es ist in jede Fall browserunabhängig, FF und IE erzeugen das gleiche Verhalten.
Ähm - sollte PHP-Code nicht *immer* browserunabhängig sein (wenn man nicht gerade auf Latrinenparolen à la $_SERVER["HTTP_USER_AGENT"] prüft)?
Auf der ganzen Seite finden sich mehrere solcher Segmente, die jedoch alle voneinander getrennt sind.
OMG, was für ein Spaghetticode ... bist Du Dir sicher, dass sich dieses Segment *nicht* in irgendeiner Datei befindet, die aus Versehen mehrfach inkludiert wird o.ä.?
MfG,
EKKi
Hi!
eigenartiges Problem: ein Codeschnipsel, der in keiner Schleife liegt, sondern für sich allein steht, wird offenbar doppel durchlaufen.
Nur dieser? Und der Code davor und danach nicht? Woran genau merkst du, dass er doppelt ausgeführt wird? Was hast du unternommen um das "offenbar" zu überprüfen?
Abgesehen davon,
$categories_up_sort_order_query = mysql_query("SELECT categories_sort_order FROM categories WHERE categories_id = '$categories_up'");
while($row = mysql_fetch_object($categories_up_sort_order_query))
{
$categories_up_sort_order = $row->categories_sort_order;
}
was ist denn das für ein Konstrukt? Du führst eine Schleife aus, in der du stets den vorhergehenden Wert ungenutzt überschreibst? Was willst du damit wirklich anstellen? Soll nur der letzte Datensatz aus deiner noch dazu unsortierten Menge verwendet werden? Dann kann man die Query effektiver umschreiben. Oder existiert nur ein einziger Datensatz, dann brauchst du keine Schleife zum Abfragen.
// set category with sort order +1 to sort order -1
$categories_next_sort_order = $categories_up_sort_order + 1;
echo $categories_up_sort_order . $categories_next_sort_order;
$update_categories_next = "UPDATE categories SET categories_sort_order = '$categories_up_sort_order' WHERE categories_sort_order = '$categories_next_sort_order' && categories_parent = '$categories_parent'";
$update = mysql_query($update_categories_next);
Wenn die in die Query eingefügten Variablen garantiert Zahlen sind, warum notierst du sie in Anführungszeichen? Wenn nicht, warum verwendest du kein mysql_real_escape_string()?
Warum prüfst du nicht, ob deine Querys erfolgreich abgearbeitet wurden? mysql_query() gibt im Fehlerfall ein anderes Ergebnis zurück.
// nur zum testen, ob das Script doppelt durchlaufen wird, oder ob die db-operationen fehlerhaft sind
$fp = fopen('log.txt', 'a');
fputs($fp, 'X');
fclose($fp);
Schreib doch da mal den Inhalt des $_SERVER-Arrays rein:
fputs($fp, print_r($_SERVER, 1));
Dann kannst du dir ansehen, welche Requests (nebst Referrer und so weiter) dieses Script erreicht haben.
Lo!
Schreib doch da mal den Inhalt des $_SERVER-Arrays rein:
fputs($fp, print_r($_SERVER, 1));
Dann kannst du dir ansehen, welche Requests (nebst Referrer und so weiter) dieses Script erreicht haben.
Hab ich gemacht, das ist das Ergebnis:
Array
(
[HTTP_ACCEPT] => image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
[HTTP_REFERER] => http://www.egal.de/test.php?categories_parent=0&categories_id_act=0
[HTTP_ACCEPT_LANGUAGE] => de
[HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_HOST] => www.egal.de
[HTTP_CONNECTION] => Keep-Alive
[HTTP_COOKIE] => PHPSESSID=fc6aa7cf5a93700d9f289cf338f14e86
[PATH] => /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
[SERVER_SIGNATURE] => <address>Apache/2.0.49 (Linux/SuSE) Server at www.egal.de Port 80</address>
[SERVER_SOFTWARE] => Apache/2.0.49 (Linux/SuSE)
[SERVER_NAME] => www.egal.de
[SERVER_ADDR] => 82.165.42.136
[SERVER_PORT] => 80
[REMOTE_ADDR] => 87.155.159.55
[DOCUMENT_ROOT] => /home/htdocs/stb4/html
[SERVER_ADMIN] => [no address given]
[SCRIPT_FILENAME] => /home/htdocs/stb4/html/admin/test.php
[REMOTE_PORT] => 4973
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] => categories_parent=0&categories_id_act=0&categories_up=5
[REQUEST_URI] => /test.php?categories_parent=0&categories_id_act=0&categories_up=5
[SCRIPT_NAME] => /admin/test.php
[PHP_SELF] => /admin/test.php
[PATH_TRANSLATED] => /home/htdocs/stb4/html/test.php
[argv] => Array
(
[0] => categories_parent=0&categories_id_act=0&categories_up=5
)
[argc] => 1
)
Array
(
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://www.egal.de/test.php?categories_parent=0&categories_id_act=0&categories_up=5
[HTTP_ACCEPT_LANGUAGE] => de
[HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_HOST] => www.test.de
[HTTP_CONNECTION] => Keep-Alive
[HTTP_COOKIE] => PHPSESSID=fc6aa7cf5a93700d9f289cf338f14e86
[PATH] => /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
[SERVER_SIGNATURE] => <address>Apache/2.0.49 (Linux/SuSE) Server at www.egal.de Port 80</address>
[SERVER_SOFTWARE] => Apache/2.0.49 (Linux/SuSE)
[SERVER_NAME] => www.egal.de
[SERVER_ADDR] => 82.165.42.136
[SERVER_PORT] => 80
[REMOTE_ADDR] => 87.155.159.55
[DOCUMENT_ROOT] => /home/htdocs/stb4/html
[SERVER_ADMIN] => [no address given]
[SCRIPT_FILENAME] => /home/htdocs/stb4/html/test.php
[REMOTE_PORT] => 4972
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] => categories_parent=0&categories_id_act=0&categories_up=5
[REQUEST_URI] => /test.php?categories_parent=0&categories_id_act=0&categories_up=5
[SCRIPT_NAME] => /test.php
[PHP_SELF] => /test.php
[PATH_TRANSLATED] => /home/htdocs/stb4/html/test.php
[argv] => Array
(
[0] => categories_parent=0&categories_id_act=0&categories_up=5
)
[argc] => 1
)
Offenbar wird die ganze Seite doppelt aufgerufen. Stutzig macht mich [REMOTE_PORT] => 4972 und beim nächsten mal ein anderer Port. Dürfte also einen gänzlich anderen Grund haben.
Hi!
Mal auf das Wesentliche zusammengestrichen:
[HTTP_REFERER] => http://www.egal.de/test.php?categories_parent=0&categories_id_act=0
[REQUEST_URI] => /test.php?categories_parent=0&categories_id_act=0&categories_up=5
2. Request
[HTTP_REFERER] => http://www.egal.de/test.php?categories_parent=0&categories_id_act=0&categories_up=5
[REQUEST_URI] => /test.php?categories_parent=0&categories_id_act=0&categories_up=5
Offenbar wird die ganze Seite doppelt aufgerufen.
Ja, und zwar einmal von anderswo her, und dann nochmal ein Selbstaufruf. Da ist bestimmt ein Verweis in der Seite, der den Browser veranlasst, was nachladen zu wollen. Script-, CSS- und Bild-Ressourcen fallen mir da als potentielle Ursachen ein. Wenn du durch Quelltextbetrachtung keine Unregelmäßigkeit findest (src="" oder ähnliches), kannst du nur versuchen, HTML-Code zu entfernen, bis der Fehler weg ist und dann im entfernten Teil genauer nachzusehen.
Stutzig macht mich [REMOTE_PORT] => 4972 und beim nächsten mal ein anderer Port. Dürfte also einen gänzlich anderen Grund haben.
Das ist normal. TCP/IP-Kommunikation läuft zwischen IP-Adresse und Port auf der einen Seite und einem ebensolchen Paar auf der anderen Seite ab. Der Server hat immer den selben Port, auf dem er lauscht, der Client nimmt für jeden Request einen anderen Port, damit er weiß, welche Pakete zu welchem Request gehören.
Lo!
Ja, und zwar einmal von anderswo her, und dann nochmal ein Selbstaufruf. Da ist bestimmt ein Verweis in der Seite, der den Browser veranlasst, was nachladen zu wollen. Script-, CSS- und Bild-Ressourcen fallen mir da als potentielle Ursachen ein.
Besten Dank. Damit komme ich weiter.