2010-12-08 81 views
0

J'ai un fichier connection.php dans lequel j'initialise PDO dans $ db. Et je veux vérifier cette validation dans le User.php que j'inclus après connection.php. mais ça me donne une erreur.Erreur lors de l'ajout de PDO à mon code

try { 
    $db = new PDO("mysql:dbname=$db_name;host=$db_host", $db_username,$db_password); 
    echo "PDO connection object created"; 
} 
catch(PDOException $e){ 
    echo $e->getMessage(); 
} 

Comment puis-je valider ce code en exécutant PDO. Comment je vais passer l'AOP à la classe utilisateur ..

Fatal error: Call to a member function query() on a non-object in /var/www/youngib/rahul/yapi/user.php on line 41 

    $sql="select * from users where email='$this->email'"; 
      $rs=$db->query($sql); 
      if(mysql_num_rows($rs)>0){ 
       $msg=geterrormsg(4); 
        //email already exist 
       echo $msg= "{ 'success': 'false','msg':'$msg'  ,'error_code':'4'  }"; 
       return false; 
      } 

Aide S'il vous plaît.

Merci.

+0

Montrez-nous le code qui initialise 'db' de $. D'après ce que vous avez posté, je m'attendrais à ce que '$ db' soit un non-objet. En outre, pensez à utiliser des requêtes paramétrées, d'autant plus que vous utilisez déjà PDO. – Asaph

+0

J'avais posté le code de $ db – XMen

+0

Voyez-vous "Objet de connexion PDO créé" ...? – Vikash

Répondre

0

Injecter dans la classe ou de faire une classe singleton DB comme ...

Injection:

class User 
{ 
    protected $db; 

    public function __construct(PDO $db) 
    { 
    $this->db = $db; 
    } 

    public function getDb() 
    { 
    return $this->db; 
    } 

    public function isUser($email) 
    { 
    $stmt = $this->getDb()->prepare('select count(email) as user_exists from users where email = :email'); 
    return (bool) $stmt->execute(array(':email' => $email))->fetchColumn(); 

    } 
} 

Singleton:

class Database { 
    protected $pdo; 
    protected static $instance; 

    protected function __construct($dsn, $user, $password) 
    { 
    $this->pdo = new PDO($dsn, $user, $password); 
    } 

    public static function getInstance() 
    { 
    if(!self::$instance) 
    { 
     // normally you would load the dsn, user, and password from a config file 
     $db = Config::get('db'); 
     self::$instance = new self($db['dsn'], $db['user'], $db['password']); 
    } 

    return self::$instance; 
    } 

    public function getDb() 
    { 

    return $this->pdo; 
    } 
} 


class User 
    { 
     protected $db; 

     public function __construct(PDO $db = null) 
     { 
     if(null !== $db) 
     { 
      $this->db = $db; 
     } 
     } 

     public function getDb() 
     { 
     if(!$this->db) 
     { 
      $this->db = Database::getInstance()->getDb(); 
     } 

     return $this->db; 
     } 

     public function isUser($email) 
     { 
     $stmt = $this->getDb()->prepare('select count(email) as user_exists from users where email = :email'); 
     return (bool) $stmt->exectute(array(':email' => $email))->fetchColumn(); 

     } 
    } 
+0

s'il vous plaît vérifier ma réponse dans la réponse – XMen

+0

Salut, maintenant je reçois cette erreur, erreur fatale: Appel à la méthode non définie PDOStatement :: exectute() dans /var/www/youngib/rahul/yapi/user.php sur la ligne 50 sur ce instruction \t \t \t return (booléen) $ stmt-> exectute (array (': email' => $ email)) -> fetchColumn(); – XMen

+1

Singletons n'ont aucune utilité en PHP. Il n'y a pas de mémoire d'application partagée et la quantité autorisée de connexions db peut être gérée depuis l'adaptateur approprié. – Gordon

0

Je déteste dire cela, mais essayez ajouter simplement

global $db; 

avant votre ligne $db->query($sql);. Cela pourrait fonctionner, en fonction de l'endroit exact où $ db a été créé.

Cela dit, la réponse de prodigitalson est une approche nettement améliorée, il implique simplement la fixation de votre conception entière, ce qui implique plus haut travail avant :)