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

时间:2010-01-26 11:11:54

标签: 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();
    }
?>

它抛出了这条消息:

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中,如果我用127.0.0.1替换localhost,我将获得

SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111) 

如果我用10.103.0.14替换localhost:

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

感谢您的帮助!

14 个答案:

答案 0 :(得分:21)

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

解决此问题的最简单方法是首先获取套接字路径(通过查看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 = $数据库名”,   $ User,$ Password,array(PDO :: ATTR_PERSISTENT =&gt; true)); //使用   持久连接

这对我有用。

答案 1 :(得分:15)

FWIW,我遇到了这个问题,并将我的主机从'localhost'更改为'127.0.0.1'。

我不知道为什么localhost没有工作,但这就行了。

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

答案 2 :(得分:7)

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

# setsebool -P httpd_can_network_connect on

答案 3 :(得分:4)

您可以尝试使用127.0.0.1作为服务器名称而不是localhost吗?

IIRC,有一些mySQL驱动程序/适配器,它决定套接字是否用于建立连接。

答案 4 :(得分:4)

使用有效的连接,运行查询:

show variables like 'socket';

(这就像select语句一样)......你将获得正在运行的套接字的路径。

然后检查文件权限。

答案 5 :(得分:4)

我遇到的问题是生产版本工作得很好而且测试版本无法连接PDO:/ 两个版本都位于相同的服务器上,在子目录中进行测试。

修复程序在DSN中替换了localhost for ip。

'mysql:host=localhost;dbname=db'

成了

'mysql:host=127.0.0.1;dbname=db'

答案 6 :(得分:2)

尝试:

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

这应该显示已配置的套接字。

答案 7 :(得分:1)

我找到了这种奇怪行为的原因。如果bind-address与127.0.0.1或0.0.0.0(所有地址)不同,则PDO无法连接到127.0.0.1。

答案 8 :(得分:1)

对于它的价值,我在遇到完全相同的问题之后找到了这个页面。我在运行Apache&amp;的服务器上仅限PHP - MySQL安装在另一台机器上。我尝试了服务器的DNS名称及其IP,并确认我可以ping它。使用旧语法mysql_connect(),同一台机器上的PHP应用程序正在与数据库通信。但来自CLI的PDO抛出了这个错误。

我的解决方案是检查我的DSN。 DSN中的任何拼写错误都会被静默忽略,PDO假定您的意思是localhost 。我的问题是我在DSN中使用了“name =”而不是“dbname =”。

答案 9 :(得分:0)

问题在Mysql配置中你需要禁用skip-networking的选项 在my.conf配置文件中,这应该可以正常工作 参考 http://www.wolfcms.org/forum/post7098.html#p7098

答案 10 :(得分:0)

我刚刚解决了类似的问题。我的猜测是你可能用等效的PDO替换你的mysql_connect()语句。不要忘记你仍然有很多其他代码依赖于旧的连接语句。尝试在PDO代码中写入时保持mysql_connect。

答案 11 :(得分:0)

对我来说有用的是如此指定端口号:

MySQL的:主机名;端口= 3306; DBNAME = dbname;开发

这使它在连接到本地数据库时起作用。现在我正致力于让它与远程数据库一起工作。

答案 12 :(得分:0)

我的问题可能与OP有所不同,但我认为值得张贴。我在VM上进行了软件升级,然后重新启动并收到了OP的错误消息。事实证明这是一个内存不足的问题,阻止了mysql的启动。删除一些大文件会使问题消失。

答案 13 :(得分:-8)

一年后,我找到了解决此问题的方法:使用SQLite数据库。 PDO运行良好,但不适用于MySQL

**编辑**因为每个人都在贬低这个:这解决了我的问题(我是OP)。我使用的是Doctrine,因此切换RDBMS非常简单快捷。该网站也是一个自制的CMS,只有很少的流量,所以SQLite很好。

我知道这不是问题的真正“答案”,但是如果有人在同一个环境中:一个糟糕的共享主机,你无法通过这个奇怪的PDO-MySQL错误改变 AND正在使用学说。这是一个解决方案。我可以删除这个答案,但如果我在OP时想到这个,我会节省很多时间。