Page 1 sur 1

header('Content-Type: image/png'), scripts en double

Posté : 23 mars 2011, 20:46
par Castor Gaspard
Bonjour,

Je voudrai afficher une image dans une page et insérer dans une table des informations sur le navigateur.

L'appel de l'image est basique...
header('Content-Type: image/png');
$source = 'image.png';
$image = imagecreatefrompng('image.png');
imagepng($image);
imagedestroy($image);
Or, l'appel du header, avec header('Content-Type: image/png'), perturbe le déroulement de mon script : il est effectué deux fois, quand je rajoute un compteur, et ma table compte alors deux enregistrements. En revanche, si je mets en commentaires l'affichage de l'image, mon script se déroule normalement.

J'ai essayé de déporter dans un autre fichier l'ajout de l'image, puis le code d'insertion, mais rien ne change.

J'ai aussi voulu encadrer l'affichage par ob_start() et ob_end_flush(), sans plus de succès.

J'ai aussi modifié le header avant l'insertion dans la table avec header("Content-type: text/html; charset=utf-8"), mais la manipulation ne fonctionne pas non plus. :cry:

Auriez-vous des idées ? :mrgreen:

Merci.

Cordialement,

Gaspard

Re: header('Content-Type: image/png'), scripts en double

Posté : 23 mars 2011, 23:48
par Castor Gaspard
Bonjour,

Bah, j'ai un peu avancé, dans l'éclaircissement du mystère...

En fait, j'appelle une session en haut de page. Si je ne l'appelle pas, l'enregistrement n'est pas doublé. Curieux, non ? :mrgreen:

L'ordre n'influe pas... Appeler header avant ou après session ne change rien.

Ceci posé, je suis preneur de vos idées. Merci.

Cordialement,

Gaspard

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 00:02
par moogli
yop,

t'aurais pas le code complet des fois ? :)

@+

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 01:30
par Castor Gaspard
Bonjour,

Merci, Moogli, mais j'ai peur de t'embêter, ma page fait 700 lignes de code. J'ai décommenté chaque partie, pour en conclure que le problème venait de la session. :)

En fait, justement, le but de la session est d'empêcher le rafraichissement du script par des malotrus. Aussi je me demande si je ne vais pas tout simplement ajouter un appel à la fonction sleep à la fin du script par exemple pour une durée de cinq minutes.

Question bête, cependant... Le sleep ne fera "dormir" que le visiteur en cours, pas les autres ? :mrgreen:

Néanmoins, je crois que sleep ralentit le serveur, car il doit continuer à gérer le processus.

Cordialement,

Gaspard

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 09:47
par Mazarini
Bonjour,

Une question bête, tu utilises bien une balise <img> pour insérer ton image ?

Autrement, pour l'image, il est plus simple de faire :
header('Content-Type: image/png');
readfile('image.png');

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 10:03
par Castor Gaspard
Bonjour,

Merci, Mazarine, oui, l'image s'affiche bien.

J'ai simplifié mon code pour reproduire le "bogue"... Le voici...
session_start();
header('Content-Type: image/png');
$ip = $_SERVER['REMOTE_ADDR']; // Uniquement pour reproduire le bogue
$source = 'image.png';
if (empty($_SESSION['reload'])) // Évite le rafraichissement de la page
{
	$_SESSION['reload'] = 1;
} 
else 
{
	$_SESSION['reload']++;
}
if ($_SESSION['reload'] <= 5000) // 5000 pour l'exemple, évidemment!
{
	$image = imagecreatefrompng($source);
	imagepng($image);
	imagedestroy($image);
	try
		{
		$dbh = new PDO('sqlite:/database/cocain_track.sqlite', '', '');
		$dbh->beginTransaction();
		$table_test = $dbh->quote('test');
		$sth = $dbh->prepare('INSERT INTO '.$table_test.' (ip) VALUES (?)');
		$sth->execute(array($ip));
		$dbh->commit();
		$sth->closeCursor();
	}
	catch(PDOException $e)
	{
		echo $e->getMessage(). "\n";
		echo $e->getCode();
	}
}
else
{
	readfile($source); 
}
Le code ci-dessous insère donc deux fois l'adresse Ip dans la table "Test".

Voilà, voilà...

Si vous avez des idées, je les lirai avec intérêt. :mrgreen:

Merci.

Gaspard

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 11:40
par moogli
Yop,


Je ne suis pas familier du begintransaction / commit a tu essayer sans (juste en commentant ces deux lignes). Vu le code je soupçonne un auto commit a verifier !

@+

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 12:17
par Castor Gaspard
Bonjour,

Merci, Moogli, pour ton aide et ton attention. :)

Finalement, je crois que je vais me passer d'une session en temporisant l'accès à la page avec une petite table Sqlite. :mrgreen:

Cordialement,

Gaspard

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 14:24
par Mazarini
Bonjour,

Le problème se produit uniquement lorsque l'image est affichée dans une page html ou se produit également lorsque l'image directement ?

Il doit y avoir une possibilité de voir les header échangés mais je ne connais pas la manipe. Ca pourrait aider à voir ce qui se passe

Re: header('Content-Type: image/png'), scripts en double

Posté : 24 mars 2011, 17:11
par Castor Gaspard
Bolnjour,

Non, Mazarini, l'image est affichée directement grâce à mon script. Elle ne renvoie pas de code Html, car j'en ai pas besoin ici.

Mais ta remarque est judicieuse. :)

Merci.

Gaspard