php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.04.2006, 10:13  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard Problem mit Header-Senden und DB-Zugriff

Hallo,

ich hab ein sehr seltsames Phänomen entdeckt und kann es nach langem Suchen eingrenzen, aber nicht ganz erklären:

Ich lasse per PHP-Skript eine Datenbank-Abfrage durchführen: "UPDATE ... SET feld=feld+1 ..."
Dabei lud ich die Seite mehrfach neu und prüfte nach jedem Mal die Werte mit einem externen Programm in der Datenbank.
Dabei stellte ich fest, dass bei jedem 2. Reload der Seite, das Update (bzw. mein Skript) wohl 2x ausgeführt werden muss: der Werte war nämlich um 2 erhöht worden. Dies hab ich mit ähnlichen DB-Abfragen durchgeführt, um einen Fehler der Operation "feld=feld+1" auszuschließen.
Weiter stellte ich fest, dass dieses Problem nur mit dem Firefox-Browser (benutze 1.0.7) auftrat. Bei IE und Opera nicht.
Nach weiterem Suchen konnte ich das Problem eingrenzen:
Mein Skript sendet einen Header ( header (...) ).
Kommt vor diesem Befehl eine Ausgabe, dann kann ja der Header nicht mehr gesendet werden. Und genau dann tritt mein Problem auf, sonst nicht.

Natürlich programmiere ich so, dass dieser Fehler im Praxisbetrieb nicht auftreten dürfte, aber warum trat er auf als der Header nicht gesendet werden konnte und warum nur bei jedem 2. Mal?

Danke
ajo_silent ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 07.04.2006, 10:32  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Vielleicht weil der Header einen Refresh bewirkt?

Ohne Beispiel können wir auch nur raten...
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline   Mit Zitat antworten
Alt 07.04.2006, 10:58  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard

nein, es ist kein Refresh-Header, sondern es wird ein Zeichensatz-Header gesendet.

Beispiel, wo der Fehler auftritt:

PHP-Code:
<?php
echo 'test';
header('Content-Type: text/html; charset=utf-8');

# connect to db ...
mysql_query('UPDATE ... SET feld=feld+1');
?>
ajo_silent ist offline   Mit Zitat antworten
Alt 07.04.2006, 11:17  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

wie wärs mit ob_start(); zu arbeiten und sämtliche ausgaben in nen puffer umzuleiten ?

aber ist ja kein grund deswegen aus dem letzen thread ins profiforum umzuziehen, da lesen und schreiben die gleichen leute ...
robo47 ist offline   Mit Zitat antworten
Alt 07.04.2006, 11:32  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard

der Umzug ist denke ich gerechtfertigt, weil es eine völlig neue Frage ist. Mein UTF-8-Problem hat damit nichts zu tun. Außerdem denke ich, dass dieses abnormale Server-Verhalten kein Gesprächsstoff für Anfänger oder Fortgeschrittene ist...

LG

André
ajo_silent ist offline   Mit Zitat antworten
Alt 07.04.2006, 11:33  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard Re: Problem mit Header-Senden und DB-Zugriff

Hi "ajo_silent".

Ich check dein Problem nicht!

Zitat:
Zitat von ajo_silent
Dabei lud ich die Seite mehrfach neu

[...]

Dabei stellte ich fest, dass bei jedem 2. Reload der Seite, das Update (bzw. mein Skript) wohl 2x ausgeführt werden muss

[...]

Mein Skript sendet einen Header ( header (...) ).
Kommt vor diesem Befehl eine Ausgabe, dann kann ja der Header nicht mehr gesendet werden. Und genau dann tritt mein Problem auf, sonst nicht.
Das heißt doch, du selndest einen Location-Header, der funktioniert nicht, weil zuvor eine Ausgabe erfolgte und dennoch läd die Seite neu und bei jedem zweiten Mal sogar doppelt? Also läd die Seite nun neu oder nicht? Und tritt der Fehler auf, wenn sie neu läd oder wenn sie eben nicht neu läd? Oder läd sie nur jedes zweite mal neu und dann gleich doppelt?

Irgendwie ziemlich wirr.

Basti
Basti ist offline   Mit Zitat antworten
Alt 07.04.2006, 11:52  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard

ganz einfach erklärt:

