[RESOLU] formulaire améliorations

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] formulaire améliorations

Re: formulaire améliorations

par canardcache » 27 août 2013, 16:56

Par contre j'ai un nouvel immense probleme:
que le form soit juste ou non, il m'envoie le mail... :-(
Le plus incroyable c'est si je fais exprès de faire capoter le condition, ça fonctionne quand même: j'ai besoin d'aide svp

edit: je suis bête :il manquait un egal (=) dans la condition

Re: formulaire améliorations

par canardcache » 26 août 2013, 11:00

Si il est bien envoyé, mais jQuery n'est pas capable de le parser. :)
Tu ne dois rien ajouter après ton echo json, pourquoi vouloir rajouter quelque chose ?
Si tu dois rajouter des informations il faut que ce soit dans ton json.
Ok je vois... Mais c'est envoyer des infos inutiles en fait.
Je voulais qu'il y ait au moins un message disant que c'est bien envoyé ou non si JS était désactivé!.

Mais j'ai trouvé une astuce: à la fin de mon code php, j'ai détecter si js est activé.
Si oui : json est codé et echo json puis exit.
Si non: j'envoie (par un require) un code d'erreurs php avec lien retour au formulaire.

Re: formulaire améliorations

par xTG » 26 août 2013, 07:32

Si il est bien envoyé, mais jQuery n'est pas capable de le parser. :)
Tu ne dois rien ajouter après ton echo json, pourquoi vouloir rajouter quelque chose ?
Si tu dois rajouter des informations il faut que ce soit dans ton json.

Re: formulaire améliorations

par canardcache » 25 août 2013, 23:45

heuuuu j'ai pas trop pigé mais merci...
C'est justement ce que je cherche à faire!
Si j'avais la possibilité de mettre des echo autre que echojson dans mon php tout est réglé!

Mon code js:

Code : Tout sélectionner

$(document).ready(function() { $('#hide').removeClass('nojs').addClass('hasjs'); var $form = $('#monForm'); $('#envoyer').on('click', function() { $form.trigger('submit'); return false; }); $form.on('submit', function() { var nom = $('#nom').val(); var email = $('#email').val(); var message = $('#message').val(); var spam =$('#spam').val(); $.ajax({ url: $(this).attr('action'), type: $(this).attr('method'), data: $(this).serialize(), dataType: 'json', success: function(json) { if(json.valide == false){ if (json.errorspam == true){ $('#success').html("Test spam failed"); $('#errormessage').html(""); $('#erroremail').html(""); $('#errornom').html(""); } if (json.erreurnom == true){ $('#errornom').html("erreur nom"); $('#nom').css({"background-color": "yellow"}); $('#success').html(""); }else{ $('#errornom').html(""); } if (json.erreuremail == true){ $('#erroremail').html("erreur email"); $('#success').html(""); }else{ $('#erroremail').html(""); } if (json.emailinvalide == true){ $('#erroremail').html("email invalide"); $('#success').html(""); }else if(json.erreuremail == true){ $('#erroremail').html("erreur email"); $('#success').html(""); }else{ $('#erroremail').html(""); } if (json.erreurmessage == true){ $('#errormessage').html("erreur message"); $('#success').html(""); }else{ $('#errormessage').html(""); } }else{ $('#success').html("succes!"); $('#errormessage').html(""); $('#erroremail').html(""); $('#errornom').html(""); } } }); return false; }); });

C'est plus facile pour en parler.
Pour le php, je l'ai mis plus haut mais je vous le remets ici:
<?php
 
$n = array();
 
if (!empty($_POST))
{
   $valid = true;
	
	if (!empty($_POST['spam']) && !($_POST['spam'] == '4' || $_POST['spam'] == 'four')) 
	{
	$valid = false;
	$erreur = 'erreur spam';
	$n['errorspam'] = true;
	$n['valide'] = $valid;
	echo json_encode($n);
	exit();
	}
	
	if ( (isset($_POST['nom'])) && (strlen(trim($_POST['nom'])) > 0) )
	{
		$nom = stripslashes(strip_tags($_POST['nom']));	
	}
    else
    {
        $valid = false;
        $erreur = 'Erreur nom';
        $n['erreurnom'] = true;
		$nom= '';
    }


    if ( (isset($_POST['email'])) && (strlen(trim($_POST['email'])) > 0) )
	{
		if (preg_match('/^[a-z0-9\-_.]+@[a-z0-9\-_.]+\.[a-z]{2,3}$/i', $_POST['email']))
    	{
			$email = stripslashes(strip_tags($_POST['email']));
		}
		else
		{	
			$valid = false;
			$erreur = 'Votre email n\'est pas valide';
			$n['erreuremail'] = false;
			$n['emailinvalide'] = true;
			$email='';
		}
    }
	else
    {
        $valid = false;
        $erreur = 'Erreur email';
        $n['emailinvalide'] = false;
        $n['erreuremail'] = true;
		$email='';
    }
		

    if ( (isset($_POST['message'])) && (strlen(trim($_POST['message'])) > 0) )
	{
        $message = stripslashes(strip_tags($_POST['message']));
	}
	else
    {
        $valid = false;
        $erreur = 'Erreur message';
        $n['erreurmessage'] = true;
		$message = '';
    }
}

