所以问题从原来的问题发生了变化,我会在下面留下原来的问题,以防止在我回答有人编辑他的问题之后对我的答案进行不良评价:
所以我正在开发一个安装了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 没有命令行可能。 (我知道它应该是技术支持的工作,但它们的确很慢)
由于
上一个问题:
所以今天的问题是: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 ......我不想从头开始重做网站!
感谢您的帮助!
答案 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
吗?
答案 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时想到这个,我会节省很多时间。