[RESOLU] Classe database en pdo avec requêtes préparées

Eléphant du PHP | 258 Messages

25 mars 2013, 16:14

Bonjour

Je suis en train de m'entrainer à créer une classe database en pdo avec des requêtes préparées.
je ne trouve pas beaucoup concernant les classes concernant les requêtes préparées en pdo sur internet.


J'ai tenté quand même et je savais que j'allais être coincé face à ce message d'erreur :
Fatal error: Call to undefined method DBMySQL::prepare() in ....
voici mon code
<?php
    define('DB_HOST', 'localhost');
	define('DB_DATABASE', 'tests');
	define('DB_USERNAME', 'root');
	define('DB_PASSWORD', 'root');
    define('DB_CHARSET', 'utf8');

class DBMySQL{

    public $db;
    public $sql;
    private $dbhost = DB_HOST;
    private $dbuser = DB_USERNAME;
    private $dbpass = DB_PASSWORD;
    private $dbname = DB_DATABASE;
    private $dbcharset = DB_CHARSET;
  
    public function __construct(){
		try{
			$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " .$this->dbcharset));
			$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
			echo "Connexion réussie<br />";
		}catch(Exception $e){
				echo "Connexion pas réussie<br />";
				echo "Erreur : ".$e->getMessage()."<br />";
				echo "N° : ".$e->getCode();
		}
    }
      
    public function query($sql){
        global $db;
        
        $stmt = $db->prepare($sql);             
        $stmt->execute();             
        return $stmt->fetchAll(PDO::FETCH_OBJ);        
    }
    
}
?>
<?php
                        $db = new DBMySQL();
                        $select = $db->query("SELECT * FROM regions");
                        $data = $select->fetchAll();
                        var_dump($data);
                    ?>
je vous remercie beaucoup de votre aide ;)
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Mammouth du PHP | 571 Messages

25 mars 2013, 16:47

bonjour,
j'ignore la portée d'une variable globale dans une classe certainement elle doit être la source de ton problème.d'après l'erreur, la méthode execute() de ta méthode query() n'est défini nulle part car $db n'est pas vu comme un objet pdo.
si tu veux apppeler la variable db qui est l'attribut de ta classe il faut utiliser $this->db;



<?php
    define('DB_HOST', 'localhost');
        define('DB_DATABASE', 'tests');
        define('DB_USERNAME', 'root');
        define('DB_PASSWORD', 'root');
    define('DB_CHARSET', 'utf8');

class DBMySQL{

    public $db;
    public $sql;
    private $dbhost = DB_HOST;
    private $dbuser = DB_USERNAME;
    private $dbpass = DB_PASSWORD;
    private $dbname = DB_DATABASE;
    private $dbcharset = DB_CHARSET;
 
    public function __construct(){
                try{
                        $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE, DB_USERNAME, DB_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " .$this->dbcharset));
                        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                        echo "Connexion réussie<br />";
                }catch(Exception $e){
                                echo "Connexion pas réussie<br />";
                                echo "Erreur : ".$e->getMessage()."<br />";
                                echo "N° : ".$e->getCode();
                }
    }
     
    public function query($sql){
    //    global $db;
       
        $stmt = $this->db->prepare($sql);            
        $stmt->execute();            
        return $stmt->fetchAll(PDO::FETCH_OBJ);        
    }
   
}
?>
par ailleurs, tu doit appeller ta méthode query() sans faire un fetchAll() car la méthode query() de ta classe sait déjà retourner un tableau d'objets:
$db = new DBMySQL();
                        $data = $db->query("SELECT * FROM regions");
                        var_dump($data);

Eléphant du PHP | 258 Messages

25 mars 2013, 17:06

merci
ça marche

merci beaucoup
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver