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 запускаться. При удалении нескольких больших файлов проблема исчезла.