IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Lier un champ de texte à ma liste déroulante


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut Lier un champ de texte à ma liste déroulante
    Bonjour,
    J'ai crée un formulaire HTML avec un champ de texte lié à une liste déroulante. Quand l'utilisateur entre le code postal dans le champ
    de texte, la liste de droite devrait afficher la liste des communes correspondantes.

    J'obtiens dans le log d'erreur d'Apache2 l'erreur suivante:
    Trying to access array offset on value of type null
    Voici mon code:
    Code html : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <!DOCTYPE html>
    <html lang="fr">
        <head>
            <meta charset="utf-8">
            <title>Listes li&eacute;es en JQuery</title>
            <link rel="shortcut icon" href="../../../images/site/favicon.ico" />
            <link type="text/css" rel="stylesheet" href="css/style.css" />
            <script type="text/javascript" src="js/jquery.js"></script>
            <script type="text/javascript" src="js/jquery.chained.js"></script>
            <!-- Actualiser liste départements -->
            <script type="text/javascript">
                $(function(){
                $("#departement").chained("#region");
                });
            </script>  
     
            <!-- Actualiser liste communes -->
            <script type="text/javascript">
                $(function(){
                $("#commune").chained("#codepostal");
                });
            </script>
     
    	</head>
     
    	<body>
    	<?php
                    // Connexion a la BDD
                    $bddname = 'france';
                    $hostname = 'localhost';
                    $username = 'root';
                    $password = 'kahless';
                    $db = mysqli_connect ($hostname, $username, $password, $bddname);
                    $db -> set_charset("utf8");
            ?>
     
    	<form method="post">
       	 <select name="region" id="region">
          	  <option value="">Sélectionner une région</option>
            			<?php
                            // Appel des regions
                            $req = "SELECT RegionId, NomRegion FROM regions ORDER BY NomRegion";        
                            $rep = mysqli_query($db, $req);
                            while ($row = mysqli_fetch_array($rep)) {
                            echo "<option value=".$row['RegionId'].">".$row['NomRegion']."</option>";
                            }
                                    ?>
        		</select>
     
        		<select name="departement" id="departement">
            		<option value="">Sélectionner un département</option>
            			<?php
                    // Appel des departements
                    $req = "SELECT DepartementId, RegionId, NomDepartement FROM departements ORDER BY NomDepartement";
                    $rep = mysqli_query($db, $req);
                    while ($row = mysqli_fetch_array($rep)) {
                    echo "<option value=".$row['DepartementId']." class=".$row['RegionId'].">".$row['NomDepartement']."</option>";
                    }
                                    ?>
        		</select>
     
                             // Entrée code postal
    	 		<input type="text" name="codepostal" id="codepostal" value="<?php $row['CodePostal']; ?>" pattern="[0-9]*" maxlength="5">
     
    	 			<select name="commune" id="commune">
            			<option value="">Sélectionner une commune</option>
            				<?php
                            // Appel des communes
                            $req = "        SELECT NomCommune FROM communes;
                                                                            LEFT JOIN communeCP;
                                                                    ON communeCP.CommuneId = communes.CommuneId;
                                                                    LEFT JOIN codesPostaux;
                                                                    ON codesPostaux.CodePostalId = communeCP.CodePostalId;
                                                                    WHERE codesPostaux.CodePostal = ".$row["CodePostal"]." ORDER BY NomCommune";
                            $rep = mysqli_query($db, $req);
                            while ($row = mysqli_fetch_array($rep)) {
                                    echo "<option value=".$row['communeId']." class=".$row['CodePostal'].">".$row['NomCommune']."</option>";
                            }a
                                            ?>
        			</select>
     
    		</form>
     
    	</body>
    </html>

    Quelqu'un peut-il m'aider, s'il vous plaît ?

  2. #2
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Bonjour,

    Je suppose que le debug a lieu dans un environnement de tests, si c'est bien le cas, ce serait plus simple d'activer l'affichage des erreurs PHP via la fonction "error_reporting()".
    On devrait avoir beaucoup plus d'info suite à l'activation de l'affichage des erreurs, comme la fonction ou la variable qui pose problème, ou encore la ligne du script où l'erreur est déclenchée.
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Tout d'abord, merci de prendre le temps de m'aider.

    Voilà mon log d'erreur:
    [Fri Nov 13 09:53:49.365875 2020] [php7:notice] [pid 8614] [client 127.0.0.1:53938] PHP Notice: Trying to access array offset on value of type null in /var/www/html/index.php on line 63
    [Fri Nov 13 09:53:49.365919 2020] [php7:notice] [pid 8614] [client 127.0.0.1:53938] PHP Notice: Trying to access array offset on value of type null in /var/www/html/index.php on line 74
    [Fri Nov 13 09:53:49.366039 2020] [php7:warn] [pid 8614] [client 127.0.0.1:53938] PHP Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, bool given in /var/www/html/index.php on line 76

  4. #4
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Alors...

    L'appel de la fonction "mysqli_fetch_assoc()" à la ligne 76 échoue car la variable $rep est un booleen (FALSE).

    La valeur de $rep est définie par la fonction "mysqli_query()" ligne 75, cette fonction ne retourne pas le jeu de résultat attendu par "mysqli_fetch_assoc()".

    Le problème vient très probablement de la requête stockée dans $req, voici des pistes :
    - $row["CodePostal"] n'est pas définie, donc la requête ne produira pas le résultat attendu;
    - il y a un point virgule à chaque fin de ligne dans la requête, ce qui n'est pas normal;

    Je te laisse revoir çà et trouver pourquoi $row["CodePostal"] n'est pas défini (c'est le moins compliqué :-) ).
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Merci pour ta réponse. Eh oui, apparemment, il me faut utiliser AJAX pour affecter la valeur du champs code postal
    à une variable php. Or, je ne connais pas AJAX, j'ai fais plusieurs essais et lu des tutos, mais je ne m'en sors pas.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Bien, je commence à avancer. J'utilise AJAX pour récupérer mon code postal que j'envoies à PHP.
    Ca ne marche toujours pas. Voici l'erreur inscrite dans le log d'Apache:
    [Sun Nov 15 10:25:07.856350 2020] [php7:warn] [pid 1261] [client 127.0.0.1:47114] PHP Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, bool given in /var/www/html/index.php on line 99, referer: http://127.0.0.1/html/
    Ici mon code:
    Code html : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    <!DOCTYPE html>
    <html lang="fr">
        <head>
            <meta charset="utf-8">
            <title>Listes li&eacute;es en JQuery</title>
            <link rel="shortcut icon" href="../../../images/site/favicon.ico" />
            <link type="text/css" rel="stylesheet" href="css/style.css" />
            <script type="text/javascript" src="js/jquery.js"></script>
            <script type="text/javascript" src="js/jquery.chained.js"></script>
            <!-- Actualiser liste départements -->
            <script type="text/javascript">
                $(function(){
                    $("#departement").chained("#region");
                });
            </script>  
     
     
     
    	</head>
     
    	<body>
    	<?php
                    // Connexion a la BDD
                    $bddname = 'france';
                    $hostname = 'localhost';
                    $username = 'root';
                    $password = 'kahless';
                    $db = mysqli_connect ($hostname, $username, $password, $bddname);
                    $db -> set_charset("utf8");
            ?>
     
    	<form method="post">
       	 <select name="region" id="region">
          	  <option value="">Sélectionner une région</option>
            			<?php
                            // Appel des regions
                            $req = "SELECT RegionId, NomRegion FROM regions ORDER BY NomRegion";        
                            $rep = mysqli_query($db, $req);
                            while ($row = mysqli_fetch_array($rep)) {
                            echo "<option value=".$row['RegionId'].">".$row['NomRegion']."</option>";
                            }
                                    ?>
        		</select>
     
        		<select name="departement" id="departement">
            		<option value="">Sélectionner un département</option>
            			<?php
                    // Appel des departements
                    $req = "SELECT DepartementId, RegionId, NomDepartement FROM departements ORDER BY NomDepartement";
                    $rep = mysqli_query($db, $req);
                    while ($row = mysqli_fetch_array($rep)) {
                    echo "<option value=".$row['DepartementId']." class=".$row['RegionId'].">".$row['NomDepartement']."</option>";
                    }
                                    ?>
        		</select>
     
             <!-- Entrée code postal -->
    	 		<input type="text" name="codepostal" id="codepostal" pattern="[0-9]*" maxlength="5">
     
    			<script>
                                    $(document).ready(function(){
                                            $("#codepostal").blur(function(){
                                            var cp = $(this).val();
                                            $.ajax({
                                    type: 'post',
                                    data: {codePostal:cp},
                                    dataType: 'json',
                                    success:function(response){
                                            var len = response.length;
                                            $("#commune").empty();
                                            for( var i = 0; i<len; i++){
                                            var id = response[i]['id'];
                                            var name = response[i]['name'];
                                            $("#commune").append("<option value='"+id+"'>"+name+"</option>");
                                            }
                                    }
                                            });
                                    });
                                    });
                    </script>
     
    			<?php 
                            // Handle AJAX request (start)                          
                            $codepostal = 0;
                            if( isset($_POST['codePostal']) ){
                            $codepostal = $_POST['codePostal'];
                            }
                            $comm_arr = array();
                            if($codepostal > 0){
                                                    
                                    // Appel des communes
                    $req = "        SELECT CommuneId, NomCommune FROM communes
                                                            LEFT JOIN communeCP
                                                    ON communeCP.CommuneId = communes.CommuneId
                                                    LEFT JOIN codesPostaux
                                                    ON codesPostaux.CodePostalId = communeCP.CodePostalId
                                                    WHERE codesPostaux.CodePostal = '$codepostal' ORDER BY NomCommune";
                $rep = mysqli_query($db, $req);
                while ($row = mysqli_fetch_array($rep)) {
                    $commId = $row['CommuneId'];
                    $commune = $row['NomCommune'];      
                                            $comm_arr[] = array("id" => $commId, "name" => $commune);
                            }
                            }
                            // encoding array to json format
                            echo json_encode($comm_arr);
                            ?>
     
    			<select name="commune" id="commune">
           		<option value="">Sélectionner une commune</option>
    			</select>
    		</form>
    	</body>
    </html>

  7. #7
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Cette encore la même erreur...

    La valeur de $rep est définie par la fonction "mysqli_query()" ligne 98, cette fonction ne retourne pas le jeu de résultat attendu par "mysqli_fetch_assoc()" ligne 99.

    À vérifier :
    - la valeur de $_POST['codePostal'] coté serveur;
    - la requête SQL en la passant via un éditeur SQL (celui de phpMyAdmin par exemple);
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Effectivement, il y avait une ambiguïté dans ma requête. Je l'ai modifie comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CommuneId, NomCommune FROM communes
    LEFT JOIN communeCP
       ON communeCP.CommuneId = communes.CommuneId
       LEFT JOIN codesPostaux
          ON codesPostaux.CodePostalId = communeCP.CodePostalId
             WHERE codesPostaux.CodePostal = '$codepostal' ORDER BY NomCommune";
    Elle fonctionne parfaitement dans phpmyadmin.

    Il n'y a plus d'erreur dans le log d'apache, mais deux crochets [] s'affiche entre les champs <input> et <select>
    au chargement de la page et rien ne se passe dans ma liste déroulante après avoir entré un code postal.

  9. #9
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Il faut ouvrir l'outil de debug du navigateur (F12) afin de récupérer les informations suivantes :
    - présence d'erreurs remontées dans la console;
    - conformité des paramètres envoyés via la requête en Ajax (est-ce que c'est bien ce qui est attendu côté PHP ?);
    - conformité de la réponse envoyée par PHP suite à la requête en Ajax (est-ce que c'est bien ce qui est attendu par le JS ?);
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Il n'a aucune erreur dans la console.
    Pour les paramètres envoyés à PHP et la réponse de PHP, comment fait-on ?

  11. #11
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    Dans l'outil de développement, aller sur l'onglet "Réseau" et activer "XHR".
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Merci. J'ai pu régler mon problème. Mais j'en ai un autre. Je veux que la liste des communes correspondant au code postal entré ne s'affiche que si le code postal entré correspond au département sélectionné.
    J'ai donc modifié le script en conséquence. La liste des communes ne s'affiche pas et j'affiche un message d'erreur. En revanche, si le dialogue d'erreur n'apparaît pas quand le code postal correspond au département sélectionné, la liste des communes reste vide.
    J'ai vérifié comme tu me l'as suggéré, j'obtiens bien les valeurs souhaitées en retour de PHP.

    Ici l'AJAX:
    Code JavaScript : 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
    $(document).ready(function(){
        $("#codepostal").blur(function(){
        	var cp = $(this).val();
    		$.ajax({
        		url:  'communes.php',
       			type: 'post',
       			data: {codePostal:cp},
        		dataType: 'json',
       			success:function(response){
           			var depId = $("#departement option:selected").val();
           			var departementId = response['departementId'];   
            		if (depId === departementId) {
        			    $("#commune").click(function(){
               		        var len = response.length;
               		        $("#commune").empty();
              		        for( var i = 0; i<len; i++ ){
                   		        var communeId = response[i]['communeId'];
                   		        var nomCommune = response[i]['nomCommune'];		
                   		        $("#commune").append("<option value='"+communeId+"'>"+nomCommune+"</option>");
                            }
                        });
                     } else {
                        alert("Bad CP");
                     }
               }
            });     	
        });     
    });

    Ici le 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
    <?php
     
    	include "config.php";
     
    	// Handle AJAX request (start)  			
      	$codepostal = 0;
    	if( isset($_POST['codePostal']) ){
        	$codepostal = $_POST['codePostal'];
        }
     
    	$comm_arr = array();
    	if($codepostal > 0){
     
    		// Appel des communes
     		$req = "	SELECT communes.CommuneId cid, NomCommune, codesPostaux.DepartementId FROM communes 
    					LEFT JOIN communeCP
        				ON communeCP.CommuneId = communes.CommuneId
        				LEFT JOIN codesPostaux
        				ON codesPostaux.CodePostalId = communeCP.CodePostalId
        				WHERE codesPostaux.CodePostal = '$codepostal' ORDER BY NomCommune"; //, codesPostaux.DepartementId
            $rep = mysqli_query($db, $req);
            while ($row = mysqli_fetch_array($rep)) {
            	$depId = $row['DepartementId'];
             	$commId = $row['cid'];
               	$commune = $row['NomCommune']; 
               	$comm_arr["departementId"] = $depId;
    			$comm_arr[] = array("communeId" => $commId, "nomCommune" => $commune); //, "departementId" => $depId
    		}
    	}
     
     
    		// encoding array to json format
    		echo json_encode($comm_arr);
    ?>

Discussions similaires

  1. Vérification champs de texte et liste déroulantes
    Par yashiro41281 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/12/2014, 17h23
  2. Réponses: 1
    Dernier message: 19/03/2008, 18h52
  3. champ texte et liste déroulante
    Par angeleyes24 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/03/2008, 09h32
  4. [MySQL] Affichage auto de champs par clic sur liste déroulante
    Par Mister Shell dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/12/2006, 12h08
  5. Réponses: 4
    Dernier message: 19/07/2006, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo