Bonjour!

Quelque chose manque dans captcha.php et ça dit toujours que j'ai entré un mauvais code.
(au dernier test, ça indique rien du tout)
J'avais créé une version texte avant et le code fonctionnait bien.

De l'aide est apprécié, merci.

Fichier CAPTCHA.PHP :

<?php

session_start();

if(!isset($_SESSION['captcha'])||!isset($_POST['captcha'])){
null;
}
else{
if ( $_SESSION['captcha'] == htmlentities($_POST['captcha']) ) {
unset($_SESSION['captcha']); 

echo '[vous avez réussi à mettre le bon code!]';
   
} else { echo 'Mauvais code de vérification anti-spams!'; }}

?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
  <input type="image" name="captcha" src="icaptcha.php" /><br />
  <input type="text" name="captcha" id="captcha" size="5" maxlength="5" /><br />
  <input type="submit" name="sub" value="Soumettre"><br />
</form>



Fichier ICAPTCHA.PHP (celui-ci fonctionne bien et est appelé par le formulaire) :

<?php
$rand_str = md5(microtime());
$result_str = substr($rand_str,0,5);
$new_image =imagecreatefromjpeg("images/captcha.JPG");
$line_color = imagecolorallocate($new_image,233,239,239);
$text_color = imagecolorallocate($new_image, 255, 0, 0);
imageline($new_image,1,1,40,40,$line_color);
imageline($new_image,1,100,60,0,$line_color);
imagestring($new_image, 10, 50, 5, $result_str, $text_color);
$_SESSION['captcha'] = $result_str;
header("Content-type: image/jpeg");
imagejpeg($new_image);
?>


avec son fichier de fond CAPTCHA.JPG (ok sur ce point). upload/29862-dan4.jpg
Modifié par dan4 (13 Jul 2010 - 07:57)
Bonjour,
il faut suivre la logique session / creation image / input/img

Logique session, lorsque tu retourne a ta page il t'affiches le code
suivant et a déjas mis la valeur session a jour, mais toi tu as contrôlé
avant ce changement de valeur session, la cohérence saisie/code.

La création de l'image captcha n'as pas lieu dans le PHP
contenant l'image ... donc surtout ouvrir la session
dans le générateur de captcha.

Il ne faut pas créer d'image mais générer le src de l'image dans
une balise img et non pas une balise input Smiley cligne

Bref avec ton code corrigé ça donnerais

captcha.php


<?php
session_start();
?>
<html><body>
<?PHP
if(!isset($_SESSION['captcha']) || !isset($_POST['captcha'])){ null;}
else{
if ( $_SESSION['captcha'] == htmlentities($_POST['captcha']) ) 
{
unset($_SESSION['captcha']); 
echo '[vous avez réussi à mettre le bon code!]';
} else { echo 'Mauvais code de vérification anti-spams!'; }}

?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
  <img src="icaptcha.php" /><br />
  <input type="text" name="captcha" id="captcha" size="5" maxlength="5" /><br />
  <input type="submit" name="sub" value="Soumettre"><br />
</form>
</body></html>



ATTENTION IMG et non INPUT

et le icaptcha.php



<?php

session_start();
$rand_str = md5(microtime());
$result_str = substr($rand_str,0,5);
$_SESSION['captcha']=$result_str;
header ("Content-type: image/jpeg");
$im = imagecreate (80,20) or die ("Problème de création GD");
$background_color = imagecolorallocate ($im, 238, 238, 238);
$ecriture_color = imagecolorallocate ($im, 0, 0, 0);
imagestring ($im, 10, 18, 6, $result_str , $ecriture_color);
imagejpeg($im);

?>



Merci Christele!

J'ai corrigé et ça fonctionne.
Je cherchais aussi à placer une font pour grossir les caractères.
Je vais tenter quelque chose..

a+
Dan


Christele a écrit :
Bonjour,
il faut suivre la logique session / creation image / input/img

Logique session, lorsque tu retourne a ta page il t'affiches le code
suivant et a déjas mis la valeur session a jour, mais toi tu as contrôlé
avant ce changement de valeur session, la cohérence saisie/code.

La création de l'image captcha n'as pas lieu dans le PHP
contenant l'image ... donc surtout ouvrir la session
dans le générateur de captcha.

Il ne faut pas créer d'image mais générer le src de l'image dans
une balise img et non pas une balise input Smiley cligne

Bref avec ton code corrigé ça donnerais

captcha.php


<?php
session_start();
?>
<html><body>
<?PHP
if(!isset($_SESSION['captcha']) || !isset($_POST['captcha'])){ null;}
else{
if ( $_SESSION['captcha'] == htmlentities($_POST['captcha']) ) 
{
unset($_SESSION['captcha']); 
echo '[vous avez réussi à mettre le bon code!]';
} else { echo 'Mauvais code de vérification anti-spams!'; }}

?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
  <img src="icaptcha.php" /><br />
  <input type="text" name="captcha" id="captcha" size="5" maxlength="5" /><br />
  <input type="submit" name="sub" value="Soumettre"><br />
</form>
</body></html>



ATTENTION IMG et non INPUT

et le icaptcha.php



<?php

session_start();
$rand_str = md5(microtime());
$result_str = substr($rand_str,0,5);
$_SESSION['captcha']=$result_str;
header ("Content-type: image/jpeg");
$im = imagecreate (80,20) or die ("Problème de création GD");
$background_color = imagecolorallocate ($im, 238, 238, 238);
$ecriture_color = imagecolorallocate ($im, 0, 0, 0);
imagestring ($im, 10, 18, 6, $result_str , $ecriture_color);
imagejpeg($im);

?>



Voici mon code final que j'ai complètement révisé :

(possible que je tente de rendre individuel les 5 premiers chiffres pour ajouter des effets dedans, merci de m'avoir éclairer pour une solution).

icaptcha.php :


<?php
session_start();
$rand_str = md5(microtime());
$result_str = substr($rand_str,0,5);
$bidon = substr(md5(mt_rand(10000,99999)),0,1); //ajouter un chiffre bidon servant à rien
$new_image =imagecreatefromjpeg("images/captcha.jpg");
$line_color = imagecolorallocate($new_image,153,0,0);
$text_color = imagecolorallocate($new_image, 153,0,0);
imageline($new_image,mt_rand(1,10),mt_rand(1,10),mt_rand(200,120),mt_rand(0,100),$line_color);
imageline($new_image,mt_rand(1,10),mt_rand(1,10),mt_rand(200,220),mt_rand(0,40),$line_color);
$font = 'font2.ttf';
$size = 28;
$angle = 0;
$x = 18;
$y = 28;
imagettftext($new_image, $size, $angle, $x, $y, $text_color, $font, $result_str.$bidon);
$_SESSION['captcha'] = $result_str;
header("Content-type: image/jpeg");
imagejpeg($new_image);
?>


code.php :


<?php
session_start();

echo 'Entrez les 5 premiers caractères!<br />';

if(!isset($_SESSION['captcha'])||!isset($_POST['captcha'])){
null;
}
else{
if ( $_SESSION['captcha'] == htmlentities($_POST['captcha']) ) {
unset($_SESSION['captcha']); 

echo '[vous avez réussi à mettre le bon code!]';
   
} else { echo 'Erreur!'; }}

?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
  <img src="icaptcha.php" /><br />
  <input type="text" name="captcha" id="captcha" size="5" maxlength="6" /><br />
  <input type="submit" name="sub" value="Soumettre"><br />
</form>

upload/29862-captcha-im.jpg
Christele a écrit :
C' est super en couleur, mais la fonte est un peut petite,
presque illisible !


Au niveau des chiffres, c'est beaucoup plus gros. c'est vrai pour les lettres.

Mais, on peut changer facilement la font, juste à changer le fichier.

Je découvre qu'il y a tellement de variétés qu'on peut mettre. J'ai mis $bidon
pour créer un chiffre et lettre qui sert à rien. Mais on peut faire plus.
Dans ma version finale, j'ai ajouté pour avoir 4 lignes qui se croisent dans
toutes les sens.


$line_color = imagecolorallocate($new_image,153,0,0); //couleurs des lignes
$text_color = imagecolorallocate($new_image, 153,0,0); // couleurs du texte

Puis les lignes : 
imageline($new_image,mt_rand(1,10),mt_rand(1,10),mt_rand(200,120),mt_rand(0,40),$line_color);
imageline($new_image,mt_rand(1,10),mt_rand(2,40),mt_rand(200,220),mt_rand(0,20),$line_color);
imageline($new_image,mt_rand(13,13),mt_rand(21,43),mt_rand(100,170),mt_rand(5,30),$line_color);
imageline($new_image,mt_rand(1,22),mt_rand(1,43),mt_rand(120,180),mt_rand(10,25),$line_color);

$font = 'font.ttf'; //fichier de la font


Si y avait moyen d'épaissir les lignes et je pourrais leurs donner une autre couleur. Mais c'est volontaire pour la grosseur des lettres. mt_rand() fait changer la position des liens et leur sens aléatoirement. C'est intéressant. Je pourrais faire la même chose pour les couleurs.. je viens d'y penser.

genre : imagecolorallocate($new_image,mt_rand(1255,),etc0,etc0);

A+
Dan
Modifié par dan4 (15 Jul 2010 - 17:41)