A voir également:
- Est-ce possible avec PHP SVP ??
- Easy php - Télécharger - Divers Web & Internet
- \R php ✓ - Forum PHP
- Br php ✓ - Forum PHP
- Expert php - Télécharger - Langages
- Php echo image ✓ - Forum PHP
10 réponses
Apatik
Messages postés
5304
Date d'inscription
mercredi 28 janvier 2009
Statut
Contributeur
Dernière intervention
29 mai 2016
782
28 mai 2010 à 14:43
28 mai 2010 à 14:43
Bon, alors voila ce que je te propose. Il y a sans doute des coquilles mais l'idée me semble clair. Une première passe durant laquelle on affiche et rempli le formulaire, puis une fois soumis, on affiche une confirmation, et un bouton a valider. Les valeurs sont maintenues grace a champs "hidden", et il y a un bouton qui envoie tout au fameux service:
Par contre, comme les données sont envoyées directement du client au service, il est possible qu'elles soient modifiées si le mec bidouille un peu.. Mais pour l'utilisateur lambda, c'est impossible :)
<?php if (!isset($_POST['button'])) //au premier affichage du formulaire { echo " <form id=\"form\" name=\"formulaire\" action=\"newsletter.php\" method=\"post\">// action => boucler sur le meme fichier <fieldset> <input type=\"hidden\" name=\"Liste\" value=\"6789\">//champ invisible imposé par le service en question <p><label for=\"Prénom\">1- Votre prénom ou pseudo :</label> <input class=\"name\" name=\"name\" value=\"<?php echo htmlspecialchars($_POST['name']);?> type=\"text\"></p> <p><label for=\"email\">2- Votre adresse e-mail :</label> <input class=\"email\" name=\"Email\" value=\"<?php echo htmlspecialchars($_POST['Email']);?> type=\"text\"></p> <input type=\"hidden\" name=\"espion\" value=\"rempli\"> <input value=\"Envoyer\" class=\"button\" name=\"button\" type=\"submit\"> </fieldset> </form> "; } elseif ($_POST['espion'] = "rempli") //si le formulaire vient d'être soumis { $verif = "!^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}.[a-zA-Z]{2,4}$!"; $espion = htmlspecialchars($_POST['espion']); $name = htmlspecialchars($_POST['name']); $Email = htmlspecialchars($_POST['Email']); if ((strlen($name) == 0) OR (strlen($Email) == 0)) { echo "<p class='avert'>Inscription échouée: <em>les 2 champs doivent être remplis !</em></p>"; } elseif (isset($_POST['Email']) && !preg_match($verif,$Email)) { echo "<p class='avert'>Inscription échouée: <em>il y a une erreur dans votre e-mail !</em></p>"; } else //On va générer un nouveau formulaire figé qui cette fois va tout envoyer au fameux service { echo " <form id=\"form\" name=\"formulaire\" action=\"urlduservice.php\" method=\"post\"> //Pour envoyer les données au service cette fois-ci <p>il n'y a aucune erreur dans votre formulaire, cliquer ici pour l'envoyer définitivement</p> <input type=\"hidden\" name=\"liste\" value=\"6789\"> <input type=\"hidden\" name=\"name\" value=\"$name\"> <input type=\"hidden\" name=\"email\" value=\"$email\"> <input value=\"Envoyer\" class=\"button\" name=\"button\" type=\"submit\"> </form> ;" } } ?>
Par contre, comme les données sont envoyées directement du client au service, il est possible qu'elles soient modifiées si le mec bidouille un peu.. Mais pour l'utilisateur lambda, c'est impossible :)
Je ne sais pas si je me fais bien comprendre mais je vais éclaircir un peu la question.
En fait j'utilise un prestataire de mailing payant qui récupère les champs de saisie (nom et email) de mon formulaire pour les placer dans une base de donnée qui me sert à envoyer des mails à ma liste d'inscrits.
Pour que le script du service de mailing s'exécute il faut que j'indique dans l'attribut: action="http://www.urlduservice.php" de la balise <form>.
Donc je récapitule, je souhaite que l'attribut action ="http://www.urlduservice.php" s'enclenche si et seulement si le traitement de mon formulaire que je vérifie avec php est valide.
Je sais que je peux faire ceci avec du javascript comme par exemple avec l'événement "onsubmit", mais je veux le faire avec du php. Suis-je plus clair ?
Merci
En fait j'utilise un prestataire de mailing payant qui récupère les champs de saisie (nom et email) de mon formulaire pour les placer dans une base de donnée qui me sert à envoyer des mails à ma liste d'inscrits.
Pour que le script du service de mailing s'exécute il faut que j'indique dans l'attribut: action="http://www.urlduservice.php" de la balise <form>.
Donc je récapitule, je souhaite que l'attribut action ="http://www.urlduservice.php" s'enclenche si et seulement si le traitement de mon formulaire que je vérifie avec php est valide.
Je sais que je peux faire ceci avec du javascript comme par exemple avec l'événement "onsubmit", mais je veux le faire avec du php. Suis-je plus clair ?
Merci
Bon visiblement ça n'a pas l'air d'être réalisable ou je dois m'exprimer comme une vraie savate...
Merci quand même à ceux qui ont pris le temps de me lire.
Merci quand même à ceux qui ont pris le temps de me lire.
Apatik
Messages postés
5304
Date d'inscription
mercredi 28 janvier 2009
Statut
Contributeur
Dernière intervention
29 mai 2016
782
28 mai 2010 à 12:56
28 mai 2010 à 12:56
Bonjour,
Il faut savoir être patient pour obtenir une réponse :)
Donc, ton problème:
Tu as un formulaire, qui une fois validé, est analysé par du code PHP, et seulement ensuite doit être envoyé au fameux service.php ?
Dans ce cas, je te propose de mettre un
Qu'en penses-tu?
Il faut savoir être patient pour obtenir une réponse :)
Donc, ton problème:
Tu as un formulaire, qui une fois validé, est analysé par du code PHP, et seulement ensuite doit être envoyé au fameux service.php ?
Dans ce cas, je te propose de mettre un
action="verification.php"Puis de faire générer a cette page un récapitulatif non modifiable (pour avoir une relecture des informations), avec cette fois le bouton
action="urlduservice.php"qui permet d'envoyer définitivement le mail.
Qu'en penses-tu?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut Apatik et merci pour ta réponse.
Si j'ai compris ta proposition je traite le formulaire par le biais d'un script externe "verification.php"
dans lequel j'appelle ensuite le service qui récupère les champs de saisie de mon formulaire avec un action="urlduservice.php" ?
Ok pas bête dutout je n'y ait même pas pensé, mais j'ai un peu de mal à saisir comment générer un récapitulatif non modifiable sur cette page et faire exécuter le bouton action="urlduservice.php".
Si j'ai compris ta proposition je traite le formulaire par le biais d'un script externe "verification.php"
dans lequel j'appelle ensuite le service qui récupère les champs de saisie de mon formulaire avec un action="urlduservice.php" ?
Ok pas bête dutout je n'y ait même pas pensé, mais j'ai un peu de mal à saisir comment générer un récapitulatif non modifiable sur cette page et faire exécuter le bouton action="urlduservice.php".
Apatik
Messages postés
5304
Date d'inscription
mercredi 28 janvier 2009
Statut
Contributeur
Dernière intervention
29 mai 2016
782
28 mai 2010 à 13:37
28 mai 2010 à 13:37
Ok, alors on va parler concret.
Comment fait tu pour vérifier ton formulaire avec le PHP? Copie moi tout ton code ici s'il te plait. On parlera a partir de la même base comme ça.
Comment fait tu pour vérifier ton formulaire avec le PHP? Copie moi tout ton code ici s'il te plait. On parlera a partir de la même base comme ça.
briiiiix
Messages postés
575
Date d'inscription
vendredi 24 octobre 2008
Statut
Membre
Dernière intervention
1 juin 2010
18
28 mai 2010 à 14:10
28 mai 2010 à 14:10
Une petite remarque: PHP est executé au niveau du serveur, et javascript est executé au niveau du client, du coup, il est impossible de verifier le contenu des champs de ton formulaire avec php sans avoir a envoyer quelques requetes au serveur.
Une autre remarque, tout ce que tu genère comme html ou javascript est visible dans le code source de la page, et je ne penses pas que tu apprecirais qu'un utilisateur voit vers qui tu redirige ton formulaire en cliquant sur afficher source du navigateur.
Pour moi, la meilleur solution et la plus sécurisée est de passer par ajax qui permet de faire passer des variables html ou javascript au serveur sans avoir à recharger la page. Il permet aussi de modifier l'attribut action="" du formulaire initialement vide et de faire la soumission. Il te permet aussi de vérifier l'existence de l'adresse email dans ta base de données et de garder une copie de tes formulaires avant de les envoyer, ceci te sera très utile afin de blacklister des adresses si tu veux.
Une autre remarque, tout ce que tu genère comme html ou javascript est visible dans le code source de la page, et je ne penses pas que tu apprecirais qu'un utilisateur voit vers qui tu redirige ton formulaire en cliquant sur afficher source du navigateur.
Pour moi, la meilleur solution et la plus sécurisée est de passer par ajax qui permet de faire passer des variables html ou javascript au serveur sans avoir à recharger la page. Il permet aussi de modifier l'attribut action="" du formulaire initialement vide et de faire la soumission. Il te permet aussi de vérifier l'existence de l'adresse email dans ta base de données et de garder une copie de tes formulaires avant de les envoyer, ceci te sera très utile afin de blacklister des adresses si tu veux.
briiiiix
Messages postés
575
Date d'inscription
vendredi 24 octobre 2008
Statut
Membre
Dernière intervention
1 juin 2010
18
28 mai 2010 à 14:30
28 mai 2010 à 14:30
Tout d'abord, ajax n'est pas un langage, c'est une methode de développement (Asynchrone Javascript And Xml), ceci dit que le traitement est asynchrone, et que tu peux envoyer seulement les variables que tu veux vers PHP.
Si tu veux, tu peux voir ici
https://www.xul.fr/xml-ajax.html
Revien vers moi si ça t'interresse
Si tu veux, tu peux voir ici
https://www.xul.fr/xml-ajax.html
Revien vers moi si ça t'interresse
ok voila le code html et php à savoir que tout est sur la même page qui s'appelle newsletter.php:
Maintenant le code php qui vérifie le formulaire:
<form id="form" name="formulaire" action="" method="post">// Pour l'instant je n'ai rien mis dans l'attribut action="" <fieldset> <input type="hidden" name="Liste" value="6789">//champ invisible imposé par le service en question <p><label for="Prénom">1- Votre prénom ou pseudo :</label> <input class="name" name="name" value="<?php echo htmlspecialchars($_POST['name']);?> type="text"></p> <p><label for="email">2- Votre adresse e-mail :</label> <input class="email" name="Email" value="<?php echo htmlspecialchars($_POST['Email']);?> type="text"></p> <input type="hidden" name="espion" value="ok"> <input value="Envoyer" class="button" name="button" type="submit"> </fieldset> </form>
Maintenant le code php qui vérifie le formulaire:
<?php $verif = "!^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-zA-Z]{2,4}$!"; if (isset($_POST['button'])) { $espion = htmlspecialchars($_POST['espion']); $name = htmlspecialchars($_POST['name']); $Email = htmlspecialchars($_POST['Email']); if (($espion == "ok") && (strlen($name) == 0) OR ($espion == "ok") && (strlen($Email) == 0)) { echo "<p class='avert'>Inscription échouée: <em>les 2 champs doivent être remplis !</em></p>"; } elseif (isset($_POST['Email']) && !preg_match($verif,$Email)) { echo "<p class='avert'>Inscription échouée: <em>il y a une erreur dans votre e-mail !</em></p>"; } }
Oui l'idée est bien sympa merci Apatik, le seul hiic pour moi c'est que ca demande 2 action de la part de l'utilisateur et si on faisait une redirection vers "urlduservice.php plutot" qu'une seconde action sur le boutton submit ?
Tu ferais comment toi briiiix en ajax je présume....
Tu ferais comment toi briiiix en ajax je présume....
briiiiix
Messages postés
575
Date d'inscription
vendredi 24 octobre 2008
Statut
Membre
Dernière intervention
1 juin 2010
18
28 mai 2010 à 15:10
28 mai 2010 à 15:10
Tout d'abord j'ai commencé par corriger ton formulaire et ajouter des id a tes champs.
Le bouton est un type button mnt et non pas un submit et il appelle la fonction javascript verifier_formulaire() qui se chargera d'envoyer la pour ajax:
Il nous reste a créer la fonction javascript et le fichier php pour terminer notre code ajax, je les poste un apres l'autre d'ici quelques minutes
//**************************************************
form id="form" name="formulaire" action="" method="post">
<fieldset>
<input type="hidden" name="Liste" id="Liste" value="6789">
<p><label for="Prénom">1- Votre prénom ou pseudo :</label>
<input class="name" name="name" id="name" value="<?php echo htmlspecialchars($_POST['name']);?>" type="text"></p>
<p><label for="email">2- Votre adresse e-mail :</label>
<input class="email" name="Email" id="Email" value="<?php echo htmlspecialchars($_POST['Email']);?>" type="text"></p>
<input type="hidden" name="espion" id="espin" value="ok">
<input value="Envoyer" class="button" name="button" type="button" onclick="verifier_formulaire()">
</fieldset>
</form>
Le bouton est un type button mnt et non pas un submit et il appelle la fonction javascript verifier_formulaire() qui se chargera d'envoyer la pour ajax:
Il nous reste a créer la fonction javascript et le fichier php pour terminer notre code ajax, je les poste un apres l'autre d'ici quelques minutes
//**************************************************
form id="form" name="formulaire" action="" method="post">
<fieldset>
<input type="hidden" name="Liste" id="Liste" value="6789">
<p><label for="Prénom">1- Votre prénom ou pseudo :</label>
<input class="name" name="name" id="name" value="<?php echo htmlspecialchars($_POST['name']);?>" type="text"></p>
<p><label for="email">2- Votre adresse e-mail :</label>
<input class="email" name="Email" id="Email" value="<?php echo htmlspecialchars($_POST['Email']);?>" type="text"></p>
<input type="hidden" name="espion" id="espin" value="ok">
<input value="Envoyer" class="button" name="button" type="button" onclick="verifier_formulaire()">
</fieldset>
</form>
briiiiix
Messages postés
575
Date d'inscription
vendredi 24 octobre 2008
Statut
Membre
Dernière intervention
1 juin 2010
18
28 mai 2010 à 15:56
28 mai 2010 à 15:56
Voici la fonction javascript qui va permettre d'envoyer des données en ajax, il ne reste maintenant que le fichier validation.php:
<script>
function verifier_formulaire(){
//On récupere les données du formulaire a travers leurs id
nom = document.getElementById('name').value;
Email = document.getElementById('Email').value;
espion = document.getElementById('espion').value;
// Debut de la requete XMLHttpRequest
if (window.XMLHttpRequest)
{
NewsletterRequest = new XMLHttpRequest();
if (NewsletterRequest.overrideMimeType){NewsletterRequest.overrideMimeType('text/xml');}
}
else if (window.ActiveXObject)
{
try {
NewsletterRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
NewsletterRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert ("Impossible de communiquer avec le serveur");
}
}
}
// le secret d'AJAX réside en partie dans la réception et le traitement des résultats en background :
NewsletterRequest.onreadystatechange = function()
{
if( NewsletterRequest.readyState == 4 )
{
// Ici le code 200 signifie que la requête a renvoyé par le serveur apres traitement une valeur valide. On pourrait aussi gérer les erreurs 500, 404 ...
if( NewsletterRequest.status == 200 ) //200 signifie une valeur valide
{
if ( NewsletterRequest.responseText != "" ){// Si on reçoit une valeur non nulle c'est que notre formulaire est validé
// Traitement, on a reçu deux chaines de caracteres séparées par la sequence -&-
mareponse = NewsletterRequest.responseText;
mareponse = mareponse.split('-&-');// On separe la page de la réponse et on les mets dans un tableau
if (mareponse[1] == 'valide'){
document.formulaire.action = mareponse[0]; // on attribue l'action du formulaire
document.formulaire.submit();} // on submite le formulaire}
} else if ( NewsletterRequest.responseText == "" ){//Si on reçoit une valeur nulle c'est que notre formulaire n'est pas validé
alert ('Reponse vide');
}
}
else
{
alert ("Une erreur est survenue ");
}
}
};
//On teste le format de l'email afin d'eviter les caracteres speciaux
if (!/.+@.+\.[a-zA-Z]{2,4}$/.test(Email)){
alert ('Format de email incorrect');
}else{// Sinon on procede a l'envoi ajax
//On envoi les données vers validation.php en methode Get
NewsletterRequest.open("GET", "validation.php?name=" + name + "&Email=" + Email + "&espion=" + espion , true);
NewsletterRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
NewsletterRequest.send(null);
}
}
</script>
<script>
function verifier_formulaire(){
//On récupere les données du formulaire a travers leurs id
nom = document.getElementById('name').value;
Email = document.getElementById('Email').value;
espion = document.getElementById('espion').value;
// Debut de la requete XMLHttpRequest
if (window.XMLHttpRequest)
{
NewsletterRequest = new XMLHttpRequest();
if (NewsletterRequest.overrideMimeType){NewsletterRequest.overrideMimeType('text/xml');}
}
else if (window.ActiveXObject)
{
try {
NewsletterRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
NewsletterRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert ("Impossible de communiquer avec le serveur");
}
}
}
// le secret d'AJAX réside en partie dans la réception et le traitement des résultats en background :
NewsletterRequest.onreadystatechange = function()
{
if( NewsletterRequest.readyState == 4 )
{
// Ici le code 200 signifie que la requête a renvoyé par le serveur apres traitement une valeur valide. On pourrait aussi gérer les erreurs 500, 404 ...
if( NewsletterRequest.status == 200 ) //200 signifie une valeur valide
{
if ( NewsletterRequest.responseText != "" ){// Si on reçoit une valeur non nulle c'est que notre formulaire est validé
// Traitement, on a reçu deux chaines de caracteres séparées par la sequence -&-
mareponse = NewsletterRequest.responseText;
mareponse = mareponse.split('-&-');// On separe la page de la réponse et on les mets dans un tableau
if (mareponse[1] == 'valide'){
document.formulaire.action = mareponse[0]; // on attribue l'action du formulaire
document.formulaire.submit();} // on submite le formulaire}
} else if ( NewsletterRequest.responseText == "" ){//Si on reçoit une valeur nulle c'est que notre formulaire n'est pas validé
alert ('Reponse vide');
}
}
else
{
alert ("Une erreur est survenue ");
}
}
};
//On teste le format de l'email afin d'eviter les caracteres speciaux
if (!/.+@.+\.[a-zA-Z]{2,4}$/.test(Email)){
alert ('Format de email incorrect');
}else{// Sinon on procede a l'envoi ajax
//On envoi les données vers validation.php en methode Get
NewsletterRequest.open("GET", "validation.php?name=" + name + "&Email=" + Email + "&espion=" + espion , true);
NewsletterRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
NewsletterRequest.send(null);
}
}
</script>
briiiiix
Messages postés
575
Date d'inscription
vendredi 24 octobre 2008
Statut
Membre
Dernière intervention
1 juin 2010
18
28 mai 2010 à 16:15
28 mai 2010 à 16:15
Voici le code du fichier validation.php
<?
$name = $_POST['name'];
$Email = $_POST['Email'];
$espion = $_POST['espion'];
$validation = 'invalide'; //Onsuppose que $validation est invalide
// Ici ton traitement
echo 'http://pagedetonnewsletter'.'-&-'.$validation;
//attention $validation doit prendre la valeur 'valide' pour que ton formulaire soit envoyé
?>
<?
$name = $_POST['name'];
$Email = $_POST['Email'];
$espion = $_POST['espion'];
$validation = 'invalide'; //Onsuppose que $validation est invalide
// Ici ton traitement
echo 'http://pagedetonnewsletter'.'-&-'.$validation;
//attention $validation doit prendre la valeur 'valide' pour que ton formulaire soit envoyé
?>
okuni
Messages postés
1221
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
2 janvier 2014
126
28 mai 2010 à 15:15
28 mai 2010 à 15:15
J'ai une autre idée, et c'est comme ça que je procède sur mon site.
j'ai ma première page contenant le formulaire. une fois rempli, l'utilisateur clique sur submit et envois les données vers une 2ème page. Cette page fait la vérification. S'il y a des erreurs, il enregistre toutes les données correctes en variables de session et redirige vers le formulaire (cette fois-ci, le formulaire contiendra les variables de sessions valides).
Par contre, s'il n'y a aucune erreur, alors la 2ème page exécute ce que tu veux.
j'ai ma première page contenant le formulaire. une fois rempli, l'utilisateur clique sur submit et envois les données vers une 2ème page. Cette page fait la vérification. S'il y a des erreurs, il enregistre toutes les données correctes en variables de session et redirige vers le formulaire (cette fois-ci, le formulaire contiendra les variables de sessions valides).
Par contre, s'il n'y a aucune erreur, alors la 2ème page exécute ce que tu veux.
Un redirection php du genre:
et
<form id="form" name="formulaire" action="<?php $action ?>" method="post">
et
else //si tout est bon on redirige { $action = header ('location: urlduservice.php'); }
okuni
Messages postés
1221
Date d'inscription
jeudi 4 septembre 2008
Statut
Membre
Dernière intervention
2 janvier 2014
126
28 mai 2010 à 15:28
28 mai 2010 à 15:28
tu peux utiliser header ('location:');
mais uniquement s'il n'y a pas de html avant, sinon tu aura droit à une erreur.
ce que j'utilise dans ces cas là, c'est peut-être pas très "bien" mais ça marche, c'est d'utiliser la balise meta reflresh que je tape en plein milieu de mon code html. ^^'
mais uniquement s'il n'y a pas de html avant, sinon tu aura droit à une erreur.
ce que j'utilise dans ces cas là, c'est peut-être pas très "bien" mais ça marche, c'est d'utiliser la balise meta reflresh que je tape en plein milieu de mon code html. ^^'
Apatik
Messages postés
5304
Date d'inscription
mercredi 28 janvier 2009
Statut
Contributeur
Dernière intervention
29 mai 2016
782
28 mai 2010 à 15:30
28 mai 2010 à 15:30
Sauf que si tu fait un header('location:') vers un site externe, tu perds les variables de session non?
28 mai 2010 à 14:52
28 mai 2010 à 15:05
La solution d'Ajax que tu as proposé parait plus propre coté client mais.. la soumission du formulaire vers le service se ferait toujours depuis le client, donc au final.. il y aurait toujours un aller retour vers le serveur pour vérification (quitte a ne retourner qu'un "ok", il y aura quand même un retour). Il y a donc toujours le risque de fraude puisque tout part du client vers le service, et.. du trafic en trop.. Sans compter que je maitrise pas Ajax ^^.