Verifier un formulaire avec PHP, AJAX et json

rimie1
Invité n'ayant pas de compte PHPfrance

11 avr. 2011, 02:20

bonjour AB,

est ce que cette solution est valable:

+ code jQuery + json avec submit seulement,
+ reverification des champs en PHP.

Le fait d'utiliser json, c'est que je ne veux pas que le code jQuery soit visible, je pense qu'il precoit une mauvaise securite, de plus j'ai entendu parler avec la nouvelle technologie (firebug par exemple), on peut effectuer des changements cote jQuery, corrigez moi svp.

merci

Mammouth du PHP | 19672 Messages

11 avr. 2011, 09:10

Salut,
il faut que tu envisages le problème sous un autre angle.

Le JavaScript pouvant être désactivé coté client, tu ne peux de toutes la manières pas baser la validation de tes données et la sécurité de ton application dessus. Il te faut donc à la base une validation en PHP.
L'ajout du JavaScript, que ce soit ou non avec Jquery et/ou du JSON, ça ne devrait jamais se faire pour une autre raison qu'une amélioration ergonomique. Le code exécuté coté client sera forcément plus rapide puisque ça n'utilise pas forcément des échanges réseau entre le client et le serveur.

Masquer le code Jquery ? Pour quoi faire ? Pour éviter qu'un futé ne contourne tes dispositifs de sécurité ? C'est sans intérêt dès l'instant où tu auras une validation coté serveur totalement indépendante du JavaScript, et celui qui désactive la validation coté client ne fera que dégrader sa propre utilisation de ton site. Lorsque ton application fonctionnera sans JavaScript, alors tu pourras ajouter du confort d'utilisation avec du JavaScript, ne fais jamais l'inverse ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

11 avr. 2011, 16:14

Donc pour résumé ce qu'à dit Cyrano :

1ère étape/
Formulaire classique avec vérification des champs en php à l'envoi du formulaire (sans javascript).

2ème étape/
Ajout d'une couche javascript permettant une meilleure ergonomie.
A ce niveau tu peux faire ce que tu veux sans souci de sécurité puisque l'ensemble des champs sera recontrôlé par php.


Si tu veux aller vite et gagner du temps de développement tu peux ne pas faire la deuxième étape. Mais la première est indispensable.

rimie1
Invité n'ayant pas de compte PHPfrance

12 avr. 2011, 05:27

j'ai fait un petit effort avec les exemple precedents:

formulaire:
<?php
if (isset($_POST['envoyer']))
{
                if(mb_strlen($nom, 'utf-8') < 5)
                {
                	$erreur = 'Nom comporte moins de 5 caracteres';
                }
   				  
}


?>

<html>
<head>
<script src="jquery.js" type="text/javascript"></script>

<script type="text/javascript">
$(document).ready(function(){

	$('.formulaire').submit(function(){
		
		
		var valnom = $('.nom').val();
		datas = $(".formulaire").serialize();
		
		$.ajax({
        type: "POST",
        url: "verifier.php",
        data: datas,
        dataType: "json",
        success: function(response) {
        	
        if(response.verifNom == "erreur"){
        	  	
        	$(".error").html("Nom invalid");
            } 
			else 
			{
            $(".message").html('Merci');
            }	

}

});

return false;		
	});
			
 return false;
  }); 
</script>


</head>


<body>

<?php

		
	
	if (isset($erreur))
	{
		echo $erreur;
	}
	
?>
<form name="formulaire" class="formulaire" action="<?php $_SERVER['php_self']; ?>" method="POST">
Nom: <input type="text" name="nom" class="nom" /><span class="message"></span><span class="error"></span>
<br />
<input type="submit" name="envoyer" value="Envoyer" class="envoyer" />
</form>

</body>
</html>
verifier.php
<?php
header('Content-Type: application/json');

	$nom = $_POST['nom'];
	
	if(mb_strlen($nom, 'utf-8') < 5)
	{
		$verifNom = 'erreur';
		}
	else
	{
		$verifNom = 'ok';
	}

		$return_arr["verifNom"] = $verifNom;
		
		echo json_encode($return_arr);

?>
est ce que c'est bon!

ViPHP
AB
ViPHP | 5818 Messages

12 avr. 2011, 16:44

C'est déjà mieux dans la bonne direction...

Il manque $nom = $_POST['nom']; dans le code php de ton formulaire.

Par ailleurs comme je te l'ai déjà dit, inutile de faire une requête ajax pour calculer la longueur d'un champ. Et de toutes façons sauf à faire une requête synchrone, le submit n'attendra pas le retour de la requête.

Voici un exemple :
<?php
if (isset($_POST['envoyer']))
{		
		$nom = $_POST['nom'];
				
                if(mb_strlen($nom, 'utf-8') < 5)
                {
                        $message = 'Nom comporte moins de 5 caracteres';
                }
		else
		{
			$message = 'Merci';
		}                            
}


?>

<html>
<head>
<script src="jquery.js" type="text/javascript"></script>

<script type="text/javascript">
$(document).ready(function(){

        $('#formulaire').submit(function(){
               
               
                var valnom = $('#nom').val();
                
       		if(valnom.length < 5)
			{
                	     $("#error").html("Nom invalid");
			    return false; 
            		}

	})
});
                       
</script>


</head>


<body>

<?php              
	if (isset($message))
	{
			echo $message;
	}
	
?>
<form name="formulaire" id="formulaire" action="#" method="post">
Nom: <input type="text" name="nom" id="nom" /><span id="error"></span>
<br />
<input type="submit" name="envoyer" value="Envoyer" id="envoyer" />
</form>

</body>
</html>
Y'a pas de requête ajax, car pas besoin.

rimie1
Invité n'ayant pas de compte PHPfrance

13 avr. 2011, 02:59

et quelles sont les autres methodes du control jQuery, par exemple en php:

+ On controle la longueur des mots => strlen,
+ Les caracteres => preg_match,
+ Etc,..

Quelles sont leurs equivalents en jQuery.

merci

ViPHP
AB
ViPHP | 5818 Messages

13 avr. 2011, 03:53

Pour "strlen" c'est déjà dans mon dernier exemple javascript avec if(valnom.length < 5) [fonction : length]

Pour les regex (preg_match) j'ai donné un exemple avec if (!(regex_mail.test(mail.val()))) [fonction : test] dans ce lien (de nombreuses fois cité) que tu devrais essayer de regarder pour avancer un peu plus. Cela dit, prends le temps de comprendre car il ne sert à rien de faire du copié-collé.

Pour "etc." cette fonction n'existe pas en php :mrgreen:

rimie1
Invité n'ayant pas de compte PHPfrance

13 avr. 2011, 07:19

Pour "strlen" c'est déjà dans mon dernier exemple javascript avec if(valnom.length < 5) [fonction : length]

Pour les regex (preg_match) j'ai donné un exemple avec if (!(regex_mail.test(mail.val()))) [fonction : test] dans ce lien (de nombreuses fois cité) que tu devrais essayer de regarder pour avancer un peu plus. Cela dit, prends le temps de comprendre car il ne sert à rien de faire du copié-collé.

Pour "etc." cette fonction n'existe pas en php :mrgreen:
presque tous les controles sont en regex.

La fonction etc existerait en php10 =D>

Mammouth du PHP | 19672 Messages

13 avr. 2011, 07:34

Avec Jquery, tu n'est pas obligé d'écrire toutes les méthodes de validation pour certaines vérifications génériques. Il existe un plugin qui fait ça très bien et que tu peux étendre assez facilement pour ajouter des validations particulières : À voir ici. C'est le système dont je me sers au quotidien et ça fonctionne parfaitement bien. Un détail cependant : je déconseille l'utilisation de classes CSS dans les balises pour indiquer les règles de validation d'un champ, il est préférable d'utiliser un fichier .js à part. Pour voir comment utiliser ça, regarde les source du démo «Remember the milk» et regarde comment est construit le système de validation.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

13 avr. 2011, 15:36

presque tous les controles sont en regex.
Il y a peu de différence entre les regex php et javascript. Pour plus d'info tu rentre "regex javascript" dans google et tu auras toute une flopée de réponses.