Ajouter juste un captcha

Eléphanteau du PHP | 36 Messages

03 déc. 2011, 11:32

Le truc c'est que mon hébergement d'images utilise une certaine technique, ce qui fait que mes pages ne se trouvent pas à la racine mais dans un dossier. Même si visuellement, on peut croire qu'elles sont à la racine. La configuration est celle-ci je crois :
<?php

/*
 * pages_config.php
 *  You can set on/off status, doctitle, etc. *
 * NOTES >>
 * - The array order is also the default sort order.
 * - 'live' values can be true/false
 * - 'title' values can use $lang[] values or any value.
 */

$pages_config = array (
	'apropos' 	=> array('live' => true, 'title' => 'A propos'),
	'cgu' 		=> array('live' => true, 'title' => 'Conditions'),
	'dons'   	=> array('live' => true, 'title' => 'Dons'),
	'news'   	=> array('live' => true, 'title' => 'Actualité'),	
	'contact'	=> array('live' => true, 'title' => 'Contact'),
	'partenaires'	=> array('live' => true, 'title' => 'Partenaires'),

);
Du coup, il y a une erreur. L'image ne s'affiche pas et la requête SQL s'affiche en haut de la page sans parler du fichier traitement qui mène à une erreur 404 :? Une idée ? Le truc le plus simple serait de mettre tout le code dans le même fichier car ça fonctionnerait sans soucis mais là je sais plus trop l'ordre...
Modifié en dernier par ZePhYmA le 18 déc. 2011, 20:25, modifié 1 fois.

Eléphant du PHP | 188 Messages

04 déc. 2011, 10:57

Non tout mettre dans le meme fichier ne serait pas plus simple, au contraire on aurai plus de difficulté à trouver le problème.

Le code que tu m'a donné est (apparement) la configuration de ton menu. C'est un CMS ton site ?

Ensuite, c'est vraiment bizare que la requette et son traitement s'affiche. Et, si ça s'affiche, ça ne s'execute pas, donc l'adresse du captcha n'est pas reçue, donc l'image n'est pas affichée. Le problème est là : pourquoi ce texte s'affiche ? Le seul moyen ça serait que tu me copie le code complet de contact.php et traitement.php, que je teste en local pour debuger parce que là je vois pas, WTF --'

Eléphanteau du PHP | 36 Messages

04 déc. 2011, 13:09

C'est si on peut dire un CMS d'hébergement d'image (Chevereto), comme je sais pas programmer cela aurait bien trop de temps à le faire. :?

Mais les petits trucs comme ça, captcha etc. J'essaye de le faire moi-même.

traitement.php
<?php

// 1 : connexion à la base de donnée

$PARAM_hote='Mon chemin'; // Chemin du serveur
$PARAM_port='3306'; // Port, non obligatoire
$PARAM_nom_bd='Nom'; // Le nom de la base de donnée
$PARAM_utilisateur='User'; // L'identifiant de connexion à la base de donnée
$PARAM_mot_passe='mdp'; // Le mot de passe de connexion à la base de donnée

$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
try
{
        $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
 
catch(Exception $e)
{
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
}
?>

<?php

// 2 : Récuperation de ce qu'a dit l'utilisateur sur le captcha !

if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user
?>		

$sql = 'SELECT solution FROM captcha WHERE id ='.$id_captcha;
$req = $connexion->query($sql);
$req->setFetchMode(PDO::FETCH_OBJ);
$data = $req->fetch();
$solution= $data->solution;
$req->closeCursor();


<?php // 4 : Comparaison solution/reponse utilisateur.

//rappel  : $reponse_captcha contient la reponse de l'user et $solution contient la vrai solution (de la BDD) !
if ($reponse_captcha != $solution)
{
die('Erreur dans la recopie du captcha ! <a href="javascript&#058;history.go(-1)" alt="retour"> Retour. </a>');
}
?>

<?php // 5 : Envoi de l'e-mail				
        	if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
$result  = true;
$name    = $_POST['name'];
$email   = trim($_POST['email']);
$message = $_POST['message'];

$to = '@gmail.com';
$subject = 'Formulaire de contact';
			
$mailbody .= "Name: ".$name."\n";
$mailbody .= "E-mail: ".$email."\n\n";
				
$mailbody .= "Message: ".$message."\n\n";
						
$mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
$mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
				
$use_phpmailer = true; // Activer/Désactiver l'utilisation de la fonction ()mail
				
// We are going to check the fields...
if(check_email_address($email) and check_value($name) and check_value($message)) {

// Paramètres SMTP
if($use_smtp) {
						// Hail PHPMailer!
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "smtp.gmail.com"; // SMTP host
$mail->SMTPAuth = true;
$mail->Username = "[email protected]";
$mail->Password = "bjk19yanarutime";
$mail->Timeout = 30;
$mail->From = $email; 
$mail->FromName = $name;
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->Body = $mailbody;
$success = $mail->Send();
} else {
$success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
}
					
// Succès / Erreur

if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
} else { // Ho non ! Erreur
$output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
$contact_class = 'contact-error';
}
} else { // Valeurs invalides !
$output = 'Merci de remplir les champs du formulaire correctement.';
$contact_class = 'contact-error';
				}
        	}
