2014-02-15 84 views
0

我有,在db.php中的文件,下面的代码:

public function query($sql, $params = array()){ 
    $this->_error = false; 
    if($this->_query = $this->_pdo->prepare($sql)){ 
     $x = 1; 
     if(count($params)){ 
      foreach($params AS $pa){ 
       $this->_query->bindValue($x, $pa); 
       $x++; 
      } 
     } 
     #MASSIVE ERROR 
     #correctthis 
     if($this->_query->execute()){ 
      echo 'success'; 
      $this->_result = $this->_query->fetchAll(PDO::FETCH_OBJ); 
      $this->_query = $this->_query->rowCount(); 
     } else { 
      $this->_error = true; 
     } 
    } 

    return $this; 
} 

public function error(){ 
    return $this->_error; 
} 

我的问题是$this->_query->execute()始终是假的,这意味着$ _error总是被设置为true。即使它看起来没有任何问题,我也无法使它工作。

脚本进入准备(我通过回声测试),这意味着它准备成功。它也进入foreach循环,所以值必须被绑定。但它似乎无法执行。为什么?

编辑:

我用DB::getInstance()->query("SELECT email FROM user_credentials WHERE user_id = ?", array(1))打电话查询,这是什么的getInstance样子:

public static function getInstance(){ 
    if(!isset(self::$_instance)){ 
     self::$_instance = new DB(); 
    } 
    return self::$_instance; 
} 
+0

你的** $ sql **语句是怎么样的?它是否期望你在执行中不提供参数? – sqlab

+0

我正在使用'DB :: getInstance() - >查询(“SELECT email FROM user_credentials WHERE user_id =?”,array(1));'我正在编辑我的帖子以显示getInstance的样子。 – markovchain

+0

对于问号你不需要绑定参数,但是无论哪种方式,你都应该在执行调用中提供参数。 – sqlab

回答

-1

让你的函数这样

public function queryAll($sql, $params = array(), $method = PDO::FETCH_OBJ) 
{ 
    $stmt = $this->_pdo->prepare($sql); 
    $stmt->execute($params); 
    return $stmt->fetchAll($method); 
} 

,或者,如果你喜欢的方法链接,那么这样

public function query($sql, $params = array()) 
{ 
    $stmt = $this->_pdo->prepare($sql); 
    $stmt->execute($params); 
    return $stmt; 
} 

然后在异常模式设置PDO,你将永远通知发生任何错误。为了使这样的构造

$this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

添加该代码的代码的其余部分是没用的,不灵活,容易出错,有时甚至完全错误的。

+0

谢谢!但是当'$ params'没有元素时,你的代码会发生什么?另外,为什么你建议使用'$ stmt'而不是'$ this - > _ query'? – markovchain

+0

我不知道谁低估了你,但这个答案是有帮助的。我只是刚刚开始使用PDO,这段代码来自一个教程,让你逐步了解数据发生了什么。 – markovchain

+1

@markovchain只是试试看。没有什么特别的 - 查询只是照常执行。 –

-1

试试这个知道该查询返回的具体错误。我只修改了其他块。

#MASSIVE ERROR 
    #correctthis 
    if($this->_query->execute()){ 
     echo 'success'; 
     $this->_result = $this->_query->fetchAll(PDO::FETCH_OBJ); 
     $this->_query = $this->_query->rowCount(); 
    } else { 
     $this->_error = true; 
     echo $this->_query->errorInfo()[2]; 
    } 
0

我认为你没有正确连接数据库。查看连接功能是否正常工作。像下面的代码,如果你是从在线教程试试这个:

$this->_pdo = new PDO('mysql:host=' . Config::get 
('mysql/host') . ';dbname=' . Config::get('mysql/db'), 
Config::get('mysql/username'), Config::get('mysql/password')); 
相关问题