[RESOLU] imagejpeg() ne fonctionne plus suite à migration php 5.4

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] imagejpeg() ne fonctionne plus suite à migration php 5.4

Re: Code ne fonctionne plus suite à migration php

par Farah DOUIBI » 16 mai 2015, 02:05

MERCI INFINIMENT ! Problème trouvé et résolut !

J'ai fait comme demandé, j'ai commenté les header et une fois la page de l'image secu affichée, j'ai ce message :
"Warning: imagejpeg(): Filename cannot be empty in /home/pygmaliu/www/imagesecu.php on line 90"
La page est là : http://www.farahdouibi.fr/imagesecu.php
A la ligne 90 de imagesecu.php, il y a cette ligne :
imagejpeg($img , '' , 100);
Ensuite, j'ai été sur le site de php pour voir que le code n'était pas déprécié, mais sans regarder plus avant.
Puis j'ai recherché sur Google à propos de l'erreur, et suis tombée sur ce forum (en anglais) qui explique le pourquoi du comment : https://bugs.php.net/bug.php?id=63920
Pour être plus précise, ce paragraphe :
"i read a documentation http://php.net/manual/en/function.imagejpeg.php and understand that now it should works maybe in more 'pedantic' way (imagejpeg($image, NULL, $quality)), but maybe for the Backward Compatible you make this function work in a old way? (NULL or '' in secord parameter to output jpeg)"
En gros, cette fonction imagejpeg() a été modifiée entre php 5.3 et 5.4. Son deuxième argument acceptait une valeur de caractères vide "", mais depuis php 5.4, il le l'accepte plus. J'ai donc renseigné NULL à la place, comme indiqué sur le forum anglais, et cela fonctionne.
Si cela peut servir à d'autres.

Merci encore ! Sans cela, je n'aurais même pas vu d'où venait l'erreur.

Re: Code ne fonctionne plus suite à migration php

par Ryle » 15 mai 2015, 21:05

Bonjour,

Pour trouver d'où provient l'erreur, il faut regarder le fichier de log php si tu y a accès.

Sinon le plus simple est de mettre temporairement en commentaire les headers qui indiquent au navigateur qu'il s'agit d'une image, et d'ouvrir directement l'url de l'image/du script dans le navigateur. S'il y a des messages d'erreur php, ceux-ci devraient alors être affichés à l'écran. Ca sera plus facile pour trouver ce qui cloche dans ton script en 5.4 :)

Re: Code ne fonctionne plus suite à migration php

par Farah DOUIBI » 15 mai 2015, 17:48

Pour que vous voyiez, le site en php 5.4 : http://www.farahdouibi.fr/index.php?page=1 => puis cliquez en bas d'une actualité sur "Cliquez ici pour commentez".
Et le site en php 5.3 : http://www.valeriesimon.fr/index.php?page=1 => puis cliquez en bas d'une actualité sur "Cliquez ici pour commentez".
Erreur de ma part, c'est l'inverse :
php 5.3 : http://www.farahdouibi.fr/index.php?page=1
php 5.4 : http://www.valeriesimon.fr/index.php?page=1

Merci

Re: Code ne fonctionne plus suite à migration php

par Farah DOUIBI » 15 mai 2015, 17:46

Bonjour,

Je déterre ce sujet, car j'ai EXACTEMENT le même problème.

Je précise que j'ai un site en php 5.3 et un autre en php 5.4.
Mon code affiche bien l'image de sécu depuis des années sur le site en php 5.3, mais j'ai créé un site en php 5.4 et j'ai mi la fonction dessus, l'image ne s'affiche pas dessus.

OVH me dit de mettre le .htaccess qui va bien pour forcer le php 5.3 : SetEnv PHP_VER 5_3, et hop le code fonctionne, et l'image s'affiche !

Mais voilà, cette version va être supprimée en septembre, dans 4 mois...
Et en repassant en php 5.4, l'image ne s'affiche plus, sur les deux sites...

Pour que vous voyiez, le site en php 5.4 : http://www.farahdouibi.fr/index.php?page=1 => puis cliquez en bas d'une actualité sur "Cliquez ici pour commentez".
Et le site en php 5.3 : http://www.valeriesimon.fr/index.php?page=1 => puis cliquez en bas d'une actualité sur "Cliquez ici pour commentez".

Mon code :

