混淆仅PDO问题:无法通过套接字连接/拒绝访问/无法连接到服务器(共享主机)

Jul*_*ien 16 php mysql sockets connection 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();
    }
?>
Run Code Online (Sandbox Code Playgroud)

它抛出这个消息:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Run Code Online (Sandbox Code Playgroud)

使用简单的mysql_connect,它可以工作.

套接字路径似乎是正确的(phpinfo和这个查询:

show variables like 'socket';
Run Code Online (Sandbox Code Playgroud)

确认.

Localhost重定向到10.103.0.14(此数据来自mysql_get_host_info()和phpMyAdmin)

在PDO中,如果我用127.0.0.1替换localhost,我会得到

SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111) 
Run Code Online (Sandbox Code Playgroud)

如果我用10.103.0.14替换localhost:

Access denied for user 'USER_NAME'@'10.103.0.14' (using password: YES
Run Code Online (Sandbox Code Playgroud)

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();
    }
?>
Run Code Online (Sandbox Code Playgroud)

抛出这条消息:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Run Code Online (Sandbox Code Playgroud)

一个常规的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/>';
Run Code Online (Sandbox Code Playgroud)

工作良好.

显然它找不到.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的需求是因为我在这个网站上使用了Sytrfony框架和Doctrine,而Doctrine插件需要PDO ......我不想从头开始重做网站!

谢谢你的帮助 !

小智 21

这已被标记为已回答,但尚未真正解决(无需更改数据库).所以,万一像我这样的人也会遇到这个问题......

解决此问题的最简单方法是首先获取套接字路径(通过查看php.ini文件或使用:phpmyadmin或控制台(或在mysql或mysqli中构建它)

...运行以下查询(除了PDO之外的任何内容):

show variables like 'socket';       //as mentioned by symcbean
Run Code Online (Sandbox Code Playgroud)

那么,在PDO连接字符串中,将其更改为使用套接字而不是主机名:

$ dbc = new PDO("mysql:unix_socket =/var/run/mysqld/mysqld.sock; dbname = $ DBName",$ User,$ Password,array(PDO :: ATTR_PERSISTENT => true)); //使用持久连接

这对我有用.


zmo*_*eca 15

FWIW,我有这个问题,并将我的主机从'localhost'改为'127.0.0.1'.

我不知道为什么localhost没有工作,但是这样做了.

奇怪的是,我们有大量的服务器,它几乎每一个都使用'localhost'


小智 7

您的服务器是否在启用SeLinux的情况下运行(强制执行)?如果是,请尝试以root身份运行:

# setsebool -P httpd_can_network_connect on
Run Code Online (Sandbox Code Playgroud)


Jul*_*ien -8

一年后,我找到了这个问题的解决方案:使用 SQLite 数据库。PDO 工作正常,但不适用于 MySQL

** 编辑 ** 因为每个人都对此表示反对:这解决了我的问题(我是OP)。我使用的是 Doctrine,因此切换 RDBMS 既简单又快捷。而且该网站是一些自制的 CMS,流量很少,所以 SQLite 就很好。

我知道这不是问题的真正“答案”,但如果有人处于相同的环境中:一个蹩脚的共享主机,你无法用这个奇怪的 PDO-MySQL 错误来改变它,并且正在使用学说。这是一个解决方案。我可以删除这个答案,但如果我在OP时就想到了这一点,我会节省很多时间。

  • 您对OP的解决方案是切换RDBMS?IMO 这不是一个解决方案。 (9认同)