Есть ли какой-нибудь способ перехватить ошибки MySQL и базы данных в PHP?

#php #mysql #error-handling #mysql-error-1045

#php #mysql #обработка ошибок #mysql-ошибка-1045

Вопрос:

Иногда я получаю ошибку базы данных типа

Предупреждение: mysql_connect() [function.mysql-connect]: доступ запрещен для пользователя ‘test’ @’101.190.193.83′ (с использованием пароля: ДА)

Не удалось подключиться: доступ запрещен для пользователя ‘test’ @’101.190.193.83′ (используя пароль: ДА) «

Но на самом деле пароль не изменился.

Есть ли какой-нибудь способ записать эту ошибку в файл журнала и отобразить на экране какое-нибудь приятное сообщение, например «Ошибка сервера. Пожалуйста, попробуйте еще раз как-нибудь.»

Комментарии:

1. На самом деле я работаю над проектом с открытым исходным кодом, чтобы перехватывать ошибки, отображать приятное сообщение на экране и регистрировать их с гораздо большим количеством информации, чем предоставляет стандартный журнал ошибок. jarofgreen.co.uk/2011/01/tracking-errors-with-php или elastik.sf.net

Ответ №1:

Если вы не хотите, чтобы PHP отображал предупреждение, вы должны использовать оператор «@»

 $connect = @mysql_connect(HOST, USER, PASS);//won't display the warning if any.
if (!$connect) { echo 'Server error. Please try again sometime. CON'; }
  

Вы также можете рассмотреть возможность установки для display_errors значения 0 в вашем php.ini файле в рабочей среде

Вы также можете рассмотреть PDO для подключения к MySQL, он использует исключения по умолчанию для сообщения об ошибках,

 try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Could not connect : ' . $e->getMessage();
}
  

Ответ №2:

 <?php
    $connect = mysql_connect(HOST, USER, PASS);
    if(!$connect) { echo 'Server error. Please try again sometime. CON'; }

    $select_db = mysql_select_db(DATABASE);
    if(!$select_db) { echo 'Server error. Please try again sometime. DB'; }
?>
  

Комментарии:

1. Форматирование отсутствует, по-видимому, stackoverflow его не распознает .. pastebin.com/EFefnNSp

2. Я исправил это за вас. Чтобы получить форматирование кода, поставьте 4 пробела (или 1 табуляцию) перед вашим кодом. Вы можете сделать это легко, выделив текст и нажав CTRL K.

Ответ №3:

Есть ли какой-либо способ зафиксировать эти ошибки в файле журнала …?

ДА. Все ошибки PHP и предупреждения записываются в файл журнала ошибок веб-сервера, поэтому вам больше ничего не нужно делать — это уже делается.

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

  1. Используйте @ символ перед вызовом вашей функции — ie $db = @mysql_connect(...); . Это отключит сообщение об ошибках только для этого конкретного вызова функции. Обычно считается плохой идеей чрезмерно использовать этот метод, но иногда это вполне допустимо.

  2. Лучшим вариантом может быть отключение флага глобального сообщения об ошибках либо в вашем PHP.ini , либо в вашем локальном .htaccess файле, либо с помощью ini_set() внутри программы.

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

Для ошибок MySQL, таких как та, с которой вы столкнулись, вы все равно можете получить доступ к самой ошибке в программе с помощью mysql_error() функции. Это будет содержать подробную информацию о последней возникшей ошибке, чтобы вы могли программно проверить ее и сообщить о разумном сообщении об ошибке.

Ответ №4:

Источник: http://wallstreetdeveloper.com/php-database-connection /

Вот пример кода для подключения к базе данных в php:

 <?php
//Step-1 : Create a database connection
$connection=mysql_connect(“localhost”,”root”,”root”);
if(!$connection) {
    die(“Database Connection error” . mysql_error());
}
//Step-2 : Select a database to use
$db=mysql_select_db(“widget_corp”,$connection);
if(!$db) {
    die(“Database Selection error” . mysql_error());
}
?>
<html>
<head>
<title>Database</title>
</head>
<body>
<?php
 //Step 3 : Perform database Queury
 $result=mysql_query(“select * from subjects”,$connection);
if(!$result) {
    die(“No rows Fetch” . mysql_error());
}

//Step 4 : Use returned data
while($row=mysql_fetch_array($result))
{
     //echo $row[1].” “.$row[2].”<br>”;
    echo $row["menu_name"].” “.$row["position"].”<br>”;
}

?>
</body>
</html>
<?php
//Step 5 : Close Connection
mysql_close($connection);
?>
  

Ответ №5:

 try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// if your are not set this attributes you won't get any exceptions.
} catch (PDOException $e) {
    echo 'Server error. Please try again some time.';
}