0

我尝试构建一个类似 Laravel 的查询构建器,但我遇到了问题。

致命错误:在第 31 行的 C:\xampp\htdocs\tutorial\public\classes\DB.php 中的非对象上调用成员函数 fetch()

class DB {
    private $_pdo,
    $_query,
    $_results = array(),
    $_count = 0;

    public static $instance;

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

    public function __construct(){
        try {
            $this->_pdo = new PDO('mysql:host=localhost;dbname=query', 'root', '');

            $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }
    }

    public function query($sql){
        if($this->_pdo = $this->_pdo->query($sql)){

           while($row = $this->_query->fetch(PDO::FETCH_OBJ)){
               $this->_results[] = $row;

           }
        }
        return $this;
 }

 public function results(){

     return $this->_results;
 }

}

4

2 回答 2

3

改变:

if($this->_pdo = $this->_pdo->query($sql)){

到:

if($this->_query = $this->_pdo->query($sql)){

编辑:

如果你$_query被调用,在这种情况下会更好$_resource

编辑2:

对于未来 - 你应该检查你在你的方法中实际查询的 SQL 类型- 如果它在你的对象中的某个地方返回 / 设置并且它返回 / 设置query可能会很好?UPDATE...affected rowsINSERT...last insert id

这将使它更加灵活 - 虽然只是一个建议:)

编辑 3:

确保您的 $sql 是安全的/防注入的 - 对于 PDO 使用准备好的语句:

PDO::prepare - 手动

于 2013-08-27T15:08:07.260 回答
0

$this->_query永远不会在您的查询功能中设置。您正在分配$this->_pdo给查询结果而不是查询变量。

于 2013-08-27T15:10:52.053 回答