Мне нужно обернуть класс 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>';
}
@Jonnix, я думаю, что поместил туда isset, чтобы проверить. если есть ошибка, она выдаст ошибку. в противном случае он вернется. неправильно ли возвращать запрос?
Присмотревшись повнимательнее, я понятия не имею, что делают ваши catch, но я чувствую, что это (довольно большое?) непонимание того, для чего нужны try/catch и как они работают. Возможно, посмотрите документацию, блоки catch не запускаются, если в блоке try не выдается исключение. php.net/manual/en/language.exceptions.php
да, я думаю, мне нужно научиться концепции «поймать». я думаю try только check.it ничего не возвращает, пока внутри обертки catch не обработается выброшенная ошибка или нет. Спасибо
Нет, они так не работают. Все в блоке try запускается (пока не возникнет исключение), это не пробный прогон, это не «проверьте, все ли в порядке, затем перейдите в перехват». пойманный), то попытка завершается, и соответствующий код catch будет запущен. Если вы окажетесь в блоке catch, исключение БЫЛО сгенерировано. делать что-либо внутри блока try, что вы могли бы сделать вне его, чтобы вы могли возвращать результаты запроса внутри.






Ваш 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
}
Суть моего кода в том, что мне нужно минимизировать код в основном коде. но он все еще воспроизводит журнал. Так что эта информация пригодится позже для отладки. если есть проблема.
I need to wrap PDO class to the new class.
На самом деле нет. В вашем классе так много проблем и так мало предложений, которых нет в оригинальном PDO, что на самом деле нет ни одной причины предпочесть этот класс оригинальному PDO. Сначала изучите, как использовать PDO (в частности, подготовленные заявления), и только потом пытайтесь создать простую оболочку. Вот статья, которую я написал на основе сотен подобных вопросов, заданных здесь, в Stack Overflow, Детские болезни вашей первой оболочки базы данных, она поможет вам с вашей оболочкой. Но на данный момент - опять же - просто используйте исходный PDO как есть.
Почему мне нужно обернуть, потому что мне нужно минимизировать код с ошибкой возврата дополнительной функции. каждый шаг. из инициализации PDO и оператора SQL.
Вам это тоже не нужно. Пожалуйста, прочитайте о Основы отчетов об ошибках PHP. Короче говоря, исключение PDO - все, что вам действительно нужно для сообщения об ошибках. исключение уже содержит всю необходимую информацию, писать код для его перемещения в массив просто не имеет смысла. Просто сразу используйте исключение
Можете ли вы привести пример, как использовать встроенную ошибку без попытки и отлова. поэтому я могу минимизировать код. а это все еще отчет типа попробуй поймай?
Это зависит от вашей цели. Что вы собираетесь делать с этой информацией об ошибке?
Мне нужно получить getCode и getMessage из всех исключений PDO. Мне нужно проверить, подключается ли он или нет, и вставить в базу данных для информации
Затем вы должны использовать оператор try catch.
вот почему мне нужен класс encasuplation PDO. причина. у меня есть основной производственный код. это спам, слишком много попыток и повторений.
если вы спамите слишком много попыток и поймать, то вы делаете что-то не так. обычно не должно быть ни одной попытки поймать. Я не понимаю, зачем тебе столько
Потому что ваш метод
queryничего не возвращает в случае успеха. Кстати,if (isset($e))в улове избыточен. Я не знаю, каким образом он мог попасть туда и не быть установленным.