Un souci dans formulaire php avec récup champ msql

Fermé
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 - Modifié le 10 juil. 2018 à 17:55
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 24 juil. 2018 à 17:49
Bonjour à tous,

Jusqu'à présent nous avions un formulaire simple général pour transmettre les erreurs dans la base de données à l'administrateur... çà tourne!
Maintenant on veut que le formulaire récupère pour chaque item les données de la base et que le membre corrige le texte de la base dans le formulaire puis l'envoie à l'administrateur (c'est mieux!)
On a fait (en étant aidé!) la partie MySql (çà tourne en LocalHost avec 2 items, Current trinominal name et Subfamily, voir code) et on a copié la partie de code du précédent formulaire dans le nouveauen l'adaptant (et il n'y a pas d'erreur de code en localhost).
Malheureusement c'est pas possible de vérifier en localhost le fonctionnement du nouveau formulaire, en l'envoyant, bien sûr.
Donc il faut télécharger le nouveau la nuit très tard 1 ou 2 minutes sur le site (en gardant le vieux en archive) pour tester et revenir à l'ancien si erreur vite fait.
On a testé une fois et on a 2 lignes d'erreur qui s'affichent sur Internet losrque l'on clique sur le bouton "send":


Warning: mail() expects at least 3 parameters, 2 given in /homepages/1/htdocs/xxxx/blabla.php on line 143

Warning: mail() expects at least 3 parameters, 2 given in /homepages/1/htdocs/xxxx/blabla.php on line 143

En prenant le code source de la page, la ligne 143 est sans rapport avec notre partie du code.

Donc il y a une erreur dans notre code, mais où... est-ce que quelqu'un peut nous donner un coup de pousse?
Merci d'avance!

Seb

        $recipient = 'zzzzzz@gmail.com';
        $copy = 'yes';
        $form_action = '';
        $message_sent = "Your message has been well received, thank you.";
        $message_not_sent = "An error occurred during processing your message, please try again.";
        $message_invalid_form = "Please check all fields are filled and syntax of e-mail is correct.";
        function Rec($text)
    {
        $text = htmlspecialchars(trim($text), ENT_QUOTES);
        if (1 === get_magic_quotes_gpc())
        {
            $text = stripslashes($text);
        }
     
        $text = nl2br($text);
        return $text;
    };
        function IsEmail($email)
    {
        $value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
        return (($value === 0) || ($value === false)) ? false : true;
    }
    $name_of_member    = (isset($_POST['name_of_member']))    ? Rec($_POST['name_of_member'])    : '';
    $email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
    $email = (IsEmail($email)) ? $email : '';
    $err_form = false;
    if (isset($_POST['send']))
    {
        if (($name_of_member != '') && ($email != ''))
        {
            $headers  = 'From:'.$name_of_member.' <'.$email.'>' . "\r\n";
            if ($copy == 'yes')
            {
                $target = $recipient.';'.$email;
            }
            else
            {
                $target = $recipient;
            };
            $num_emails = 0;
            $tmp = explode(';', $target);
            foreach($tmp as $email_recipient)
            {
                if (mail($email_recipient, $headers))
                $num_emails++;
            }
     
            if ((($copy == 'yes') && ($num_emails == 2)) || (($copy == 'no') && ($num_emails == 1)))
            {
                echo '<p>'.$message_sent.'</p>';
            }
            else
            {
                echo '<p>'.$message_not_sent.'</p>';
            };
        }
        else
        {
            echo '<p>'.$message_invalid_form.'</p>';
            $err_form = true;
        };
    };
    if (($err_form) || (!isset($_POST['send'])))
    {
        echo '<form id="contact" method="post" action="' . $form_action . '">';
        echo '<input type="hidden" name="Rk_Hist" value="' . $_GET["Rk_Hist"] . '">';
        echo '<input type="hidden" name="form_modif" value="1">';
        echo '<input type="hidden" name="modifier" value="1">';
        echo 'Name of member: <input type="text" size="100" id="name_of_member" name="name_of_member" value="' .stripslashes($name_of_member). '" tabindex="1"><br>';
        echo 'E-mail: <input type="text" size="100" id="email" name="email" value="' .stripslashes($email). '" tabindex="2"><br><br><br><br>';
        echo 'Current trinominal name (no change): <input type="text" size="100" name="Current_trinom_name" value="' . $result[0]["Current_trinom_name"] . '"><br>';
        echo 'Subfamily: <textarea style="vertical-align: top;" rows="10" cols="100" wrap="virtual" name="Subfamily">' . $result[0]["Subfamily"] . '</textarea><br>';
        echo '<div style="text-align:center;"><input type="submit" name="send" value="Send !"></div>';
        echo '</form>';
        }




A voir également:

14 réponses

Utilisateur anonyme
10 juil. 2018 à 20:34
Bonjour

Le message d'erreur semble pourtant clair : il faut passer 3 paramètres à la fonction mail, et tu n'en passes que 2.
Si tu regardes la doc : https://www.php.net/manual/fr/function.mail.php, il faut indiquer au moins le destinataire, le sujet et le message.
Toi, tu n'indiques que le destinataire et les en-têtes, tu oublies le sujet et le message.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
13 juil. 2018 à 17:57
Ah oui merci, Le Père.
Je vais ajouter le title que j'avais supprimé.
Comme cela?
$title = (isset($_POST['title'])) ? Rec($_POST['title']) : '';
Mais pour le message je ne sais pas quoi faire... je vais avoir une cinquantaine de input type text et autant de textarea, tous extraits de champs de la BDD éventuellement à modifier par le formulaire du moins certains d'entre eux.
Dis moi, je dois faire autant de variables comme?
$name_of_member = (isset($_POST['name_of_member'])) ? Rec($_POST['name_of_member']) : '';

Désolé, je suis un peu paumé et pas du tout à l'aise avec les formulaires... merci de ton aide.
Comme çà je pourrai faire des tests ce WE quand le site est moins visité.
A+, Seb
0
Utilisateur anonyme
13 juil. 2018 à 18:46
En supposant que $_POST['title'] représente le sujet (et pas le titre, il n'y a pas de notion de titre dans la fonction mail) du message, qu'il n'y ait pas dedans de caractères bizarres et que tu mettes bien $title dans l'appel à la fonction mail, ça a l'air correct.
Pour ce qui est du message, ce n'est pas à moi de te dire ce que tu dois faire. Je n'ai aucune idée de ce que tu veux dire aux destinataires du message (tu leur écris pour leur dire quelque chose, non ?). Si tu as besoin d'extraire des données de toute une ribambelle de champs du même type, ça doit pouvoir se faire avec une simple boucle 'for', mais ça n'a aucun rapport avec les messages d'erreur que tu avais cités.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
17 juil. 2018 à 17:08
Bonjour,

Après de multiples tentatives en ligne ces dernières nuits, j'avance (je n'ai plus de message d'erreur) mais le problème n'est pas réglé.

Je vais être méthodique pour mieux expliquer.
Donc 2 étapes (dans mes tentatives) en modifiant le code précédent de 2 manières).

1. je ne fais qu'un formulaire partiel avec seulement nom expéditeur, adresse-mail et sujet/titre - ici Current_trinom_name) (donc c'est pas un vrai formulaire, car sans boîte de message à remplir) et les lignes de codes suivantes:
$name_of_member    = (isset($_POST['name_of_member']))    ? Rec($_POST['name_of_member'])    : '';
$email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
$Current_trinom_name   = (isset($_POST['Current_trinom_name']))   ? Rec($_POST['Current_trinom_name'])   : '';
//etc.
if (($name_of_member != '') && ($email != '') && ($Current_trinom_name != ''))
//etc.
if (mail($email_recipient, $Current_trinom_name, $headers))
//etc.
echo '<form id="contact" method="post" action="' . $form_action . '">';
        echo '<input type="hidden" name="Rk_Hist" value="' . $_GET["Rk_Hist"] . '">';
        echo '<input type="hidden" name="form_modif" value="1">';
        echo '<input type="hidden" name="modifier" value="1">';
        echo 'Name of member: <input type="text" size="100" id="name_of_member" name="name_of_member" value="' .stripslashes($name_of_member). '" tabindex="1"><br>';
        echo 'E-mail: <input type="text" size="100" id="email" name="email" value="' .stripslashes($email). '" tabindex="2"><br><br><br><br>';
        echo 'Current trinominal name (do not change !): <input type="text" size="100" name="Current_trinom_name" value="' . $result[0]["Current_trinom_name"] . '"><br>';
        echo '<div style="text-align:center;"><input type="submit" name="send" value="Send !"></div>';
        echo '</form>';


