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 20/12/2012, 07h37   #1
nu_tango
Membre éclairé
 
Homme
Inscription : mai 2007
Messages : 133
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2007
Messages : 133
Points : 396
Points : 396
Par défaut Fatal error: Call to a member function prepare() on a non-object

Bonjour à tous,

Je vous explique mon petit souci : j'ai une classe DAO que voici :

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
 
class UserDaoImpl implements UserDao {
 
	private $pdo;
 
	public function __contruct(PDO $pdo) {
		$this->pdo = $pdo;
	}
 
	public function create(User $user) {	
		$sql = "INSERT INTO user
					(login, password, email, firstname, lastname) 
				VALUES
					(:login, :password, :email, :firstname, :lastname)";
 
		$stmt = $this->pdo->prepare($sql);
		$stmt->bindParam(':login', $user->getLogin(), PDO::PARAM_STR);
		$stmt->bindParam(':password', $user->getPassword(), PDO::PARAM_STR);
		$stmt->bindParam(':email', $user->getEmail(), PDO::PARAM_STR);
		$stmt->bindParam(':firstname', $user->getFirstname(), PDO::PARAM_STR);
		$stmt->bindParam(':lastname', $user->getLastname(), PDO::PARAM_STR);
		$stmt->execute();
		$user->setId($this->pdo->lastInsertId());
		return $user;		
	}
 
// autres méthodes CRUD
Quand je veux utiliser ma classe DAO comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
try {
	$pdo = new PDO('mysql:dbname=database;host=localhost', 'dbuser', 'dbpass');
	$pdo->setAttribute(PDO::ATTR_PERSISTENT, true);
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
	Logger::error($e->getMessage());
}
 
$dao = new UserDaoImpl($pdo);
$user = new User("johndoe23", "secret", "john.doe@crappymail.com", "John", "Doe");
$dao->create($user);
J'obtiens une "Fatal error: Call to a member function prepare() on a non-object". Or j'ai bien l'impression que je passe une instance de PDO au constructeur de ma classe DAO.

J'ai essayé avec et sans le try/catch, j'ai essayé en instanciant directement PDO dans le constructeur de ma classe, j'ai essayé avec un singleton, j'ai relu la doc PHP et je ne vois vraiment pas pourquoi il me sort cette erreur à chaque fois.

Si quelqu'un à une piste je suis preneur.
nu_tango est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 08h22   #2
RunCodePhp
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 965
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 965
Points : 3 673
Points : 3 673
Salut

Dans ton code je vois ceci :
public function __contruct(PDO $pdo)
__contruct au lieu de __construct, petite erreur de frappe (manque le s).

Qui fait que l'Objet DAO n'aurait finalement pas de constructeur, du coup pas un Objet PDO.


Mise à pas ça je ne vois autre chose.


Fait un peu de débogage, comme un print_r() de $pdo aussi bien après instanciation que dans l'objet DAO.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2012, 08h33   #3
nu_tango
Membre éclairé
 
Homme
Inscription : mai 2007
Messages : 133
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2007
Messages : 133
Points : 396
Points : 396
Merci RunCodePhp

Effectivement je n'avais plus les yeux en face des trous à force de chercher autour...
nu_tango 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 20h16.


 
 
 
 
Partenaires

Hébergement Web