Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2012, 10h22   #1
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Par défaut captcha PHP pas synchronisé

Bonjour.

Mon captcha n'est jamais synchronisé. Quelque chose m'échappe.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
session_start();
 
$couleur = array("yellow","green","blue","red","gray","pink","black");
  unset($_SESSION['color']);
	$color = $couleur[rand(0,5)];
	if($color == "yellow") $code = "jaune";
	if($color == "green")  $code = "vert";
	if($color == "blue")   $code = "bleu";
	if($color == "red")    $code = "rouge";
	if($color == "gray")   $code = "gris";
	if($color == "pink")   $code = "rose";
	if($color == "black")  $code = "noir";
 
  $captcha = '<div style="width:20px;"><div style="float:right;width:20px;height:20px;background-color:'.$color.'"></div></div>';
 
	$_SESSION['color'] = $code;
 
	if(isset($_POST['color']))
 
	echo '<pre>';
	var_dump($_POST['color']);
	var_dump($_SESSION['color']);
 
 
  if(empty($_POST['color']))
  if($_POST['color'] == $_SESSION['color']){ 
    echo 'ok';
    unset($_SESSION['color']);
    }
 
?>
 
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST">
            <input type="hidden" name="token" value="<?php echo $token; ?>" />
            <input style="width:66px" type="submit" name="envoye" value="Envoyer" />
            <input style="width:66px" type="reset" name="annuler" value="Annuler" />
 
                Quelle est cette couleur?
                <?php	 echo $captcha; ?>								
            <input class="form" style="width:75px" type="text" id="color" name="color" value="" size="10" />
</form>
</pre>
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 10h56   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Salut

A mon sens tu fais les choses dans le désordre, car dès le départ tu détruit la variable de session "color" : unset($_SESSION['color']);

Il faut normalement vérifier que la couleur saisie dans le champ texte (une fois le formulaire validé) corresponde à la couleur définie dans la session (lors de la création du formulaire), et ça en 1er.

Quelque chose comme :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
if (isset($_POST['color']), $_SESSION['color']) {
    if ($_POST['color'] === $_SESSION['color']) {
        // Les couleurs sont les mêmes
    }
    else {
        // Les couleurs ne sont pas les mêmes
    }
}
 
// Maintenant on détruit le session color
unset($_SESSION['color']);
 
// Puis on définie une nouvelle couleur
$_SESSION['color'] = $code;
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 17h48   #3
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Pour commencer, merci et bonjour!

