Problem mit Header und Counter

TvP

Erfahrenes Mitglied
Hallo @all.

Ich habe ein Programm geschrieben, welches mir ein Bild aus der Datenbank läd und auf den Bildschirm ausgeben soll.

Hierfür setze ich den Header:
PHP:
        HEADER('Content-Type: image/jpg');

Das Bild wird auch ausgegeben, nur leider wird der Counter, in meiner Datenbank immer um 2 hochgezählt. (Mir scheint, dass durch das setzen des headers am Anfang des Scripts, die Datei 2 mal geladen wird).

Dies geschieht aber auch nur, wenn ich den header gesetzt habe. Sonst wird der Counter nur um 1, so solls ja auch sein hochgezählt.

Kennt denn wer ne Lösung für das Problem?
 
Das Setzen eines Header-Felds ist bestimmt nicht dafür verantwortlich, dass ein Counter um zwei erhöht wird. Wie sehen denn die relevanten Stellen des gesamten Skripts aus?
 
Gumbo hat gesagt.:
Das Setzen eines Header-Felds ist bestimmt nicht dafür verantwortlich, dass ein Counter um zwei erhöht wird. Wie sehen denn die relevanten Stellen des gesamten Skripts aus?

Es findet eine Datenbankabfrage statt, dass Bild wird per FOpen, FRead geladen und per Echo an den Client weitergeleitet.
Um genau zu sein ist es genau die Zeile, nehme ich die Headeranweisung raus, wird der Inhalt, z.B. jpeg als Text angezeigt, der Counter zählt richtig, habe ich die Headeranweisung drin, wird der Counter immer um 2 hochgezählt.

PHP:
<?
IF (IsSet($_GET['id']) && Is_Numeric($_GET['id']))
    $sql = 'SELECT id,filename FROM '.TABLE_BILDER.' WHERE id = "'.mysql_real_escape_string($_GET['id']).'";';
ELSEIF (IsSet($_GET['name']))
    $sql = 'SELECT id,filename FROM '.TABLE_BILDER.' WHERE realname = "'.mysql_real_escape_string($_GET['name']).'";';
ELSE {
    DIE();
}

$res = SQL_Query($sql) OR SQL_Error(__FILE__,__LINE__);
$num = mysql_num_rows($res);
IF ($num>0) {
    $d01 = mysql_fetch_assoc($res);
    IF (File_Exists($root.'images/'.$d01['filename'])) {
        $fp = FOpen($root.'images/'.$d01['filename'],'r');
        $fd = FRead($fp,FileSize($root.'images/'.$d01['filename']));
        FClose($fp);
        
        $sql = 'UPDATE '.TABLE_BILDER.' SET counter = counter + 1 WHERE id = "'.$d01['id'].'"';
        $res = SQL_Query($sql) OR SQL_Error(__FILE__,__LINE__);
        
        LIST($name,$ext) = Explode('.',$d01['filename']);
        HEADER('Content-Type: image/'.$ext);        

        ECHO $fd;
    }
}
?>

SQL_Query kann gegen mysql_query ersetzt werden, macht genau das Gleiche hat nur noch nen Debug-Management drinnen und SQL_Error kann gegen DIE() ersetzt werden,
hat den gleichen effekt.

Wie gesagt, ohne Header wird der Counter korrekt hochgezählt, mit Headeranweisung
zählt er ihn um 2 hoch.

Gruß TvP
 
Ich glaube zwar nicht, dass sich viel ändern wird, aber probier mal Folgendes:
PHP:
if( file_exists($root.'images/'.$d01['filename']) ) {
	$query = 'UPDATE '.TABLE_BILDER.' SET `counter` = `counter` + 1 WHERE `id` = "'.$d01['id'].'"';
	SQL_Query($query) OR SQL_Error(__FILE__,__LINE__);

	list($name, $ext) = explode('.', $d01['filename']);
	header('Content-Type: image/'.$ext);
	readfile($root.'images/'.$d01['filename']);
	exit;
}
 
Probier jetzt schon seit 2 Tagen, irgendwie hauts nicht hin.
Hat denn jemand evt. ne Vermutung, warum das Script 2mal geladen wird,
sobald in den Header setze?
 
das ganze basiert darauf, dass die Bilder auf dem Server mit verschlüsseltem Dateinamen gespeichert werden.
Die Datenbankabfrage holt mir zur ID oder zum Namen den passenden Link zur Datei und liest den Bildinhalt ein.
Ebenso soll der Counter um einen hochgezählt werden.
Da es sich um ein Bild und nicht um Text handelt, ändere ich den Header und gebe per echo den Inhalt der Datei an den Client.

Hab schon überlegt, eine nicht so elegante Lösung zu nutzen. Ich hol mir den Dateinamen aus der Datenbank, zähle den counter um einen hoch und gebe per Header(Location) an ein 2tes Script den Dateinamen weiter.

Dieses Script würde dann den Inhalt laden und an den Client weitergeben. Auf jeden Fall wäre damit hoffentlich die doppelte DB-Abfrage vom Tisch.

Oder weiß wer noch ne andere Lösung?
 
Ich bin auch grad auf dieses Problem gestossen, und nach etwas Spielerei behaupte ich, dass es ein Browser-Problem ist.
Ich nehme an Du hast mit Firefox getestet? ;)

Warum? Firefox ruft die Datei 2 mal auf, Konqueror, Internet Explorer und Opera nicht. Selbst mit Mozilla klappt es. Lediglich Firefox macht Probleme, sowohl unter Linux als auch unter Windows.
Wie bin ich drauf gekommen? Der gute, alte Wireshark (vormals Ethereal) hat es mir verraten.
Was kann man dagegen tun? Gute Frage. Heute hat mir mein Firefox angezeigt, dass es ein Update gibt. Vielleicht ist die Sache damit gegessen. Moeglicherweise, aber ich denke es ist unwahrscheinlich, gibt es eine Einstellung im FF die das verhindert. Scriptseitig wird man da wohl nichts drehen koennen.

Das scheint mir also ein Problem zu sein mit dem man erstmal leben muss. Falls das Update nichts bringt werd ich mal in die Bugliste schauen und gegebenenfalls gucken wo ich da mal anklopfen kann.

Nachtrag: Auch das Update auf 1.5.0.5 hat nichts gebracht.
 
  • Gefällt mir
Reaktionen: TvP
Zurück