Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/11/2012, 21h36   #1
stalex
Invité de passage
 
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 2
Points : 2
Par défaut Call to undefined method DB::prepare()

Salut tout le monde,

Je suis en train de faire un site avec des utilisateurs qui peuvent s'inscrire.
J'utilise PDO et ma connexion est dans une classe DB.

Voici les codes :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php     
class DB{     
private $host = 'localhost';         
private $username = 'root';         
private $password = '';    
private $database = 'projet';
private $bdd;             
 
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->bdd = 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('impossible de se co à la bd'); }         
 
}          
 
public function query($sql, $data = array()){            
$req =$this->bdd->prepare($sql);             
$req->execute($data);             
return $req->fetchAll(PDO::FETCH_OBJ);        
}}
Pardon pour cette indentation, j'ai pas réussi à en faire une.
Et mon code pour un INSERT TO :

Code :
1
2
3
4
5
6
7
8
9
10
11
$test = $DB->prepare('INSERT INTO personne(NomPersonne, PrenomPersonne, TelPersonne, MDPPersonne, EmailPersonne, AdresseClient, VilleClient)  VALUES(:NomPersonne, :PrenomPersonne, :TelPersonne, :MDPPersonne, :EmailPersonne, :AdresseClient, :VilleClient)');
    $success = $test->execute(array(
        'NomPersonne'=> $var_nom,
        'PrenomPersonne'=>$var_prenom,
        'TelPersonne'=>$var_tel,
        'MDPPersonne'=>$var_mdp,
        'EmailPersonne'=>$var_email,
        'AdresseClient'=>$var_adresse,
        'VilleClient'=>$var_ville
 
        ));
J'ai comme erreur :

Fatal error: Call to undefined method DB::prepare() in C:\Program Files (x86)\EasyPHP-12.1\www\pizzaalex\formulaireinscription.inc.php on line 113

Cette ligne correspond au code du INSERT INTO.

Merci de votre aide, je désespère...
stalex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 22h23   #2
Exia93
Membre Expert
 
Homme
Étudiant
Inscription : avril 2012
Messages : 612
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2012
Messages : 612
Points : 1 070
Points : 1 070
Bonsoir,

ou instancie tu ton objet $DB?

De plus tu fait $BD->prepare() alors que dans ta class DB tu ne déclare pas cette méthode et tu ne fait pas d'héritage de la classe PDO donc tu ne récupère pas les méthodes de le class PDO.

Pour que cela fonctionne,

Dans ta class DB tu as un attribut bdd qui est un objet PDO donc pour accéder aux méthodes PDO tu doit passer par cet attribut, pour ce faire étant donné qu'il est déclaré en private dans ta classe tu doit passer par un accesseur,

c'est une méthode qui te retourne un objet privé de ta classe,
exemple pour ta classe avec un accesseur pour récupérer l'objet bdd de la classe DB:
Code :
1
2
3
4
5
6
7
8
class DB{
//Le code de la classe que tu a déjà codé,
 
public function getBdd(){
    return $this->bdd;
}
 
}
ensuite après avoir instancié un objet de type DB pour pourvoir faire des requêtes SQL tu doit passer par cet accesseur:
Code :
$test = $DB->getBdd()->prepare('ta requête');
$DB correspond à l'objet que tu as instancié au préalable.
Exia93 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2012, 22h40   #3
stalex
Invité de passage
 
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 2
Points : 2
Merci beaucoup Exia, c'est très gentil de ta part, ça marche maintenant !
J'avais peur d'être le seul ayant ce problème... j'avais trouvé beaucoup d'info sur les INSERT TO mais pas quand la connexion est codée en objet...

Pour $DB, j'ai mis dans mon header (que je "include" pour chaque page de mon site) les lignes :

Code :
1
2
require 'db.class.php';
$DB = new DB();
En tout cas je te remercie mille fois
(et merci pour les explications très claires)
stalex est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h11.


 
 
 
 
Partenaires

Hébergement Web