?>
contact.php
<?php if(!defined('access') or !access) die('This file cannot be directly accessed.'); ?>
<?php include_theme_header(); ?>

$sql = 'SELECT adresse FROM captcha WHERE id ='.$nombre_aleat;
$req = $connexion->query($sql);
$req->setFetchMode(PDO::FETCH_OBJ);
$data = $req->fetch();
$adresse = $data->adresse;
$req->closeCursor();

<?php

//création d'un nombre aléatoire entre 1 et 8

$nb_min = 1;
$nb_max = 8;
$nombre = mt_rand($nb_min,$nb_max);

?>

<div id="content" class="pages page_contact">
<h1>Contactez nous</h1>
<hr /> <br />
<div class="content" style="font-size: 1em"> Bienvenue sur la page de contact, merci de remplir les champs ci-dessous afin de procéder à l'envoi de votre message. </div>
        
        <?php if ($result) : ?>
        <div class="contact-result <?php echo $contact_class; ?>"><?php echo $output; ?></div>
        <?php endif; ?>		
		
<form method="post" action="traitement.php">
<div><label for="name">Nom:</label> <input type="text" name="name" id="name" /></div>
<div><label for="email">E-mail:</label> <input type="text" name="email" id="email" /></div>
<div><label for="message">Message:</label> <textarea name="message" id="message" ></textarea></div>

<label for="captcha">Recopiez les caractères de l'image:</label>  <img alt="captcha" src="<?php echo $adresse; ?>" /> <input type="text" name="captcha" id="captcha" /> <input type="hidden" name="id" value="<?php echo $nombre_aleat; ?>" />

<div><input type="submit" value="Envoyer" class="send-form"/></div>

</form>

</div> </div>

<?php include_theme_footer(); ?>
Pour essayer d'être plus clair, mes pages se trouvent dans un sous-dossier, même si visuellement elles apparaissent comme à la racine depuis la navigateur. Donc sans doute que ça doit peut-être poser problème pour traitement/contact :?:

Eléphant du PHP | 188 Messages

04 déc. 2011, 16:01

Je pense avoir trouver le problème en un coup d'oeil sur contact.php ;)
La requette et le traitement requette ne sont pas dans des balises " <?php ... ?>" , donc s'affiche comme du texte !

Remplace le debut du code (jusqu'à la création du nombre aleat) par ça :
<?php 
if(!defined('access') or !access) die('This file cannot be directly accessed.'); 
include_theme_header(); 

 $sql = 'SELECT adresse FROM captcha WHERE id ='.$nombre_aleat;
 $req = $connexion->query($sql);
 $req->setFetchMode(PDO::FETCH_OBJ);
 $data = $req->fetch();
 $adresse = $data->adresse;
 $req->closeCursor();



//création d'un nombre aléatoire entre 1 et 8
$nb_min = 1;
$nb_max = 8;
$nombre = mt_rand($nb_min,$nb_max);
//etc ...

Eléphanteau du PHP | 36 Messages

04 déc. 2011, 19:57

C'est fait. Et le reste de ma page ne s'affiche plus, voir l'url de la page de contact plus haut :!: :|

Eléphant du PHP | 188 Messages

04 déc. 2011, 21:14

Grrrrrr :P

Essaye ça :
<?php 
if(!defined('access') or !access) die('This file cannot be directly accessed.'); 
include_theme_header(); 

 $sql = 'SELECT adresse FROM captcha WHERE id ='.$nombre_aleat;
 $req = $connexion->query($sql);
 $req->setFetchMode(PDO::FETCH_OBJ);
 $data = $req->fetch();
 $adresse = $data->adresse;
 $req->closeCursor();


//création d'un nombre aléatoire entre 1 et 8

$nb_min = 1;
$nb_max = 8;
$nombre = mt_rand($nb_min,$nb_max);

?>

 <div id="content" class="pages page_contact">
 <h1>Contactez nous</h1>
 <hr /> <br />
 <div class="content" style="font-size: 1em"> Bienvenue sur la page de contact, merci de remplir les champs ci-dessous afin de procéder à l'envoi de votre message. </div>
         
         <?php if ($result) : ?>
         <div class="contact-result <?php echo $contact_class; ?>"><?php echo $output; ?></div>
         <?php endif; ?>         
                 
 <form method="post" action="traitement.php">
 <div><label for="name">Nom:</label> <input type="text" name="name" id="name" /></div>
 <div><label for="email">E-mail:</label> <input type="text" name="email" id="email" /></div>
 <div><label for="message">Message:</label> <textarea name="message" id="message" ></textarea></div>

 <label for="captcha">Recopiez les caractères de l'image:</label>  <img alt="captcha" src="<?php echo $adresse; ?>" /> <input type="text" name="captcha" id="captcha" /> <input type="hidden" name="id" value="<?php echo $nombre_aleat; ?>" />

 <div><input type="submit" value="Envoyer" class="send-form"/></div>

 </form>

 </div> </div>

<?php include_theme_footer(); ?>

Eléphanteau du PHP | 36 Messages

05 déc. 2011, 19:47

Code remplacé par celui proposé et toujours rien !

Je suis vraiment maudit, c'est possible que ce soit du à la configuration spéciale de mes pages :?:
Si oui, tout mettre dans le même fichier serait peut-être la solution, enfin je dis ça j'en sais rien mais bon :mrgreen:

Eléphant du PHP | 188 Messages

05 déc. 2011, 23:43

Quel config spéciale de tes pages ? Il y a qqch en plus sur ta page ?
A priori mettre tous dans un fichiers ne résout en rien le problème, MAIS je suis de loin un génie de developpement web donc surement que quelquechose m'échappe. Est-ce que tu peux me montre le contenu des "include_theme_header" et "include_theme_footer" stp ?

Eléphanteau du PHP | 36 Messages

06 déc. 2011, 09:09

header.php
<?php if(!defined('access') or !access) die('This file cannot be directly accessed.'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php show_lang_used(); ?>" lang="<?php show_lang_used(); ?>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php show_chevereto_header(); ?>
</head>

<body>

<div id="wrap">
    <div id="top"><a href="<?php show_base_url(); ?>"><img src="<?php show_theme_imgdir(); ?>logo.png" alt="Heberg-pics" /></a></div>
footer.php
<?php if(!defined('access') or !access) die('This file cannot be directly accessed.'); ?>
</div><!-- wrap -->

<div id="foot">
	<div id="in-foot">
    	<div id="foot-content">
        	<ul>
<li><a href="apropos">A propos</a></li><li><a href="cgu">Conditions</a></li><li><a href="dons">Dons</a></li><li><a href="news">Actualité</a></li><li><a href="partenaires">Partenaires</a></li><li><a href="contact">Contact</a></li>
		
            </ul>
			<p><?php
// Add number of uploaded images. smed79
// $files to liste *.* in "./images" ex: (.jpg, .png, etc...)
$files = glob("images/*.*");
// Variable $compteur counting files lister ($files) in "./images"
$compteur = count($files);
echo "Nous avons <font color=#FF0000>$compteur</font>";
if ($compteur > 1) { echo " images hébergées jusqu'à maintenant"; }
else { echo " images hébergées jusqu'à maintenant"; }
?></p>
        </div>
		<a href="http://www.heberg-pics.com" target="_blank" id="powered">&copy; 2011 Heberg-pics - Tous droits réservés</a>
    </div>
</div>
</body>

</html>

Eléphant du PHP | 188 Messages

06 déc. 2011, 19:54

Bin alors là je bloque. Un problème d'affichage comme ça normalement ya pas des millions de possibilitées --' Essaye de jouer sur les balises PHP :
<?php
et
?>
Pour rappel (je ne sais pas si tu le sais vu que tu ne connaissais pas le php :P ) la première est pour indiquer qu'on commence a ecrire du PHP, la seconde pour terminer. Pour qu'un texte écrit en HTML sois affiché, il faut qu'il sois dehors de balises PHP. Verifiie bien ça, et sinon essaye de rajouter à des endroits stratégiques une des deux balises (a tour de rôle, a différent endroits, et retire la après test) pour voir comme ça réagi, met les par exemples : après avoir mit "include_theme_header", avant "include_theme_footer", avant des balises " <div>" ect ...

Eléphanteau du PHP | 36 Messages

07 déc. 2011, 09:41

C'est la requête SQL qui pose problème car quand je l’enlève la page s'affiche entièrement :wink:

Ce bug pourrait être causé par des informations de connexion à la base de donnée éronnées :?:

Elle me semble bonne pourtant :
 $sql = 'SELECT adresse FROM captcha WHERE id ='.$nombre_aleat;
 $req = $connexion->query($sql);
 $req->setFetchMode(PDO::FETCH_OBJ);
 $data = $req->fetch();
 $adresse = $data->adresse;
 $req->closeCursor();
Et pour les balises ouvrante/fermante du PHP je savais déjà :P

Eléphant du PHP | 188 Messages

07 déc. 2011, 14:57

C'est bizar :?
Verifie :
- l'orthographe du champ "adresse" dans PhpMyAdmin
- l'orthographe du nom de la BDD dans PhpMyAdmin
- si la connexion avec PDO est bien comme ça (en remplacant avec tes bonnes donnes) :
?php
	$PARAM_hote='localhost';      // le chemin vers le serveur
	$PARAM_port='3306';
	$PARAM_nom_bd='monsite';          // le nom de votre base de données
	$PARAM_utilisateur='root';    // nom d'utilisateur pour se connecter
	$PARAM_mot_passe='';          // mot de passe de l'utilisateur pour se connecter

		try
			{
			$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
			$connexion -> query("SET NAMES 'utf8'");
			/* BDD connectee */
			}
 
		catch(Exception $e)
			{
			/* erreur connection */
			echo 'Une erreur est survenue !';
			echo 'Erreur : '.$e->getMessage().'<br />';
			echo 'N° : '.$e->getCode();
			die();
			}
?>

Eléphanteau du PHP | 36 Messages

07 déc. 2011, 18:19

Ben déjà pour la connexion PDO, j'ai pas vraiment le même code.

Mon code actuel :
<?php

// 1 : connexion à la base de donnée

$PARAM_hote='Mon chemin'; // Chemin du serveur
$PARAM_port='3306'; // Port, non obligatoire
$PARAM_nom_bd='Nom'; // Le nom de la base de donnée
$PARAM_utilisateur='user'; // L'identifiant de connexion à la base de donnée
$PARAM_mot_passe='mdp'; // Le mot de passe de connexion à la base de donnée

$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
try
{
        $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
 
catch(Exception $e)
{
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
}
?>
Et celui que tu viens de me passer :
?php
        $PARAM_hote='localhost';      // le chemin vers le serveur
        $PARAM_port='3306';
        $PARAM_nom_bd='monsite';          // le nom de votre base de données
        $PARAM_utilisateur='root';    // nom d'utilisateur pour se connecter
        $PARAM_mot_passe='';          // mot de passe de l'utilisateur pour se connecter

                try
                        {
                        $connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
                        $connexion -> query("SET NAMES 'utf8'");
                        /* BDD connectee */
                        }
 
                catch(Exception $e)
                        {
                        /* erreur connection */
                        echo 'Une erreur est survenue !';
                        echo 'Erreur : '.$e->getMessage().'<br />';
                        echo 'N° : '.$e->getCode();
                        die();
                        }
?>
Le champ "adresse" est bien correct et les informations de la base de donnée sont correct et même si elles ne l'étaient pas je pense pas que cela afficherais une telle erreur. La on ne voit strictement rien. La seule chose étrange c'est que le code que tu viens de me passer est différent de celui que j'ai (cf les codes ci-dessus). :wink:

C'est possible que ce soit du au fait que le fichier traitement.php ne soit pas trouvé par la page de contact ? Par ce que lorsque j'enlève la requête SQL et que la page s'affiche, si j'appui sur "envoyer" cela me mène à une erreur 404 - Fichier traitement.php introuvable. :|

J'ai remplacé le code PDO de connexion que j'avais par celui de ton précédent message et rien.. :(
Modifié en dernier par ZePhYmA le 08 déc. 2011, 13:50, modifié 1 fois.

Eléphant du PHP | 188 Messages

08 déc. 2011, 21:33

Alors pour les connection BDD les codes ont le même effets, le 2e c'est juste une version avec un rapport d'erreurs un peu plus détaillé ça ne change rien au résultat.

Regarde tous les liens qui mènent vers contact.php et traitement.php, notemment celui dans la balise " <form ... " mais normalement ça devrait s'afficher quand meme --'

Je ne comprends absolument pas, est-ce que un autre membre de PHPFrance plus connaisseur que moi pourrait nous aider svp ??

Eléphanteau du PHP | 36 Messages

08 déc. 2011, 22:19

Bon alors déjà je viens de corriger une erreur :P

Dans mon fichier traitement.php il fallait insérer :
<?php if(!defined('access') or !access) die('This file cannot be directly accessed.'); 
include_theme_header(); 

... MON CODE ...

<?php include_theme_footer(); ?>
Quand j'appel ce fichier via mon navigateur j'obtiens cette erreur :
Une erreur est survenue !Erreur : SQLSTATE[HY000] [2005] Unknown MySQL server host 'pf2-sql1.free-h.org:3306' (3)
N° : 2005
J'ai donc corrigé cette information et j'ai maintenant ce simple message d'erreur en appelant le fichier traitement.php :
Erreur lors du chargement de la page. Retour.
En ce qui concerne le fichier contact.php ça n'a rien changé, cela ne s'affiche pas. Un moyen de récolter un message d'erreur au moins ?

Autre question, l'utilisateur n'a pas besoin d'avoir accès au fichier traitement.php non ?