Comment récupérer une valeur d'un select en PHP sans submit ?

Fermé
Aucune_solution - 1 juin 2015 à 09:42
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 2 juin 2015 à 14:02
Bonjour,
J'aimerais récupérer la valeur d'un pays qui est une liste, afin de lui associer l'indicatif téléphonique dans mon champ téléphone. Et cela avant la validation de mon formulaire, je ne trouve aucune solution, comment faire SVP ?

Merci
A voir également:

6 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 1/06/2015 à 15:59
Tu veux :
Tu sélectionnes un PAYS dans ta liste déroulante
A ce moment là .. l'indicatif (téléphone) du pays correspondant apparait dans ton champ input TEL...

Sachant que :
- La liste des indicatifs pays est présent dans une table de ta BDD ....

DONC :
- Tu détéctes le changement de pays dans ton select grâce à la méthode ONCHANGE
<select id="countrySelect" name="country"  onchange="check();getIndicateurPays();">


- Tu récupères, via AJAX, l'indicatif du PAYS concerné
il faut donc que tu fasses une page PHP spécialement dédiée pour récupérer l'indicatif du pays via une requête sql et l'utiliser avec l'appel AJAX.

- Tu mets dans ton INPUT TEL ... l'indicatif récupéré via la AJAX (en javascript)

Niveau Javascript (AJAX):

 function getIndicateurPays(){
  var urlAjx       = 'cheminverstonfichier/indicatifPays.ajx.php';
  var pays   = $("#countrySelect").val();

  var data = {pays:pays};
 
   $.ajax({ 
     url:      urlAjx,
     dataType: "json",
     type:     "POST",
     data:     data,
     async:    false,
     success:  function(reponse){
                $("#tel_struct").val(reponse);
               },
     error:    function(jqXHR, textStatus){
               var error = formatErrorMessage(jqXHR, textStatus);
               alert('error :' + error);
              }
    }); 
    
 }
  
  
  function formatErrorMessage(jqXHR, exception) {
    if (jqXHR.status === 0) {
        return ('Not connected.\nPlease verify your network connection.');
    } else if (jqXHR.status == 404) {
        return ('The requested page not found. [404]');
    } else if (jqXHR.status == 500) {
        return ('Internal Server Error [500].');
    } else if (exception === 'parsererror') {
        return ('Requested JSON parse failed.');
    } else if (exception === 'timeout') {
        return ('Time out error.');
    } else if (exception === 'abort') {
        return ('Ajax request aborted.');
    } else {
        return ('Uncaught Error.\n' + jqXHR.responseText);
    }
}


Et côté PHP
// ici tu inclus ton fichier de connexion à ta BDD


// ensuite :

// récupération des variables POST
$pays = isset($_POST['pays'])?$_POST['pays']:NULL;

if($pays){
// ici ta requete:
$sql = "SELECT * FROM tatable WHERE pays='$pays'";

// execution de ta requete :
$result = ------
}

// Puis renvoie des données vers l'ajax :
echo json_encode($result);



Voilou ...
Je te laisse compléter !
2
Aucune_solution
1 juin 2015 à 16:18
Merci bcp c'est très gentil!!
0
Aucune_solution
1 juin 2015 à 17:02
J'aurais une dernière question à propos de la valeur du pays.
Initialement, le pays prend une certaine valeur, et dans ce cas-là je n'ai pas l'indicatif, il faudrait que je sélectionne le pays avant.
Comment avoir l'indicatif dans ce cas ?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Aucune_solution
1 juin 2015 à 17:38
Je n'ai rien compris ...

