如何包装PDO类?

时间:2019-06-24 09:11:08

标签: php mysql pdo

我需要将PDO类包装到新类中。问题是在包装某些方法后,它无法访问其他方法。在下面的代码中。它包装查询以执行try catch并返回错误。但是,在我包装了该查询方法之后。我不能在PDO方法之后调用任何方法。像fetchAll等。

class aegis{
    private $init, $dsn, $user, $pass;
    private $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_CASE => PDO::CASE_NATURAL,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING  
    ];
    private $error = [];

    public function __construct($host, $port, $db_name, $user, $pass){
        $this->dsn = 'mysql:host='.$host.';port='.$port.';dbname='.$db_name;
        $this->user = $user;
        $this->pass = $pass;
        $this->connect();
    }

    private function connect(){
        try{
            $this->init = new PDO($this->dsn, $this->user, $this->pass, $this->options);
        }catch(PDOException $e){
            if(isset($e)){
                array_push($this->error, $e->getCode());
                array_push($this->error, $e->getMessage());
                array_push($this->error, time());
            }
        }
    }

    public function query($sqlStatement){
        if(isset($this->init)){
            try{
                $this->init->query($sqlStatement);
            }catch(PDOException $e){
                if(isset($e)){
                    array_push($this->error, $e->getCode());
                    array_push($this->error, $e->getMessage());
                    array_push($this->error, time());
                }else{
                   return $this->init->query($sqlStatement);
                }
            }
        }
    }

    public function close(){
        $this->init = NULL;
    }

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

$aegis = new aegis($host, $port, $db_name, $user, $pass);

$rows = $aegis->query("SELECT `market` FROM `result`")->fetchAll();

foreach($rows as $row){
    echo $row.'<br>';
}

2 个答案:

答案 0 :(得分:1)

  

我需要将PDO类包装到新类中。

实际上,您没有。您的课程有很多问题,提供的内容很少,以至于原始PDO并没有,因此没有真正的理由偏向于原始PDO。首先了解如何使用PDO(特别是准备好的语句),然后再尝试创建简单的包装器。这是我根据栈溢出Your first database wrapper's childhood diseases在此处提出的数百个类似问题撰写的文章,它将为您的包装程序提供帮助。但是,目前(再次),仅按原样使用原始PDO。

答案 1 :(得分:0)

如果原始呼叫成功query(),则您的$this->init->query将不会返回任何内容。但是,如果有一个异常并且没有设置该异常(没有意义),那么它将重新执行查询并返回结果。

public function query($sqlStatement){
    if(isset($this->init)){
        try{
            return $this->init->query($sqlStatement);
        }catch(PDOException $e){
            array_push($this->error, $e->getCode());
            array_push($this->error, $e->getMessage());
            array_push($this->error, time());
            return false;
        }
    }
}

不确定发生异常或要重新引发某些异常时要返回什么。但这返回false,这将导致...的问题。

$rows = $aegis->query("SELECT `market` FROM `result`")->fetchAll();

fetchAll()将失败(它将尝试在fetchAll()上调用false)。

替代用途

if ($result = $aegis->query("SELECT `market` FROM `result`") ) {
    $rows = $result->fetchAll();

    // Output data
}
相关问题