Page 1 sur 3

integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 14:59
par lenouveau
Bonjour
étant débutant en php, je voudrais pouvoir intégrer un captcha pour le livre d'or de mon site, je suis allé cherché un peu partout des tutos, mais je n'ai pas compris la façon de procéder, j'ai crée une page livreor.php que voici:
<!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">
   <head>
       <title>Livre d'or</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 
       <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design.css" />
    </head>
    <body>
 
    [b]<?php session_start(); ?>
<?php require('captcha.php'); ?>

<form action="verification.php" method="post">
	
	<p>Mon site vous plaît ? Laissez-moi un message !</p>
        <p>
            Pseudo : <input name="pseudo" /><br />
            Message :<br />
            <textarea name="message" rows="8" cols="35"></textarea><br />
			
	<label for="captcha">Recopiez le mot : "<?php echo captcha(); ?>"</label>[/b]
		[b]	<input type="text" name="captcha" id="captcha" /><br />
		
		<input type="submit" value="envoyer" />
	</p>
</form>[/b]
 
  
 
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("test");
 
// --------------- Étape 1 -----------------
// Si un message est envoyé, on l'enregistre
// -----------------------------------------
 
if (isset($_POST['pseudo']) AND isset($_POST['message']))
{
    $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo'])); // On utilise mysql_real_escape_string et htmlspecialchars par mesure de sécurité
    $message = mysql_real_escape_string(htmlspecialchars($_POST['message'])); // De même pour le message
    $message = nl2br($message); // Pour le message, comme on utilise un textarea, il faut remplacer les Entrées par des <br />
 
    // On peut enfin enregistrer :o)
    mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')");
}
 
// --------------- Étape 2 -----------------
// On écrit les liens vers chacune des pages
// -----------------------------------------
 
// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}
?>
 
</p>
 
<?php
 
 
// --------------- Étape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------
 
if (isset($_GET['page']))
{
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
        $page = 1; // On se met sur la page 1 (par défaut)
}
 
// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
 
$reponse = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);
 
while ($donnees = mysql_fetch_array($reponse))
{
        echo '<p><strong>' . $donnees['pseudo'] . '</strong> a écrit :<br />' . $donnees['message'] . '</p>';
}
 
mysql_close(); // On n'oublie pas de fermer la connexion à MySQL ;o)
?>
 
</body>
</html>

puis suivant les conseils, j'ai fait un fichier captcha.php ci dessous
<?php
function motListe()
{
    $liste = array('internet', 'captcha', 'robot');
    return $liste[array_rand($liste)];
}

function captcha()
{
    $mot = motListe();
    $_SESSION['captcha'] = $mot;
    return $mot;
}
?>
il me manque le fichier verification.php introduit par le formulaire voir le srcript livreor.php ce qui est surligné en gras
mais la je suis bloqué, que mettre dans ce fichier verification.php et où mettre le script ?

merci de m'aider

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 16:13
par Mazarini
Bonjour,

Il te faut comparer $_POST['captcha'] et $_SESSION['captcha'] pour vérifier que la saisie est bonne

En fonction de ton paramétrage, utilise session_start() (cf http://fr2.php.net/manual/fr/function.session-start.php)

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 16:15
par macgawel
Bonjour.

Où mettre ta vérification ?
Là où tu en auras besoin :mrgreen:
C'est à dire, dans la page vers laquelle pointe ton formulaire.
<form action="verification.php" method="post">
Donc a priori dans verification.php.
Mais tu n'as pas de fichier verification.php. Et tu fais la vérification du formulaire dans ta page livreor.php... Donc c'est là qu'il faut tester le captcha.

Dans cette page, à quel endroit faire ta vérification ?
Par définition du captcha, s'il n'est pas bon on arrête tout de suite (éventuellement on affichera un message).
=> Il faut faire le test dès le début, et s'il n'est pas probant on arrête le traitement du formulaire. A toi de voir ce que tu fais (stockage du "spam" pour vérification à la main, suppression, avertir l'utilisateur, etc.)

Quel test faire ?
La fonction captcha() prend un mot au hasard dans ta liste, le stocke dans la variable $_SESSION et en parallèle le renvoit (pour affichage).
Il faudra donc comparer ce qui a été envoyé dans l'input du formulaire au contenu de cette variable de session.

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 16:31
par le nouveau
re

j'ai fait ceci, et je le mets à la suite de mon formulaire dans le script livreor.php ? est ce bon ?

<?php
session_start();
?>

<?php
mysql_connect("localhost", "root", "");
mysql_select_db("test");
    
 
if(!empty($_POST['captcha']) && !empty($_POST['pseudo']) && !empty($_POST['message']))
{
 if($_POST['captcha'] == $_SESSION['captcha'])
 {
  echo '<p> Toutes les données ont été enregistrées avec succès </p>';
  $pseudo = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['pseudo'])));
  $message = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['message']))); 
  $message = nl2br($message);  
  mysql_query("INSERT INTO livre VALUES('', '" . $pseudo . "', '" . $message . "')");
 }

 else
 
  echo '<h2>Le captcha n\'est pas bon.</h2p>';
 }
 else
 
  echo '<h2>Il faut remplir tous les champs.</h2>';
 

