[PHP] Insertion d'un captcha
Résolu
Bonjour,
J'ai lu précedemment sur un tuto que je ne retrouve malheureusement plus que l'on pouvait insérer un captcha de la manière suivante :
On insère le script de la réalisation/mémorisation du captcha comme on insèrerait une image en html...
Voici mes scripts:
script page 1
[...]
<span class="etape">3. Recopie maintenant le code de vérification ci-dessous :</span><br />
<img src="w.captcha.php" alt="captcha" /> <input type="text" name="verif" size="10" maxlength="5" /><br/>
[...]
script page 2
<?php
// CREATION & MEMORISATION du CAPTCHA :
session_start();
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$code = '';
while(strlen($code) != 6) {$code. = $liste[rand(0,36)];}
$_SESSION['code'] = $code;
// CREATION de l'IMAGE :
$img = imageCreate(70, 20) or die ("Une erreur s'est produite lors de la création de l'image. Recommence");
$background_color = imagecolorallocate ($img, 238, 238, 238);
$ecriture_color = imagecolorallocate ($img, 0, 0, 0);
$code_police = 5;
// FILTRE du CACHE des navigateurs :
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");
// INSERTION du CAPTCHA dans l'IMAGE :
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen(''.$code.''))/2,0, $code,$ecriture_color);
imagejpeg($img,'',30); // qualité
// LIBÉRATION de la MÉMOIRE :
imageDestroy($img);
?>
Mais lorsque je vais sur la page 1, le captcha ne se présente pas ! (j'ai à la place la valeur du "alt") :(
Où est l'erreur ?
J'ai lu précedemment sur un tuto que je ne retrouve malheureusement plus que l'on pouvait insérer un captcha de la manière suivante :
On insère le script de la réalisation/mémorisation du captcha comme on insèrerait une image en html...
Voici mes scripts:
script page 1
[...]
<span class="etape">3. Recopie maintenant le code de vérification ci-dessous :</span><br />
<img src="w.captcha.php" alt="captcha" /> <input type="text" name="verif" size="10" maxlength="5" /><br/>
[...]
script page 2
<?php
// CREATION & MEMORISATION du CAPTCHA :
session_start();
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$code = '';
while(strlen($code) != 6) {$code. = $liste[rand(0,36)];}
$_SESSION['code'] = $code;
// CREATION de l'IMAGE :
$img = imageCreate(70, 20) or die ("Une erreur s'est produite lors de la création de l'image. Recommence");
$background_color = imagecolorallocate ($img, 238, 238, 238);
$ecriture_color = imagecolorallocate ($img, 0, 0, 0);
$code_police = 5;
// FILTRE du CACHE des navigateurs :
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");
// INSERTION du CAPTCHA dans l'IMAGE :
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen(''.$code.''))/2,0, $code,$ecriture_color);
imagejpeg($img,'',30); // qualité
// LIBÉRATION de la MÉMOIRE :
imageDestroy($img);
?>
Mais lorsque je vais sur la page 1, le captcha ne se présente pas ! (j'ai à la place la valeur du "alt") :(
Où est l'erreur ?
Configuration: Windows Vista Firefox 3.5.3
22 réponses
-
Enlève l'include de ton image ;)
-
Merci P@t@ch0n ! Mon problème est maintenant résolu ! =)
-
Le voici (je l'ai abrégé pour ne pas montrer trop de trucs inutiles) :
<?php
session_start();
if ( isset($_POST['objet']) ) {$_SESSION['objet'] = $_POST['objet'];}
?>
<?php include('w.captcha.php'); ?>
<?php include("w.design_global.php"); ?>
<!DOCTYPE ...
<body>
<div id="corps">
<table id="element_menu">[...]</table>
<h1>Me Contacter</h1>
<!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!-->
<form method="post" action="w.formulaire_contact.php" >
<span class="etape">1. Sélectionne le sujet du message...</span><br/>
<select>[...]</select> <input type="submit" value="Ok"><br/> <br/>
<form method="post" action="w.formulaire_contact.php" >
<span class="etape">2. Remplis les champs suivants :</span><br/>
<label for="nom">prénom et nom :</label> <input type="text" name="nom"/><br />
<label for="mail">adresse mail :</label> <input type="text" name="mail" style="margin-left: 4.5%"/><br />
<?php
if ( isset($_POST['objet']) )
{
if ( $_POST['objet'] == 'inscription' )
{ ?> <label>*Tu recevras un mail dans la semaine pour ton mot de passe !</label><br /><?php }
if ...
;}
?>
<br/>
<span class="etape">3. Recopie maintenant le code de vérification ci-dessous :</span><br />
<img src="w.captcha.php" alt="captcha" style="margin-left: 2%; border: 1px solid grey" /> <input type="text" name="verif" size="10" maxlength="5" /><br/>
<br/>
<input type="submit" value="Envoyer !" style="margin-left: 5%"> <label for="Envoyer !" style="color: blue"> Clique pour valider et envoyer ton message !</label><br/>
</form>
<!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!--><!-->
</div>
<?php include("w.foot.php"); ?>
<?php
session_unset();
session_destroy();
?>
</body>
</html> -
Montre le code de la page du formulaire.
-
Cool, ça marche ! =)
Seulement j'ai toujours les symboles du script de l'image en haut de la page du formulaire... -
Tu as mis du html dans ton code.
Comme je te l'ai indiqué précédemment, tu ne dois n'envoyer rien d'autres que ton image, donc tu ne gardes que ce qu'il y a entre <?php et ?> et tu vires le reste.
Et déplace les headers en les plaçant juste avant le imagejpeg. -
ah ok ! il y avait un malentendu =)
Voici mon script:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<body>
<?php
// CREATION & MEMORISATION du CAPTCHA :
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$code = '';
while (strlen($code) != 6)
{$code.= $liste [rand (0,34)];}
$_SESSION['code'] = $code;
// CREATION de l'IMAGE :
$img = imageCreate(70, 20) or die ("Une erreur s'est produite lors de la création de l'image. Recommence");
$background_color = imagecolorallocate ($img, 238, 238, 238);
$ecriture_color = imagecolorallocate ($img, 0, 0, 0);
$code_police = 5;
// FILTRE du CACHE des navigateurs :
if( !headers_sent() )
{
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");
}
// INSERTION du CAPTCHA dans l'IMAGE :
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen(''.$code.''))/2,0, $code,$ecriture_color);
imagejpeg($img,'',30); // qualité
// LIBÉRATION de la MÉMOIRE :
imageDestroy($img);
?>
</body> -
Hum, en effet ma phrase était ambigüe, quand je disais « tu dois faire », cela était dans le sens « tu as du faire ».
Il ne faut pas faire d'echo de l'image, mais bien mettre l'url de celle-ci dans la balise img.
Tu peux remontrer ton code de l'image ? -
"C'est parce que tu dois faire un echo de ton image au lieu de mettre l'url dans l'attribut src de img "
-> Où et Comment utiliser l'echo ?
" La bonne solution est donc bien. <img src="w.captcha.php" alt="captcha" /> "
-> C'est ce que j'avais fait =)
"Dans quel tuto ?"
-> Je ne le retrouve plus ! =\ (voir 1er post)
Donc comment afficher le captcha ?
P.S: Lorsque je vais directement sur la page de réalisation du captcha, les symboles du script de mon image s'affichent sur une page blanche. -
Dans quel tuto ?
Non, ce n'est pas possible, soit tu envois du html, soit tu envois une image, les deux en même temps n'a pas de sens.Comme on dit, on ne mélange pas les torchons et les serviettes.
La bonne solution est donc bien.
<img src="w.captcha.php" alt="captcha" />
Si tu n'obtiens toujours pas ton image, c'est que tu as toujours des erreurs dans celle-ci.
Donc même méthode que précédemment pour débuguer, accéde directement à l'image dans ton navigateur. -
pourtant, dans le tuto, il est écrit qu'il est justement possible de faire cela ?!
Mais je n'ai pas compris ce que tu dis de faire :
j'ai essayé avec
<?php echo '$img' ?> (alors même résultat qu'avant et y'a afficher "$img" au lieu du "alt=" de "<img.../>")
<?php echo 'w.captcha.php' ?> (alors même résultat qu'avant)
<?php include('w.captcha.php') ?> (toujours comme avant mais ce script d'image est réaffiché au lieu du "alt=")
toujours à la place de <img src="w.captcha.php" alt="captcha" />
aucune de ces solutions n'est bonne =\ -
C'est parce que tu dois faire un echo de ton image au lieu de mettre l'url dans l'attribut src de img.
Comme ta sortie dans ta page de ton formulaire n'est pas en jpeg mais en html, il est normal d'obtenir ceci. -
merci de ton conseil, j'y penserai si vraiment je galère...
Mais je sens que je suis proche du but : les erreurs ont toutes disparues ! =)
Il ne manque plus qu'à savoir pourquoi, sur mon localhost, lorsque je vais sur la page de mon captcha ou de mon formulaire, ce n'est pas la page ni une erreur qui s'affiche, mais ' http://localhost/Mon%20site/Monsite/w.captcha.php ' ?!
P.S: J'ai actualisé mes pages du formulaires et du captcha sur mon client ftp, et voici ce qui s'affiche lorsque je vais sur la page du formulaire maintenant ! :
'ÿØÿà�JFIF������ÿþ�;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 30 ÿÛ�C� [...] (B+(%%(Q:=0B`Ued_U][jx™jqs[]…µ†ž£««g€¼Éº¦Ç™¨«¤ÿÛ�C(#(N++N¤n]n¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ÿÀ���Q@ÿÙ '
(ça s'affiche comme une erreur, en haut de la page...) -
ContributeurLes captcha sont bien sympas mais tres dur a mettre en place pour les debutants.
Je peux te conseiller une alternative simple.
Créer une question sur une image, une question ne comportement pas de mot universel.
Par exemple:
Quel est le chef de l' etat de notre pays?
et non pas:
Quel est le president de la france?
En effet, president est utilisé dans beaucoup de langue et donc compréhensible, et "france", forcement aussi.
Non seulement tu eviteras aussi bien les bots (puisque ca sera une image) mais aussi les etrangers venus spammer ton forum de lien moisis.
C' est une methode facile, juste au cas ou. -
Je n'ai pas compris ce que tu dis.
Réaliser une notice de quoi ? -
Mais alors comment faire pour réaliser une bonne notice ? (Celle-ci est tirée du tuto sans avoir été changée)
-
Pour la notice, logique, tu n'as que 35 caractères dans ta chaine, donc 0,34.
Pour la seconde, GD n'est pas installé ou activé sur ton serveur, tout du moins je ne vois que ça. -
Cool, y'a plus l'erreur...
Mais maintenant c'est ça qui s'affiche :
Notice: Uninitialized string offset: 35 in ... (désignant toujours {$code.= $liste [rand (0,36)];} )
Fatal error: Call to undefined function imageCreate() in...(désignant : $img = imageCreate(70, 20) or die ('...'); )
? ! ? ! -
Salut,
Oui, c'est ça, ça permet de ne pas envoyer le content-type si une sortie texte a déjà été faites, donc pour visualiser l'erreur.
J'ai du faire un copié coller de ta ligne pour voir que tu avais mit un espace entre le . et le = de ta concaténation, il n'en faut pas.
Sinon, pour générer plus facilement ta chaine, tu peux utiliser str_shuffle() et substr() ;) -
Salut P@t@ch0n
Tout d'abord, merci de ta réponse, mais excuse-moi je n'ai pas du bien comprendre car c'est toujours faux...
-> Ton code, je le met bien à la place de :
// FILTRE du CACHE des navigateurs :
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");
P.S: Mon localhost m'indique une 'parse error' dans la page de création de mon captcha à dans ' {$code. = $liste [rand (0,36)];} ' .
- 1
- 2
Suivant