Поэтому проблема изменилась с того, что было, я оставлю исходный вопрос ниже, чтобы предотвратить плохие отзывы о ответах, подобных мне, после того, как кто-то отредактировал его вопрос, на который я ответил:
Поэтому я работаю над (действительно хромым) общим хостингом, в котором установлен 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 Нет командной строки. (я знаю, что это должна быть работа технического надзора, но они медленны)
благодаря
Предыдущий вопрос:
Таким образом, сегодня проблема заключается в следующем: соединение 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, я бы сэкономил много времени.