mysql_close(); 

?>

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 21:36
par moogli
salut,

le nl2br est a réserver pour l'affichage (pour éviter les soucis lors de l'édition du message par exemple)

tu ne devrait mettre le message comme quoi tous est ok après vérification que le mysql_query a bien son job, car la tu peut dire que c'est bon sans que l'insertion soit réalisée ;)

pour cela vérifie le retour de mysql_query si c'est true alors tu affiche le message de validation, sinon un message d'erreur.

@+

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 22:01
par mrbean
bonsoir
en fait j'ai testé mes scripts et ça ne marchait pas, alors j'ai refait 3 fichiers
le premier captcha.php ci dessous:
<?php
function motListe()
{
    $liste = array('internet', 'captcha', 'robot');
    return $liste[array_rand($liste)];
}

function captcha()
{
    $mot = motListe();
    $_SESSION['captcha'] = $mot;
    return $mot;
}
?>
puis mon fichier livreor.php incluant le formulaire:
<!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">
   <head>
       <title>Livre d'or</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 
       <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design.css" />
    </head>
    <body>
 
    <?php session_start(); ?>
<?php require('captcha.php'); ?>

<form action="verification.php" method="post">
       
        <p>Mon site vous plaît ? Laissez-moi un message !</p>
        <p>
            Pseudo : <input name="pseudo" /><br />
            Message :<br />
            <textarea name="message" rows="8" cols="35"></textarea><br />
                       
        <label for="captcha">Recopiez le mot : "<?php echo captcha(); ?>"</label>
                        <input type="text" name="captcha" id="captcha" /><br />
               
                <input type="submit" value="envoyer" />
        </p>
</form>
 
 
 

 
</body>
</html>
puis un fichier verification.php:
<?php
session_start();
?>

<?php
mysql_connect("localhost", "root", "");
mysql_select_db("test");
   
 
if(!empty($_POST['captcha']) && !empty($_POST['pseudo']) && !empty($_POST['message']))
{
 if($_POST['captcha'] == $_SESSION['captcha'])
 {
  echo '<p> Toutes les données ont été enregistrées avec succès </p>';
  $pseudo = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['pseudo'])));
  $message = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['message'])));
  $message = nl2br($message);  
  mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')");
 }

 else
 
  echo 'Le captcha n\'est pas bon.';
 }
 else
 
  echo 'Il faut remplir tous les champs.';
 

$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir <img src="./images/smilies/icon_surprised.gif" alt=":o" title="Surprised" />)
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}
?>
 
</p>
 
<?php
 
 
// --------------- Étape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------
 
if (isset($_GET['page']))
{
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
        $page = 1; // On se met sur la page 1 (par défaut)
}
 
// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
 
$reponse = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);
 
while ($donnees = mysql_fetch_array($reponse))
{
        echo '<p><strong>' . $donnees['pseudo'] . '</strong> a écrit :<br />' . $donnees['message'] . '</p>';
}
 
mysql_close(); // On n'oublie pas de fermer la connexion à MySQL ;o)
?>
j'ai testé ça a l'air de fonctionner,les messages sont bien dans ma base de données, mais les messages ne s'affichent pas dans la page du livre d'or, mais sur une page blanche, exemple voici ma page livre d'or,

Image

et si je fais envoyer, voila ce que ça donne:



Image

comment faire pour que les messages s'affichent sur la page du livre d'or ?

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 22:28
par moogli
une simple requete SQL select permet de faire ce que tu souhaite !

@+

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 22:39
par lenouveau
re

c'est à dire ?
peux tu m'en dire plus et me donner un exemple de script ? je ne vois pas du tout en quoi ça consiste

merci

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 22:56
par moogli
tu sais faire un insert mais pas un select ? O_o

=> http://www.phpdebutant.org/article63.php


@+

Re: integrer un captcha dans mon livre d'or

Posté : 03 mai 2011, 23:10
par lenouveau
re
Désolé, mais je n'ai pas compris ce que tu me demandes de faire, les messages sont bien enregistrés dans la table, mais je voudrais qu'ils s'affichent sur la page du livre d'or
d'autres parts les scripts ne sont pas de moi :( , j'ai cherché un peu partout, j'ai réussi à faire de moi même malgré tout ces trois fichiers qui ont l'air corrects, mais il me manque cette fonction d'affichage sur la page .
voila où j'en suis, et ton lien ne me donne absolument pas la solution.
si tu ne veux pas m'en dire plus, alors tant pis. on est sur un forum d'aide, non :wink:

