Правильная обработка ошибок позволяет сделать стабильное приложение, которое не будет завершаться неожиданно. В случае возникновения непредвиденной ситуации программа должна выдавать вменяемый ответ, почему она не хочет исполнится. И создание правильного механизма обработки ошибок — это задача программиста.
В этой статье рассмотрим два вида ошибок, которые могут возникнуть при программировании взаимодействия с базой данных. Первый тип — это ошибка подключения к базе данных. Второй тип — это ошибка выполнения запроса к базе данных. Для обработки этих ошибок будем использовать специальные функции для работы с базой.
Ошибка соединения с базой данных
Сразу приведём пример обработки ошибки с соединением с базой данных:
<?php
$host = 'localhost'; // адрес сервера
$db_name = 'database'; // имя базы данных
$user = 'user'; // имя пользователя
$password = 'password'; // пароль
// создание подключения к базе
$connection = mysqli_connect($host, $user, $password, $db_name);
// проверка правильности подключения
if(!$connection){ // при соединении с базой данных возникла ошибка
echo 'Ошибка соединения: ' . mysqli_connect_error() . '<br>';
echo 'Код ошибки: ' . mysqli_connect_errno();
}else{ // соединение было установлено успешно
// здесь можно делать запрос к базе,
// потому что соединение успешно установлено
}
?>
В этом примере можно заметить функцию mysqli_connect_error. Она выводит текстовое описание ошибки подключения (на английском языке). В отличии от неё функция mysqli_connect_errno выводит числовой код ошибки, к примеру «1045».
Ошибка запроса к базе
Теперь попробуем доработать пример из предыдущего параграфа и добавить запрос к базе данных. Не будем вдаваться в детали, что будет записано в тексте SQL запроса, просто предположим, что он может завершиться ошибкой. К примеру, из-за неожиданного отключения сервера с базой данных от сети. В примере добавим проверку на наличие ошибок при выполнении запроса:
<?php
$host = 'localhost'; // адрес сервера
$db_name = 'database'; // имя базы данных
$user = 'user'; // имя пользователя
$password = 'password'; // пароль
// создание подключения к базе
$connection = mysqli_connect($host, $user, $password, $db_name);
if(!$connection){ // проверка правильности подключения
echo 'Ошибка соединения: ' . mysqli_connect_error() . '<br>';
echo 'Код ошибки: ' . mysqli_connect_errno();
}else{ // подключение успешно установлено
// текст SQL запроса, который будет передан базе
$query = 'SELECT * FROM `USERS`';
// выполняем запрос к базе данных
$result = mysqli_query($connection, $query);
if(!$result){ // запрос завершился ошибкой
echo 'Ошибка запроса: ' . mysqli_error($connection) . '<br>';
echo 'Код ошибки: ' . mysqli_errno($connection);
}else{ // запрос успешно выполнился
while($row = $result->fetch_assoc()){
// обрабатываем полученные данные
}
}
// закрываем соединение с базой
mysqli_close($connection);
}
?>
В этом примере есть две функции, которые работают с ошибками базы. Функция mysqli_error возвращает описание ошибки запроса (на английском языке), а функция mysqli_errno возвращает числовой код ошибки, к примеру, «1193».
Обратите внимание, что все функции обработки ошибок в этой статье (mysqli_connect_error, mysqli_connect_errno, mysqli_error, mysqli_errno) возвращают информацию только о последней ошибке. Но ошибок может быть несколько.
Была ли эта статья полезна?
Есть вопрос?
Закажите недорогой хостинг
Заказать
всего от 290 руб
- Be sure that you have configured PHP with the MySQL extensions. On MacPorts, you need to install it separately:
me@lastdance Sites % sudo port search php | grep mysql
php-mysql-xdevapi @8.0.17 (php, devel)
php52-mysql @5.2.17 (php, databases)
a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
php53-mysql @5.3.29 (php, databases)
a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
php54-mysql @5.4.45 (php, databases)
a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
php55-mysql @5.5.38 (php, databases)
a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
php56-mysql @5.6.40 (php, databases)
a PHP interface to MySQL databases, including the mysql, mysqli and pdo_mysql extensions
php70-mysql @7.0.33 (php, databases)
a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
php71-mysql @7.1.32 (php, databases)
a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
php71-mysql-xdevapi @8.0.17 (php, devel)
php72-mysql @7.2.23 (php, databases)
a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
php72-mysql-xdevapi @8.0.17 (php, devel)
php73-mysql @7.3.10 (php, databases)
a PHP interface to MySQL databases, including the mysqli and pdo_mysql extensions
php73-mysql-xdevapi @8.0.17 (php, devel)
me@lastdance Sites % sudo port install php73-mysql
---> Computing dependencies for php73-mysql
---> Cleaning php73-mysql
---> Scanning binaries for linking errors
---> No broken files found.
---> No broken ports found.
me@lastdance Sites %
- Be sure that your localhost mysql socket is correctly specified in your php.ini file. See My database user exists, but I still get an (HY000/2002): No such file or directory
On my system, I had to edit the file /opt/local/etc/php73/php.ini
and add this:
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysqli.default-socket
mysqli.default_socket = /opt/local/var/run/mysql8/mysqld.sock
Файл db.php содержит ошибку или ошибки. Необходимо подключиться к базе. Необходимо это подключение для того, чтобы в итоге пользователь мог бы воспользоваться поиском, а так как база к базе не получается подключиться, то это становиться проблематично.
Существует код подключения:
<?php
$db_name = 'infoin';
$db_host = 'localhost';
$db_user = 'admin';
$db_password = '123456';
$link = mysqli_connect($db_host,$db_user,$db_password,$db_name);
mysqli_select_db($db_name,$link) or die("Нет соединения с БД " .mysqli_error());
mysqli_query("SET names cp1251");
class db {
function PDO__construct()
{
global $dbh;
if (!is_null($dbh)) return;
$dbh = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysqli_select_db(DB_NAME);
mysqli_query('SET NAMES utf8');
}
function select_list($query)
{
$q = mysqli_query($query);
if (!$q) return null;
$ret = array();
while ($row = mysqli_fetch_array($q, MYSQL_ASSOC)) {
array_push($ret, $row);
}
mysqli_free_result($q);
return $ret;
}
}
?>
Я уже один из подсказок нашел, оказалось, что mysqli необходимо, я в документация подсмотрел. Однако ошибка не пропадает. Так как код считает сверху вниз, то ошибок может ещё тут есть. Вот и получается, что выводит две ошибки. Не знаю наверно что-то фундаментально поменять или подход, а может просто какое-то небольшое исправление… Если ещё есть какие-то ошибки ниже mysqli_select_db() и mysqli_error(), тоже было хорошо чтобы нашлись, а то база никак не подключается(((.
Вот эти ошибки выводит:
Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in D:OSPaneldomainsdevitera.comincludedb.php on line 9
Warning: mysqli_error() expects exactly 1 parameter, 0 given in D:OSPaneldomainsdevitera.comincludedb.php on line 9
Нет соединения с БД
Чтобы узнать, почему не работает соединение или запрос, надо настроить РНР так чтобы он отображал ошибки, а mydsqli — чтобы оно бросало исключения.
То есть код должен выглядеть вот так
<?php
// видеть все ошибки!
ini_set('display_errors',1);
error_reporting(E_ALL);
// подключаем настройки
require_once 'connect.php';
// включаем режим информирования об ошибках
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// подключаемся к серверу
$link = mysqli_connect($host, $user, $password, $database);
// не забываем установить кодировку, чтобы не было ошибок с кракозябрами
$mysqli->set_charset('utf8mb4');
// выполняем операции с базой данных
$query ="SELECT * FROM foo";
$result = mysqli_query($link, $query);
// дальше делаем что нужно
// и кстати, в большинстве случаев закрывать подключение не надо
ЗЫ. На боевом сервере ошибки на экран выводить конечно не стоит, а их надо писать в лог (собственно, именно поэтому все эти die — это ужас). И на боевом сервере display_errors надо отключать, а log_errors наоборот — подключать.
Если совсем не можешь найти, где у сервера висит лог ошибок, можешь задать свой собственный, с помощью функции ini_set('error_log','/путь/к/файлу');
. Но только размещать его надо разумеется в папке недоступной пользователям сайта
Если же говорить о конкретно этой проблеме, то это очень забавная ошибка, в которой смешалась куча старого карго культ кода, который и сам по себе использовать не стоит, и вдобавок он здесь написан неправильно.
Если разобраться, то код or die("Ошибка1 " . mysqli_error($link));
очень смешной (это не к тебе претензия, никто не ожидает от тебя понимания таких тонкостей, которые не то что новички, а половина здешних «кураторов» не понимают).
Что тут происходит?
слово or die (которое на самом деле вообще нельзя никогда писать) пишут тогда, когда ожидают что в переменной $link будет значение false. Но если в $link будет false, то тогда её бессмысленно подставлять в mysqli_error. Именно поэтому для получения ошибки соединения в мускули есть отдельная специальная функция.
Но как я говорил выше, применять её не следует, как и or die.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Активные темы Темы без ответов
Ошибка при загрузке базы данных
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 2018-12-10 10:04:27 (изменено: Alexx25, 2018-12-10 10:06:21)
- Alexx25
- Редкий гость
- Неактивен
- Зарегистрирован: 2018-12-10
- Сообщений: 3
Тема: Ошибка при загрузке базы данных
Всем привет! Возникает такая ошибка:
> Статический анализ:
>
> Найдено 2 ошибок при анализе.
>
> Неожиданное начало выражения. (near «phpMyAdmin» at position 0)
> Неизвестный оператор. (near «SQL» at position 11)
> SQL запрос:
>
> phpMyAdmin SQL Dump — version 4.2.10.1 — http://www.phpmyadmin.net — — Хост: localhost — Время создания: Янв 20 2015 г., 15:27 — Версия сервера: 5.5.40-0+wheezy1 — Версия PHP: 5.4.4-14+deb7u9 SET SQL_MODE = «NO_AUTO_VALUE_ON_ZERO»
>
> Ответ MySQL: Документация
>
> #1064 — У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около ‘phpMyAdmin SQL Dump
> — version 4.2.10.1
> — http://www.phpmyadmin.net
> —
> — Хо’ на строке 1
Заранее благодарю за ответ!
2 Ответ от Hanut 2018-12-10 11:16:46
- Hanut
- Модератор
- Неактивен
- Откуда: Рига, Латвия
- Зарегистрирован: 2006-07-02
- Сообщений: 9,726
Re: Ошибка при загрузке базы данных
Откройте дам в Notepad++ и посмотрите наличие комментария (два дефиса) перед первой строкой.
3 Ответ от Alexx25 2018-12-10 11:33:42
- Alexx25
- Редкий гость
- Неактивен
- Зарегистрирован: 2018-12-10
- Сообщений: 3
Re: Ошибка при загрузке базы данных
Hanut сказал:
Откройте дам в Notepad++ и посмотрите наличие комментария (два дефиса) перед первой строкой.
— phpMyAdmin SQL Dump
— version 4.2.10.1
— http://www.phpmyadmin.net
—
— Хост: localhost
— Время создания: Янв 20 2015 г., 15:27
— Версия сервера: 5.5.40-0+wheezy1
— Версия PHP: 5.4.4-14+deb7u9
4 Ответ от Hanut 2018-12-10 11:55:32
- Hanut
- Модератор
- Неактивен
- Откуда: Рига, Латвия
- Зарегистрирован: 2006-07-02
- Сообщений: 9,726
Re: Ошибка при загрузке базы данных
Попробуйте в Notepad++ проверить наличие BOM байта при сохранении файла и сохраните файл без него.
5 Ответ от Alexx25 2018-12-10 12:07:29
- Alexx25
- Редкий гость
- Неактивен
- Зарегистрирован: 2018-12-10
- Сообщений: 3
Re: Ошибка при загрузке базы данных
Hanut сказал:
Попробуйте в Notepad++ проверить наличие BOM байта при сохранении файла и сохраните файл без него.
Спс) получилось)
Сообщения 5
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться