Problème formulaire suite à mise en place de captcha.

Eléphant du PHP | 89 Messages

20 mars 2022, 19:30

Bonjour à tous,

j'essaye de mettre en place un captcha pour protéger un formulaire de spams.

Le captcha fonctionne, mais la dernière partie qui consiste à renvoyer sur la page "Merci pour nous avoir contacté" ne fonctionne pas. Cela ramène vers une page blanche, mais je reçois bien les réponses du formulaire par mail.

Voici mon formulaire:

Code : Tout sélectionner

<form action="traitement2003.php" method="post"> <p> <label for="nom">Nom :</label> <input type="text" name="nom" id="nom"> </p> <p> <label for="sujet">Sujet :</label> <input type="text" name="sujet" id="sujet"> </p> <p> <label for="email">E-mail :</label> <input type="email" name="email" id="email"> </p> <p> <label for="message">Message :</label> <textarea name="message" id="message"></textarea> </p> <input type="hidden" id="recaptchaResponse" name="recaptcha-response"> <button>Envoyer</button> <script src="https://www.google.com/recaptcha/api.js?render=6LdoPuAeAAAAAD3VdvggAG3AgjBgAuy8xjfDVSxt"></script> <script> grecaptcha.ready(function() { grecaptcha.execute('6LdoPuAeAAAAAD3VdvggAG3AgjBgAuy8xjfDVSxt', {action: 'homepage'}).then(function(token) { document.getElementById('recaptchaResponse').value = token }); }); </script> </form>
Et mon fichier traitement.php

Code : Tout sélectionner

<?php // On vérifie que la méthode POST est utilisée if($_SERVER['REQUEST_METHOD'] == 'POST'){ // On vérifie si le champ "recaptcha-response" contient une valeur if(empty($_POST['recaptcha-response'])){ header('Location: index.html'); }else{ // On prépare l'URL $url = "https://www.google.com/recaptcha/api/siteverify?secret=6xxxxxxxxxx&response={$_POST['recaptcha-response']}"; // On vérifie si curl est installé if(function_exists('curl_version')){ $curl = curl_init($url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($curl); }else{ // On utilisera file_get_contents $response = file_get_contents($url); } // On vérifie qu'on a une réponse if(empty($response) || is_null($response)){ header('Location: index.php'); } else{ $data = json_decode($response); if($data->success){ if( isset($_POST['nom']) && !empty($_POST['nom']) && isset($_POST['sujet']) && !empty($_POST['sujet']) && isset($_POST['email']) && !empty($_POST['email']) && isset($_POST['message']) && !empty($_POST['message']) ){ // On nettoie le contenu $nom = strip_tags($_POST['nom']); $sujet = strip_tags($_POST['sujet']); $email = strip_tags($_POST['email']); $message = htmlspecialchars($_POST['message']); // Ici vous traitez vos données $msg = "Nom:\t$_POST[nom]\n"; $msg .= "E-Mail de contact:\t$_POST[email]\n"; $msg .= "Commentaires:\t$_POST[message]\n"; $recipient = "[email protected]"; $subject = "Formulaire de reservation au pays des Saveurs"; $mailheaders = "From: $_POST[email]\n"; $mailheaders .= "Reply-To: $_POST[email]\n\n"; mail($recipient, $subject, $msg, $mailheaders); } }else{ header("Location:http://www.paysdessaveurs.be/merci.html"); }}} }else{ http_response_code(405); echo "Méthode non autorisée"; } ?>
Merci pour votre aide.

Mammouth du PHP | 2703 Messages

20 mars 2022, 21:25

il faut indenter le code correctement. cela permettra de se rendre compte plus facilement que la ligne
header("Location:http://www.paysdessaveurs.be/merci.html");
n'est pas au bon endroit.

Eléphant du PHP | 89 Messages

21 mars 2022, 08:39

Merci pour votre réponse.
J'ai à nouveau essayé plusieurs fois et soit j'ai des parse error ou la page ne s'affiche toujours pas.

Code : Tout sélectionner