bonne soirée

Re: integrer un captcha dans mon livre d'or

Posté : 04 mai 2011, 00:55
par moogli
un forum d'aide pas de réalisation de script gratis a la chaine.

le lien que je t'ai filé sur phpdeb est ce qu'il te manque, c'est a dire la requete SQL Select, j'auraisaussi pu te filer le liens d'un cours liée seulement à SQL, mais je me suis dit qu'un cours appliqué (regarde les cours suivant) c'est mieux.

je ne ferais pas ton script, lit les tutos et test ou afficher, ce que tu demande est facile, si tu n'y parvient pas, reviens avec tes question code a l'appui ;)


@+

Re: integrer un captcha dans mon livre d'or

Posté : 04 mai 2011, 08:11
par lenouveau
re
mais je l'ai la commande SELECT ici,non ?

$reponse = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);

while ($donnees = mysql_fetch_array($reponse))
{
echo '<p><strong>' . $donnees['pseudo'] . '</strong> a écrit :<br />' . $donnees['message'] . '</p>';
}

Re: integrer un captcha dans mon livre d'or

Posté : 04 mai 2011, 21:20
par moogli
effectivement, mais pas dans la bonne page....

déplace le code dans livreor.php

Re: integrer un captcha dans mon livre d'or

Posté : 04 mai 2011, 21:29
par lenouveau
re
bon j'ai supprimé le fichier vérification.php et j'ai mis le code dans livreor.php
ce qui fait maintenant que je n'ai plus que deux fichiers

1) le fichier captcha.php ci dessous
<?php
function motListe()
{
    $liste = array('internet', 'captcha', 'robot');
    return $liste[array_rand($liste)];
}

function captcha()
{
    $mot = motListe();
    $_SESSION['captcha'] = $mot;
    return $mot;
}
?>
2) le fichier livreor.php ci dessous
<!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">
   <head>
       <title>Livre d'or</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 
       <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design.css" />
    </head>
    <body>
 
    <?php session_start(); ?>
<?php require('captcha.php'); ?>

<form method="post" action="livreor.php">
       
        <p>Mon site vous plaît ? Laissez-moi un message !</p>
        <p>
            Pseudo : <input name="pseudo" /><br />
            Message :<br />
            <textarea name="message" rows="8" cols="35"></textarea><br />
                       
        <label for="captcha">Recopiez le mot : "<?php echo captcha(); ?>"</label>
                        <input type="text" name="captcha" id="captcha" /><br />
               
                <input type="submit" value="envoyer" />
        </p>
</form>


<?php
mysql_connect("localhost", "root", "");
mysql_select_db("test");
   
 
if(!empty($_POST['captcha']) && !empty($_POST['pseudo']) && !empty($_POST['message']))
{
 if($_POST['captcha'] == $_SESSION['captcha'])
 {
 
  $pseudo = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['pseudo'])));
  $message = mysql_real_escape_string(htmlspecialchars(stripslashes($_POST['message'])));
  $message = nl2br($message);  
  mysql_query("INSERT INTO livreor VALUES('', '" . $pseudo . "', '" . $message . "')");
 }

 else
 
  echo 'Le captcha n\'est pas bon.';
 }
 else
 
  echo 'Il faut remplir tous les champs.';
 

$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir <img src="./images/smilies/icon_surprised.gif" alt=":o" title="Surprised" />)
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
$nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}
?>
 
 
<?php
 
 
// --------------- Étape 3 ---------------
// Maintenant, on va afficher les messages
// ---------------------------------------
 
if (isset($_GET['page']))
{
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse (livreor.php?page=4)
}
else // La variable n'existe pas, c'est la première fois qu'on charge la page
{
        $page = 1; // On se met sur la page 1 (par défaut)
}
 
// On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
 
$reponse = mysql_query('SELECT * FROM livreor ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);
 
while ($donnees = mysql_fetch_array($reponse))
{
        echo '<p><strong>' . $donnees['pseudo'] . '</strong> a écrit :<br />' . $donnees['message'] . '</p>';
}
 
mysql_close(); // On n'oublie pas de fermer la connexion à MySQL ;o)
?>
 
 
 

 
</body>
</html>
j'ai testé, c'est déjà mieux ça s'affiche dans la bonne page,mais ça marche un coup sur deux, c'est curieux!!!!!!!!!

Re: integrer un captcha dans mon livre d'or

Posté : 05 mai 2011, 13:16
par mrbean
re
Alors après quelques nouveaux essais l'affichage se fait très bien, par contre j'ai fait un test sur un message très long, en me trompant sur le mot à recopier, le message :"le captcha n'est pas bon " apparaît , mais le message initial s'efface et je suis obligé de le refaire en entier. c'est gênant, est ce normal ?