Formulaires : Listes déroulantes dynamiques liées AJAX

kinl2005
Messages postés
1
Date d'inscription
samedi 18 novembre 2000
Dernière intervention
10 juin 2009
- 10 juin 2009 à 12:06 - Dernière réponse : Whismeril
Messages postés
12238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 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 

Votre réponse

3 réponses

nautilus99
Messages postés
662
Date d'inscription
vendredi 26 septembre 2008
Dernière intervention
18 septembre 2009
- 13 juin 2009 à 13:12
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
12238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 6 mai 2016 à 10:04
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.