题
今天,我删除并重新安装了最新版本的 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;
?>
在网上查找时,我发现其他一两个人也有同样的问题,但他们都没有收到回复,更不用说工作了。有谁知道发生了什么事?我在配置中遗漏了什么吗?我需要做什么来修复它?
解决方案
通常意味着您需要指定 TCP/IP (1),或告诉 MySQL 您的 Unix 套接字在哪里 (2):
- “mysql:主机= 127.0.0.1”或“mysql:主机= localhost;端口= 3306”
- “mysql:unix_socket=/var/run/mysqld/mysqld.sock”
其他提示
您也可以在数据库连接字符串中使用127.0.0.1,而不是指定“localhost”,以完全避免此问题。
您可能想要修改php.ini,以便PDO可以通过指定 pdo_mysql.default_socket = /opt/lampp/var/mysql/mysql.sock
找到mysql.sock(在xampp的情况下) )。不要忘记在更改php.ini后重新启动Apache。
(对不起,这似乎是一个重复的解决方案)。
我正在将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;'
像这样的错误的最常见原因是MySQL没有运行。
不隶属于 StackOverflow