Ошибка при загрузке базы php

Правильная обработка ошибок позволяет сделать стабильное приложение, которое не будет завершаться неожиданно. В случае возникновения непредвиденной ситуации программа должна выдавать вменяемый ответ, почему она не хочет исполнится. И создание правильного механизма обработки ошибок — это задача программиста.

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

Ошибка соединения с базой данных

Сразу приведём пример обработки ошибки с соединением с базой данных:

<?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 руб

  1. 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 %
  1. 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
  • 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
  • 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

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Понравилась статья? Поделить с друзьями:
  • Ошибка при диагностике неполадок сетей
  • Ошибка при диагностике замершей беременности
  • Ошибка при диагностике внематочной беременности
  • Ошибка при диагностике вич инфекции
  • Ошибка при дефрагментации жесткого диска