Dans le manuelle, if(isset($a,$b), on indique ça comme syntaxe correcte.
Mais, j'ai déjà essayé et j'ai essayé de nouveau et ça indique une erreur
vis-a-vis la virgule entre post et session.

Citation:
Envoyé par RunCodePhp Voir le message
Salut
Code :
1
2
 
if (isset($_POST['color']), $_SESSION['color']) {
A l'entrée dans le formulaire, ça m'indique "erreur" qu'on a défini dans le code.
Et je n'ai pas encore tappé la couleur.

Ensuite, si je continue et que je fais refresh, l'indication "erreur" disparait.
Et là, je tappe la couleur et la page n'est que rafraichie.

code revisé (traitement) :

Code :
1
2
3
4
5
6
7
8
9
10
11
if (isset($_POST['color']) AND isset($_SESSION['color'])){
  if ($_POST['color'] === $_SESSION['color']) {
    echo 'OK';
  }
}
else{
  echo 'Error';
}
 
unset($_SESSION['color']);
$_SESSION['color'] = $code;
Il manque peut-être quelque chose dans le formulaire?

le formulaire :
Code :
1
2
3
4
5
6
7
8
9
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST">
            <input type="hidden" name="token" value="<?php echo $token; ?>" />
            <input style="width:66px" type="submit" name="envoye" value="Envoyer" />
            <input style="width:66px" type="reset" name="annuler" value="Annuler" />
 
                Quelle est cette couleur?
                <?php	 echo $captcha; ?>								
            <input class="form" style="width:75px" type="text" id="color" name="color" value="" size="10" />
</form>
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 21h30   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Corrige comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
session_start();
//
if (isset($_POST['color'], $_SESSION['color'])) {
    if ($_POST['color'] == $_SESSION['color']) {
        echo 'OK';
    }
    else {
        echo 'Error';
    }
}
 
// Maintenant on détruit le session color
unset($_SESSION['color']);
 
// Puis on définie une nouvelle couleur
// Tous les codes ici qui crée/définie $code
$_SESSION['color'] = $code;
(Je n'ai pas mis tous les codes, c'est juste pour expliquer le déroulement)


Concernant la syntaxe du isset(), j'avais fais une petite erreur effectivement.
Dans la doc de Php il est indiqué ceci : bool isset ( mixed $var [, mixed $... ] )
On peu donc mettre plusieurs paramètres successivement, ce qui évite de répéter isset().
Ceci : if (isset($var1, $var2, $var3)) ...
est équivalent à : if (isset($var1) && isset($var2) && isset($var3)) ...


Citation:
Il manque peut-être quelque chose dans le formulaire?
Si le formulaire n'est pas soumis (submité), il doit avoir une erreur de HTML par là.
Remplace $_SERVER['PHP_SELF'] par le nom de ta page (c'est mieux de toute manière).
Il y a une variable $token. Existe t-elle ? Sa valeur est elle correcte ?
Puis englobe tous les éléments avec un <fieldset> ou <p> : (c'est plus conforme selon la W3C)
Code :
1
2
3
4
5
6
 
<form action="nom_de_la_page.php" method="post">
    <fieldset>
        ... etc ...
    </fieldset>
</form>
Sinon, observe le code HTML généré, peut être verrais tu une erreur. (clic droit dans la page puis "code source de la page".
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 22h17   #5
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Là, ça fonctionne avec ces changements.

Je révise ma version complète avant de fermer ce poste. Il se peut que j'aie d'autres problème. Pour le token en soit, il fonctionne bien. Je vais peut-être revoir l'emplacement du unset($_POST). Pour ...php_self, je vais revoir.

La version corrigée :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php 
session_start();
 
$couleur = array("yellow","green","blue","red","gray","pink","black");
	$color = $couleur[rand(0,5)];
	if($color == "yellow") $code = "jaune";
	if($color == "green")  $code = "vert";
	if($color == "blue")   $code = "bleu";
	if($color == "red")    $code = "rouge";
	if($color == "gray")   $code = "gris";
	if($color == "pink")   $code = "rose";
	if($color == "black")  $code = "noir";
 
  $captcha = '<div style="width:20px;"><div style="float:right;width:20px;height:20px;background-color:'.$color.'"></div></div>';
 
echo '<pre>';
	//var_dump($_POST['color']);
	//var_dump($_SESSION['color']);
 
if (isset($_POST['color'], $_SESSION['color'])) {
    if ($_POST['color'] == $_SESSION['color']) {
        echo 'OK';
    }
    else {
        echo 'Error<br><br>';
        echo 'post: '.$_POST['color'].'<br>';
        echo 'sess: '.$_SESSION['color'];
    }
}
 
// Maintenant on détruit le session color
unset($_SESSION['color']);
 
// Puis on définie une nouvelle couleur
// Tous les codes ici qui crée/définie $code
$_SESSION['color'] = $code;          
?>
 
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST">
            <input style="width:66px" type="submit" name="envoye" value="Envoyer" />
            <input style="width:66px" type="reset" name="annuler" value="Annuler" />
 
                Quelle est cette couleur?
                <?php	 echo $captcha; ?>								
            <input class="form" style="width:75px" type="text" id="color" name="color" value="" size="10" />
 
</form>
</pre>
Je pense pas que les bots peuvent savoir que green est vert et si c'est le cas, il ne peuvent pas savoir que green est Vert. Mais, faut pas être daltanien bien sur à cause des couleurs.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 05h34   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Est-ce que la gestion des erreurs de Php est activée ? (php.ini, display_errors à On).
Voir aussi ceux de MySQL (php.ini toujours, mysql.trace_mode à On).
S'il y a erreur au moins tu auras une indication.

Sinon, et vu qu'à un moment tu obtenais un résultat correcte, et bien évite d'intégrer trop de code d'un coup, fait petit bloc par petit bloc et fait des essai à chaque intégration.
Tu vas surement repérer d'où vient l'erreur.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 05h55   #7
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Côté erreur PHP, ça va. Il en a pas.

Le bloc tout seul du captcha va bien mais c'est intégré à mon code que ça ne va pas. Je pensais faire de même. Sur la vue d'ensemble, je ne sais pas si ça semble être correcte.

Je me demande s'il n'y aurait pas un logiciel ou un plugin déboguer en PHP?

Merci.

Citation:
Envoyé par RunCodePhp Voir le message
Est-ce que la gestion des erreurs de Php est activée ? (php.ini, display_errors à On).
Voir aussi ceux de MySQL (php.ini toujours, mysql.trace_mode à On).
S'il y a erreur au moins tu auras une indication.

Sinon, et vu qu'à un moment tu obtenais un résultat correcte, et bien évite d'intégrer trop de code d'un coup, fait petit bloc par petit bloc et fait des essai à chaque intégration.
Tu vas surement repérer d'où vient l'erreur.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 06h53   #8
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 727
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 727
Points : 3 294
Points : 3 294
Citation:
Je me demande s'il n'y aurait pas un logiciel ou un plugin déboguer en PHP?
Personnellement j'utilise NetBeans, qui est plutôt léger et analyse le code.

Mais les logiciels, même les plus avancés, ont leur limites.
Si tu penses ne pas avoir d'erreurs de Php, on peu imaginer 2 types d'erreurs :
- Soit une erreur de HTML par là qui empêche la soumission du formulaire.
- Soit une erreur de logique. (aucun logiciel permettra de détecter une erreur de logique).

Dans les 2 cas on peu faire du débogage simple pour le savoir : de simple echo ou print_r() suffisent.


Pour le 1er cas, suffit de faire un print_r($_POST).
S'il y a rien dedans après validation, c'est qu'il y a erreur.
Attention tout de même aux redirections, quand on débug comme ça on supprime la redirection, ou on met un point d'arrêt juste avant (un exit()).

Pour le 2ème cas, suffit de mettre des echo dans chaque condition (chaque if, else, else if, etc ...) de façon à suivre le déroulement, et détecter que ça n'entre pas dans la ou les bonnes conditions.


Il faut aussi apprendre à déboguer son code, c'est aussi important que de faire le programme/le site.
Tu as tout ce qu'il faut pour savoir la ligne exact d'où vient l'erreur.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 11h04   #9
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
J'ai enlevé un truc sur les cookies et le code fonctionne dans son entier.

Merci pour l'aide RunCodePhp.
__________________
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h51.


 
 
 
 
Partenaires

Hébergement Web