Confusion PDO-only проблема: невозможно подключиться через сокет /Access denied/не удается подключиться к серверу (общий хост)
Итак, проблема изменилась с того, что было, я оставлю исходный вопрос ниже, чтобы предотвратить плохие отзывы о ответах, подобных мне, после того, как кто-то редактировал свой вопрос, на который я ответил:
Итак, я работаю над (действительно хромым) хостингом, на котором установлен PDO, но он не работает.
С параметрами по умолчанию
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
echo 'Connected to database';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
он выдает это сообщение:
SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
С помощью простого mysql_connect он работает.
И путь сокета кажется правильным (оба phpinfo и этот запрос:
show variables like 'socket';
подтверждения.
Localhost перенаправляет на 10.103.0.14 (эти данные поступают из mysql_get_host_info() и в phpMyAdmin)
В PDO, если я заменил localhost на 127.0.0.1, я получу
SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111)
И если я заменил localhost на 10.103.0.14:
Access denied for user 'USER_NAME'@'10.103.0.14' (using password: YES
Оба IP-адреса (127.0.0.1 и 10.103.0.14) работают с mysql_connect.
По-видимому, проблема связана с подключением PDO.
Кто-нибудь знает, откуда это может произойти, и/или каким-либо образом его исправить?
Некоторые серверные данные:
Версия PHP: 5.2.10
Вы можете увидеть сервер phpinfo: http://web.lerelaisinternet.com/abcd.php?v=5
Возможна командная строка.
(я знаю, что это должна быть работа над технической поддержкой, но они медленны).
Спасибо
Предыдущий вопрос:
Как найти mysql.sock на общем хосте (сложный способ...)
Итак, проблема сегодня: соединение PDO не работает на общем хосте, и оно должно (оно установлено на сервере).
Просто базовое соединение PDO:
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
echo 'Connected to database';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
выдает это сообщение:
SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Регулярное соединение mysql:
mysql_connect("localhost", "THE_USER", "THE_PWD") or die(mysql_error());
mysql_select_db("24DLJLRR1") or die(mysql_error());;
echo 'Connected to database <br/>';
отлично работает.
По-видимому, он не может найти .sock.
Я думаю, что указание правильного адреса должно работать, я пробовал некоторый "классический" путь mysql, который я нашел в Интернете, без успеха.
Phpinfo говорит, что он находится по этому адресу (/var/lib/mysql/mysql.sock)
(Версия PHP - 5.2.10)
Вы можете увидеть сервер phpinfo: http://web.lerelaisinternet.com/abcd.php?v=5
Итак, я пытаюсь выяснить, где, черт возьми, это!!!
Я попытался посмотреть в интерфейсе phpMyAdmin, но я не смог найти информацию, плюс кажется, что phpMyAdmin подключается к другому серверу (у него другой IP-адрес, и попытка подключиться к нему с помощью php дает "Неверный пароль", ошибка). Mysql_connect также подключается к этому адресу, я думаю, что он перенаправляет на другой сервер с некоторым внутренним паролем/логином.
Хорошо, если у вас есть представление о том, как получить эту информацию (техническая поддержка поставщика "устраняет проблему"... это был 1 месяц...).
Также, возможно, проблема возникает откуда-то еще, но тот же самый материал работает на других общих хостах...
Необходимость PDO заключается в том, что я использую структуру Symfony с Doctrine для этого веб-сайта, а плагин Doctrine нуждается в PDO... Я не хочу переделывать сайт с нуля!
Спасибо за вашу помощь!
Ответы
Ответ 1
Через год я нашел решение этой проблемы: используя базу данных SQLite. PDO работал нормально, но не с MySQL
** ИЗМЕНИТЬ **, поскольку все это уменьшают это: это решило мою проблему (я OP). Я использовал Doctrine, поэтому переключать RDBMS было легко и быстро. Также на веб-сайте был какой-то домашний CMS, с очень небольшим количеством трафиков, поэтому SQLite был в порядке.
Я знаю, что это не настоящий "Ответ" на проблему, но если кто-то находится в том же контексте: crappy shared hosting, который вы не можете изменить с помощью этой странной ошибки PDO-MySQL И использует доктрину. Это решение. Я могу удалить этот ответ, но если бы я подумал об этом во время OP, я бы сэкономил много времени.
Ответ 2
Это уже было отмечено как ответ, но не реально разрешено (без изменения баз данных).
Итак, на всякий случай кто-то вроде меня также испытывает эту проблему...
Самый простой способ исправить это - сначала получить путь сокета (либо посмотреть в файле php.ini, либо с помощью: phpmyadmin или консоли (или создать его в mysql или mysqli)
... для запуска следующего запроса (ничего, кроме PDO):
show variables like 'socket'; //as mentioned by symcbean
THEN, в строке подключения PDO измените его на использование сокета вместо имени хоста:
$dbc = new PDO ( "MySQL: UNIX_SOCKET =/вар/запустить/туздЫ/mysqld.sock; имя_бд = $DBName", $Пользователь, $Пароль, массив (PDO:: ATTR_PERSISTENT = > true));//с помощью постоянные соединения
Это сработало для меня.
Ответ 3
FWIW, у меня была эта проблема и я изменил свой хост с 'localhost' на '127.0.0.1'.
Я не знаю, почему localhost не работал, но это сделало трюк.
Невероятно, у нас есть множество серверов, и он работает почти на каждом, используя "localhost"
Ответ 4
Поддерживается ли ваш сервер с включенным SeLinux (принудительным)? Если это так, попробуйте запустить root:
# setsebool -P httpd_can_network_connect on
Ответ 5
Можете ли вы попробовать 127.0.0.1
в качестве имени сервера вместо localhost
?
IIRC, с некоторыми драйверами/адаптерами mySQL, это определяет, используется ли сокет для установления соединения или нет.
Ответ 6
Используя соединение, которое работает, запустите запрос:
show variables like 'socket';
(это ведет себя как оператор select)... и вы получите путь к запущенному сокету.
Затем проверьте права доступа к файлам.
Ответ 7
У меня возникла проблема в том, что производственная версия работает нормально, и тестовая версия не смогла подключить PDO:/
обе версии были расположены на тех же серверах, тест в подкаталоге.
Исправление было заменено в DSN на localhost для ip.
'mysql:host=localhost;dbname=db'
стал
'mysql:host=127.0.0.1;dbname=db'
Ответ 8
попробовать:
exec('`which mysql_config` --socket');
это должно показать настроенный сокет.
Ответ 9
Я нашел причину странного поведения. Если адрес привязки отличается от 127.0.0.1 или 0.0.0.0 (все адреса), PDO не может подключиться к 127.0.0.1.
Ответ 10
Для чего это стоит, я нашел эту страницу, имея ту же самую проблему. Я на сервере, на котором запущены только Apache и PHP. MySQL установлен на другой машине. Я попробовал как DNS-имя сервера, так и его IP-адрес, и подтвердил, что могу его проверить. Приложение PHP на том же компьютере отлично работает с базой данных, используя старый синтаксис mysql_connect(). Но PDO из CLI выбрасывает эту ошибку.
Решение для меня состояло в проверке моего DSN. Любая опечатка в самом DSN игнорируется молча, и PDO предполагает, что вы имеете в виду localhost. Моя проблема заключалась в том, что у меня было "name=" вместо "dbname =" в DSN.
Ответ 11
Проблема В конфигурации Mysql Вам нужно отключить опцию skip-networking
в файле конфигурации my.conf это должно работать нормально
Справка
http://www.wolfcms.org/forum/post7098.html#p7098
Ответ 12
Я просто решил аналогичную проблему. Я предполагаю, что вы, вероятно, заменили ваш оператор mysql_connect() эквивалентом PDO. Не забывайте, что у вас все еще есть много другого кода, зависящего от этого старого оператора связи. Попробуйте сохранить mysql_connect во время записи в коде PDO.
Ответ 13
Что работало для меня, это указать номер порта, например:
MySQL: имя хоста; порт = 3306; имя_бд = имя_бд;
Это заставило его работать при подключении к локальной базе данных. Теперь я работаю над тем, чтобы он работал с удаленным db.
Ответ 14
Моя проблема может отличаться от OP, но я думал, что это стоит публикации. Я выполнил обновление программного обеспечения на виртуальной машине, затем перезагрузился и получил сообщение об ошибке OP. Оказалось, что проблема с памятью не позволяет mysql запускаться. При удалении нескольких больших файлов проблема исчезла.