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

Aucune_solution -  
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   -
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
 
Merci bcp c'est très gentil!!
0
Aucune_solution
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > Aucune_solution
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > Aucune_solution
 
.... 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
 
D'accord merci :)
0
Aucune_solution
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > Aucune_solution
 
???
TU n'as pas d'autres possibilités .....
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

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
 
Je voulais dire par le fichier ajax, le fichier qui contient le code ajax+ le code PHP
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

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
 
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
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
 
Merci bcp!
comment avez-vous fait le lien entre les deux pages HTML/JS et PHP ?
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
 
Ok merci, mais vous considérez donc test2_pays.php comme le code du fichier PHP appelé par l'Ajax ?
0