Avec ce test, le formulaire en ligne envoyé (send) retourne le message
Your message has been well received, thank you.
Et dans la boîte mail de l'expéditeur, le title ou subject comme vous voudrez est bien repris.
Et dans la boîte mail du destinataire, le title ou subject comme vous voudrez est bien repris.
Ce qui est curieux c'est que dans les 2 cas, l'expéditeur est :
CGI-Mailer <cgi-mailer@kundenserver.de>
Et dans le texte du message il y a From:Non Expéditeur, Prénom <xxxx@gmail.com>
Autrement dit, dans le mail, il n'y a pas l'expéditeur de précisé mais cgi-mailer@kundenserver.de (l'hébergeur)

2. je m'engage dans le formulaire complet avec nom expéditeur, adresse-mail, sujet titre, et en plus un text-area de subfamily (donc juste un imput text pour le sujet-titre, Current_trinom_name, et un seul texte area, Subfamily, alors qu'il y en aura une centaine) et les lignes de codes suivantes:

$name_of_member    = (isset($_POST['name_of_member']))    ? Rec($_POST['name_of_member'])    : '';
$email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
$Current_trinom_name   = (isset($_POST['Current_trinom_name']))   ? Rec($_POST['Current_trinom_name'])   : '';
$Subfamily = (isset($_POST['Subfamily'])) ? Rec($_POST['Subfamily']) : '';
//etc.
if (($name_of_member != '') && ($email != '') && ($Current_trinom_name != '') && ($Subfamily != ''))
//etc.
if (mail($email_recipient, $Current_trinom_name, $Subfamily, $headers))
//etc.
        echo '<form id="contact" method="post" action="' . $form_action . '">';
        echo '<input type="hidden" name="Rk_Hist" value="' . $_GET["Rk_Hist"] . '">';
        echo '<input type="hidden" name="form_modif" value="1">';
        echo '<input type="hidden" name="modifier" value="1">';
        echo 'Name of member: <input type="text" size="100" id="name_of_member" name="name_of_member" value="' .stripslashes($name_of_member). '" tabindex="1"><br>';
        echo 'E-mail: <input type="text" size="100" id="email" name="email" value="' .stripslashes($email). '" tabindex="2"><br><br><br><br>';
        echo 'Current trinominal name (do not change, please !): <input type="text" size="100" name="Current_trinom_name" value="' . $result[0]["Current_trinom_name"] . '"><br>';
        echo 'Subfamily: <textarea style="vertical-align: top;" rows="10" cols="100" wrap="virtual" name="Subfamily">' . $result[0]["Subfamily"] . '</textarea><br>';
        echo '<div style="text-align:center;"><input type="submit" name="send" value="Send !"></div>';
        echo '</form>';