<?php // On vérifie que la méthode POST est utilisée if($_SERVER['REQUEST_METHOD'] == 'POST'){ // On vérifie si le champ "recaptcha-response" contient une valeur if(empty($_POST['recaptcha-response'])){ header('Location: index.html'); }else { // On prépare l'URL $url = "https://www.google.com/recaptcha/api/siteverify?secret=xxxxx&response={$_POST['recaptcha-response']}"; // On vérifie si curl est installé if(function_exists('curl_version')) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($curl); }else { // On utilisera file_get_contents $response = file_get_contents($url); } // On vérifie qu'on a une réponse if(empty($response) || is_null($response)) { header('Location: index.php'); } else { $data = json_decode($response); if($data->success){ if( isset($_POST['nom']) && !empty($_POST['nom']) && isset($_POST['sujet']) && !empty($_POST['sujet']) && isset($_POST['email']) && !empty($_POST['email']) && isset($_POST['message']) && !empty($_POST['message']) ) { // On nettoie le contenu $nom = strip_tags($_POST['nom']); $sujet = strip_tags($_POST['sujet']); $email = strip_tags($_POST['email']); $message = htmlspecialchars($_POST['message']); // Ici vous traitez vos données $msg = "Nom:\t$_POST[nom]\n"; $msg .= "E-Mail de contact:\t$_POST[email]\n"; $msg .= "Commentaires:\t$_POST[message]\n"; $recipient = "[email protected]"; $subject = "Formulaire de reservation au pays des Saveurs"; $mailheaders = "From: $_POST[email]\n"; $mailheaders .= "Reply-To: $_POST[email]\n\n"; mail($recipient, $subject, $msg, $mailheaders); } }else { header("Location:http://www.paysdessaveurs.be/merci.html"); } } } }else { http_response_code(405); echo "Méthode non autorisée"; } ?>
Le "Location:http://www.paysdessaveurs.be/merci.html" n'est pas au bon endroit ou une une condition se termine par manquant?

Merci pour votre aide.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

21 mars 2022, 13:04

Si tu as des parse error, il faut que tu les lises attentivement et les corriges, ou que tu nous les indiques pour qu'on puisse t'aider.

La fonction header('Location...); doit déclencher une redirection via les entête HTTP.
Or si ça passe dans les entêtes, ça veut dire deux choses pour que ça marche :
1) il ne faut pas qu'il y ait du texte ou du HTML ni même un espace, qui soit envoyé au navigateur avant la fonction header().
Et donc pas de message d'erreur non plus vu que le message d'erreur est envoyé en HTML ;)
2) il ne faut pas qu'il y ait non plus de HTML envoyé juste après le header('Location...') car le navigateur va recevoir des infos contradictoires de faire une redirection mais en même temps de lui envoyer du HTML qu'il est sensé afficher. Du coup ça peut provoquer des résultats instables.

:arrow: la solution pour éviter les problèmes, c'est de toujours (mais vraiment toujours toujours) faire suivre un appel à) header('location...'); par un exit;
Comme ça pas de risque de comportement bizarre.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 89 Messages

21 mars 2022, 22:50

Merci pour votre réponse.

Il n'y a pas d'espace avant le header. J'ai aussi ajouté le exit, comme ceci:

Code : Tout sélectionner

else {header("Location:http://www.paysdessaveurs.be/merci.html"); exit; }
Plus de souci de "parse" non plus.

J'ai néanmoins toujours une page blanche qui pointe vers "http://www.paysdessaveurs.be/traitement2003.php" lorsque j'envoie le formulaire ...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

22 mars 2022, 14:41

Moi j'ai un message d'erreur quand je clique sur ton lien...

Sinon pour les pages blanches, il faut regarder dans les logs d'erreur Apache/PHP (fais un phpinfo() pour savoir où est situé le fichier de log)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 89 Messages

22 mars 2022, 23:03

Bonsoir,

quand je remplis le formulaire http://www.paysdessaveurs.be/contact2003.php, je n'ai pas de message d'erreur, mais une page blanche.
Quand je clique directement sur http://www.paysdessaveurs.be/traitement2003.php, j'ai une erreur: undefined function http_response_code() Ce n'est pas parce que le fichier n'est pas appelé par la méthode "post"?

Code : Tout sélectionner

if($_SERVER['REQUEST_METHOD'] == 'POST')
Le phpinfo.php m'indique ceci:
error_log no value no value

Je ne trouve nul part le php.ini ...

Merci pour votre aide et patience ...

Mammouth du PHP | 2703 Messages

22 mars 2022, 23:27

https://www.php.net/manual/fr/function. ... e-code.php nous dit qu'il faut au moins php 5.4 pour que cette fonction existe.

Eléphant du PHP | 89 Messages

24 mars 2022, 08:42

Bonjour,

je viens de configurer manuellement le fichier .ovhconfig (hébergement ovh start10M ...) et je suis désormais en version php 8.

