try { self::$dbinstance = new PDO( "mysql:host=$c[host];dbname=$c[dbname]", $c['user'], $c['password'] ); self::$dbinstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo "Errors" . $e->getMessage(); }
В приведенном выше коде, если PDO не удается подключиться к хосту, fatal error
показывает имя пользователя и пароль
Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003] Can't connect to MySQL server on '172.25.102.65' (10060)' in D:\xampp\htdocs\mytest\wh_client_2.1\classes\importmodule-class.php:33 Stack trace: #0 D:\xampp\htdocs\mytest\wh_client_2.1\classes\importmodule-class.php(33): PDO- >__construct('mysql:host=172....', 'host', 'password') #1
Один из возможных способов состоит в том, чтобы отключить display_error=0
в php.ini
но таким образом я не смогу узнать, когда мой хост не отвечает. есть ли способ изменить сообщение об ошибке?
Существует разница между обработкой ошибок и сообщениями об ошибках.
Чтобы правильно обрабатывать ошибки, я думаю, что ini_set('display_errors',0);
это лучший подход. Вы не хотите, чтобы на экране отображалось сообщение об ошибке.
Однако я хочу получить всю возможную информацию об ошибках, поэтому я использую error_reporting(E_ALL);
,
Ошибки записываются в файл error_log, который обычно находится на том же уровне, что и index.php (или любой php-файл, вызываемый напрямую). Вы также можете получить доступ к нему из своего cpanel.
Вероятно, ваша ошибка не показана, потому что ваш код находится в пространстве имен, тогда как вы хотите поймать глобальное пространство имен PDOException
. Используйте \
чтобы указать, что ваш скрипт вы ищете глобальное PDOException
. После того, как вы поймаете свою ошибку, вы можете эхом отточить содержимое, используя обычные методы класса PDOException .
try { $db = new PDO (/*connection infos*/); } catch (\PDOException $e) { switch ($e->errorCode()) { case 'HY000': // or whatever error you are looking for // here it's the general error code mail('your@email.com','connection problem',$e->getTraceAsString()); $db = new PDO (/*rollback connection infos of a local database*/); break; } }
Это отправит вам письмо, содержащее след ошибки, не позволяя вашему пользователю видеть его, сообщая вам, что что-то не так.
Вот ссылка на коды ошибок, возвращаемые операторами pdo.
Когда ваш хост не отвечает, вы будете знать все правильно – ваш хост перестанет отвечать. Затем вам нужно заглянуть в журнал ошибок и найти сообщение об ошибке с особой ошибкой.
Так что просто держите с display_errors=0
как и должно быть в производственной среде.
Нет , не пытайтесь throw
исключение, так как оно выплюнет такую важную информацию. Обращайтесь с ними с помощью соответствующих пользовательских сообщений об ошибках и обработайте эти исключения внутри ваших пользовательских функций ведения журнала …
Вы должны делать что-то похожее на это …
<?php try { $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'uname', 'pass'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->query('bla bla bla bla'); //<---- This will definitely fail !!!! } catch(PDOException $ex) { echo "An Error occured!"; file_put_contents('somefile.txt',$ex->getMessage(),FILE_APPEND); }
Как вы можете видеть, вышеупомянутый запрос действительно будет терпеть неудачу, поэтому конечный пользователь будет видеть только ошибку! сообщение, но ошибка будет somefile.txt
в ваш somefile.txt
Вы должны регистрировать все исключения и, конечно же, можете их восстановить, но в своем основном файле обычно указывается, что вы должны обернуть весь код с помощью try, и если вы поймаете там какое-либо исключение, вы должны просто показать пользователям какую-то пользовательскую страницу ошибок.
Если ничего не работает, вы должны упростить и попробовать, если этот файл отлично работает с теми же данными в массиве:
<?php $c = array(); $c['host'] = '172.25.102.65'; $c['dbname'] = 'rewrwe'; $c['user'] = 'rewarwae'; $c['password'] = '4242'; try{ $dbinstance=new PDO("mysql:host=$c[host];dbname=$c[dbname]",$c['user'],$c['password']); $dbinstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch( PDOException $e) { //die( '<b>Errors:</b> '); //throw new $e->getCode(); }
На моем сервере localhost это просто не печатает ничего. Мне кажется, что ошибка связана с чем-то elso in yor code
Вы можете сделать что-то вроде этого:
<?php // connect try { $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); } catch (PDOException $e) { $dbh = NULL; } // check if connected if($dbh) { // run queries } else { die('Oops! Our server has encountered an error, please try again later'); } ?>