Verifier un formulaire avec PHP, AJAX et json

rimie1
Invité n'ayant pas de compte PHPfrance

03 avr. 2011, 11:00

bonjour,

est ce qu'il est possible de verifier les champs d'un formulaire en PHP, AJAX et json, par exemple:

check.php
<?php
if (username == '')
{
	$data['username'] = 'vide';
}

// ainsi de suite

?>

Code : Tout sélectionner

<script type="text/javascript"> $(document).ready(function(){ $("form").submit(function() { $.post("check.php", $("form"), function(data) { if( data.username == "vide" ) { $("#msg").html('username est vide'); } // ainsi de suite </script> [code]

ViPHP
AB
ViPHP | 5818 Messages

04 avr. 2011, 04:12


rimie1
Invité n'ayant pas de compte PHPfrance

04 avr. 2011, 07:52

Les 2 exemple ne contiennent pas json :(

rimie1
Invité n'ayant pas de compte PHPfrance

04 avr. 2011, 09:18

j'ai trouve cet exemple, ca ne marche pas:

index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TutDepot - Form Demonstration</title>
<style type="text/css">
@import "styles.css";
</style>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
	$("form.register").change(function() {
		$.post("check.php", $("form.register").serialize(), function( data ) {
			if( data.username == "inuse" )
				$("p#username_error").slideDown();
			else
				$("p#username_error").hide();
			if( data.password == "missmatch" )
				$("p#password_error").slideDown();
			else
				$("p#password_error").hide();
			if( data.email == "notvalid" )
				$("p#email_error").slideDown();
			else
				$("p#email_error").hide();
		}, "json");
	});
});
</script>
</head>
<body>
<form action="" method="post" class="register">
    <fieldset>
        <legend>registration</legend>
        <input type="text" name="username" value="" />
        <label>desired username</label>
		<p id="username_error" class="error">That Username is unavailable</p>
        <input type="password" name="password" value="" />
        <label>password</label>
        <input type="password" name="password_again" value="" />
        <label>password Again</label>
		<p id="password_error" class="error">Passwords do not match</p>
        <input type="text" name="email" value="" />
        <label>email</label>
        <p id="email_error" class="error">Email is not valid</p>
        <input type="submit" name="submit" value="register" />
    </fieldset>
</form>
</body>
</html>
check.php
<?php

$usernames = array( "martynj", "admin", "bob", "dave", "fred" );
$data = array( "username" => "", "password" => "", "email" => "" );
if( isset($_POST["username"]) ) {
	if( in_array( $_POST["username"], $usernames ) ) {
		$data["username"] = "inuse";
	}
}
if( isset($_POST["password"]) && isset($_POST["password_again"]) ) {
	if( $_POST["password_again"] != "" && $_POST["password"] != $_POST["password_again"] ) {
		$data["password"] = "missmatch";
	}
}
if( isset( $_POST["email"] ) ) {
	if( $_POST["email"] != "" && !preg_match( "/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $_POST["email"] ) ) {
		$data["email"] = "notvalid";
	}
}
echo json_encode( $data );
?>

ViPHP
AB
ViPHP | 5818 Messages

04 avr. 2011, 19:21

Les 2 exemple ne contiennent pas json :(
Bah ces exemples ne contiennent pas json parce qu'il n'y en avait pas besoin, mais tu peux toujours le rajouter par la suite. Cela va juste te retourner un tableau plutôt qu'une valeur.

Au niveau de la requête ajax
	$.ajax({
			type: "POST",
			url: 'requete_json.php',//url de destination de la requête
			data: $("#mon_form").serialize(),//pour envoyer tous les input du formulaire ayant l'id= mon_form
			dataType: "json",//type de données de retour
							
			success: function(result)
				{
					$.each(result,function(index, value) //liste le tableau
					{ 
					alert(index+' : '+value);
					})

				}
		});
Fichier "requete_json.php" pour test :
<?php
header('Content-Type: application/json');

$tab = array('2','4','6','8','10');

echo json_encode($tab);
?>

rimie1
Invité n'ayant pas de compte PHPfrance

05 avr. 2011, 10:33

rebonjour AB,
j'ai utilise les exemples ci-dessus, et j'obtenais ce code:

index.php
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function(){
      	
    	var name = $('#name_ajax').attr('name_ajax');
    	
    	function check_name() {	
        dataString = $("#JqAjaxForm").serialize();
        
        $.ajax({
        type: "POST",
        url: "check.php",
        data: dataString,
        dataType: "json",
        success: function(data) {

			if(data.name_check == "invalid"){        
              $("#nMsg").html("Nom invalide");
              
            } else {
                $("#nMsg").html(name + " est valide");
            }
			        }
                });
        }
        
                         

$("#name_ajax").keyup(check_name);

return false;
    });
</script>

</head>


<form id="JqAjaxForm">
<fieldset>
<legend>jQuery.ajax Form Submit</legend>
<p><label for="name_ajax">Name:</label><br />
<input id="name_ajax" type="text" name="name_ajax" /><span id="nMsg"></span></p>
<p><label for="email_ajax">Email:</label><br />
<input id="email_ajax" type="text" name="email_ajax" /><span id="eMsg"></span></p>
<p><input type="submit" value="Submit" /></p>
</fieldset>
</form>
check.php:
<?php

$email_check = '';
$return_arr = array();

	$name_ajax = $_POST['name_ajax'];	
	
	if(mb_strlen($name_ajax, 'utf-8') < 3)
	{
		$name_check = 'invalid';
	}
	else
	{
		$name_check = 'valid';
	}

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

?>
le seul soucis est qu'il n'affiche pas le nom:
$("#nMsg").html(name + " est valide");
merci

ViPHP
xTG
ViPHP | 7331 Messages

05 avr. 2011, 13:01

Code : Tout sélectionner

var name = $('#name_ajax').attr('name_ajax');
Le HTML ne possède aucune balise possédant un attribut nommé "name_ajax". ;)
Donc tu n'as rien dans la variable name.

rimie1
Invité n'ayant pas de compte PHPfrance

05 avr. 2011, 13:19

Code : Tout sélectionner

var name = $('#name_ajax').attr('name_ajax');
Le HTML ne possède aucune balise possédant un attribut nommé "name_ajax". ;)
Donc tu n'as rien dans la variable name.
je pense que le nom le comporte:
<input id="name_ajax" type="text" name="name_ajax" />

ViPHP
AB
ViPHP | 5818 Messages

05 avr. 2011, 15:39

Nan.. xTG a raison ça fonctionne pas comme ça. C.f http://jquery.developpeur-web2.com/docu ... s/attr.php

D'ailleurs si tu fais alert($('#name_ajax').attr('name_ajax')) cela devrait te donner undefined et donc le reste ne fonctionne pas.

Dans l'exemple avec ajax que je t'ai donné en premier, tu vois bien que je fais $("#name_ajax").val() pour récupérer la valeur de l'input dont l'id est name_ajax

A passage ton exemple n'est pas très probant puisque l'on fait normalement une requête pour des éléments que l'on ne peut pas vérifier directement en javascript. C'est pour cela que dans mon exemple la longueur du mot est vérifiée directement par JS et seule la validité du nom qui demande une requête en bdd est faite par ajax.

Même si souvent cela ne sert à rien tu devrais prendre l'habitude de mettre le header json dans ton code php (si tu sort du json_encode)
header('Content-Type: application/json'); ...on contrôle mieux ce que l'on affiche.

rimie1
Invité n'ayant pas de compte PHPfrance

06 avr. 2011, 05:02

quelque chose comme:
var name = $('#name_ajax').val();
mais je l'ai mis autrement, parce que cette derniere me retourne juste les 2 premieres lettres (par exemple au lieur de rimie, elle retourne ri)

mon code final est:

index.php:
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function(){
    	function check_name() {
    		
        dataString = $("#JqAjaxForm").serialize();       

        $.ajax({
        type: "POST",
        url: "check.php",
        data: dataString,
        dataType: "json",
        success: function(data) {

			if(data.name_check == "invalid"){
              
              $("#nMsg").html("Sorry invalid name, please try again.");
              
            } else {
                $("#nMsg").html(data.name + " is a valid name. Thank you, " + data.name);
            }
        }
        });
        }
        
                         

$("#name_ajax").keyup(check_name);

return false;
    });

</script>

</head>


<form id="JqAjaxForm">
<fieldset>
<legend>jQuery.ajax Form Submit</legend>
<p><label for="name_ajax">Name:</label><br />
<input id="name_ajax" type="text" name="name_ajax" /><span id="nMsg"></span></p>
<p><label for="email_ajax">Email:</label><br />
<input id="email_ajax" type="text" name="email_ajax" /><span id="eMsg"></span></p>
<p><input type="submit" value="Submit" /></p>
</fieldset>
</form>
<div id="message_ajax"></div>

check.php:
<?php
ob_start();

$return_arr = array();


	$name_ajax = $_POST['name_ajax'];
	$email_ajax = $_POST['email_ajax'];
	
	if(mb_strlen($name_ajax, 'utf-8') < 2)
	{
		$name_check = 'invalid';
	}
	else
	{
		$name_check = 'valid';
		$name = $name_ajax;
	}

	if(mb_strlen($email_ajax, 'utf-8') < 2)
	{
		$email_check = 'invalid';
	}
	else
	{
		$email_check = 'valid';
		$email = $email_ajax;
	}
	

		$return_arr["name_check"] = $name_check;
		$return_arr["email_check"] = $email_check;
		
		$return_arr["name"] = $name;
		$return_arr["email"] = $email;
		
		echo json_encode($return_arr);
		header('Content-Type: application/json');

ob_end_flush();
?>
si quelque chose au code est ambigue veuillez me l'annoncer, merci.

Une 2eme question, si j'ajoute un champs e-mail, je dois encore refaire le travail de "$.ajax({", ou bien il existe une autre methode?

ViPHP
AB
ViPHP | 5818 Messages

07 avr. 2011, 02:38

Pas bon ton code php, vire les ob_start(); ob_end_flush(); et mets le header au début de ton code
<?php
header('Content-Type: application/json');

$return_arr = array();

//...
?>
Sinon je vois pas pourquoi tu fais des vérifications en php (longueur de chaine) que tu pourrais faire en javascript donc sans requête au serveur.
Je t'ai déjà donné un lien avec des vérifs javascript + une requête ajax pour vérifier le nom (qui normalement devrait se faire dans le code php par une requête à la bdd). Tu devrais t'en inspirer au moins en partie pour comprendre le fonctionnement (je fais par exemple des tests de longueur sur le nom et validité de mail en javascript).

A part ça je comprend pas ta 2eme question.

rimie1
Invité n'ayant pas de compte PHPfrance

07 avr. 2011, 05:35

J'ai mis une verification php pour ne pas la reverifier une 2eme fois (js et php), pour ma 2eme question, j'utilise une fonction pour verifier le nom, si j'ajoute un autre champs par exemple email, je devais refaire une 2eme fonction ou bien il existe une autre methode:
// verifier le nom
function check_name() {

$.ajax({

});

}

// verifier l'email
function check_email() {

$.ajax({

});

}
parce que a chaque fois je devais l'envoyer par la fonction ajax.

ViPHP
AB
ViPHP | 5818 Messages

07 avr. 2011, 20:18

Quand tu fais :

dataString = $("#JqAjaxForm").serialize();

tu envoies tous les post du formulaire dans ta requête ajax.

donc tu retrouvera
$_POST['email_ajax'] dans ta page php

et la réponse que tu transmet avec ton tableau php $return_arr se retrouve dans la fonction de retour ajax avec la variable data
et tu peux donc faire "data.email" pour la récupérer (de la même manière que tu fais data.name_check).

Mais encore une fois cela ne te sert à rien de faire ce genre de vérif avec une requête vers php.
STRICTEMENT A RIEN à part d'encombrer le serveur avec des requêtes inutiles.

La seule justification (dans le cas d'un formulaire) de faire une requête ajax vers le serveur est par exemple pour vérifier si le nom transmis n'est pas déjà utilisé dans ta bdd... en résumé de faire des choses que javascript ne sait pas faire (javascript ne peut pas interroger directement une bdd sauf à passer par une requête AJAX).

Pour le reste, genre vérification de la longueur d'une chaine ou validité d'un email, tu peux le faire en javascript directement (sans faire une requête ajax). Et encore une fois c'est exactement l'exemple que je t'ai donné dans mon lien plus haut (vérification directe javascript + confirmation du login par ajax). Cela économise des requêtes puisque si la longueur du nom n'est pas bonne, inutile d'aller plus loin et de vérifier si le login n'est pas déjà utilisé en bdd... (par exemple).

Quand on refais les vérifications en php, on le fait dans la page php qui enregistre le formulaire (et pas avant dans une requête AJAX qui peut toujours être désactivée en désactivant javascript).

rimie1
Invité n'ayant pas de compte PHPfrance

08 avr. 2011, 05:18

Mais encore une fois cela ne te sert à rien de faire ce genre de vérif avec une requête vers php.
STRICTEMENT A RIEN à part d'encombrer le serveur avec des requêtes inutiles.
Je partage ce point avec toi, le seul incomvenient JS est que le code est visible par l'utilisateur, si jamais on fesait une betise au niveau des verifications on peut etre choppe :(

Voila la raison duquelle j'ai mis ce genre de verification

ViPHP
AB
ViPHP | 5818 Messages

10 avr. 2011, 20:43

Mais encore une fois cela ne te sert à rien de faire ce genre de vérif avec une requête vers php.
STRICTEMENT A RIEN à part d'encombrer le serveur avec des requêtes inutiles.
Je partage ce point avec toi, le seul incomvenient JS est que le code est visible par l'utilisateur, si jamais on fesait une betise au niveau des verifications on peut etre choppe :(

Voila la raison duquelle j'ai mis ce genre de verification
Que ton code javascript soit mal écrit par le développeur ou qu'il soit désactivé par le visiteur, c'est un problème javascript et les données contrôlées par javascript doivent être normalement revalidées en php hors dépendance javascript.

Le problème de ta méthode est que tu reprends le pire des deux mondes : une requête au serveur pour faire des validations partielles "onkeyup" (alors que javascript pourrait faire le travail sans requête) et de plus ces vérifications sont dépendantes de javascript (donc peuvent être désactivées) puisque tu utilises Ajax.

Normalement c'est uniquement lors de la soumission du formulaire que tu dois refaire les vérifs php - les mêmes mais en une seule fois - que tu as faites "onkeyup" en javascript. C'est à ce prix que l'on a une parfaite complémentarité entre javascript et php : javascript pour éviter des requêtes inutiles et pour le confort du visiteur, complété par un contrôle sécurisé côté serveur en php.

Ta méthode est gourmande en ressource puisque tu fais des requêtes serveur on "onkeyup", et cela ne te dispenseras pas de refaire une validation php juste avant l'enregistrement des données si tu souhaites une sécurité maximum et fonctionnelle sans javascript activé... bref en l'état actuel, ton code n'est ni sécurisé, ni optimisé.