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

Мне нужно обернуть класс PDO в новый класс. Проблема в том, что после обертки какого-то метода он не может получить доступ к другому методу. в приведенном ниже коде. он оборачивает запрос для выполнения попытки поймать и вернуть ошибку. Но после того, как я оберну этот метод запроса. я не могу вызвать какой-либо после метода 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>';
}

Потому что ваш метод query ничего не возвращает в случае успеха. Кстати, if (isset($e)) в улове избыточен. Я не знаю, каким образом он мог попасть туда и не быть установленным.

Jonnix 24.06.2019 11:14

@Jonnix, я думаю, что поместил туда isset, чтобы проверить. если есть ошибка, она выдаст ошибку. в противном случае он вернется. неправильно ли возвращать запрос?

olivia 24.06.2019 11:16

Присмотревшись повнимательнее, я понятия не имею, что делают ваши catch, но я чувствую, что это (довольно большое?) непонимание того, для чего нужны try/catch и как они работают. Возможно, посмотрите документацию, блоки catch не запускаются, если в блоке try не выдается исключение. php.net/manual/en/language.exceptions.php

Jonnix 24.06.2019 11:19

да, я думаю, мне нужно научиться концепции «поймать». я думаю try только check.it ничего не возвращает, пока внутри обертки catch не обработается выброшенная ошибка или нет. Спасибо

olivia 24.06.2019 11:34

Нет, они так не работают. Все в блоке try запускается (пока не возникнет исключение), это не пробный прогон, это не «проверьте, все ли в порядке, затем перейдите в перехват». пойманный), то попытка завершается, и соответствующий код catch будет запущен. Если вы окажетесь в блоке catch, исключение БЫЛО сгенерировано. делать что-либо внутри блока try, что вы могли бы сделать вне его, чтобы вы могли возвращать результаты запроса внутри.

Jonnix 24.06.2019 11:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш 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
}

Суть моего кода в том, что мне нужно минимизировать код в основном коде. но он все еще воспроизводит журнал. Так что эта информация пригодится позже для отладки. если есть проблема.

olivia 24.06.2019 11:44

I need to wrap PDO class to the new class.

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

Почему мне нужно обернуть, потому что мне нужно минимизировать код с ошибкой возврата дополнительной функции. каждый шаг. из инициализации PDO и оператора SQL.

olivia 24.06.2019 11:28

Вам это тоже не нужно. Пожалуйста, прочитайте о Основы отчетов об ошибках PHP. Короче говоря, исключение PDO - все, что вам действительно нужно для сообщения об ошибках. исключение уже содержит всю необходимую информацию, писать код для его перемещения в массив просто не имеет смысла. Просто сразу используйте исключение

Your Common Sense 24.06.2019 11:35

Можете ли вы привести пример, как использовать встроенную ошибку без попытки и отлова. поэтому я могу минимизировать код. а это все еще отчет типа попробуй поймай?

olivia 24.06.2019 11:43

Это зависит от вашей цели. Что вы собираетесь делать с этой информацией об ошибке?

Your Common Sense 24.06.2019 11:44

Мне нужно получить getCode и getMessage из всех исключений PDO. Мне нужно проверить, подключается ли он или нет, и вставить в базу данных для информации

olivia 24.06.2019 11:46

Затем вы должны использовать оператор try catch.

Your Common Sense 24.06.2019 11:52

вот почему мне нужен класс encasuplation PDO. причина. у меня есть основной производственный код. это спам, слишком много попыток и повторений.

olivia 24.06.2019 11:55

если вы спамите слишком много попыток и поймать, то вы делаете что-то не так. обычно не должно быть ни одной попытки поймать. Я не понимаю, зачем тебе столько

Your Common Sense 24.06.2019 11:57

Другие вопросы по теме