Bonjour,
Je travail sur le tuto "POO et création de models", dans ce tutot est utilisé une méthode procédurale, je souhaitais donc le faire en PDO.
Je me trouve confronté au problème suivant :

Notice : Undefined variable: dbh in ../Site/PooModels/category.php on line 7

Fatal error : Call to a member function query() on a non-object in ../Site/PooModels/category.php on line 7

ok j'ai compris que la variable dbh n'est pas définie et la fatal error reste un peu abstraite mais certainement conséquente à l'absence de dbh.

struture de mon site:

category.php .....> contient

<?php   
class Category{
        public $id;

        function read($fields){

            $sql = $dbh->query("SELECT $fields FROM categories WHERE id=".$this->id);
            $sql->setFetchMode();
            while($result = $sql->fetch())
            {
                echo $result;
            }

        }
    }
?>

core.php .........> contient

<?php

    define('USER','root');
    define('PASS','root');
    define('DSN','mysql:host=localhost;dbname=tuto');
try {
    $dbh= new PDO(DSN,USER,PASS);
    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

}catch(PDOException $e) {
    echo "Erreur ! :" .$e->getMessage(). "<br/>";
    die();
}

?>

index.php ......> contient :

<?php 
require 'core.php';
require 'category.php';
 ?>
<!DOCTYPE html>
 <html lang="fr">
 <head> 
 <meta charset="utf-8" /> 
    <title>Test PDO MODELS</title>
    <link rel="stylesheet" href="css/main.css" type="text/css" /> 
 <!--[if IE]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]--> 
<!--[if lte IE 7]> <script src="js/IE8.js" type="text/javascript"></script><![endif]--> <!--[if lt IE 7]> 
 <link rel="stylesheet" type="text/css" media="all" href="css/ie6.css"/><![endif]--> 
</head> 
 <body>
<?php
    $c = new Category();
    $c->id = 2;
    print_r($c->read("name"));
?>
 </body>
 </html>

la variable dbh existe donc dans le core mais semble être occulté une fois appelé dans index.php. J'ai tenté de mettre la connection via PDO directement dans la fonction read et ça fonctionne. Pourquoi en dehors de la fonction cela ne fonctionne pas, dois je integrer un deuxieme paramètre dans la fonction qui correspondrait a dbh ? une solution?

Donc au final la solution est la suivante, il fallait bien intégrer en deuxième paramètre la connexion ici $dbh:

<?php   
class Category{
        public $id;

        function read($fields,$dbh){

            $sql = $dbh->query("SELECT $fields FROM categories WHERE id=".$this->id);
            $data = $sql->fetchAll();
            return $data;
        }
    }
?>

2 réponses


KTC
Auteur
Réponse acceptée
<?php   
class Category{
        public $id;

        function read($fields,$dbh){

            $sql = $dbh->query("SELECT $fields FROM categories WHERE id=".$this->id);
            $data = $sql->fetchAll();
            return $data;
        }
    }
?>

c'était la solution ^^

Ou alors il suffirait de mettre global $dbh; au début de ta fonction