Подтвердить что ты не робот

Mysqli:: mysqli(): (HY000/2002): Не удается подключиться к локальному серверу MySQL через сокет "MySQL" (2)

Я получаю эту ошибку, когда пытаюсь подключиться к базе данных mysql, используя php mysqli class. Используя следующий код:

$db = new MySQLi("localhost","kamil","*****");
if (mysqli_connect_errno())
{
    echo "An error occured. Please try again later.";
    exit();
}

пароль * для обеспечения безопасности.

Я создал пользователя kamil со всеми привилегиями на внешний IP-адрес и localhost. Когда я запускаю: select user,host from mysql.user он правильно отображает этих двух пользователей.

Я провел некоторое исследование и использовал этот тест: qaru.site/info/131950/..., чтобы узнать, к чему он подключается. Как оказалось, он может подключаться только к 127.0.0.1 и 127.0.0.1:3306, который является localhost, однако при поставке localhost он выдает эту ошибку.

Мой вопрос в том, почему это только позволяет мне подключиться к БД, используя адрес localhost ip, а не имя или внешний ip. Нужен ли мне другой хост, если я хочу использовать mysql на веб-сайте, или если я могу использовать 127.0.0.1?

EDIT:
hosts файл

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi


Результаты поиска пользователя Mysql для этого пользователя:
| kamil            | 109.255.177.28 |
| kamil            | localhost      |
4b9b3361

Ответ 1

Когда вы используете только "localhost", клиентская библиотека MySQL пытается использовать сокет домена Unix для подключения вместо соединения TCP/IP. Ошибка сообщает вам, что сокет, называемый MySQL, не может использоваться для соединения, вероятно, потому, что он не существует (номер ошибки 2).

Из Документация MySQL:

В Unix программы MySQL обрабатывают имя хоста localhost специально, в путь, который, вероятно, отличается от того, что вы ожидаете, по сравнению с другими сетевые программы. Для соединений с локальным хостом, программы MySQL попытайтесь подключиться к локальному серверу с помощью файла сокета Unix. Это происходит, даже если параметр -port или -P задан для указания порта номер. Чтобы клиент выполнял TCP/IP-соединение с локальный сервер, используйте -host или -h, чтобы указать значение имени узла 127.0.0.1, или IP-адрес или имя локального сервера. Вы также можете указать протокол подключения явно, даже для localhost, используя опцию --protocol = TCP.

Есть несколько способов решить эту проблему.

  • Вы можете просто использовать TCP/IP вместо Unix-сокета. Вы должны сделать это, используя 127.0.0.1 вместо localhost при подключении. Однако сокет Unix может быть быстрее и безопаснее.
  • Вы можете изменить сокет в php.ini: откройте файл конфигурации MySQL my.cnf, чтобы найти, где MySQL создает сокет, и установите PHP mysqli.default_socket на этот путь. В моей системе это /var/run/mysqld/mysqld.sock.
  • Настройте сокет непосредственно в PHP script при открытии соединения. Например:

    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                                  '/var/run/mysqld/mysqld.sock')
    

Ответ 2

Если это проблема с PHP, вы можете просто изменить конфигурационный файл php.ini везде, где он находится, и обновить настройки для PORT/SOCKET-PATH и т.д., чтобы подключиться к серверу.

В моем случае я открыл файл php.ini и сделал

mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock

И это сработало сразу. Должен признаться, я принял намек на принятый ответ @Joni

Ответ 3

Если "localhost" не работает, но 127.0.0.1. Убедитесь, что ваш локальный файл hosts указывает на правильное местоположение. (/etc/hosts для linux/mac, C:\system32\drivers\etc\hosts для Windows).

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

Ответ 4

Пожалуйста, проверьте следующий файл

%SystemRoot%\system32\drivers\etc\host

Строка, которая связывает имя хоста с ip, вероятно, отсутствует строка, которая связывает их togather

127.0.0.1  localhost

Если данная строка отсутствует. Добавьте строку в файл


Не могли бы вы также проверить свою таблицу пользователей базы данных MySQL и сообщить нам значение столбца хоста для пользователя, который вы используете. У вас должна быть привилегия пользователя как для хоста "127.0.0.1", так и для "localhost" и использовать%, так как это дикое char для общего имени хоста.

Ответ 5

[RESOLVED]: Решение, которое мы интегрировали, мы увеличили пространство на сервере, и оно было разрешено.

Не знаю точную причину, но это позволяет нам решить проблему.