else
{
    $valid = false;
}	
$n['valide'] = $valid;
echo json_encode($n);


if ($valid = true)
{
	
    $destinataire = "[email protected]";
    $contenu      = "Nom de l'expéditeur : ".$nom."\n";
    $contenu     .= $message."\n";
    $headers  = 'From:'.$nom.'<'.$email."> \n"; 

	if ( (empty($nom)) && (empty($email)) && (preg_match('/^[a-z0-9\-_.]+@[a-z0-9\-_.]+\.[a-z]{2,3}$/i', $_POST['email'])) && (empty($message)) )
	{
        'echec :( <br /><a href="contact.html">Retour au formulaire</a>';
	}
	// ENCAPSULATION DES DONNEES
    else
	{
        mail($destinataire,$objet,utf8_decode($contenu),$headers);
        'Formulaire envoyé';
	}
}
?>


Voilà où j'en suis...
Comme je l'ai dit j'ai un "echo json_encode($n);" avec dedans toute les valeurs true-false dont j'ai besoin pour mon ajax dans mon jquery.
MON problème: c'est que si je fais un echo d'autre chose mon jquery est TOTALEMENT bloqué: il n'y a pas de json! (json n'est pas renvoyé)

Pourquoi?

Re: formulaire améliorations

par xTG » 25 août 2013, 21:31

Ce qu'il te faut c'est savoir si la requête est asynchrone ou non.
Pour cela tu peux simplement rajouter un paramètre dans l'url pour distinguer les deux traitements.

Mais j'avoue ne pas trop comprendre ton système.
Si ton formulaire te redirige vers cette page, qu'affiches tu dans le cas où tu y arrives car le JS est désactivé ?
Tu réouvres les balises html et insères tout le contenant de ton site ?

