|
|
|
|
Bonjour,
mon formulaire est terminé, bien comme je le voulais ....
( ajouter une info dans formulaire php#0 )
et maintenant j'aimerais intégrer une vérification avec un " captcha " mais je ne sais pas quelle commande insérer, ni où la mettre !!!
celui que j'ai trouvé est simple et sympa : question sur la place d'une lettre d'un mot généré au hasard (pas d'images) dont voici le code:
<?php
class capcha{
var $min;
var $max;
var $alphabet;
var $word;
var $num;
var $numletter;
function capcha(){
$this->min = 4;
$this->max = 6;
$this->alphabet = 'abcdefghijklmnopqrstuvwxyz';
$this->grain_de_sel = '6tIb90ZAS11';
$this->word = $this->createWord();
$this->num = $this->chooseNum();
$this->numletter = $this->num2letter();
}
function q(){
return 'Quelle est la '.$this->numletter.' lettre du mot '.$this->word.' ?';
}
function createWord(){
$len = rand($this->min,$this->max);
for($i=0;$i<$len;$i++){
$word[$i] = $this->alphabet[rand(0,strlen($this->alphabet)-1)];
}
return implode('',$word);
}
function chooseNum(){
return rand(1,strlen($this->word));
}
function num2letter(){
if($this->num == strlen($this->word)){
return 'dernière';
}
$array = array('1' => 'première','2' => 'deuxième','3' => 'troisième','4' => 'quatrième','5' => 'cinquième','6' => 'sizième','7' => 'septième','8' => 'huitième','9' => 'neuvième','10' => 'dixième');
if(isset($array[$this->num])){
return $array[$this->num];
}else{
return $this->num.'.ème';
}
}
function r(){
return md5($this->grain_de_sel.$this->word[$this->num-1]);
}
}
?>
Configuration: Windows XP Firefox 2.0.0.4
Bsr,
|
Bonjour
|
Bjr
Vérification anti-spam :<br />Quelle est la deuxième lettre du mot rtwe ? <input name="rep" type="text" size="10" /><br /><input name="rep2" type="hidden" value="2a89b66a60af2d98f9b5a29947c3a47f" /> <br /><input type="submit" value="Envoyer" />PhP Il y a 10 types de personnes dans le monde : ceux qui comprennent le binaire et les autres ... |
Oui j'ai vu (j'ai effacé ) là le captcha fonctionne, mais c'est maintenant avec le formulaire que tu m'as aidé à faire que je voudrais le faire fonctionner pour l'intégrer sur les autres sites
|
PhP is back again lol
|
Ok c'est comme tu veux ! car là ça se complique pour moi ... pas du niveau !
|
Bjr
<?php
class capcha{
var $min;
var $max;
var $alphabet;
var $word;
var $num;
var $numletter;
function capcha(){
$this->min = 4;
$this->max = 6;
$this->alphabet = 'abcdefghijklmnopqrstuvwxyz';
$this->grain_de_sel = '6tIb90ZAS11';
$this->word = $this->createWord();
$this->num = $this->chooseNum();
$this->numletter = $this->num2letter();
}
function q(){
return 'Quelle est la '.$this->numletter.' lettre du mot '.$this->word.' ?';
}
function createWord(){
$len = rand($this->min,$this->max);
for($i=0;$i<$len;$i++){
$word[$i] = $this->alphabet[rand(0,strlen($this->alphabet)-1)];
}
return implode('',$word);
}
function chooseNum(){
return rand(1,strlen($this->word));
}
function num2letter(){
if($this->num == strlen($this->word)){
return 'dernière';
}
$array = array('1' => 'première','2' => 'deuxième','3' => 'troisième','4' => 'quatrième','5' => 'cinquième','6' => 'sizième','7' => 'septième','8' => 'huitième','9' => 'neuvième','10' => 'dixième');
if(isset($array[$this->num])){
return $array[$this->num];
}else{
return $this->num.'.ème';
}
}
function r(){
return md5($this->grain_de_sel.$this->word[$this->num-1]);
}
}
?>
<?php
if (!isset($_SESSION))
{
session_start(); // Restaure la session précédente ou démarre ou nouvelle session
}
// On sauvegarde l'heure de création de la session : juste pour info ne sert pas
if (!isset($_SESSION['generated']))
{
$_SESSION['generated'] = time();
}
$capcha=new capcha(); // Création d'un nouvel objet (instance) de classe capcha
// Sauvegarde dans la session de la réponse attendue issue du capcha
$_SESSION['reponse'] = substr($capcha->word,$capcha->num-1,1);
?>
<html>
<body>
<pre>
<?php
echo "--- Debug début ---<br/>";
echo "Session démarrée le ".date('d-m-Y à H:i:s',$_SESSION['generated'])."<br/>";
echo "Réponse attendue : ".$_SESSION['reponse']."<br/>";
echo var_dump($capcha);
echo "--- Debug fin ---";?>
</pre>
<br/>
<br/>
<?php
if (isset($msgerr)) echo "Erreur : ".$msgerr."<br/>";
?>
<form action="form_verif.php" method="post">
<?php echo $capcha->q();?> <input type="text" name="reponse" id="reponse" size="4">
<input type="submit" value="Envoyer">
</form>
</body>
</html>
La page : form_verif.php <?php
// On restaure la session pour l'utilisateur
if (!isset($_SESSION))
{
session_start(); // Restaure la session précédente ou démarre ou nouvelle session
}
$reponse="";
// On regarde si la réponse a été postée par l'utilisateur
if (isset($_POST['reponse'])) $reponse=$_POST['reponse'];
// On teste si la réponse du capcha existe déjà dans la session
if (isset($_SESSION['reponse']))
{
if ($_SESSION['reponse'] != $reponse)
{
$msgerr="Mauvaise réponse.";
include("form.php");
exit;
}
}
else
{
// Si la réponse n'est pas déjà dans la session on suppose que la session a expiré
// l'utilisateur doit recommencer
$msgerr="Votre session a expiré.";
include("form.php");
exit;
}
?>
<html>
<body>
<?php
echo "Session démarrée le ".date('d-m-Y à H:i:s',$_SESSION['generated'])."<br/>";
echo "Réponse attendue : ".$_SESSION['reponse']."<br/>";
echo "Réponse fournie : ".$reponse."<br/>";
echo "BRAVO : bonne réponse !";
?>
Une fois que tu as compris comment ça marche c'est assez facile de l'intégrer à ton propre formulaire. Mais dans un premier temps essai de comprendre comment fonctionne les sessions. PHP stocke automatiquement dans un tableau superglobal toutes les variables envoyées aux pages PHP par le méthode POST : ce tableau s'appelle $_POST; Et bien de la même façon il est possible d'utiliser un autre tableau superglobal prédéfini $_SESSION pour stocker les valeurs des variables qu'on ne veut pas perdre entre 2 appels à 2 pages ou plus. L'instruction session_start() force PHP à recharger le contenu du tableau $_SESSION : si aucun session n'avait été sauvegardée ou si la session est expirée alors ce tableau et vide. En effet par soucis de sécurité, une session n'est valide que pendant un certain délai défini lors de la compilation / l'installation du module PHP sur le serveur. Dès que tu recharges une page, si la session n'est pas expirée alors le compteur repart à zéro (du moins je crois). Donc si l'utilisateur n'attend pas des "plombes" devant son écran sans cliquer, il n'y a pas de problème. Pour la sauvegarde tu n'as rien à faire : dès que tu places quelque chose dans le tableau $_SESSION, PHP le sauvegarde automatiquement. Cool ! PhP Il y a 10 types de personnes dans le monde : ceux qui comprennent le binaire et les autres ... |
Grand merci ! mais malgré toutes tes explications, très claires ... je plante encore un peu ...
|
Je recommence car je crois que c'est mal passé:
<?php
$objet="";
$votretelephone="";
$Previsualiser='<p class="bt"><input type="submit" name="previsualiser" tabindex="3" value="Prévisualiser" /></p>';
$Envoi="\n".'<p class="bt"><input name="envoi" tabindex="4" value="Envoyer" type="submit" /></p>';
if (isset($_POST['message']))
{
// La variable $verif va nous permettre d'analyser si la sémantique de l'email est bonne
$verif='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';
$votretelephone=isset($_POST['votretelephone']) ? htmlentities($_POST['votretelephone']) : "";
//quelques remplacements pour les specialchars
$message=preg_replace('#(<|>)#', '-', $_POST['message']);
$message=str_replace('"', "'",$message);
$message=str_replace('&', 'et',$message);
$objet=preg_replace('#(<|>)#', '-', $_POST['objet']);
$objet=str_replace('"', "'",$objet);
$objet=str_replace('&', 'et',$objet);
// On assigne et/ou protège nos variables
$votremail=stripslashes(htmlentities($_POST['votremail']));
$message=stripslashes(htmlspecialchars($message));
$objet=stripslashes(htmlspecialchars($objet));
//input button envoi/previsualiser
// $envoi=htmlentities($_POST['envoi']);
$envoi=isset($_POST['envoi']) ? htmlentities($_POST['envoi']) : "";
// $previsualiser=htmlentities($_POST['previsualiser']);
$previsualiser=isset($_POST['previsualiser']) ? htmlentities($_POST['previsualiser']) : "";
//on enlève les espaces
$votremail=trim($votremail);
$message=trim($message);
$objet=trim($objet);
$apercu_resultat='<p>Aperçu du résultat :</p>';
/*On vérifie si l'e mail et le message sont pleins, et on agit en fonction.
(on affiche Apercu du resultat, tel ou tel champ est vide, etc...*/
//Si ca ne vas pas (mal rempli, mail non valide...)
if((empty($message)) or (empty($objet)) or (!preg_match($verif,$votremail)))
{
//les 3 champs sont vides
if(empty($votremail) and (empty($message)) and (empty($objet)))
{
echo '<p>Tous les champs sont vides.</p>';
$message='';$votremail='';$objet='';$apercu_resultat='';
}
//un des champs est vide
else
{
if(!preg_match($verif,$votremail))
{
echo'<p>Votre adresse e-mail n\'est pas valide.</p>';
}
else
{
echo'<p>Il faut remplir tous les champs !</p>';
if(empty($message)) { $apercu_resultat=''; }
}
}
}
//Si les deux sont pleins et que l'adresse est valide, on envoie on on prévisualise sans envoi
else
{
$domaine=preg_replace('#[^@]+@(.+)#','$1',$votremail);
$DomaineMailExiste=checkdnsrr($domaine,'MX');
if(!$DomaineMailExiste)
{
echo'<p>Le nom de domaine de l\'adresse e-mail que vous avez donné n\'existe pas.</p>';
}
elseif(!empty($previsualiser))
{
$apercu_resultat='<p>Votre message et votre adresse e-mail sont valides et prêts à être envoyés.
<br />Vous n\'avez plus qu\'à cliquer sur le bouton "Envoyer".<br />Prévisualisation :</p>';
$Previsualiser='';
}
elseif(!empty($envoi))
{
$objet='[contact SITE] : '.$objet;
$headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=is-8859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');
$destinataire='laurenti@monfail.fr
';
$message = $message."\nTéléphone : ".$votretelephone;
if(mail($destinataire,$objet,$message,$headers))
{
echo '<p>Votre message a bien été envoyé. Merci.</p><p><a href="/">Retour à la page d\'accueil</a></p>';
$Envoi='';
$Previsualiser='';
}
else
{
echo'<p>Un problème est survenu durant l\'envoi du mail.</p>';
}
}
else
{
echo'<p>Une condition innatendue est survenue lors de l\'exécution du script.</p>';
}
}
echo $apercu_resultat;
}
else
{
echo '<p>Toutes les lignes doivent être renseignées, merci.</p>';
$votremail='';$message='';
}
$bas_formulaire=$Previsualiser.$Envoi;
?>
<form id='contact' method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"" enctype="multipart/form-data">
<p id='obj'>Pour contacter directement JEAN PIERRE</p>
<p>
<label for='objet'>Objet de votre message :<br />
<input type='text' name='objet' id='objet' tabindex='10' size='50' value='<?php echo $objet;?>' />
</label>
</p>
<p id="adr">
<label for="mail">Votre Adresse E-mail<br />
<input name="votremail" tabindex="20" size="40" type="text" id="mail" value="<?php echo $votremail; ?>" />
</label>
</p>
<p id="tel">
<label for="telephone">Votre téléphone(si vous désirez être contactés)<br />
<input name="votretelephone" tabindex="30" size="30" type="text" id="telephone" value="<?php echo $votretelephone ?>" />
</label>
</p>
<p id="msg">
<label for="message">Votre message<br />
<textarea tabindex="40" rows="10" cols="50" name="message" id="message"><?php echo $message; ?></textarea>
</label>
</p>
<?php echo $bas_formulaire;?>
</form>
il y aurait donc trois fichiers a utiliser ? form1.php form.php form_verif.php c'est le premier qui serait appelé par un include dans la page où l'on veut voir apparaitre le formulaire mais je ne vois pas trop comment se 'goupillent' les deux autres vis à vis de celui-là ...... !! lourd le bg hein ! alors stpl encore un peu d'aide @mitiés b g le 'www' est fait aussi pour communiquer, partager et échanger, non ? |
Re
<?php
if (!isset($_SESSION))
{
session_start(); // Restaure la session précédente ou démarre ou nouvelle session
}
?>
<?php
//Juste pour simuler la fonction :
function checkdnsrr($domain)
{
return true;
}
?>
<html>
<body>
<?php include("form1.php");?>
</body>
</html>
Ceci est juste un exemple. Dans ta propre page tu dois juste inclure tout au début en premier avant tout autre code php : <?php if (!isset($_SESSION)) { session_start(); // Restaure la session précédente ou démarre ou nouvelle session } ?> Et quelque part dans le body de ta page faire l'include : <?php include("form1.php");?> Nota : tu n'es pas obligé de scinder ton code en 2 pages distinctes. Tu peux très bien copier le code du formulaire directement dans la page principale. Le formulaire : form1.php <?php
define("ST_READY", 0); // La page a été appellée pour la 1ere fois (aucun bouton n'a donc pu être cliqué)
define("ST_OK", 1); // La page a été appellée avec le bouton [Envoyer] et l'envoi du mail s'est bien passé
define("ST_PREVIEW", 2); // La page a été avec le bouton [Prévisualiser]
define("ST_ERROR", 3); // Une erreur s'est produite lors de la vérification de la page
function remplacements_speciaux($txt)
{
$txt=preg_replace('#(<|>)#', '-', $txt);
$txt=str_replace('"', "'",$txt);
$txt=str_replace('&', 'et',$txt);
return $txt;
}
function mail_valide($mail)
{
// La variable $verif va nous permettre d'analyser si la sémantique de l'email est bonne
$verif='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';
return preg_match($verif,$mail);
}
$reponse="";
// On regarde si la réponse a été postée par l'utilisateur
if (isset($_POST['reponse'])) $reponse=$_POST['reponse'];
$message="";
$objet="";
$votretelephone="";
$votremail="";
// On suppose qu'il y a une erreur par défaut même si ce n'est pas le cas.
// Raisonnement par l'absurde en quelque sorte ...
$status=ST_ERROR;
//input button envoi/previsualiser
$envoi=isset($_POST['envoi']) ? htmlentities($_POST['envoi']) : "";
$previsualiser=isset($_POST['previsualiser']) ? htmlentities($_POST['previsualiser']) : "";
if (isset($_POST['message']))
{
//quelques remplacements pour les specialchars
$message=remplacements_speciaux($_POST['message']);
$objet=isset($_POST['objet']) ? remplacements_speciaux($_POST['objet']) : "";
// On assigne et/ou protège nos variables
$votremail=stripslashes(htmlentities($_POST['votremail']));
$message=stripslashes(htmlspecialchars($message));
$objet=stripslashes(htmlspecialchars($objet));
$votretelephone=isset($_POST['votretelephone']) ? htmlentities($_POST['votretelephone']) : "";
//on enlève les espaces
$votremail=trim($votremail);
$message=trim($message);
$objet=trim($objet);
/*On vérifie si l'e mail et le message sont pleins, et on agit en fonction.
(on affiche Apercu du resultat, tel ou tel champ est vide, etc...*/
//Si ca ne vas pas (mal rempli, mail non valide...)
if((empty($message)) or (empty($objet)) or (!mail_valide($votremail)))
{
//les 3 champs sont vides
if(empty($votremail) and (empty($message)) and (empty($objet)))
{
$msgerr='Tous les champs sont vides.';
}
//un des champs est vide
else
{
if(!mail_valide($votremail))
{
$msgerr='Votre adresse e-mail n\'est pas valide.';
}
else
{
$msgerr='Il faut remplir tous les champs !';
}
}
}
//Si les deux sont pleins et que l'adresse est valide, on envoie on on prévisualise sans envoi
else
{
$domaine=preg_replace('#[^@]+@(.+)#','$1',$votremail);
$DomaineMailExiste=checkdnsrr($domaine,'MX');
if(!$DomaineMailExiste)
{
$msgerr='Le nom de domaine de l\'adresse e-mail que vous avez donné n\'existe pas.';
}
elseif(!empty($previsualiser))
{
$status=ST_PREVIEW;
}
elseif(!empty($envoi))
{
// Test si la réponse au captcha est correcte !
if (isset($_SESSION['reponse']))
{
if ($_SESSION['reponse'] != $reponse)
{
$msgerr="Mauvaise réponse à la question posée ! Réessayez.";
}
else
{
$objet='[contact SITE] : '.$objet;
$destinataire='laurenti@monfail.fr';
$mail=$destinataire;
$headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=is-8
859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');
$message = $message."\nTéléphone : ".$votretelephone;
if(mail($destinataire,$objet,$message,$headers))
{
$status=ST_OK;
}
else
{
$msgerr='Un problème est survenu durant l\'envoi du mail.';
}
}
}
else
{
$msgerr="Votre session a expirée ! Veuillez répondre de nouveau à la
question puis valider.";
}
}
else
{
$msgerr='Une condition innatendue est survenue lors de l\'exécution du script.';
}
}
}
else
{
$status=ST_READY;
}
switch ($status)
{
case ST_READY :
echo '<p>Tous les champs doivent être renseignés, merci.</p>';
break;
case ST_OK :
echo '<p>Votre message a bien été envoyé. Merci.</p><p><a href="/">Retour à la page
d\'accueil</a></p>';
break;
case ST_PREVIEW :
echo '<p>Votre message et votre adresse e-mail sont valides et prêts à être envoyés.
<br />Vous n\'avez plus qu\'à cliquer sur le bouton "Envoyer" sans oublier de répondre à la question
posée.<br />Prévisualisation :</p>';
break;
case ST_ERROR :
if (isset($msgerr) && !empty($msgerr))
{
echo "<p>".$msgerr."</p>";
}
else
{
echo "<p>Erreur non prévue !</p>";
}
break;
}
?>
<form id='contact' method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"" enctype="multipart/form-data">
<p id='obj'>Pour contacter directement JEAN PIERRE</p>
<p>
<label for='objet'>Objet de votre message :<br />
<input type='text' name='objet' id='objet' tabindex='10' size='50' value='<?php echo $objet;?>' />
</label>
</p>
<p id="adr">
<label for="mail">Votre Adresse E-mail<br />
<input name="votremail" tabindex="20" size="40" type="text" id="mail" value="<?php echo $votremail; ?>" />
</label>
</p>
<p id="tel">
<label for="telephone">Votre téléphone(si vous désirez être contactés)<br />
<input name="votretelephone" tabindex="30" size="30" type="text" id="telephone" value="<?php echo
$votretelephone ?>" />
</label>
</p>
<p id="msg">
<label for="message">Votre message<br />
<textarea tabindex="40" rows="10" cols="50" name="message" id="message"><?php echo $message; ?></textarea>
</label>
</p>
<?php
include("captcha.php");
$captcha=new capcha(); // Création d'un nouvel objet (instance) de classe capcha
// Sauvegarde dans la session de la réponse attendue issue du captcha
$_SESSION['reponse'] = substr($captcha->word,$captcha->num-1,1);
$bouton_previsualiser='<p class="bt"><input type="submit" name="previsualiser" tabindex="3" value="Prévisualiser"
/></p>';
$bouton_envoi='<p class="bt">'.$captcha->q().' <input type="text" name="reponse" id="reponse" size="4"> '.
'<input name="envoi" tabindex="4" value="Envoyer" type="submit" /></p>';
switch ($status)
{
case ST_READY :
echo $bouton_previsualiser.$bouton_envoi;
break;
case ST_PREVIEW :
echo $bouton_envoi;
break;
case ST_ERROR :
echo $bouton_previsualiser.$bouton_envoi;
break;
}
?>
</form>
La page : captcha.php qui est appellé dans la page form1.php par include("captcha.php"); <?php
class capcha{
var $min;
var $max;
var $alphabet;
var $word;
var $num;
var $numletter;
function capcha(){
$this->min = 4;
$this->max = 6;
$this->alphabet = 'abcdefghijklmnopqrstuvwxyz';
$this->grain_de_sel = '6tIb90ZAS11';
$this->word = $this->createWord();
$this->num = $this->chooseNum();
$this->numletter = $this->num2letter();
}
function q(){
return 'Quelle est la '.$this->numletter.' lettre du mot '.$this->word.' ?';
}
function createWord(){
$len = rand($this->min,$this->max);
for($i=0;$i<$len;$i++){
$word[$i] = $this->alphabet[rand(0,strlen($this->alphabet)-1)];
}
return implode('',$word);
}
function chooseNum(){
return rand(1,strlen($this->word));
}
function num2letter(){
if($this->num == strlen($this->word)){
return 'dernière';
}
$array = array('1' => 'première','2' => 'deuxième','3' => 'troisième','4' => 'quatrième','5' => 'cinquième','6' => 'sizième','7' => 'septième','8' => 'huitième','9' => 'neuvième','10' => 'dixième');
if(isset($array[$this->num])){
return $array[$this->num];
}else{
return $this->num.'.ème';
}
}
function r(){
return md5($this->grain_de_sel.$this->word[$this->num-1]);
}
}
?>
Tu noteras que j'ai pas mal modifié le code de ton formulaire. J'ai notemment introduit le notion de status ce qui améliore la lisibilité du code. Au moins on sait où on en est ! Voilà j'ai pas tout testé ...ça c'est ton taf ! lol PhP Il y a 10 types de personnes dans le monde : ceux qui comprennent le binaire et les autres ... |
Bonjour,
|
Salut je viens de tester ... tout semble fonctionner impec ... sauf que :
859-1 Sent:Monday, October 08, 2007 15:08 pas génant ... mais à quoi sert le " 859-1 " ???? 2 - j'ai fait des essais en répondant juste ou mal dans le captcha >>>>> ça passe à tous les coups ! >>> cherchez l'erreur .... encore du boulot pour toi car là je " p l a n e " !! @+ b g le 'www' est fait aussi pour communiquer, partager et échanger, non ? |
Bsr
$headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=is-8
859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');
par : $headers='From:'.$votremail."\r\n".
'To:'.$mail."\r\n".
'Subject:'.$objet."\r\n".
'Content-type: text/plain; charset=ISO-8859-1'."\r\n".
'Sent:'.date('l, F d, Y H:i');
Je ne suis pas un pro de la fonction email et encore moins des headers . Je ne sais pas si "Sent" constitue un header valide. Eventuellement supprime le et mets seulement : $headers='From:'.$votremail."\r\n". 'To:'.$mail."\r\n". 'Subject:'.$objet."\r\n". 'Content-type: text/plain; charset=ISO-8859-1'; Pour le captcha ben chez moi ça fonctionne alors je ne sais pas trop quoi te dire ... PhP Il y a 10 types de personnes dans le monde : ceux qui comprennent le binaire et les autres ... |