Zum Testen, ob meine Update-Funktionalität funktioniert, habe ich per F5-Taste die Seite mehrfach neu geladen und nach jedem Neuladen in der DB geschaut, ob der Wert korrekt um 1 erhöht wurde.
Ich stellte fest, dass der Wert manchmal um 2 erhöht wurde.
Daraus schlussfolgerte ich, dass die DB-Abfrage bzw. mein Skript an dieser Stelle zweimal durchgeführt worden sein muss, obwohl ich nur ein Mal auf F5 drückte.

Und dieses seltsame Verhalten (Wert wird um 2 erhöht) tritt nur beim Firefox auf UND wenn er den header nicht korrekt senden konnte.
ajo_silent ist offline   Mit Zitat antworten
Alt 07.04.2006, 13:13  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Du hast also ein Skript, dass ohne dieses echo 'test'; funktioniert. Mit diesem echo 'test'; lässt du es dann auch mal laufen und lädst die Seite dabei mehrmals neu, ohne das Skript zwischenzeitlich zu verändern und dabei wird die DB-Query irgendwie bei jedem zweiten Aufruf doppelt ausgeführt, richtig?

Druck hier doch mal den kleinsten Quellcode ab, mit dem der Fehler noch auftritt.

Basti
Basti ist offline   Mit Zitat antworten
Alt 07.04.2006, 13:59  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard

zu deinem ersten Absatz: korrekt erkannt

Leider kann ich keinen Quellcodeauszug machen, weil es ein großes
PHP-System ist, was ziemlich modular aufgebaut ist. Da es ein laufendes
System ist, an dem noch andere Leute arbeiten, kann ich da nicht einfach
rumändern, um zu gucken, ab wann ein Fehler auftritt.
Aber schematisch ist es so (leider funktioniert alles korrekt in dem
Beispiel; konnte es so nicht reproduzieren):
PHP-Code:
<?php
<?php


$con_ 
mysql_connect('...''...''..');
mysql_select_db('...'$con_);

@
mysql_query("UPDATE ...SET clicks=clicks+1 WHERE id=1002;");
echo 
'hallo';


header('Content-type: text/html; charset=UTF-8');



?>
<html>
...
<body>
...
</body>
</html>
?>
ajo_silent ist offline   Mit Zitat antworten
Alt 07.04.2006, 14:09  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Also eigentlich darf echo 'hallo'; nicht vor header(...); kommen wenn die Ausgabe nicht gepuffert wird!
Flor1an ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
header Problem Shyne PHP Tipps 2008 9 18.02.2008 08:55
https header und Cookie TailerD PHP Tipps 2008 5 26.01.2008 19:54
header() ??? TeazY PHP Tipps 2008 9 11.01.2008 15:40
header problem, denn downloaddialog öffnet nicht leuktra PHP Tipps 2006 13 31.08.2006 13:51
Problem mit Webradio senden (zu leise) (WINAMP) Off-Topic Diskussionen 7 09.08.2005 13:54
daten senden problem PHP Tipps 2005-2 14 29.07.2005 18:54
Datei-Download: Problem mit Header PHP-Fortgeschrittene 11 07.07.2005 00:22
header erneut senden PHP Tipps 2005 6 05.04.2005 14:55
[Erledigt] Datei selber nach einer Abfrage senden, header() geht nicht? PHP Tipps 2005 2 23.02.2005 05:58
Redirect mit Header - Problem PHP Tipps 2005 3 22.02.2005 10:28
Problem mit header PHP-Fortgeschrittene 1 09.02.2005 23:10
header problem aircrash PHP Tipps 2005 13 20.01.2005 23:04
xfdf Datei mit PHP an eMail senden Problem: Leere Datei PHP Tipps 2004-2 1 07.12.2004 12:25
header problem PHP Tipps 2004 8 08.08.2004 00:35
Problem mit Header und $HTTP_REFERER PHP Tipps 2004 4 11.07.2004 12:21

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
header neu senden, php header neu senden, php header erneut senden, \jedem zweiten mal\ internet explorer, php mehrmals header schicken, header nicht senden firefox, firefox header nicht senden, php sendet header zweimal, header \nicht senden\, php skript wird doppelt ausgeführt header, php header zweimal senden, php header mehrmals, mehrmals header absenden, php header nach db-abfrage, header db datenbank, fehlermeldung header doppelt geschickt, php ich drücke einmal senden es wird doppelt ausgeführt, firefox führt php doppelt, php header wird 2 mal gesendet, header wird zweimal ausgeführt

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:14 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.