Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > AJAX
AJAX Forum sur la programmation AJAX. Avant de poster : Cours AJAX, FAQ AJAX, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2011, 15h32   #1
Invité de passage
 
Cédric Odin
Inscription : mars 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : Cédric Odin

Informations forums :
Inscription : mars 2010
Messages : 8
Points : 4
Points : 4
Par défaut vérifier le contenu d'un select après une XMLHttpRequest puis récupérer son contenu après un POST

Bonjour à la communauté.

Mon problème en est un double en réalité. En AJAX et en PHP, mais les 2 ont la même source.
Je fais un formulaire d'inscription et j'utilise une XMLHttpRequest pour charger la(les) ville(s) en fonction du code postal saisit (d'ailleurs, merci à siddh pour son article "Web 2.0, allez plus loin avec AJAX et XMLHttpRequest" ).

Lors du clic sur le bouton "S'inscrire", je vérifie que tous les champs soient remplis. Et c'est là que se pose le problème car le script de vérification renvoie une erreur, et du coup le formulaire passe à la page d'enregistrement de l'inscription et qui renvoie elle aussi une erreur.

Je vous poste le code (allégé) des fichiers que j'utilise, il y a 5 morceaux de code.

Code du formulaire (HTML) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
<table>
	<!-- Formulaire pour l'inscription d'un client -->
	<form  method='post' action='os_insc_cli_valid.php' id='form_insc_client' onsubmit='return verif_champs_insc(this);'>
		<tr valign='top'>
			<td><label for='inscCivilite' id='lblInscCivilite'>Civilit&eacute; * :</label></td>
			<td>
				<select name='inscCivilite' id='cbInscCivilite'>
					<option value='0'>&nbsp;</option>
					<option value='M.'>M.</option>
					<option value='Mlle.'>Mlle.</option>
					<option value='Mme.'>Mme.</option>
				</select>
			</td>
		</tr>
		<tr valign='top'>
			<td><label for='inscNom' id='lblInscNom'>Nom * : </label></td>
			<td><input type='text' name='inscNom' id='tbInscNom' size='30' maxlength='50' value='' /></td><!--style='margin-left: 25px;'-->
		</tr>
		<tr valign='top'>
			<td><label for='inscPrenom' id='lblInscPrenom'>Pr&eacute;nom * : </label></td>
			<td><input type='text' name='inscPrenom' id='tbInscPrenom' size='30' maxlength='50' value='' /></td>
		</tr>
		<tr valign='top'>
			<td><label for='inscAdr' id='lblInscAdr'>Adresse* : </label></td>
			<td><textarea name='inscAdr' id='taInscAdr' cols='30' rows='2' ></textarea></td>
		</tr>
		<tr valign='top'>
			<td><label for='inscCP' id='lblInscCP'>Code postal * :</label></td>
			<td><input type='text' name='inscCP' id='tbInscCP' size='10' value='' onKeyPress='new SUC(this);' onBlur='xhr_get_vil(this);' /></td>
		</tr>
		<tr valign='top'>
			<td><label for='inscVil' id='lblInscVil'>Ville * :</label></td>
			<td>
				<span name='spInscVil' id='spanInscVil'>
					<select name='inscVil' id='listInscVil'>
						<option value='0'>Saisissez votre code postal pour avoir la ville.</option>
					</select>
				</span>
			</td>
		</tr>
		<tr valign="top">
			<td style='font-style: italic; font-size: 90%;'>* Champs obligatoires</td>
			<td><input type="submit" id="btInscrire" name="inscrire" value="S'inscrire" /></td>
		</tr>
	</form>
</table>
Code AJAX pour la XMLHttpRequest :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
// Crée un objet XMLHttpRequest en fonction du navigateur.
function create_xhr(){
	var xhr = null; 
	if(window.XMLHttpRequest) // Firefox et autres
	   xhr = new XMLHttpRequest(); 
	else if(window.ActiveXObject){ // Internet Explorer 
		try {
			xhr = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e) {
			xhr = new ActiveXObject('Microsoft.XMLHTTP');
		}
	}
	else { // XMLHttpRequest non supporté par le navigateur 
		alert('Votre navigateur ne supporte pas les objets XMLHTTPRequest...'); 
		xhr = false; 
	}
 
	return xhr;
}
 
// Recherche la (les) ville(s) en fonction du code postal passé en paramètre.
function xhr_get_vil(champ){
	try{
		if (champ.value != ''){
		   var xhr = create_xhr();
 
			// On défini ce qu'on va faire quand on aura la réponse
			xhr.onreadystatechange = function(){
 
				// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
				if(xhr.readyState == 4 && xhr.status == 200){
					// On se sert de innerHTML pour rajouter les options a la liste
					document.getElementById('spanInscVil').innerHTML = xhr.responseText;
				}
			}
 
			// Ici on va voir comment faire du post
			xhr.open('POST', 'xhr/get_villes_from_cp.php', true);
 
			// ne pas oublier ça pour le post
			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
 
			var data = 'cpCli=' + escape(champ.value);
			xhr.send(data);
		}
	}
	catch(e){
		alert('erreur récupérée : \n' + e);
	}
}
Code du fichier "get_villes_from_cp.php" (fichier appelé par la fonction AJAX) (PHP) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<?php
	echo "<select name='inscVil' id='listInscVil'>";
 
	if(isset($_POST["cpCli"])){
		mysql_connect("localhost","root","");
		mysql_select_db("my_test_base");
		$res = mysql_query("SELECT `vil` FROM `cpvil` WHERE `cp` = ".$_POST['cpCli']);
		while($row = mysql_fetch_array($res)){
			echo "<option value='".$row["vil"]."' selected='selected'>".$row["vil"]."</option>";
		}
	}
	echo "</select>";
?>
Code de la fonction JS qui vérifie la saisie des champs (JavaScript) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
// Vérifie que tous les champs obligatoires pour l'inscription soient remplis
function verif_champs_insc(form){
 
	// Civilité
	if(form.elements['cbInscCivilite'].value == '0'){
		alert('Veuillez sélectionner votre civilité.');
		form.elements['cbInscCivilite'].focus();
		return false;
	}
	// Nom
	if(form.elements['tbInscNom'].value == ''){
		alert('Veuillez saisir votre nom.');
		form.elements['tbInscNom'].focus();
		return false;
	}
	// Prénom
	if(form.elements['tbInscPrenom'].value == ''){
		alert('Veuillez saisir votre prénom.');
		form.elements['tbInscPrenom'].focus();
		return false;
	}
	// Adresse
	if(form.elements['taInscAdr'].value == ''){
		alert('Veuillez saisir votre adresse.');
		form.elements['taInscAdr'].focus();
		return false;
	}
	// Code Postal
	if(form.elements['tbInscCP'].value == ''){
		alert('Veuillez saisir votre code postal.');
		form.elements['tbInscCP'].focus();
		return false;
	}
	// Ville
 
	alert('ville = ' + document.getElementById('listInscVil').selectedIndex);
	if(form.elements['inscVil'].value == ''){
		alert('Veuillez sélectionner votre ville.');
		form.elements['inscVil'].focus();
		return false;
	}
}
Et enfin le code de la page d'enregistrement (PHP) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
echo 'nombre de variables postée = '.count($_POST). '<br />';
echo 'valeurs du POST : '. print_r($_POST) .'<br />';
 
// Récupération des données saisies par le client lors de son inscription
$civilCli = $_POST['inscCivilite'];
$nomCli = $_POST['inscNom'];
$prenomCli = $_POST['inscPrenom'];
$adrCli = $_POST['inscAdr'];
$cpCli = $_POST['inscCP'];
$vilCli = $_POST['inscVil'];
 
echo $civilCli, $nomCli , $prenomCli, $adrCli, $cpCli, $vilCli
L'erreur retournée par le JS est la suivante :
Citation:
Erreur*: form.elements.inscVil is undefined
L'erreur retournée par le PHP est la suivante :
Citation:
Notice: Undefined index: inscVil in C:\Program Files\wamp\www\...
Ce que j'en ai compris :
1. La récupération par "document.getElementById" est bonne puisque le message d'alerte s'affiche correctement. Mais le "form.elements['inscVil'].value" renvoie l'erreur JS ci-dessus alors que la syntaxe est la bonne puisqu'utilisée pour la civilité. Là se trouve le premier problème.
2. Lors de la récupération des variables $_POST, la variable "inscVil" n'apparait pas. Là se situe le second problème.

Donc comment puis-je vérifier que la ville est bien saisie dans le JS et comment récupérer la variable dans mon fichier de récupération ?
Y a t-il une solution en AJAX pour enregistrer en base de données l'inscription sans passer par un fichier de récupération PHP qui serait plus simple?


Merci d'avance pour votre aide.
Nijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 15h41   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 806
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 806
Points : 35 803
Points : 35 803
Tu ne peux pas mettre un formulaire dans un tableau, il faut que ce soit le tableau qui soit dans le formulaire.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/04/2011, 16h12   #3
Invité de passage
 
Cédric Odin
Inscription : mars 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : Cédric Odin

Informations forums :
Inscription : mars 2010
Messages : 8
Points : 4
Points : 4
Je vais aller me flageller pour ne pas avoir vu cette stupide erreur !!! C'est pas faute de le savoir en plus !!
Merci Bovino !!

Edit : Comment mettre [Résolu] au début du sujet ?
Nijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 16h25   #4
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 806
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 806
Points : 35 803
Points : 35 803
Citation:
Envoyé par Nijin
Edit : Comment mettre [Résolu] au début du sujet ?
En cliquant sur le bouton en bas de la discussion
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 09h47   #5
Invité de passage
 
rio ugo
Inscription : avril 2010
Messages : 11
Détails du profil
Informations personnelles :
Nom : rio ugo

Informations forums :
Inscription : avril 2010
Messages : 11
Points : 2
Points : 2
Par défaut Merci !

Salut,

J'avais exactement le même problème ... merci !
hgushgus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h25.


 
 
 
 
Partenaires

Hébergement Web