Formulaires : Listes déroulantes dynamiques liées AJAX

Messages postés
1
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
10 juin 2009
- - Dernière réponse : Whismeril
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
- 6 mai 2016 à 10:04
Bonjour,

Je suis novice et je me suis appuyé un petit bout de code , et je n'arrive pas à le faire fonctionner :

Le code d'origine est là := >
J'ai comme erreur :
Warning : mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\LABO\AJAX_11\index3.php on line 35

Alors que mes quotes sont correctes...

Voici les 3 pages.
< DEBUT index3.php>
<?php
echo("<?xml version="1.0" encoding="iso-8859-1"?>\n");
/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<title>Liste déroulantes dynamiques liées</title>

<script type="text/javascript" src="./dept_xhr.js" charset="iso_8859-1"></script>
<?php
/* Requête SQL de récupération des données de la première liste */
$sql =     "SELECT `country.idcountry` AS idr, `name_country` ".
        "FROM `country`, `packs` ".
        "WHERE `country.idcountry` = `packs.idcountry` ".
        "AND `status_pack` = `'I search'` ".
        "GROUP BY name_country` ".
        "ORDER BY name_country`;";

/* Connexion et exécution de la requête */
$connexion = mysql_connect($serveur, $admin, $mdp);
if($connexion != false)
{
    $choixbase = mysql_select_db($base, $connexion);
    $recherche = mysql_query($sql, $connexion);
    /* Création du tableau PHP des valeurs récupérées */
    $country = array();
    /* Index du département par tableau régional */
    $id = 0;
    while($ligne = mysql_fetch_assoc($recherche))
    {
        $country[$ligne['idr']] = $ligne['name_country'];
    }
?>
</head>

Version Utilisant AJAX

Vous constaterez que le délai de latence entre la sélection et la mise à jour est quasiment intermédiaire entre les versions 100% PHP et JavaScript.

Les Séries qu'il me manque

<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdept">
  <fieldset style="border: 3px double #333399">
  <legend>Sélectionnez un pays</legend>
    <select name="country" id="country" onchange="getDepartements(this.value);">
      <option value="vide">- - - Choisissez un pays - - -</option>
    <?php
    /* Construction de la première liste : on se sert du tableau PHP */
    foreach($country as $nr => $nom)
    {
        ?>
    <option value="<?php echo($nr); ?>"><?php echo($nom); ?></option>
<?php
    }
    ?>
    </select>
    <!-- ICI, le secret : on met un bloc avec un id ou va s'insérer le code de
         la seconde liste déroulande -->
 

 
  </fieldset>
</form>
[./index.php Aller vers la version 100% PHP]

[./index2.php Aller vers la version JavaScript]

<?php
}
else
{
    /*  Si vous arrivez ici, vous avez un gros problème avec la connexion au serveur de base de données */
?>
</head>

La connexion au serveur de base de données a échoué. Aucun élément ne peut être affiché.

<?php
}
?>

</html><FIN index3.php>
<DEBUT departements.php>
<?php
/**
 * Code qui sera aeeplé par un objet XHR et qui
 * retournera la liste déroulante des départements
 * correspondant à la région sélectionnée.
 */
/* Paramètres de connexion */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "";

/* On récupère l'identifiant du pay choisi. */
$idr = isset($_GET['idr']) ? $_GET['idr'] : false;
/* Si on a un pay, on procède à la requête */
if(false !== $idr)
{
    /* Cération de la requête pour avoir les series de ce pay*/
    $sql2 =
    "SELECT `idpack`, `idcountry`, `name_series` ".
    "FROM `packs` ".
    "WHERE `idcountry` = ".$idr."".
    "GROUP BY `name_series` ".
    "ORDER BY `name_series ASC`;";
   
    $connexion = mysql_connect($serveur, $admin, $mdp);
    mysql_select_db($base, $connexion);
    $rech_series = mysql_query($sql2, $connexion);
   
    /* Un petit compteur pour les series */
    $nd = 0;
   
    /* On crée deux tableaux pour les numéros et les noms des départements */
    $code_country = array();
    $nom_series = array();
   
    /* On va mettre les numéros et noms des départements dans les deux tableaux */    while(false !($ligne_series mysql_fetch_assoc($rech_series)))
    {
        $code_country[] = $ligne_series['idcountry'];
        $nom_series[]  = $ligne_series['name_series'];
        $nd++;
    }
    /* Maintenant on peut construire la liste déroulante */
    $liste = "";
    $liste .= '<select name="series" id="series">'."\n";
    for($d = 0; $d < $nd; $d++)
    {
        $liste .= '  <option value="'. $code_country[$d] .'">'. htmlentities($nom_series[$d]) .' ('. $code_country[$d] .')</option>'."\n";
    }
    $liste .= '</select>'."\n";
    /* Un petit coup de balai */
    mysql_free_result($rech_series);
    /* Affichage de la liste déroulante */
    echo($liste);
}
/* Sinon on retourne un message d'erreur */
else
{
    echo("Une erreur s'est produite. La région sélectionnée comporte une donnée invalide.

\n");
}
?><FIN departements.php><DEBUT dept_xhr.js>
/**
 * Lister les départements d'une région avec un objet
 * XMLHTTPRequest.
 */
/* Création de la variable globale qui contiendra l'objet XHR */
var requete = null;
/**
 * Fonction privée qui va créer un objet XHR.
 * Cette fonction initialisera la valeur dans la variable globale définie
 * ci-dessus.
 */
function creerRequete()
{
    try
    {
        /* On tente de créer un objet XmlHTTPRequest */
        requete = new XMLHttpRequest();
    }
    catch (microsoft)
    {
        /* Microsoft utilisant une autre technique, on essays de créer un objet ActiveX */
        try
        {
            requete = new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch(autremicrosoft)
        {
            /* La première méthode a échoué, on en teste une seconde */
            try
            {
                requete = new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch(echec)
            {
                /* À ce stade, aucune méthode ne fonctionne... mettez donc votre navigateur à jour ;) */
                requete = null;
            }
        }
    }
    if(requete == null)
    {
        alert('Impossible de créer l\'objet requête,\nVotre navigateur ne semble pas supporter les object XMLHttpRequest.');
    }
}
/**
 * Fonction privée qui va mettre à jour l'affichage de la page.
 */
function actualiserDepartements()
{
    var listeDept = requete.responseText;
    var blocListe = document.getElementById('blocDepartements');
    blocListe.innerHTML = listeDept;
}

/**
 * Fonction publique appelée par la page affichée.
 * Cette fonction va initialiser la création de l'objet XHR puis appeler
 * le code serveur afin de récupérer les données à modifier dans la page.
 */
function getDepartements(idr)
{
    /* Si il n'y a pas d'identifiant de région, on fait disparaître la seconde liste au cas où elle serait affichée */
    if(idr == 'vide')
    {
        document.getElementById('blocDepartements').innerHTML = '';
    }
    else
    {
        /* À cet endroit précis, on peut faire apparaître un message d'attente */
        var blocListe = document.getElementById('blocDepartements');
        blocListe.innerHTML = "Traitement en cours, veuillez patienter...";
        /* On crée l'objet XHR */
        creerRequete();
        /* Définition du fichier de traitement */
        var url = 'departements.php?idr='+ idr;
        /* Envoi de la requête à la page de traitement */
        requete.open('GET', url, true);
        /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */
        requete.onreadystatechange = function()
        {
            /* Lorsque l'état est à 4 */
            if(requete.readyState == 4)
            {
                /* Si on a un statut à 200 */
                if(requete.status == 200)
                {
                    /* Mise à jour de l'affichage, on appelle la fonction apropriée */
                    actualiserDepartements();
                }
            }
        };
        requete.send(null);
    }
}<FIN dept_xhr.js>

Merci d'avance pour vote aide !!!!!
Afficher la suite 

2 réponses

Messages postés
662
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
18 septembre 2009
0
Merci
Bonjour,

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\LABO\AJAX_11\index3.php on line 35

signifie tout bêtement que la reque n'a pas renvoyé une resource, mais une erreur. Que raconte exactement mysql_error()... En général, ça signifie que la requête est mauvaise et a généré une erreur MySQL...

Poste sdonc le résultat de mysql_error()
Pour savoir comment l'utiliser, regardes dans le manuel de php... Il y a même des exemples...
Commenter la réponse de nautilus99
0
Merci
essaye plutôt :
$sql2 = "SELECT idpack, idcountry, name_series FROM packs WHERE idcountry = '".$idr."' GROUP BY name_series ORDER BY name_series ASC";
Whismeril
Messages postés
14026
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 décembre 2019
322 -
Bonjour si si la politesse c'est bien aussi.

Et puis saluer quand on déterre un sujet vieux de 8 ans c'est un minimum non?
Commenter la réponse de Tof