Erreur PDO

Eléphanteau du PHP | 18 Messages

19 déc. 2008, 23:59

Bonjour je débute sous pdo et je ne suis pas familier avec elle.
J'ai fais une petite requête mais elle me renvoie une erreur :
		$QS_exist = Spdo::getInstance()->query("SELECT COUNT(*) AS nb FROM '".$this->_table."'");
		aExist = $QS_exist->fetch();
Et l'erreur :
Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\Punchline2\class\ValidatorInputUserExist.php on line 24

Merci de m'aider ;)
Thx all

De plus avec pdo y-a-t-il un or exit(mysql_error))?

Eléphanteau du PHP | 20 Messages

20 déc. 2008, 11:52

La classe c'est spdo, ou pdo tout court ?

ViPHP
ViPHP | 1136 Messages

20 déc. 2008, 12:37

Salut ,

Tu utilises une classe fille qui hérite de la classe PDO ( pour utiliser un Singleton ) ?

ce qui m'étonnerai car ta classe posséderai le même nom que la classe mére .. et sans espace de nom pour le moment , je ne pense pas que ce soit possible ..

Bref ,

Le méthode pour récupérer l'instance de PDO , n'existe pas en natif getInstance()

Donc , l'erreur est la suivante ,

"Call to a member function fetch() on a non-object"

Tu essayes d'appeler une méthode ( fetch ) à partir d'une ressource qui n'est pas un objet ( normal car getInstance n'existe pas )... donc plantage .

Pour les erreurs de PDO ... une fois que tu auras une bonne instance , tu peux utiliser ces méthodes :

errorCode() et errorInfo()

Je te laisse découvrir le leurs fonctionnement dans la doc .

http://fr2.php.net/manual/fr/class.pdo.php

Eléphanteau du PHP | 18 Messages

20 déc. 2008, 14:57

Si si j'utilise bien un singleton (bon il est honteusement copié sur apprendre-php.com^^) .
Voici ma classe Spdo :
<?php
class Spdo{
	private $_PDOInstance = null;
	private static $instance = null;
	const DEFAULT_SQL_USER = 'root';
	const DEFAULT_SQL_HOST = 'localhost';
	const DEFAULT_SQL_PASS = '';
	const DEFAULT_SQL_DTB = 'punchline';
	private function __construct() {
		$this->_PDOInstance = new PDO('mysql:dbname='.self::DEFAULT_SQL_DTB.';host='.self::DEFAULT_SQL_HOST,self::DEFAULT_SQL_USER ,self::DEFAULT_SQL_PASS);
	}
	
	public static function getInstance() {
		if(is_null(self::$instance)) {
			self::$instance = new Spdo();
		}
		return self::$instance;
	}

	public function query($query){
		return $this->_PDOInstance->query($query);
	}
	public function exec($exec) {
		return $this->_PDOInstance->exec($exec);
	}
	public function errorInfo() {
		return $this->_PDOInstance->errorInfo();
	}
}
?>
Voilà donc si vous y voyez un peu plus clair , merci de m'aider ! :)

ViPHP
ViPHP | 3607 Messages

20 déc. 2008, 15:16

Il faut utiliser try {} catch() pour detecter les erreurs, exemple:
try {
	$connexion = new PDO('mysql:host='.$CONFIG['host'].';dbname='.$CONFIG['db'], $CONFIG['user'], $CONFIG['pass']);
} catch(Exception $e) {
	echo 'Erreur : '.$e->getMessage().'<br />';
	echo 'N° : '.$e->getCode();
}

Eléphanteau du PHP | 18 Messages

20 déc. 2008, 15:41

Tu n'aurais pas oublier la ligne
throw new Exception('msg');


??Merci de m'expliquer je débute.

ViPHP
ViPHP | 3607 Messages

20 déc. 2008, 16:02

Non je ne l'ai pas oublié ;)
En fait c'est la classe PDO qui contient cce genre d'instructions, c'est elle qui renvoi des expetions si il y a une erreur...
D'où le try catch()

Eléphanteau du PHP | 18 Messages

20 déc. 2008, 18:50

Bon j'ai fais ce que tu m'as dit de faire mais aucune erreurs particulières .
Le problème c'est que cela n'affiche pas d'erreur :'(...
Quelqu'un a une idée?
Merci!

Eléphant du PHP | 185 Messages

20 déc. 2008, 18:54

Erreur dans ta requête.
if (false ! == $QS_exist) {

  $aExist = $QS_exist->fetch();

} else {

  print_r(Spdo::getInstance()->errorInfo());
}

Eléphanteau du PHP | 18 Messages

20 déc. 2008, 19:00

Bon j'ai trouvé et personnellement j'ai perdu un temps fou pour un simple problème de concaténation.
Il fallait faire :
$QS_exist = Spdo::getInstance()->query("SELECT COUNT(*) AS nb FROM ".$this->_table."");

Bref la prochaine fois je controllerais l'erreur directement...

Je suis nostalgique du or exit(mysql_error())... :'(
Merci all