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 … Я не хочу переделывать сайт с нуля!

Спасибо за вашу помощь !

Это уже было отмечено как ответ, но не реально разрешено (без изменения баз данных). Итак, на всякий случай кто-то вроде меня тоже испытывает эту проблему …

Самый простой способ исправить это – сначала получить путь сокета (либо посмотреть в файле php.ini, либо с помощью: phpmyadmin или консоли (или создать его в mysql или mysqli)

… для запуска следующего запроса (ничего, кроме PDO):

 show variables like 'socket'; //as mentioned by symcbean 

Затем, в строке подключения PDO, измените ее на использование сокета вместо имени хоста:

$ dbc = new PDO («mysql: unix_socket = / var / run / mysqld / mysqld.sock; dbname = $ DBName», $ User, $ Password, array (PDO :: ATTR_PERSISTENT => true)); // использование постоянных соединений

Это сработало для меня.

FWIW, у меня была эта проблема и я изменил свой хост с «localhost» на «127.0.0.1».

Я понятия не имею, почему локальный хост не работает, но это сделало трюк.

Странно, у нас есть множество серверов, и он работает практически на всех, используя «localhost»,

Поддерживается ли ваш сервер с включенным SeLinux (принудительным)? Если это так, попробуйте запустить root:

 # setsebool -P httpd_can_network_connect on 

Можете ли вы попробовать 127.0.0.1 качестве имени сервера вместо localhost ?

IIRC, с некоторыми драйверами / адаптерами mySQL, это определяет, используется ли сокет для установления соединения или нет.

Используя соединение, которое работает, запустите запрос:

 show variables like 'socket'; 

(это ведет себя как оператор select) … и вы получите путь к запущенному сокету.

Затем проверьте права доступа к файлам.

У меня возникла проблема в том, что производственная версия работает нормально, а тестовая версия не смогла подключить PDO: / обе версии были расположены на одинаковых серверах, протестировать в подкаталоге.

Исправление было заменено в DSN на localhost для ip.

 'mysql:host=localhost;dbname=db' 

стал

 'mysql:host=127.0.0.1;dbname=db' 

пытаться:

 exec('`which mysql_config` --socket'); 

это должно показать вам сконфигурированный сокет.

Я нашел причину странного поведения. Если адрес привязки отличается от 127.0.0.1 или 0.0.0.0 (все адреса), PDO не может подключиться к 127.0.0.1.

Для чего это стоит, я нашел эту страницу, имея ту же самую проблему. Я на сервере, на котором запущен только Apache и PHP. MySQL установлен на другой машине. Я попробовал как DNS-имя сервера, так и его IP-адрес, и подтвердил, что могу его проверить. Приложение PHP на том же компьютере отлично работает с базой данных, используя старый синтаксис mysql_connect (). Но PDO из CLI выбрасывает эту ошибку.

Решением для меня было проверить мой DSN. Любая опечатка в самом DSN игнорируется молча, и PDO предполагает, что вы имеете в виду localhost . Моя проблема заключалась в том, что у меня было имя «name =» вместо «dbname =» в DSN.

Проблема В конфигурации Mysql Вам необходимо отключить опцию skip-networking в файле конфигурации my.conf, это должно работать с хорошей ссылкой http://www.wolfcms.org/forum/post7098.html#p7098

Я просто решил аналогичную проблему. Я предполагаю, что вы, вероятно, заменили ваш оператор mysql_connect () эквивалентом PDO. Не забывайте, что у вас все еще есть много другого кода, зависящего от этого старого оператора связи. Попробуйте сохранить mysql_connect во время записи в PDO-коде.

То, что сработало для меня, – это указать номер порта следующим образом:

MySQL: имя хоста; порт = 3306; имя_бд = имя_бд;

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

Моя проблема может отличаться от OP, но я думал, что это стоит публикации. Я выполнил обновление программного обеспечения на виртуальной машине, затем перезагрузился и получил сообщение об ошибке OP. Оказалось, что проблема с памятью не позволяет mysql запускаться. При удалении нескольких больших файлов проблема исчезла.

Через год я нашел решение для этой проблемы: используя базу данных SQLite. PDO работал нормально, но не с MySQL

** РЕДАКТИРОВАТЬ **, поскольку все это уменьшает это: это решило мою проблему (я OP). Я использовал Doctrine, поэтому переключать RDBMS было легко и быстро. Также на веб-сайте был какой-то домашний CMS, с очень небольшим количеством трафиков, поэтому SQLite был в порядке.

Я знаю, что это не настоящий «Ответ» на проблему, но если кто-то находится в том же контексте: дерьмовый общий хостинг, который вы не можете изменить с помощью этой странной ошибки PDO-MySQL И использует доктрину. Это решение. Я могу удалить этот ответ, но если бы я подумал об этом во время OP, я бы сэкономил много времени.