dans imagesecu.php
<?php
	// OUVERTURE DE SESSION POUR $_SESSION['code_image']
	session_start();
	
	// on créé une image vide (L , H)
	$img = imagecreatetruecolor(200 , 60);
	// Couleur de l'image
	//$fond = imagecolorallocate($img, 236, 217, 187);
	$fond = imagecolorallocate($img, 255, 255, 255);
	// Création du rectangle
	imagefilledrectangle($img, 0, 0, 199, 59, $fond);
	
	
	
	// LISTE DES COULEURS DE POLICE UTILISÉES
	// +++++++++++++++++++++++++++++++++
	$table_color = array (
		imagecolorallocate($img, 80, 39, 6),
		imagecolorallocate($img, 23, 71, 91),
		imagecolorallocate($img, 106, 27, 53),
		imagecolorallocate($img, 21, 99, 39),
		imagecolorallocate($img, 81, 82, 7),
		imagecolorallocate($img, 0, 0, 0)
	);
	// +++++++++++++++++++++++++++++++++
	
	
	
	// LISTE DES POLICES UTILISÉES
	// +++++++++++++++++++++++++++++++++
	$table_police = scandir('structure/font');
	// +++++++++++++++++++++++++++++++++
	
	
	
	// LISTE DES CARACTERES UTILISÉS
	// +++++++++++++++++++++++++++++++++
	$liste_caracteres = '123456789abcdefghijklmnpqrstuvwxyz';
	$table_lettre = array(
		$liste_caracteres[rand(0,33)], 
		$liste_caracteres[rand(0,33)], 
		$liste_caracteres[rand(0,33)], 
		$liste_caracteres[rand(0,33)], 
		$liste_caracteres[rand(0,33)], 
		$liste_caracteres[rand(0,33)]
	);
	// +++++++++++++++++++++++++++++++++
	


	// FONCTION D'ECRITURE ===================================================================================================
	$position_en_x = 10;
	for($a=0 ; $a<6 ; $a++){
		// POLICE DE CARACTERE
		$font_de_police = 'structure/font/'.$table_police[rand(2, (count($table_police)-2))];
		// COULEUR DE POLICE DE CARACTERE
		$couleur_de_police = $table_color[rand(0,5)];
		// CONVERTION DE LA COULEUR DE POLICE EN RGB
		$color2rgb = str_pad(base_convert($couleur_de_police, 10, 16), 6, 0, STR_PAD_LEFT);
		$rgb2array = array(
			base_convert(substr($color2rgb, 0, 2), 16, 10),
			base_convert(substr($color2rgb, 2, 2), 16, 10),
			base_convert(substr($color2rgb, 4, 2), 16, 10),
		);
		// MODIFICATION DE LA COULEUR RGB POUR L'OMBRE
		$couleur_de_police_ombre = imagecolorallocate($img, ($rgb2array[0]+100), ($rgb2array[1]+70), ($rgb2array[2]));
		// ANGLE DE ROTATION
		$angle = rand(-20,20);
		// OMBRE DU CODE
		imagettftext($img , 30 , $angle , ($position_en_x+2) , 45 , $couleur_de_police_ombre , $font_de_police , $table_lettre[$a]);
		// CODE
		imagettftext($img , 30 , $angle , $position_en_x , 43 , $couleur_de_police , $font_de_police , $table_lettre[$a]);
		// J'INCREMENTE DE 30 LA POSITION x DE LA LETTRE SUIVANTE
		$position_en_x +=30;
	}
	// ========================================================================================================================
	
	
	// CREATION DE L'IMAGE PAR L'EN-TÊTE / PAS DE MISE EN CACHE
	header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
	header("Cache-Control: no-cache");
	header("Pragma: no-cache");
	header("Cache-Control: no-store, no-cache, must-revalidate");
	header("Cache-Control: post-check=0, pre-check=0", false);
	header("Content-type: image/jpeg");
	
	// CREATION DE LA SESSION
	$_SESSION['code_image'] = $table_lettre[0].''.$table_lettre[1].''.$table_lettre[2].''.$table_lettre[3].''.$table_lettre[4].''.$table_lettre[5];
	// CREATION DE L'IMAGE PHYSIQUE
	imagejpeg($img , '' , 100);
	// LIBERATION DE LA MEMOIRE
	imageDestroy($img);
?>
Mon appel dans functions.php
<form name="formulaire_billet" action="'.$_SERVER['PHP_SELF'].'?page=truc" method="post">
						<div>
							Votre nom (si non renseigné, vous apparaîtrez comme anonyme)
							<input type="text" name="auteur" maxlength="15" />
						</div>
						Votre commentaire
						<textarea name="commentaire"></textarea>
						<p>
							Code de sécurité à recopier en minuscules :<br />
							<img src="imagesecu.php" alt="code de sécurité" /><br />
							<input type="text" name="code_securite" maxlength="6" />
						</p>
						<input type="submit" value="ENVOYER" />
					</form>
Je suis dans l'impasse. J'ai vérifié toutes les fonctions utilisées sur php.net. Rien de déprécié, où j'ai mal vu.

Merci de votre aide,

Farah DOUIBI

Re: Code ne fonctionne plus suite à migration php

par sirakawa » 09 oct. 2013, 20:38

Je dois être plus cruche que l'âne de Buridan, mais, au vu des informations fournies, je ne vois pas le rapport entre la création d'un code aléatoire et l'affichage d'une image.

Peut-être ai-je besoin d'un microscope pour étudier ce code comme Giovanni Rana étudie les raviolis.

Re: Code ne fonctionne plus suite à migration php

par fafabrice88 » 09 oct. 2013, 18:39

bonjour,
désolé mais mon image ne s'affiche toujours pas même avec vos corrections.

Re: Code ne fonctionne plus suite à migration php

