@ArthurTereshkov

Почему php не может подключиться к БД?

Изучаю связку php и mysql.
Есть файл index.php:
<?php
require_once 'connect.php'; // подключаем скрипт

// подключаемся к серверу
$link = mysqli_connect($host, $user, $password, $database)
    or die("Ошибка1 " . mysqli_error($link));
// выполняем операции с базой данных
     $query ="SELECT * FROM foo";
     $result = mysqli_query($link, $query) or die("Ошибка2 " . mysqli_error($link));
     if($result)
{
    echo "Выполнение запроса прошло успешно";
}
// закрываем подключение
mysqli_close($link);
?>

В connect.php:
<?php
$host = '127.0.0.1'; // адрес сервера
$database = 'dbname'; // имя базы данных
$user = 'root'; // имя пользователя
$password = 'pass'; // пароль
?>

Но при попытке выполнить файл index.php вадается "Ошибка1", т.е. на сколько я понял соединение php не может установить с БД соединение.
В httpd логах я вижу следующую информацию:
192.168.1.9 - - [24/Jan/2021:04:17:00 -0000] "GET /index.php HTTP/1.1" 200 14 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"
192.168.1.9 - - [24/Jan/2021:04:17:00 -0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://192.168.1.3/index.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"

При этом локально я подключиться к mysql могу
# mysql -h127.0.0.1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.21 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

# php -v
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies


Логи php и mysql я найти не смог.
  • Вопрос задан
  • 3024 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Чтобы узнать, почему не работает соединение или запрос, надо настроить РНР так чтобы он отображал ошибки, а 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.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ошибки соединения надо получать функцией mysqli_connect_error()
Ответ написан
@accou
У меня тоже редко к бд подключиться удается,на первый взгляд все просто а на самом деле практически не возможно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы