简单的查询生成器

时间:2013-08-27 15:04:28

标签: php oop

我尝试构建一个类似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;
 }

}

2 个答案:

答案 0 :(得分:3)

变化:

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

要:

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

修改

如果您的$_query被称为$_resource,那么情况会更好。

编辑2:

对于未来 - 您应该检查您在query方法中实际查询的SQL类型 - 如果UPDATE...它返回/设置在您的对象{{1}中某处,那么它可能会更好并且对于affected rows,它会返回/设置INSERT...

这会使它变得更加灵活 - 只是一个建议:)

编辑3:

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

PDO::prepare - Manual

答案 1 :(得分:0)

永远不会在查询函数中设置

$this->_query。您将$this->_pdo分配给查询结果而不是查询变量。