令人困惑的仅PDO问题:无法通过套接字连接/访问被拒绝/无法连接到服务器(共享主机)

2022-08-31 00:04:12

所以问题从原来的样子上改变了,我会把原来的问题留在下面,以防止对答案的差评,就像我在有人编辑他的问题后所做的那样:

所以我正在研究一个(非常蹩脚的)共享主机,它安装了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的需求是因为我在这个网站上使用Symfony框架和Trinity,而Trinity插件需要PDO...我不想从头开始重做网站!

感谢您的帮助!


答案 1

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

解决此问题的最简单方法是首先获取套接字路径(通过查找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));使用持久连接

这对我有用。


答案 2

FWIW,我遇到了这个问题,并将我的主机从“本地主机”更改为“127.0.0.1”。

我不知道为什么localhost不起作用,但这确实做到了。

奇怪的是,我们有大量的服务器,它几乎可以使用“localhost”的每个服务器。


推荐