Je n'ai plus de message d'erreur lorsque je clique sur le traitement du formulaire: http://www.paysdessaveurs.be/traitement2003.php

Malheureusement, lorsque je remplis le formulaire via http://www.paysdessaveurs.be/contact2003.php, j'ai toujours une page blanche qui s'affiche après l'envoi du formulaire ...
Les infos saisies dans le formulaire arrive bien sur mon mail: c'est l'affichage de la confirmation de l'envoi du formulaire qui ne s'affiche pas ...

Pas de trace d'un php.ini sur mon ftp ...
Le phpinfo.php est www.paysdessaveurs.be/phpinfo.php.

Merci à nouveau pour votre aide.

Mammouth du PHP | 2703 Messages

24 mars 2022, 10:37

il faut indenter le code correctement. cela permettra de se rendre compte plus facilement que la ligne
header("Location:http://www.paysdessaveurs.be/merci.html");
n'est pas au bon endroit.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 mars 2022, 12:26

Vu que tu es chez OVH, voici quelques pistes en cas de pages blanches ou pour accéder aux logs :
https://docs.ovh.com/fr/hosting/erreur- ... ver-error/
https://docs.ovh.com/fr/hosting/mutuali ... -mon-site/
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 89 Messages

24 mars 2022, 17:27

Les logs d'erreur ne semblent pas liés à mes essais (mon site n'est pas un site WP):
[Tue Mar 22 18:36:52 2022] [error] [client 185.191.34.215] [host paysdessaveurs.be] AH01264: script not found or unable to stat: /homez.547/paysdess/www/sistem.php
[Tue Mar 22 18:47:08 2022] [error] [client 124.40.255.186] [host paysdessaveurs.be] AH01264: script not found or unable to stat: /homez.547/paysdess/www/wp-login.php

Eléphant du PHP | 89 Messages

24 mars 2022, 17:28

J'ai essayé d'aligner les { et les } pour clarifier le code:
<?php

// On vérifie que la méthode POST est utilisée
if($_SERVER['REQUEST_METHOD'] == 'POST')	{
    
	// On vérifie si le champ "recaptcha-response" contient une valeur
    if(empty($_POST['recaptcha-response']))	{
        header('Location: index.html');
											}else					
					{
		
		// On prépare l'URL
        $url = "https://www.google.com/recaptcha/api/siteverify?secret=6LdoPuAeAAAAAFHlp2UVA1tGDK06FTT8l11nfWJy&response={$_POST['recaptcha-response']}";
		
		// On vérifie si curl est installé
        if(function_exists('curl_version'))	{
            $curl = curl_init($url);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_TIMEOUT, 1);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            $response = curl_exec($curl);
											}else	{
            // On utilisera file_get_contents
            $response = file_get_contents($url);
													}
		
		// On vérifie qu'on a une réponse
        if(empty($response) || is_null($response))	{
            header('Location: index.php');
													}
		else			{
            $data = json_decode($response);
            if($data->success)	{
    
                if(
                    isset($_POST['nom']) && !empty($_POST['nom']) &&
                    isset($_POST['sujet']) && !empty($_POST['sujet']) &&
                    isset($_POST['email']) && !empty($_POST['email']) &&
                    isset($_POST['message']) && !empty($_POST['message'])
                )	{
                    // On nettoie le contenu
                    $nom = strip_tags($_POST['nom']);
                    $sujet = strip_tags($_POST['sujet']);
                    $email = strip_tags($_POST['email']);
                    $message = htmlspecialchars($_POST['message']);

                    // Ici vous traitez vos données

                    $msg = "Nom:\t$_POST[nom]\n";
					$msg .= "E-Mail de contact:\t$_POST[email]\n";
					$msg .= "Commentaires:\t$_POST[message]\n";

$recipient = "[email protected]";
$subject = "Formulaire de reservation au pays des Saveurs";

$mailheaders = "From: $_POST[email]\n";
$mailheaders .= "Reply-To: $_POST[email]\n\n";

mail($recipient, $subject, $msg, $mailheaders);

					}
								}else	{header("Location:http://www.paysdessaveurs.be/merci.html");
					exit;
										}		
						}	
					}

											}else	{
    http_response_code(405);
    echo "Méthode non autorisée";
													}
Dans mon éditeur Notepad ++, toutes les parenthèses semblent se fermer et s'ouvrir aux bons endroits ...

Encore merci pour votre aide.

Mammouth du PHP | 2703 Messages

24 mars 2022, 20:30

le rendu de l'outil https://beautifytools.com/php-beautifier.php
<?php
// On vérifie que la méthode POST est utilisée
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // On vérifie si le champ "recaptcha-response" contient une valeur
    if (empty($_POST['recaptcha-response'])) {
        header('Location: index.html');
    }
    else {
        // On prépare l'URL
        $url = "https://www.google.com/recaptcha/api/siteverify?secret=xxxxx&response={$_POST['recaptcha-response']}";
        // On vérifie si curl est installé
        if (function_exists('curl_version')) {
            $curl = curl_init($url);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_TIMEOUT, 1);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            $response = curl_exec($curl);
        }
        else {
            // On utilisera file_get_contents
            $response = file_get_contents($url);
        }
        // On vérifie qu'on a une réponse
        if (empty($response) || is_null($response)) {
            header('Location: index.php');
        }
        else {
            $data = json_decode($response);
            if ($data->success) {
                if (isset($_POST['nom']) && !empty($_POST['nom']) && isset($_POST['sujet']) && !empty($_POST['sujet']) && isset($_POST['email']) && !empty($_POST['email']) && isset($_POST['message']) && !empty($_POST['message'])) {
                    // On nettoie le contenu
                    $nom = strip_tags($_POST['nom']);
                    $sujet = strip_tags($_POST['sujet']);
                    $email = strip_tags($_POST['email']);
                    $message = htmlspecialchars($_POST['message']);
                    // Ici vous traitez vos données
                    $msg = "Nom:\t$_POST[nom]\n";
                    $msg .= "E-Mail de contact:\t$_POST[email]\n";
                    $msg .= "Commentaires:\t$_POST[message]\n";
                    $recipient = "[email protected]";
                    $subject = "Formulaire de reservation au pays des Saveurs";
                    $mailheaders = "From: $_POST[email]\n";
                    $mailheaders .= "Reply-To: $_POST[email]\n\n";
                    mail($recipient, $subject, $msg, $mailheaders);
                }
            }
            else {
                header("Location:http://www.paysdessaveurs.be/merci.html");
            }
        }
    }
}
else {
    http_response_code(405);
    echo "Méthode non autorisée";
}
?>


Eléphant du PHP | 89 Messages

26 mars 2022, 09:32

<?php
// On vérifie que la méthode POST est utilisée
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{

    // On vérifie si le champ "recaptcha-response" contient une valeur
    if (empty($_POST['recaptcha-response']))
    {
        header('Location: index.html');
    }
    else
    {

        // On prépare l'URL
        $url = "https://www.google.com/recaptcha/api/siteverify?secret=6LdoPuAeAAAAAFHlp2UVA1tGDK06FTT8l11nfWJy&response={$_POST['recaptcha-response']}";

        // On vérifie si curl est installé
        if (function_exists('curl_version'))
        {
            $curl = curl_init($url);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_TIMEOUT, 1);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            $response = curl_exec($curl);
        }
        else
        {
            // On utilisera file_get_contents
            $response = file_get_contents($url);
        }

        // On vérifie qu'on a une réponse
        if (empty($response) || is_null($response))
        {
            header('Location: index.php');
        }
        else
        {
            $data = json_decode($response);
            if ($data->success)
            {

                if (isset($_POST['nom']) && !empty($_POST['nom']) && isset($_POST['sujet']) && !empty($_POST['sujet']) && isset($_POST['email']) && !empty($_POST['email']) && isset($_POST['message']) && !empty($_POST['message']))
                {
                    // On nettoie le contenu
                    $nom = strip_tags($_POST['nom']);
                    $sujet = strip_tags($_POST['sujet']);
                    $email = strip_tags($_POST['email']);
                    $message = htmlspecialchars($_POST['message']);

                    // Ici vous traitez vos données
                    $msg .= "Nom:\t$_POST[nom]\n";
                    $msg .= "E-Mail de contact:\t$_POST[email]\n";
                    $msg .= "Commentaires:\t$_POST[message]\n";

                    $recipient = "[email protected]";
                    $subject = "Formulaire de reservation au pays des Saveurs";

                    $mailheaders = "From: $_POST[email]\n";
                    $mailheaders .= "Reply-To: $_POST[email]\n\n";

                    mail($recipient, $subject, $msg, $mailheaders);

                }
            }
            else
            {
                header("Location:http://www.paysdessaveurs.be/merci.html");
                exit;
            }
        }
    }

}
else
{
    http_response_code(405);
    echo "Méthode non autorisée";
}