Le plus optimal serait de gérer des pseudo-frames.
A savoir un script qui ne génère que la réponse et que tu insères dans ton site.
Dans le cas d'un appel Ajax tu ne cibles pas l'url de pseudo-frame mais directement le fichier de traitement qui grâce au paramètre (que j'ai énoncé plus haut) traitera non pas une réponse HTML mais une réponse JSON.

Re: formulaire améliorations

par canardcache » 25 août 2013, 21:21

Oui en fait je t'explique;

Si tu veux je voulais pourvoir afficher à la fin de mon fichier php (si le js n'est pas activé) un message stipulant que l'envoi est un succès ou un échec!
Le problème c'est que si je le fait (voir si dessus mon code php), ben on se retrouve avec un réponse de ce style:

{erreurnom : true, erreurmail : false, validmail: false, etc}message bien envoyé

Json récupère tout. Si je n'ai que "{erreurnom : true, erreurmail : false, validmail: false, etc}" pas de soucis: mon jquery marche super.
Mais dès que j'ai qqch en dehors de {} ben plus rien tout le code s'arrête (ou ne fonctionne pas) et c'est ça que je ne comprends pas.

Pour moi (et ma compréhension et ma logique) je traite le json et ce qui m'interesse c'est ce qu'il y a entre {}...
Je ne vois aps pourquoi mon code fonctionne plus dès qu'il y a un truc en dehors...

Re: formulaire améliorations

par moogli » 25 août 2013, 21:05

Json c'est un format de donnée (comme tu pourrais utiliser du XML ou autre chose).

Lorsque tu fait une requête Ajax le résultat de la requête c'est ce que tu affiche en php.

Donc il n'y a aucun intérêt a afficher autre chose que la résultat de la requête.

Ensuite pour le cas ou js est désactiver de toute façon tu as un bouton subit et une action donc le formulaire se poste normalement.
Ton code js ne fait que poster le formulaire en Ajax.

Ensuite sait tu exactement où cela coince ?

Tu peux voir la requête Ajax et le retour avec les extensions développeur (chrome par exemple est bien foutu la dessus).

@+

Re: formulaire améliorations

par canardcache » 25 août 2013, 20:42

1/ ok je vois. Les sauts de lignes ne sont interprété que dans une chaîne de caractères délimitée par des doubles quotes ("). C'est la même chose pour les espaceś tabulation et tous les caractères blancs similaires.
Je te conseil d'utiliser la constante PHP_EOL pour les sauts de lignes.
Par exemple
<?php
$contenu = 'truc blabla'.PHP_EOL;
2/ la c'est a toi de faire les choses proprement. Ce n'est pas aux autres de s'adapter à toi mais l'inverse.
Si tu fait un truc propre tu n'affiche que le résultat final, tu n'a pas besoin d'afficher le reste c'est totalement inutile.


@+
Merci:
2/ mais je suis bien d'accord c'est pour cela que je demande de l'aide car je ne trouve pas. En fait j'aurai voulu dans le meilleur des cas avoir un formulaire qui fonctionne si js est désactivé... Mais si je ne peux pas faire d'echo dans mon php (ou alors c json qui enregistre... et il enregistre tout!) ben je vois mal comme faire les choses... Là ce n'est pas une quesitonde propreté du code mais simplement de comprendre comment faire pour que json ne prenne en compte que son array et pas le reste!

Pour ce point j'ai besoin d'aide. Si qqn peut m'expliquer...

Re: formulaire améliorations

par moogli » 25 août 2013, 20:32

1/ ok je vois. Les sauts de lignes ne sont interprété que dans une chaîne de caractères délimitée par des doubles quotes ("). C'est la même chose pour les espaceś tabulation et tous les caractères blancs similaires.
Je te conseil d'utiliser la constante PHP_EOL pour les sauts de lignes.
Par exemple
<?php
$contenu = 'truc blabla'.PHP_EOL;
2/ la c'est a toi de faire les choses proprement. Ce n'est pas aux autres de s'adapter à toi mais l'inverse.
Si tu fait un truc propre tu n'affiche que le résultat final, tu n'a pas besoin d'afficher le reste c'est totalement inutile.


@+

Re: formulaire améliorations

par canardcache » 25 août 2013, 18:55

Merci.

Pour le petit problème:
ok j'ai compris mais moi j'aimerais qu'il me fasse ça:

Nom

Sujet

Message

et pas Nom\r\nsujet\r\nmessage en une ligne ! ^^



Pour le grand problème: oui je le comprends aussi.
Mais mon prolbème est le suivant: le php renvoie l'array qui m'intéresse avec les valeurs bien triées... pui en dehors de l'array un string (message d'erreur final).
Ma question, car j'ai cherché et je ne trouve pas... c'est comment on fait pour que mon jquery fonctionne même si il y ades informations en dehors de mon array

Re: formulaire améliorations

par moogli » 24 août 2013, 15:40

Petit pb : un textarea retourne les saut de ligne qui sont entrées.
Si tu n'envoie pas on email au format html tu n'a pas besoin de transformation.
D'ailleurs ton code ne supprime ps les sauts de ligne.
Si c'est u format html effectivement la onction php nl2br t'es utile.
Ta fonction est inutile, car elle va juste remplacer les sauts de ligne par le saut de ligne enregistrés dans ton fichier.


Le gris pb :

Lorsque tu fait une requête Ajax, le navigateur, prend ce qui lui est retourné comme le résultat complet de la requête.
Senti affiche quelque chose qui n'est pas bien formaté le problème vient de toi et non du formulaire ;)

Si tu as un problème avec toi script utilise un déboggeur qui te permettra de suivre le cheminement de ton code et les différentes valeurs des variables tout au long de l'exécution du script.

Les plus connus sont xdebuget zend debugger..


@+

Re: formulaire améliorations

par canardcache » 24 août 2013, 14:35

Bonne question... :) je sais pas j'ys suis rester attaché.. lol
Le strip_tags est assez sécurtaire?



Par contre j'ai deux nouveaux soucis un grand et un petit...

Pour mon petit:

quand je fais mon contenu à envoyer:
if ($valid = true)
{

    $destinataire = "[email protected]";
    $contenu      = "Nom de l'expéditeur : ".$nom.'\n';
    $contenu     .= $message.'\n';
    $headers  = 'From:'.$nom.'<'.$email.'> \n'; // ici l'expediteur du mail

	if ( (empty($nom)) && (empty($email)) && (preg_match('/^[a-z0-9\-_.]+@[a-z0-9\-_.]+\.[a-z]{2,3}$/i', $_POST['email'])) && (empty($message)) )
	{
        echo 'echec :( <br /><a href="contact.html">Retour au formulaire</a>';
	}
	
    else
	{
        mail($destinataire,$objet,utf8_decode($contenu),$headers);
        echo 'Formulaire envoyé';
	}
}


les \n ne fonctionnent pas (bien entendu), donc je n'ai pas de retour à la ligne mais des \n dans mon texte...
dois-je passer par une fonction du style nl2br genre:

<?php
function nl2br2($string) {
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return $string;
}
?>



Pour mon grand problème (et ça c'est le caca): quand je mets des echo dans mon code php, mon javascripty ne fonctionne plus.
En effet json (l'idiot) encode ces echo hors de son string et donc renvoie des trucs en plus... et bloque mon code Oo...
Une idée?

Re: formulaire améliorations

par xTG » 24 août 2013, 13:40

Oui mais je m’interroge sur l'utilité de stripslashes. Pourquoi le mettre ?

Re: formulaire améliorations

par canardcache » 24 août 2013, 12:40

et si je fais un truc du genre à chaque condition?

" if ( (isset($_POST['nom'])) && (strlen(trim($_POST['nom'])) > 0) ):
$nom = stripslashes(strip_tags($_POST['nom']));"

puis en else le reste de ma condition?

Re: formulaire améliorations

par xTG » 24 août 2013, 07:15

Comment je peux vérifier les donnée $nom etc pour qu'il y ait pas d'injection?
Soit tu utilises une regex pour n'autoriser par exemple que les lettres et les nombres et auquel cas tu auras un résultat vrai ou faux que tu pourras traiter.
Mais dans tous les cas tu protèges directement les variables à l'affichage avec htmlspecialchars() pour éviter l'injection de code. :)