Как обернуть PDO Class? - PullRequest
       2

Как обернуть PDO Class?

0 голосов
/ 24 июня 2019

Мне нужно перенести класс PDO в новый класс. Проблема в том, что после обертки какой-то метод не может получить доступ к другому методу. в приведенном ниже коде. он оборачивает запрос для выполнения try catch и return error. Но после того, как я заверну этот метод запроса. я не могу вызвать любой после метода 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 ]

1 голос
/ 24 июня 2019

Мне нужно перенести класс PDO в новый класс.

На самом деле, нет. Ваш класс имеет так много проблем и предлагает так мало, что оригинальная PDO этого не делает, так что на самом деле нет единственной причины предпочитать этот класс оригинальной PDO. Узнайте, как сначала использовать PDO ( подготовленные операторы специально), и только затем попытайтесь создать простую оболочку. Вот статья, которую я написал, основанная на сотнях похожих вопросов, заданных здесь, о переполнении стека, Ваша первая детская оболочка базы данных , она поможет вам с вашей оболочкой. Но на данный момент - снова - просто используйте оригинальный PDO как есть.

0 голосов
/ 24 июня 2019

Ваш 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...