Неустранимая ошибка PDO показывает имя пользователя и пароль

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 но таким образом я не смогу узнать, когда мой хост не отвечает. есть ли способ изменить сообщение об ошибке?

Related of "Неустранимая ошибка PDO показывает имя пользователя и пароль"

Существует разница между обработкой ошибок и сообщениями об ошибках.

  • Обработка ошибок – это процесс, позволяющий конечным пользователям видеть любую трассировку стека, важную информацию или автоматически генерируемые сообщения об ошибках. Он также может изменить способ запуска вашего сценария с помощью блока catch try.
  • Отчет об ошибках определяет, какая информация будет сообщаться с помощью данного сценария.

Чтобы правильно обрабатывать ошибки, я думаю, что 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'); } ?>