Ошибка при подключении к MySQL с использованием PHP/PDO
Вопрос
Вчера мой код работал нормально, а сегодня он внезапно просто не хочет подключаться к моей базе данных.Я не менял никаких настроек ни в нем, ни в коде, а также не обновлял программное обеспечение.Все, что я делаю, это:
new PDO('mysql:host=localhost;port=3306;dbname=test', 'username', 'password');
И я получаю хорошее сообщение об исключении, в котором говорится следующее:
Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in ...
Дело в том, что:Я явно не пытаюсь подключиться с помощью сокета unix, а использую TCP/IP.Что я делаю не так?Есть ли что-то, что мне здесь не хватает?
Спасибо за любую помощь.
Решение
Вы используете сокет Unix. При чтении " localhost " Клиентские библиотеки MySQL не интерпретируют его как TCP-хост " localhost " и разрешите это имя, но используйте местоположение Socket по умолчанию. Для использования TCP на локальной машине вы должны использовать 127.0.0.1
в качестве имени хоста.
Чтобы указать прошлое, используйте unix_socket
вместо host
в DSN. Расположение сокета, используемого для localhost
, можно определить во время компиляции или в некоторых версиях PHP, используя pdo_mysql.default_socket
в php.ini
. р>
Другие советы
Из документации PHP о подключении к MySQL с использованием PDO: PDO_MYSQL DNS
В примечании в самом конце говорится:
Только Unix:
Когда имя хоста установлено на «Localhost», то соединение с сервером сделано через доменную розетку.Если PDO_MYSQL составлен против LibmySQL, то местоположение файла сокета находится в LibmySQL, составленном в месте.Если PDO_MYSQL скомпилирована против MySQLND, можно установить сокет по умолчанию через настройку PDO_MYSQL.DEFAUTL_SOCKET.
Итак, чтобы это исправить, вам нужно будет правильно настроить в php.ini расположение вашего mysql.sock.
Найдите свой файл mysql.sock.Общие локации:
- /tmp/mysql.sock
- /tmp/mysql/mysql.sock
- /var/mysql/mysql.sock
- или если вы используете MAMP или LAMP, найдите папку tmp для mysql.
Отредактируйте файл php.ini и правильно установите значение для pdo_mysql.default_socket.
Перезапустите сервер Apache, чтобы сохранить изменения в файле php.ini.
В Ubuntu вы можете использовать этот параметр в php.ini
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
Я только что добавил эту строку:
'unix_socket' => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock',
и все было хорошо.
Обновление документации для Drush документировано здесь .