lier plusieurs select

Par kendzo, il y a 12 ans


Bonjour à toutes et à tous,

Je remercie tout d'abord ce site pour les tutoriels vidéo qu'il propose.
J'en ai utilisé plusieurs et ça m'a vraiment dépanné !! vraiment merci beaucoup.
Bon là par contre j'ai un sérieux problème et ça fait plusieurs jours que je suis dessus je ne m'en sort pas.
J'espère que vous pourrez m'aider...

Je suis sur le tutoriel des listes liées

Voici le code du PDO (identique à celui du tutoriel je pense)

<?php
class DB{
    private $host = 'localhost';
    private $username = 'root';
    private $password = '';
    private $database = 'test';
    private $db;
    public function __construct($host = null, $username = null, $password = null, $database = null){
        if($host != null){
            $this->host = $host;
            $this->username = $username;
            $this->password = $password;
            $this->database = $database;
        }
        try{
            $this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
                ));
        }catch(PDOException $e){
            die('<h1>Impossible de se connecter a la base de donnee</h1>');
        }
    }
    public function query($sql, $data = array()){
        $req =$this->db->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_OBJ);
    }
}

Et voici le code de la page index.php qui utilise ce PDO

<?php
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <link rel="stylesheet" href="css/bootstrap.css">
    </head>
    <body>
        <?php
            require "db.class.php";
            $DB = new DB();     
            $regions = $DB->query('SELECT * FROM regions');   
        ?>
        <select id="region">
             <?php foreach ( $regions as $region ): ?>
                <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
            <?php endforeach ?>
        </select>
    </body>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</html>

Problème :
J'obtiens une liste déroulante qui ne contient que des

name; ?>

et je ne comprend pas pourquoi, sa me rend ouf ce truc.

Merci par avance pour votre aide car là je sèche.

Seb

12 réponses

MrGuillou, il y a 12 ans

Bonsoir,

Il manque le fetchAll(PDO::FETCH_OBJ);

require "db.class.php";
$DB = new DB();     
$req = $DB->query('SELECT * FROM regions');  
$regions = $req->fetchAll(PDO::FETCH_OBJ);

Cordialement,

kendzo, il y a 12 ans

ok j'ai inclus ton morceau de code :

<?php
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <link rel="stylesheet" href="css/bootstrap.css">
    </head>
    <body>
        <?php
            require "db.class.php";
            $DB = new DB();    
            $req = $DB->query('SELECT * FROM regions'); 
            $regions = $req->fetchAll(PDO::FETCH_OBJ);
        ?>
        <select id="region">
             <?php foreach ( $regions as $region ): ?>
                <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
            <?php endforeach ?>
        </select>
    </body>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</html>

Il me retourne une erreur :

Fatal error: Call to a member function fetchAll() on a non-object in C:\wamp\www\index.php on line 15
MrGuillou, il y a 12 ans

Oups désolé j'avais pas vue ton fichier db, donc pas besoins de ma ligne car elle est déjà dans ton fichier db.
Je cherche pour ton problème.

kendzo, il y a 12 ans

Quand je teste en enlevant

<?= $region->name; ?>

J'obtiens une liste qui semble contenir les 23 emplacements de la table regions mais la liste déroulante affiche 23 lignes vides ?!?! piouf pas facile ce truc !!

MrGuillou, il y a 12 ans

avant <?php foreach ( regions as $region ): ?> ajotue <?php print\_r(regions); ?> regarde si tu as bien les champs name dans le résultat

kendzo, il y a 12 ans

J'ai inclus <?php print_r($regions); ?> comme ceci :

<?php
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <link rel="stylesheet" href="css/bootstrap.css">
    </head>
    <body>
        <?php
            require "db.class.php";
            $DB = new DB();     
            $regions = $DB->query('SELECT * FROM regions');   
        ?>
        <?php print_r($regions); ?>
        <select id="region">
             <?php foreach ( $regions as $region ): ?>
                <option value="<?= $regions->id; ?>"></option>
            <?php endforeach ?>
        </select>
    </body>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</html>

Et j'ai bien le nom des régions, voici ce qu'il retourne :

Array ( [0] => stdClass Object ( [id] => 1 [name] => Alsace ) [1] => stdClass Object ( [id] => 2 [name] => Aquitaine ) [2] => stdClass Object ( [id] => 3 [name] => Auvergne ) [3] => stdClass Object ( [id] => 4 [name] => Bourgogne ) [4] => stdClass Object ( [id] => 5 [name] => Bretagne ) [5] => stdClass Object ( [id] => 6 [name] => Centre ) [6] => stdClass Object ( [id] => 7 [name] => Champagne-Ardenne ) [7] => stdClass Object ( [id] => 8 [name] => Corse ) [8] => stdClass Object ( [id] => 9 [name] => Franche-Comté ) [9] => stdClass Object ( [id] => 10 [name] => Île-de-France ) [10] => stdClass Object ( [id] => 11 [name] => Languedoc-Roussillon ) [11] => stdClass Object ( [id] => 12 [name] => Limousin ) [12] => stdClass Object ( [id] => 13 [name] => Lorraine ) [13] => stdClass Object ( [id] => 14 [name] => Midi-Pyrénées ) [14] => stdClass Object ( [id] => 15 [name] => Nord-Pas-de-Calais ) [15] => stdClass Object ( [id] => 16 [name] => Basse-Normandie ) [16] => stdClass Object ( [id] => 17 [name] => Haute-Normandie ) [17] => stdClass Object ( [id] => 18 [name] => Pays de la Loire ) [18] => stdClass Object ( [id] => 19 [name] => Picardie ) [19] => stdClass Object ( [id] => 20 [name] => Poitou-Charentes ) [20] => stdClass Object ( [id] => 21 [name] => Provence-Alpes-Côte d'Azur ) [21] => stdClass Object ( [id] => 22 [name] => Rhône-Alpes ) [22] => stdClass Object ( [id] => 23 [name] => DOM ) )
MrGuillou, il y a 12 ans

Tu peux aussi afficher le code source généré de la page. Sur chrome, clique droit -> afficher code source. Regarde la structure de ton select

kendzo, il y a 12 ans

Voici le code source de la page :

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <link rel="stylesheet" href="css/bootstrap.css">
    </head>
    <body>
                <select id="region">
                             <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                            <option value="<?= $region->id; ?>"><?= $region->name; ?></option>
                    </select>
    </body>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</html>
MrGuillou, il y a 12 ans

Bon plutôt incroyable. je vois pas ce qui cloche. Ton code devrait fonctionner mais php passe déçu comme si il n'existé pas :|

<?php 
        foreach ( $regions as $region ) {
            echo '<option value="'.$region->id.'">'.$region->name.'</option>';
        }
    ?>

A la place de

<?php foreach ( $regions as $region ): ?>
    <option value="<?= $regions->id; ?>"><?= $region->name; ?></option>
<?php endforeach ?>
kendzo, il y a 12 ans

OOOOOOH quelle joie !!! Quel bonheur !!

TA solution fonctionne !!!! Je suis super content je te remercie mille fois

merci merci merci... et encore merci

MrGuillou, il y a 12 ans

ok c'est bon je sais, tu es sur une ancienne version de php qui ne supporte pas la syntaxe "<?=" tu peux placer "<?php echo ...." à la place

kendzo, il y a 12 ans

Ok c'est wamp et c'est vrai que je l'ai installé il y a quelques mois, demain je vais faire une grosse mise a jour.

Je te remercie encore c'est vraiement super merci