Ta liste déroulante ... elle te retourne bien la "valeur" du pays ( en l'occurence ici, son ID )
Donc, dans le where de ta requête .. tu t'en sers ...

Bien sûr .. le code que je te donne est pûrement à titre d'exemple .. ne connaissant pas la structure de ta BDD ....mais je peux en déduire que ça devrait ressembler à un truc du genre :
$sql = "SELECT champIndicatif FROM tatable WHERE id_pays='$pays'";
0
Aucune_solution > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
2 juin 2015 à 10:27
Merci!
J'ai essayé votre code, ça a marché la première fois, je ne sais plus trop comment. Je réessayé maintenant mais rien ne se passe, j'ai mis le fichier Ajax à part, le fichier qui contient les input à part, avec comme url de l'ajax : fichier_des_inputs.php , est-ce bien ça ?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
1 juin 2015 à 09:46
Bonjour,
Pour cela il te faut utiliser du JAVASCRIPT avec de l'AJAX
L'idéal étant de passer par JQUERY (la syntaxe et l'utilisation de l'ajax étant simplifiée je trouve)

https://openclassrooms.com/fr/courses/1567926-un-site-web-dynamique-avec-jquery/1569648-le-fonctionnement-de-ajax
1
Aucune_solution
1 juin 2015 à 09:51
Merci pour votre réponse. Mais j'ai besoin d'utiliser cette valeur dans une requête SQL, comment faire avec javascript ?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Aucune_solution
1 juin 2015 à 09:53
.... ben.... avec de l'AJAX .... comme je te l'ai indiqué précédemment...
Lis le tuto que je t'ai indiqué... il explique comment l'utiliser.
0
Aucune_solution
1 juin 2015 à 09:55
D'accord merci :)
0
Aucune_solution
1 juin 2015 à 10:21
Je n'ai pas trop compris. Dans mon cas je ne vais pas utiliser POST, et le GET ne convient pas non plus
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Aucune_solution
1 juin 2015 à 10:33
???
TU n'as pas d'autres possibilités .....
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 juin 2015 à 11:10

j'ai mis le fichier Ajax à part, le fichier qui contient les input à part, avec comme url de l'ajax : fichier_des_inputs.php , est-ce bien ça ?

Je ne pense pas...

Le fichier ajax .. c'est à dire ? Le fichier qui contient le code PHP de la partie AJAX ou le code javascript ?
Si c'est le code PHP dont tu parles ... c'est lui qu'il faut mettre dans L'URL ..

L'idéal serait que tu nous postes le code de chacun de tes fichiers (en indiquant bien son nom histoire qu'on s'y retrouve).

Dans l'ordre :
Le code qui contient tes champs (ta liste déroulante, tes input (Tel ....)
Ce fichier peut contenir également le javascript de l'ajax ( à moins que tu l'aies placé dans un fichier à part)
Le code du fichier PHP appelé par l'AJAX.


PS: Lorsque tu fais du DEV Javascript (et/ou AJAX) il est FORTEMENT recomandé d'utiliser les outils de debogage de ton navigateur internet pour voir si il n'y a pas d'erreurs et voir un peu ce qui se passe. Pour cela, je te conseille vivement d'utiliser le plugin FIREBUG pour FireFox....
Et voici un tuto pour apprendre à s'en servir : https://eric-pommereau.developpez.com/tutoriels/outil-web/firebug/

1
Aucune_solution
2 juin 2015 à 11:40
Je voulais dire par le fichier ajax, le fichier qui contient le code ajax+ le code PHP
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
1 juin 2015 à 15:18

Je veux connaître la valeur du pays avant d'envoyer le formulaire, j'en ai besoin pour spécifier l'indicatif du téléphone

Tu en as besoin OU ?
Pour faire quoi ?

Pourquoi AVANT le SUBMIT ?


Ta question n'est pas assez claire et précise ... il est quasi impossible qu'on puisse te répondre !
Nous ne savons rien de ton code .... ni de ce que tu veux faire exactement .....



0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Aucune_solution
1 juin 2015 à 15:27
J'ai besoin de connaître la valeur du pays afin de remplir le champ numéro de téléphone avec l'indicatif corespondant, par exemple si je sélectionne France, je dois avoir automatiquement dans le champ téléphone (33) .....
Voici mon code :
<form action="traitement_formulaire.php" method="post" id="sky-form" class="sky-form">
<!-- Pays ------>	
<select id="countrySelect" name="country" onchange="check()">
<?php
$reponse = $bdd->query('SELECT * FROM pays'); 
echo '<OPTION VALUE="">Pays</OPTION>';
while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
{ 
	 echo '<OPTION VALUE="'.$donnees["id_pays"].'" >' . $donnees["pays"].'</OPTION>';
} 
?>
<!--Tél générique-->
<input type="tel" name="tel_struct" id="tel_struct" placeholder="Téléphone générique">
</form>			
0
Aucune_solution
2 juin 2015 à 11:27
Voici mes fichiers :
fichier 1 : test2_pays.php
<select id="countrySelect" name="country" onchange="check();getIndicateurPays();">
?php
$reponse = $bdd->query('SELECT * FROM pays'); 
echo '<OPTION VALUE="">Pays</OPTION>';
while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
{ 
echo '<OPTION VALUE="'.$donnees["id_pays"].'">'.$donnees["pays"].'</OPTION>';
} 
?>
</select>
<input type="tel" name="tel_struct" id="tel_struct" placeholder="Téléphone générique">						

fichier 2 : test_pays.php
	<?php 
// ici tu inclus ton fichier de connexion à ta BDD
include("connexion.php");

// ensuite :

// récupération des variables POST
$pays = isset($_POST['country']);

if($pays){
// ici ta requete:
$sql = "SELECT * FROM pays WHERE id_pays='$pays'";

// execution de ta requete :
$bdd->exec($sql);
}

// Puis renvoie des données vers l'ajax :
echo json_encode($result);

?>
<script>
function getIndicateurPays(){
  var urlAjx       = 'test2_pays.php';
  var pays   = $("#countrySelect").val();

  var data = {pays:pays};
 
   $.ajax({ 
     url:      urlAjx,
     dataType: "json",
     type:     "POST",
     data:     data,
     async:    false,
     success:  function(reponse){
                $("#tel_struct").val(reponse);
               },
     error:    function(jqXHR, textStatus){
               var error = formatErrorMessage(jqXHR, textStatus);
               alert('error :' + error);
              }
    }); 
    
 }
  
  
  function formatErrorMessage(jqXHR, exception) {
    if (jqXHR.status === 0) {
        return ('Not connected.\nPlease verify your network connection.');
    } else if (jqXHR.status == 404) {
        return ('The requested page not found. [404]');
    } else if (jqXHR.status == 500) {
        return ('Internal Server Error [500].');
    } else if (exception === 'parsererror') {
        return ('Requested JSON parse failed.');
    } else if (exception === 'timeout') {
        return ('Time out error.');
    } else if (exception === 'abort') {
        return ('Ajax request aborted.');
    } else {
        return ('Uncaught Error.\n' + jqXHR.responseText);
    }
}

</script>
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 juin 2015 à 12:18
oula ... non ... !

Tu as un document qui contient :
- Tes champs HTML (dont ta liste de pays ) + le javascript associé
- Un fichier PHP contenant uniquement le code nécessaire à ton AJAX

En gros :
<select id="countrySelect" name="country" onchange="check();getIndicateurPays();">
?php
$reponse = $bdd->query('SELECT * FROM pays'); 
echo '<OPTION VALUE="">Pays</OPTION>';
while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
{ 
echo '<OPTION VALUE="'.$donnees["id_pays"].'">'.$donnees["pays"].'</OPTION>';
} 
?>
</select>
<input type="tel" name="tel_struct" id="tel_struct" placeholder="Téléphone générique">

<script type="text/javascript">

function getIndicateurPays(){
  var urlAjx       = 'test2_pays.php';
  var pays   = $("#countrySelect").val();

  var data = {pays:pays};
 
   $.ajax({ 
     url:      urlAjx,
     dataType: "json",
     type:     "POST",
     data:     data,
     async:    false,
     success:  function(reponse){
                $("#tel_struct").val(reponse);
               },
     error:    function(jqXHR, textStatus){
               var error = formatErrorMessage(jqXHR, textStatus);
               alert('error :' + error);
              }
    }); 
    
 }
  
  
  function formatErrorMessage(jqXHR, exception) {
    if (jqXHR.status === 0) {
        return ('Not connected.\nPlease verify your network connection.');
    } else if (jqXHR.status == 404) {
        return ('The requested page not found. [404]');
    } else if (jqXHR.status == 500) {
        return ('Internal Server Error [500].');
    } else if (exception === 'parsererror') {
        return ('Requested JSON parse failed.');
    } else if (exception === 'timeout') {
        return ('Time out error.');
    } else if (exception === 'abort') {
        return ('Ajax request aborted.');
    } else {
        return ('Uncaught Error.\n' + jqXHR.responseText);
    }
}

</script>



Code du fichier AJAX PHP :
<?php 
// ici tu inclus ton fichier de connexion à ta BDD
include("connexion.php");

// ensuite :

// récupération des variables POST
$pays = isset($_POST['country']) ? $_POST['country'] : NULL;

if($pays){
// ici ta requete:
$sql = "SELECT * FROM pays WHERE id_pays='$pays'";

// execution de ta requete :
$bdd->exec($sql);
}

// Puis renvoie des données vers l'ajax :
echo json_encode($result);

?>

En plus tu as été capable de modifié du code ... alors qu'il suffisait de faire un simple copier/coller...
Pour récupérer une variable correctement il faut utiliser :
// récupération des variables POST
$pays = isset($_POST['country']) ? $_POST['country'] : NULL;

Alors que toi.. en récupérant ce que je te t'avais donné.. tu l'as modifié en :
$pays = isset($_POST['country']);

==>>> Ce qui ne marchera pas !


Ensuite ...
Lorsque tu fais des requêtes de type SELECT ... n'oublies pas qu'il faut faire un FETCH du résultat pour pouvoir lire le contenu...Je te propose d'utiliser directement un fetchall()
Sans oublier qu'il est préférable d'utiliser des requête préparées plutôt qu'un EXEC.

et ainsi .. ton code devient :

if($pays){
// ici ta requete:
$sql = "SELECT indicatif FROM pays WHERE id_pays=':pays'";
$params = array(':pays'=>$pays);
// execution de ta requete :
$sth = $bdd->prepare($sql);
$sth->execute($params);
$result = $sth->fetchAll();

}
// Puis renvoie des données vers l'ajax :
echo json_encode($result[0]['indicatif']);
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 juin 2015 à 12:19
NB : Tu penseras à modifier la requête, pour mettre ( à la place de "indicatif") le nom du champ de ta table... celui qui contient l'indicatif du pays

Idem dans le echo json_encode ...
0
Aucune_solution
2 juin 2015 à 13:37
Merci bcp!
comment avez-vous fait le lien entre les deux pages HTML/JS et PHP ?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 juin 2015 à 13:38
Ben ... j'ai considéré que la page appelée par l'AJAX était :test2_pays.php
et donc... dans le JS ça se trouve ici :
var urlAjx       = 'test2_pays.php';
0
Aucune_solution
2 juin 2015 à 13:49
Ok merci, mais vous considérez donc test2_pays.php comme le code du fichier PHP appelé par l'Ajax ?
0