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 AJAX pour la XMLHttpRequest :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é * :</label></td> <td> <select name='inscCivilite' id='cbInscCivilite'> <option value='0'> </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é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 du fichier "get_villes_from_cp.php" (fichier appelé par la fonction AJAX) (PHP) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 de la fonction JS qui vérifie la saisie des champs (JavaScript) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>"; ?>
Et enfin le code de la page d'enregistrement (PHP) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
L'erreur retournée par le JS est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 PHP est la suivante :Erreur*: form.elements.inscVil is undefined
Ce que j'en ai compris :Notice: Undefined index: inscVil in C:\Program Files\wamp\www\...
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.
Partager