Я получаю эту ошибку, когда пытаюсь подключиться к базе данных 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
он правильно отобразит этих двух пользователей.
Я провел некоторое исследование и использовал этот тест: https://stackoverflow.com/a/2183134/1839439, чтобы узнать, к чему он подключается. Как оказалось, он может подключаться только к 127.0.0.1
и 127.0.0.1:3306
который является localhost, однако, когда я поставляю localhost
он выдает эту ошибку.
Мой вопрос в том, почему это только позволяет мне подключаться к БД, используя адрес localhost ip, а не имя или внешний ip. Нужен ли мне другой хост, если я хочу использовать mysql на веб-сайте или я могу использовать 127.0.0.1
?
РЕДАКТИРОВАТЬ:
файл 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
| kamil | 109.255.177.28 | | kamil | localhost |
Когда вы используете только «localhost», клиентская библиотека MySQL пытается использовать сокет домена Unix для подключения вместо соединения TCP / IP. Ошибка сообщает вам, что сокет, называемый MySQL
, не может быть использован для соединения, вероятно, потому, что он не существует (номер ошибки 2).
Из документации MySQL :
В Unix программы MySQL обрабатывают имя хоста localhost специально таким образом, который, вероятно, отличается от ожидаемого по сравнению с другими сетевыми программами. Для соединений с localhost программы MySQL пытаются подключиться к локальному серверу с помощью файла сокета Unix. Это происходит, даже если задана опция -port или -P для указания номера порта. Чтобы клиент установил TCP / IP-соединение с локальным сервером, используйте -host или -h, чтобы указать значение имени узла 127.0.0.1 или IP-адрес или имя локального сервера. Вы также можете указать протокол подключения явно, даже для localhost, с помощью опции –protocol = TCP.
Есть несколько способов решить эту проблему.
127.0.0.1
вместо localhost
при подключении. Однако сокет Unix может быть быстрее и безопаснее. php.ini
: откройте файл конфигурации MySQL my.cnf
чтобы найти, где MySQL создает сокет, и задайте mysqli.default_socket
PHP этому пути. В моей системе это /var/run/mysqld/mysqld.sock
. Настройте сокет непосредственно в скрипте PHP при открытии соединения. Например:
$db = new MySQLi('localhost', 'kamil', '***', '', 0, '/var/run/mysqld/mysqld.sock')
Если это проблема с 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
Если «localhost» не работает, а 127.0.0.1. Убедитесь, что ваш локальный файл hosts указывает на правильное местоположение. (/ etc / hosts для linux / mac, C: \ system32 \ drivers \ etc \ hosts для Windows).
Кроме того, убедитесь, что вашему пользователю разрешено подключаться к любой базе данных, которую вы пытаетесь выбрать.
Проверьте следующий файл
%SystemRoot%\system32\drivers\etc\host
Строка, которая связывает имя хоста с ip, вероятно, отсутствует строка, которая связывает их togather
127.0.0.1 localhost
Если данная строка отсутствует. Добавить строку в файл
Не могли бы вы также проверить свою пользовательскую таблицу базы данных MySQL и сообщить нам значение столбца хоста для пользователя, который вы используете. У вас должна быть привилегия пользователя как для хоста «127.0.0.1», так и для «localhost» и использовать%, поскольку он является диким символом для общего имени хоста.
[RESOLVED]: Решение, которое мы интегрировали, мы увеличили пространство на сервере, и оно было разрешено.
Не знаю точную причину, но мы это разрешаем.