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
Réponse acceptée

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 ?>

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
Auteur

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

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
Auteur

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 !!

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

kendzo
Auteur

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 ) )

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
Auteur

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>
kendzo
Auteur

OOOOOOH quelle joie !!! Quel bonheur !!

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

merci merci merci... et encore merci

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
Auteur

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