Dans ce cas, le formulaire en ligne envoyé (send) retourne le message
Your message has been well received, thank you.
MAIS il n'y a rien, ni dans la boïte mail de l'expéditeur ni dans la boïte mail du destinataire !
Rien!

Bien sûr j'ai testé auparavant les 2 étapes dans le localhost de wampserver, et il n'y a pas d'erreur qui ressort.

Je ne vois pas quoi faire de plus après ces 2 étapes de tests méthodiques.

Je suis parti d'un formulaire standard repris d'Internet (sans receuil extrait de la BDD) et qui marche depuis longtemps.
Puis j'ai ajouté les codes qui extraits les données de la BDD et j'ai adapté le code du formulaire en conséquence (c'est probablement là qu'il y a un souci, donc dans le code du 1er message?).

A+

Merci d'avance,

Seb
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tu le fais exprès ?
if (mail($email_recipient, $Current_trinom_name, $headers))

Le premier paramètre c'est le destinataire
le second c'est le sujet
le troisième c'est le message
comme je te l'ai déjà dit et comme il est indiqué dans la doc de la fonction mail, pour laquelle je t'ai fourni le lien.
Et tu te dis étonné de retrouver dans le message ce que tu as mis dans la variable headers ? C'est pourtant exactement ce que dit la doc.

Ceci dit, la deuxième version, où tu passes 4 paramètres à la fonction mail a l'air plus correcte.
Mets des "echo" immédiatement avant l'appel à mail pour voir les valeurs réelles de $email_recipient,, $Current_trinom_name, $Subfamily et $headers.
Et vérifie si le message ne se retrouve pas dans les spams du destinataire.
Autre cause de problème possible: ton hébergeur ne veut peut-être pas envoyer de mail avec un "From:" d'un autre domaine, voire même d'un autre domaine que le titulaire du compte.

Pour éviter ces problèmes et de nombreux autres, depuis longtemps, je n'utilise plus directement la fonction mail de PHP, mais une bibliothèque (PhpMailer) faite par des gens qui ont de vraies compétences dans ce domaine.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
18 juil. 2018 à 14:28
Bonjour le Père, bonjour le Forum,