par sirakawa » 09 oct. 2013, 17:29

Il n'a jamais dû fonctionner, ou alors tu t'es planté en rcopiant....
<?php
// on démarre une session pour pouvoir mémoriser le code
session_start();
//bien utile en phase de développement
error_reporting(E_ALL);
//en phase finale remplacer par:
//error_reporting(0);
// on définit les caractères utilisés pour le code généré
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// génère le code en piochant dans les caractères de la liste
$code = '';
//il est inutile de faire ce calcul à chaque tour du while
//si c'est moi qui suis responsable de la parenthèse en trop, toutes mes excuses
$limite = strlen ($liste) -1;
while(strlen($code) <= 6) 
{
     //il faut concaténer pour changer la longuuer du code
     $code .= rand (0, $limite);
     print "<br />$code";

}
?>

Re: Code ne fonctionne plus suite à migration php

par fafabrice88 » 09 oct. 2013, 16:12

Désolé mais même en ayant réécrit le code (ci-dessous) sa ne fonctionne toujours pas.
<?php
// on démarre une session pour pouvoir mémoriser le code
session_start();
// on définit les caractères utilisés pour le code généré
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// génére le code en piochant dans les caractères de la liste
$code = '';
while(strlen($code) != 6) {

$limite = strlen ($liste) -1);
$code = rand (0, $limite);


}
// on mémorise le code de 6 caractères généré en session
$_SESSION['code']=$code; 
// on créé une image de 70 x 20 pixels (larg x hauteur) 
$img = imageCreate(70, 20) or die ("Problème de création GD");
// Choix de la couleur de fond, ici ça donne du Gris ( RVB)
$background_color = imagecolorallocate ($img, 62, 159, 206);
// Choix de la couleur de la police, ici du noir
$ecriture_color = imagecolorallocate ($img, 255, 255, 255);
// le code la police utilisée
$code_police=5;
// on créé une image jpeg en empêchant la mise en cache
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', false); 
header("Content-type: image/jpeg");
// on introduit le code dans l'image
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen("".$code.""))/2,0, $code,$ecriture_color);
// on créé une image avec une qualité médiocre de 30%
// pour éviter qu'un robot puisse la lire
imagejpeg($img,'',30);
// on libère la mémoire
imageDestroy($img);
?>

Re: Code ne fonctionne plus suite à migration php

par sirakawa » 09 oct. 2013, 12:20

En plussoyant moogli:
$valeur = rand (0, strlen ($tableau) -1);
ou:
$limite = strlen ($tableau) -1);
$valeur = rand (0, $limite);

Re: Code ne fonctionne plus suite à migration php

par fafabrice88 » 09 oct. 2013, 11:43

benv8nam j'ai remplacé mon 36 par 34 mais toujours le même problème.

moogli pour le strlen($liste) -1 j'ai modifié de cette façon mais sa doit pas être le bonne écriture car sa fonctionne toujours pas.
$code .= strlen($liste[rand(0,-1)];

Re: Code ne fonctionne plus suite à migration php

par moogli » 08 oct. 2013, 22:42

ou simplement un strlen($liste) -1 dans le second paramètre du rand ;)


@+

Re: Code ne fonctionne plus suite à migration php

par benv8nam » 08 oct. 2013, 16:18

Oups,

En faite c'est la ligne suivante qui pose problème :
$code .= $liste[rand(0,36)];
Il n'y a pas 36 valeurs dans ton tableau il faut mettre 34 à la place.

Re: Code ne fonctionne plus suite à migration php

par fafabrice88 » 08 oct. 2013, 15:21

le corps ? j'ai mis tout le code que faut il de plus ?

Re: Code ne fonctionne plus suite à migration php

par benv8nam » 08 oct. 2013, 14:34

Pour savoir ce qu'il ne va pas il nous faudrait le corps des fonctions que tu utilises.

Il y a des fonctionnalités qui ne fonctionne plus en PHP 5.4.X qui fonctionnait avant.

imagejpeg() ne fonctionne plus suite à migration php 5.4

par fafabrice88 » 08 oct. 2013, 13:45

Bonjour,
depuis le passage de mon hébergeur en version php 5.4 mon code qui génère un image ne fonctionne plus.
Que dois-je modifier pour qu'il refonctionne à nouveau ?

mon fichier imagesecu.php
session_start();
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$code = '';
while(strlen($code) != 6) {
   $code .= $liste[rand(0,36)];
}
$_SESSION['code']=$code; 
$img = imageCreate(70, 20) or die ("Problème de création GD");
$background_color = imagecolorallocate ($img, 62, 159, 206);
$ecriture_color = imagecolorallocate ($img, 255, 255, 255);
$code_police=5;
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', false); 
header("Content-type: image/jpeg");
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen("".$code.""))/2,0, $code,$ecriture_color);
// on créé une image avec une qualité médiocre de 30%
// pour éviter qu'un robot puisse la lire
imagejpeg($img,'',30);
imageDestroy($img);
je l'appel de cette facon depuis une page php :
<img src="imagesecu.php" alt="image de protection" />