创建PHP中PDO连接时出现错误

25

今天,我卸载并重新安装了最新版本的lampp以便移动到php 5.30,但突然一个非常简单的应用程序无法连接到mysql数据库。我正在使用PDO进行连接,并收到以下错误:

Warning: PDO::__construct() [pdo.--construct]: [2002] Invalid argument (trying to connect 
via unix://) in /home/raistlin/www/todoapp/home.php on line 9

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002]
Invalid argument' in /home/raistlin/www/todoapp/home.php:9 Stack trace: #0
/home/raistlin/www/todoapp/home.php(9): PDO->__construct('mysql:host=loca...', 'USER', 
'PASSWORD') #1 {main} thrown in /home/raistlin/www/todoapp/home.php on line 9

目前我还没有捕获到错误,为了调试它。

以下代码足以在我的系统上复制问题:

<?php
$DBACCESS = array(
    "connstring"=>"mysql:host=localhost;dbname=todoapp",
    "host"=>"localhost",
    "user"=>"user",
    "password"=>"password",
    "todoapp"=>"todoapp"
    );

    echo implode('<br \>',$DBACCESS);

    $dbh = new PDO($DBACCESS['connstring'],$DBACCESS['user'],$DBACCESS['password']);

    $dbh = null;
?>

我在网上找到了一两个遇到同样问题的人,但他们都没有得到回应,更不用说起作用的解决方法了。有知道发生什么的吗?是配置方面有什么遗漏吗?我需要做什么来修复它?

5个回答

51
通常意味着需要指定TCP/IP (1),或告诉MySQL您的Unix套接字位置 (2):
  1. "mysql:host=127.0.0.1" 或 "mysql:host=localhost;port=3306"
  2. "mysql:unix_socket=/var/run/mysqld/mysqld.sock"

1
我不确定为什么MySQL有时会将“localhost”解释为“我要使用Unix套接字”。 - TML
1
完美。问题已经通过选项2解决,尽管在xampp lampp安装中,我需要使用/opt/lampp/var/mysql/mysql.sock。 - krdluzni
当然。很高兴你能找到套接字 - 我只是随便放了一个例子,祈祷你能找到它。 :) - TML
3
我也遇到了同样的问题。看到@krdluzni的评论后,我在/opt/lampp/etc/php.ini文件中加入了pdo_mysql.default_socket=/opt/lampp/var/mysql/mysql.sock,然后问题得以解决。否则我会疑惑自己在Zend框架中做了哪些配置错误,所以感谢你发布这个帖子! - namespaceform
只需在您的设置中添加端口,如 'host' => env('DB_HOST', '192.168.1.165'), 'port' => env('DB_PORT', '3317'), 而不是定义为 192.168.1.165:3317。 - Ashwani Panwar
显示剩余5条评论

24
你可以在数据库连接字符串中使用127.0.0.1来替代"localhost",这样就能完全避免这个问题。

4
接受的答案是针对系统管理员的,这个答案是针对开发人员的 ;) 谢谢! - jack

9
你可能需要修改php.ini文件,让PDO可以通过指定 pdo_mysql.default_socket = /opt/lampp/var/mysql/mysql.sock(在xampp的情况下)找到mysql.sock。记得在更改php.ini后重新启动Apache。(抱歉,这似乎是一个重复的解决方案)。

4
我将为您翻译以下内容:“我正在使用MAMP 2.0.1和Symfony 1.4,使用Doctrine开发此项目。”“第三个选项对我有用,只需进行小修改:在/config/databases.yml中进行修改。”
dsn: 'mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=MY_DB_NAME;'

2
最常见的导致此类错误的原因是MySQL未运行。

我已经检查过了,甚至达到关闭并重新启动的程度。 - krdluzni
2
你怎么知道它是“最常见的”? - dakab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接