Je suis désolé de t'avoir énervé.
Rien n'est fait exprès.
Dans le message j'ai pris soin de préciser que je suis parti d'un formulaire récent pris sur Internet (sans extraits de BDD) qui marche.
Je viens de re-vérifier en ligne et c'est nickel et il n'y a pas de souci, comme avec la 1ère étape, de type CGI-Mailer <cgi-mailer@kundenserver.de> (l'expéditeur est nommé comme envoyeur du mail, normal).
Ensuite j'avais déjà vérifié les dossiers spams avec le test de la 2ème étape et il n'y avait rien (de toute façon le mail reçu avec le test de la première étape même imparfait n'était pas en spam).
Que le formulaire proposé sur Internet ne te convienne pas dans sa construction, je le comprend mais je n'en sais rien : c'est une querelle entre experts (si tu préfères changer le formulaire par un autre équivalent qui te convient, pas de souci pour moi, les stripslash et autre magic ne sont pas importants... nous sommes dans un espace membre protégé par ID/PW).
Mon projet, je le rappelle, c'est un formulaire qui permet, avec une centaine de type-text et de text-area pré-remplis avec des extraits de la BDD, aux membres de faire des corrections et de les envoyer à une adresse mail (et pas de corriger en direct la BDD... trop risqué!)
Bon, avançons, s'il te plait.
Tu proposes de mettre des "echo php" pour tester les variables mais précisément quel code dois-je mettre et où?
Comme cela?
echo '<p>Contenu Headers:' .$headers. '</p>';
sachant qu'il y a déjà des tests d'eereur dans la page php du type:
error reporting (e_ALL)
echo 'Erreur:' $e, etc...


Merci de ta compréhension.
Ton aide est vraiment appréciée.

A+
Seb

ci-dessous, pour info, le code complet du formulaire initial (sans extraction de la BDD) qui marche:

//derived from php-astux.info/script-formulaire-contact (thank you)
    $recipient = 'blabla@gmail.com';
    $copy = 'yes';
    $form_action = '';
    $message_sent = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br><br>Your message has been well received, thank you.";
    $message_not_sent = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br><br>An error occurred during processing your message, please try again.";
    $message_invalid_form = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br><br>Please check all fields are filled and syntax of e-mail is correct.";
    function Rec($text)
    {
        $text = htmlspecialchars(trim($text), ENT_QUOTES);
        if (1 === get_magic_quotes_gpc())
        {
            $text = stripslashes($text);
        }
     
        $text = nl2br($text);
        return $text;
    };
    function IsEmail($email)
    {
        $value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
        return (($value === 0) || ($value === false)) ? false : true;
    }
    $name    = (isset($_POST['name']))    ? Rec($_POST['name'])    : '';
    $email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
    $title   = (isset($_POST['title']))   ? Rec($_POST['title'])   : '';
    $message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';
    $email = (IsEmail($email)) ? $email : '';
    $err_form = false;
    if (isset($_POST['send']))
    {
        if (($name != '') && ($email != '') && ($title != '') && ($message != ''))
        {
            $headers  = 'From:'.$name.' <'.$email.'>' . "\r\n";
            if ($copy == 'yes')
            {
                $target = $recipient.';'.$email;
            }
            else
            {
                $target = $recipient;
            };
     
            $message = str_replace("'","'",$message);
            $message = str_replace("’","'",$message);
            $message = str_replace(""",'"',$message);
            $message = str_replace('<br>','',$message);
            $message = str_replace('<br />','',$message);
            $message = str_replace("<","<",$message);
            $message = str_replace(">",">",$message);
            $message = str_replace("&","&",$message);
               $num_emails = 0;
            $tmp = explode(';', $target);
            foreach($tmp as $email_recipient)
            {
                if (mail($email_recipient, $title, $message, $headers))
                    $num_emails++;
            }
     
            if ((($copy == 'yes') && ($num_emails == 2)) || (($copy == 'no') && ($num_emails == 1)))
            {
                echo '<p>'.$message_sent.'</p>';
            }
            else
            {
                echo '<p>'.$message_not_sent.'</p>';
            };
        }
        else
        {
            echo '<p>'.$message_invalid_form.'</p>';
            $err_form = true;
        };
    };
    if (($err_form) || (!isset($_POST['send'])))
    {
        echo '
        <form id="contact" method="post" action="'.$form_action.'">
        <fieldset><legend>Your coordinates</legend>
            <p><label for="name">Name of member:</label><input type="text" size="100" id="name" name="name" value="'.stripslashes($name).'" tabindex="1" /></p>
            <p><label for="email">Email :</label><input type="text" size="100" id="email" name="email" value="'.stripslashes($email).'" tabindex="2" /></p>
        </fieldset>
     
        <fieldset><legend>Your message :</legend>
            <p><label for="title">title :</label><input type="text" size="100" id="title" name="title" value="'.stripslashes($title).'" tabindex="3" /></p>
            <p><label for="message">Message :</label><textarea id="message" name="message" style="vertical-align: top;" tabindex="4" cols="60" rows="8">'.stripslashes($message).'</textarea></p>
        </fieldset>
     
        <div style="text-align:center;"><input type="submit" name="send" value="Send !"></div>
        </form>';
0
Utilisateur anonyme
18 juil. 2018 à 16:13
Le formulaire proposé sur Internet me convient parfaitement, il n'y a aucune "querelle d'expert" là-dessus.
Mais passons.
Les 'echo' que je te propose, je t'ai déjà dit de manière suffisamment précise où les mettre : immédiatement avant l'appel à mail. Si je te le demande, c'est pour t'assurer que la fonction est bien appelée avec les bonnes valeurs pour les paramètres. Tout ceci n'a aucun rapport avec le "error_reporting".
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
19 juil. 2018 à 16:01
Bonjour Le Père,

A mon niveau de compréhension la phrase n'est pas évidente.
Mais je tente le code suivant, avec des echos sur les 4 variables que tu as mentionnées:
//jusque là, inchangé dans étape 2
echo 'Subfamily: <textarea style="vertical-align: top;" rows="10" cols="100" wrap="virtual" name="Subfamily">' . $result[0]["Subfamily"] . '</textarea><br>';
        echo '<p>variable 1'.$email_recipient.'</p>';
        echo '<p>variable 2'.$Current_trinom_name.'</p>';
        echo '<p>variable 3'.$Subfamily.'</p>';
        echo '<p>variable 4'.$headers.'</p>';
        echo '<div style="text-align:center;"><input type="submit" name="send" value="Send !"></div>';
        //echo "<input type='submit' name='send' value='Send !'>";
        echo '</form>';

Dans local host de Wampserver, j'ai effectivement 2 érreurs qui apparaissent, des erreurs "génériques" de type undefined variable qui ne (me) disent rien (avec undefined variable cela peut être plein de choses)
Les 2 variables semblent pourtant définies par:
$tmp = explode(';', $target);
foreach($tmp as $email_recipient)
et:
$headers = 'From:'.$name_of_member.' <'.$email.'>' . "\r\n";


Notice: Undefined variable: email_recipient in C:\_xxxxxxx.php on line 175
Call Stack
# Time Memory Function Location
1 0.0030 349352 {main}( ) ..\xxxxxxx.php:0

variable 1

variable 2

variable 3

Et la ligne 175 est:
echo '<p>variable 1'.$email_recipient.'</p>';


( ! ) Notice: Undefined variable: headers in C:\_xxxxxxx.php on line 178
Call Stack
# Time Memory Function Location
1 0.0030 349352 {main}( ) ..\xxxxxxx.php:0

variable 4

Et la ligne 178 est:
echo '<p>variable 4'.$headers.'</p>';

Voilà j'espère que cela peut t'aider à progresser.
Si je ne me suis pas planté dans l'endroit où ajouter les 4 nouvelles lignes de code!

A+

Seb

PS: par curiosité, j'ai ajouté les 2 lignes de code suivant, juste après:
echo '<p>variable 5'.$name_of_member.'</p>';
echo '<p>variable 6'.$email.'</p>';
Pas de nouvelles erreurs... juste:
variable 5
variable 6
toujours avant le bouton 'Send!'
0
Utilisateur anonyme
19 juil. 2018 à 17:51
IMMEDIATEMENT AVANT L'APPEL A MAIL
Ce n'est pas une question de compétences en informatique, mais de langue française.
À moins que ... Tu sais ce que ça veut dire, "appel à mail" ?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
20 juil. 2018 à 09:41
Bonjour,

Je me permet d'intervenir dans cette discussion....

Avant de continuer à écrire ton code... je t'invite FORTEMENT à appliquer ce qui est conseillé ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code


Puis à nous reposter (en un seul morceau) l'entièreté de ton code qu'on puisse voir (suite aux diverses modifications apportés depuis le début de cette discussion) les modifications réalisées.
Cela nous permettra également de mieux nous rendre compte de la façon dont tu as écris (et positionné) ton code.
NB: Le code que l'on veut voir... c'est celui qui te génère les divers messages d'erreur... pas un ancien code obscure qui fonctionnait à peu prêt.

0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
Modifié le 20 juil. 2018 à 16:56
Bonjour Jordane,

Merci de ta proposition d'aide (je me rappelle que tu m'as déjà bien aidé).
Tu m'as surtout appris à tout mettre et précisément.
C'est ce que je crois avoir fait dans le 1er message.
Le formulaire initial (sans recours à l'extraction de la BDD fonctionne vraiment à 100% et les membres l'utilisent régulièrement).
Cela dit avec le nouveau formùulaire intégrant des extraits de la BDD on peut faire plus simple, oublier les tripslashes, caractères particuliers etc. car là on est dans la section protégée (ID/PW) et les membres ne s'amuseraiten pas à corrompre leur message sous peine d'exclusion.
Et sur le site la plupart des messages se font via direct e-mail avec adress Javascript cryptée.
Donc aucune attache au formulaire si l'on veut le simplifier.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018
20 juil. 2018 à 18:50
Tu parles de données provenant de la base de données.... mais je ne vois aucun code lié à la BDD......
Je ne vois pas non plus les instructions qui imposent l'affichage des erreurs PHP dans ton code....
Je pense sincèrement qu'il manque tout le début de ton code... il n'est donc pas ENTIER.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
20 juil. 2018 à 16:46
Bonjour le Père,

Désolé la réponse est non.
Mais je ne me suis pas laissé abattre et j'ai googelisé la phrase "appel à mail".
J'ai trouvé sur un forum qqchose qui pouvait s'appliquer donc j'ai déplacé mes 6 echos avant le if(mail($...
foreach($tmp as $email_recipient)
            {
                echo '<p>variable 1'.$email_recipient.'</p>';
                echo '<p>variable 2'.$Current_trinom_name.'</p>';
                echo '<p>variable 3'.$Subfamily.'</p>';
                echo '<p>variable 4'.$headers.'</p>';
                echo '<p>variable 5'.$name_of_member.'</p>';
                echo '<p>variable 6'.$email.'</p>';
                if (mail($email_recipient, $Current_trinom_name, $Subfamily, $headers))

Donc si c'est bien çà, on gagne une étape.
Avec ce code, dans Wampserver localhost plus d'erreur.
Ensuite le test en ligne affiche toujours "Your message has been well received, thank you.", mais le mail n'est pas reçu par le destinataire (nous), ni par l'expéditeur en copie (et rien en spam).
Sur la page web après avoir fait send, je lis tel quel:
xxxxxxxxxxxxxxxxx
variable 1 destinataire@gmail.com (le bon destinataire)
variable 2 le sujet (bien extrait de la BDD pour Current_trinom_name)
variable 3 le textarea (bien extrait de la BDD pour Subfamily)
variable 4 From:nom et prénom remplis
variable 5 à nouveau nom et prénom remplis (mais sans from)
variable 6 expediteur@gmail.com (le bon expéditeur)

puis à nouveau (une 2ème fois), les variables de 1 à 6, mais pour la 1ère c'est l'expéditeur qui est repris pas le destinataire (j'ai vérifié 2 fois)

variable 1 expediteur@gmail.com (le bon expéditeur)
variable 2 le sujet (bien extrait de la BDD pour Current_trinom_name)
variable 3 le textarea (bien extrait de la BDD pour Subfamily)
variable 4 From:nom et prénom remplis
variable 5 à nouveau nom et prénom remplis (mais sans from)
variable 6 expediteur@gmail.com (le bon expéditeur)
xxxxxxxxxxxxxxxxx

Par sécurité j'ai fait un autre test en déplaçant le bloc de code de 6 echos d'une ligne vers le haut (avant l'accolade), et là je n'ai plus qu'une seule série de résultats:
variable 1 destinataire@gmail.com (le bon destinataire)
variable 2 le sujet (bien extrait de la BDD pour Current_trinom_name)
variable 3 le textarea (bien extrait de la BDD pour Subfamily)
variable 4 From:nom et prénom remplis
variable 5 à nouveau nom et prénom remplis (mais sans from)
variable 6 expediteur@gmail.com (le bon expéditeur)

Voilà j'espère que cette fois c'est éclairant (encore pardon!), sinon dis-moi stp précisément où je dois mettre ces 6 lignes (ou moins) de code!

A+, Seb
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
21 juil. 2018 à 16:16
Bonjour Jordane45,

Pas de souci... voici tout le code concerné de la page:
<?php include 'session_start.php'; ?>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
//etc.
    <?php
    error_reporting(E_ALL);
    require ("../connect.php");
    try {
        $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    } catch (Exception $e) {
        echo 'Erreur : ' . $e->getMessage() . '<br />';
        echo 'N° : ' . $e->getCode();
    }
    
    echo '<body><div id="header">';
//etc.
    echo '<div id="center">';
    
    $Reversed_name = null;
    if (empty($result[0])) {
        include 'xxxwelcomexxx.txt';
      } 
      elseif (isSet($_GET["modifier"]) and $_GET["modifier"] == 1) {
          
          // Herein is section "modifier" direct to database then by electronic form
          // Check if form has been submitted
          if (isSet($_GET["form_modif"])) {
                 echo "Change Profile of : " . $result[0]["Reversed_name"] . "<br>";
                
                $update = "UPDATE taxabase1 SET Family='"  . $_GET["Family"] . "', Subfamily='"  . $_GET["Subfamily"] . "' WHERE taxabase1.Rk_Hist = :id";
                // to neutralize update in database add respectively /* and */ just below on lines 76 to 79
                /*echo "Changed contents has been received for  " . $_GET["Family"] . " to replace previous contents " .$result[0]["Family"] . ". Request update with : " .  $update . " <br>";
                $requete = $connexion->prepare($update);
                $requete->bindParam(':id', $_GET["Rk_Hist"], PDO::PARAM_INT);
                $requete->execute();*/
                echo "<p>";
                echo "<a href='samepage.php?Rk_Hist=" . $_GET["Rk_Hist"] . "'>Back to modified Profile</a>";
                echo "</p>";
          }
          else {
        echo "<h6>Additions and Corrections Form for  " . $result[0]["Reversed_name"] . "</h6>";
        echo '<p>Please type hereafter your additions [text to be added] (between +++ +++) and your corrections [text to be deleted] (between --- ---) </p><p>Simple… if no text is mentioned in between --- ---, then you mean it is a simple addition<br>           if no text is mentioned in between +++ +++, then you mean it is a simple suppression<br>           if text is mentioned both in between --- --- and in between +++ +++, then you mean it is a simple replacement<br>           if no text is mentioned between --- --- or between +++ +++, then you mean the text is not to be modified.</p><p> </p>';
        // to be modified for a form sent by e-mail
        $recipient = 'destinataire@gmail.com';
        $copy = 'yes';
        $form_action = '';
        $message_sent = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br><br>Your message has been well received, thank you.";
        $message_not_sent = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br><br>An error occurred during processing your message, please try again.";
        $message_invalid_form = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<br><br>Please check all fields are filled and syntax of e-mail is correct.";
        function Rec($text)
    {
        $text = htmlspecialchars(trim($text), ENT_QUOTES);
        if (1 === get_magic_quotes_gpc())
        {
            $text = stripslashes($text);
        }
     
        $text = nl2br($text);
        return $text;
    };
        function IsEmail($email)
    {
        $value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
        return (($value === 0) || ($value === false)) ? false : true;
    }
    $name_of_member    = (isset($_POST['name_of_member']))    ? Rec($_POST['name_of_member'])    : '';
    $email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
    $Current_trinom_name   = (isset($_POST['Current_trinom_name']))   ? Rec($_POST['Current_trinom_name'])   : '';
    $Subfamily = (isset($_POST['Subfamily'])) ? Rec($_POST['Subfamily']) : '';
    $email = (IsEmail($email)) ? $email : '';
    $err_form = false;
    if (isset($_POST['send']))
    {
        //if (($name_of_member != '') && ($email != '') && ($title != '') && ($message != ''))
        if (($name_of_member != '') && ($email != '') && ($Current_trinom_name != '') && ($Subfamily != ''))
        {
            $headers  = 'From:'.$name_of_member.' <'.$email.'>' . "\r\n";
            if ($copy == 'yes')
            {
                $target = $recipient.';'.$email;
            }
            else
            {
                $target = $recipient;
            };
     
            /*$message = str_replace("'","'",$message);
            $message = str_replace("’","'",$message);
            $message = str_replace(""",'"',$message);
            $message = str_replace('<br>','',$message);
            $message = str_replace('<br />','',$message);
            $message = str_replace("<","<",$message);
            $message = str_replace(">",">",$message);
            $message = str_replace("&","&",$message);*/
               $num_emails = 0;
            $tmp = explode(';', $target);
            foreach($tmp as $email_recipient)
            {
                echo '<p>variable 1'.$email_recipient.'</p>';
                echo '<p>variable 2'.$Current_trinom_name.'</p>';
                echo '<p>variable 3'.$Subfamily.'</p>';
                echo '<p>variable 4'.$headers.'</p>';
                echo '<p>variable 5'.$name_of_member.'</p>';
                echo '<p>variable 6'.$email.'</p>';
                if (mail($email_recipient, $Current_trinom_name, $Subfamily, $headers))
                //if (mail($email_recipient, $title, $message, $headers))
                    $num_emails++;
            }
     
            if ((($copy == 'yes') && ($num_emails == 2)) || (($copy == 'no') && ($num_emails == 1)))
            {
                echo '<p>'.$message_sent.'</p>';
            }
            else
            {
                echo '<p>'.$message_not_sent.'</p>';
            };
        }
        else
        {
            echo '<p>'.$message_invalid_form.'</p>';
            $err_form = true;
        };
    };
    if (($err_form) || (!isset($_POST['send'])))
    {
        echo '<form id="contact" method="post" action="' . $form_action . '">';
        //echo "<form action='samepage.php' method='post'>";
        echo '<input type="hidden" name="Rk_Hist" value="' . $_GET["Rk_Hist"] . '">';
        echo '<input type="hidden" name="form_modif" value="1">';
        echo '<input type="hidden" name="modifier" value="1">';
        //echo '<p><label for="name">name :</label><input type="text" size="100" id="name" name="name" value="'.stripslashes($name).'" tabindex="1" /></p>';
        echo 'Name of member: <input type="text" size="100" id="name_of_member" name="name_of_member" value="' .stripslashes($name_of_member). '" tabindex="1"><br>';
        echo 'E-mail: <input type="text" size="100" id="email" name="email" value="' .stripslashes($email). '" tabindex="2"><br><br><br><br>';
        echo 'Current trinominal name (do not change, please !): <input type="text" size="100" name="Current_trinom_name" value="' . $result[0]["Current_trinom_name"] . '"><br>';
        echo 'Subfamily: <textarea style="vertical-align: top;" rows="10" cols="100" wrap="virtual" name="Subfamily">' . $result[0]["Subfamily"] . '</textarea><br>';
        echo '<div style="text-align:center;"><input type="submit" name="send" value="Send !"></div>';
        //echo "<input type='submit' name='send' value='Send !'>";
        echo '</form>';
        };
          }
     
    } else {
    //etc.
    


Merci encore de toute l'aide!
A+
Seb
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
21 juil. 2018 à 17:28
Bon... visiblement tu n'as pas envie qu'on t'aide..... il manque encore des choses dans ton code.

Mais je vais quand même déjà te donner quelques pistes.
A quoi te sert le pavé
try {
        $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    } catch (Exception $e) {
        echo 'Erreur : ' . $e->getMessage() . '<br />';
        echo 'N° : ' . $e->getCode();
    }

alors qu'il semble que tu aies déjà codé ta connexion dans ton fichier
 equire ("../connect.php"); 



Ensuite, je t'invite vivement à lire et à appliquer TOUT ce qui est indiqué dans ces deux liens
- https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

- https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code#ou-placer-son-code-php
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
24 juil. 2018 à 13:36
Bonjour Jordane45,

La plus belle fille ne peut donner que ce qu'elle a.
Tu as tout le code, les etc. ne concernent que du texte et les menus.
A la fin, après le 'else {' il y a une requête sur la BDD qui n'a rien à voir et qui fonctionne parfaitement.
D'ailleurs tout le site fonctionne bien depuis des lustres.

Je ne peux pas plus!
Je connais ces liens : tu les lances régulièrement ici même pour 'spotter' les erreurs.
PS... ton analyse a été rapide: le 1er connect concerne l'accès à l'espace membre (pas de BDD membres), le 2ème est l'appel à la BDD même, classique!

Sans malice,
Seb
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
24 juil. 2018 à 14:26

Je connais ces liens : tu les lances régulièrement ici même pour 'spotter' les erreurs.

Si tu ne les connais pas.... il n'est pas trop tard pour relire mon message précédent et cliquer dessus.
Cela t’amènera à des pages expliquant comment coder (gérer devrais-je dire) correctement les erreurs PDO et l'écriture PROPRE de ton code PHP.
Les points importants étant :
- L'activation de l'affichage des erreurs PHP
- L'activation des erreurs PDO
- La récuépration PROPRE des variables AVANT de les utiliser
- L'écriture des requêtes SQL en PDO (dans des blocs TRY/CATCH pour justement "trapper" les éventuelles erreurs)

Suite à cela, si ton souci persiste, n'hésite pas à revenir nous voir avec le code modifié.....
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
24 juil. 2018 à 17:17
C'est une fin de non recevoir, déjà esquissée avec la demande de code encore plus complet.
Comme je l'avais déjà dit, quand on veut on peut (yg_be!).
Ou bien on peut envoyer aux fraises avec des liens de méthodes.

En relisant ce fil je m'aperçois que cela avait commencé par des insultes, réitérées.

Pas de souci.
Aucun problème.
Le volontariat est toujours respectable, par principe.
Merci encore du temps passé.

Bon courage,

Seb
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
24 juil. 2018 à 17:49
En relisant ce fil je m'aperçois que cela avait commencé par des insultes, réitérées.

Où ça ? Je ne vois rien de la sorte.



C'est une fin de non recevoir, déjà esquissée avec la demande de code encore plus complet.
Comme je l'avais déjà dit, quand on veut on peut (yg_be!).
Ou bien on peut envoyer aux fraises avec des liens de méthodes.

Personnellement je n'envoie pas aux fraises....
Et oui... quand on veut.. on peut ....
On peut par exemple suivre les recommandations données par des utilisateurs avertis (ceux à qui tu demande de l'aide )
On peut faire l'effort de lire ce qui est écrit / proposé
On peut faire l'effort de consulter la documentation
On peut faire l'effort de donner les informations nécessaires pour que de sympathiques intervenants soient en mesure de t'apporter leur aide...

On peut faire preuve de respect envers ceux qui essaient de t'aider...

Bref, je laisse tomber.
Bon courage à toi.
0