2010-12-08 27 views
0

私はconnection.phpファイルを持っていますが、$ dbでPDOを初期化しています。 そして、私はconnection.phpの後に私が含むUser.phpでこの検証をチェックしたいと思います。 しかし、それは私にエラーを与えています。コードにPDOを追加中にエラーが発生しました

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(); 
} 

このコードをPDOを実行することによってどのように検証できますか?私は、ユーザークラスにPDOを渡す方法 ...

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; 
      } 

助けてください。

ありがとうございました。 ...

+0

を固定関係私たちに '$のdb'を初期化するコードを表示します。あなたが投稿したことによると、私は '$ db'が非オブジェクトであると考えています。また、特にPDOを既に使用しているため、パラメータ化されたクエリを使用することを検討してください。 – Asaph

+0

$ dbのコードを投稿しました – XMen

+0

「PDO接続オブジェクトが作成されました」というメッセージが表示されますか? – Vikash

答えて

0

クラスにそれを注入するなどシングルトンDBクラスを作る

注入:

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(); 

    } 
} 

シングルトン:

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

私の返信をお答えください – XMen

+0

こんにちは、私はこのエラーが発生しています。致命的なエラー:定義されていないメソッドを呼び出すPDOStatement :: exectute()/var/www/youngib/rahul/yapi/user.php on this 50 on this声明\t \t \tリターン(ブール値)$ stmt-> exectute(配列( ':メール' => $メール)) - > fetchColumn(); – XMen

+1

シングルトンはPHPでは使用できません。そこには共有アプリケーションのメモリがなく、DB接続の許可量は、適切なアダプタ内から管理することができます。 – Gordon

0

私はこれを言うことを憎むが、してみてください追加するだけです

global $db; 

の前にあなたの$db->query($sql);行$ dbがどこに作成されたかによって、動作するかもしれません。 、prodigitalsonの答えを言っ

が大幅に改善されたアプローチであり、それだけで前の仕事まで以上を必要とするあなたの全体のデザイン、:)

関連する問題