在 PHP 中创建与 PDO 的连接时出错

Posted

技术标签:

【中文标题】在 PHP 中创建与 PDO 的连接时出错【英文标题】:Error on creating connection to PDO in PHP 【发布时间】:2010-11-28 22:59:37 【问题描述】:

今天,为了迁移到php 5.30,我删除并重新安装了最新版本的lampp,突然一个非常简单的应用程序无法连接到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;
?>

在网上查找时,我发现一两个人有同样的问题,但他们都没有收到回复,更不用说工作了。有谁知道发生了什么?我在配置中遗漏了什么吗?我需要做什么来修复它?

【问题讨论】:

【参考方案1】:

此类错误的最常见原因是 MySQL 没有运行。

【讨论】:

我已经检查过了。甚至到了关闭它并重新启动它的地步。 你怎么知道它是最常见的【参考方案2】:

通常意味着你需要指定 TCP/IP (1),或者告诉 MySQL 你的 Unix 套接字在哪里 (2):

    “mysql:host=127.0.0.1”或“mysql:host=localhost;port=3306” “mysql:unix_socket=/var/run/mysqld/mysqld.sock”

【讨论】:

我不确定为什么 MySQL 有时会使用“localhost”来表示“我将使用 Unix 套接字” 完美。使用选项 2 解决了问题,虽然使用 xampp lampp 安装,我需要使用 /opt/lampp/var/mysql/mysql.sock。 当然。很高兴你能找到插座——我只是在里面扔了一个例子,祈祷你能找到它。 :) 这里也有同样的问题。 @krdluzni,看到你的评论,我刚刚这样做了:pdo_mysql.default_socket=/opt/lampp/var/mysql/mysql.sock 在 /opt/lampp/etc/php.ini 文件中,它起作用了。否则我会想知道我必须在 Zend Framework 中犯了什么配置错误。所以谢谢你发布这个! 只需在您的设置中添加端口,例如 'host' =&gt; env('DB_HOST', '192.168.1.165'), 'port' =&gt; env('DB_PORT', '3317'), instead 定义 192.168.1.165:3317【参考方案3】:

您可能想要修改 php.ini,以便 PDO 可以通过指定 pdo_mysql.default_socket = /opt/lampp/var/mysql/mysql.sock(在 xampp 的情况下)找到 mysql.sock。更改 php.ini 后不要忘记重新启动 Apache。

(对不起,这似乎是一个重复的解决方案)。

【讨论】:

【参考方案4】:

您也可以在您的数据库连接字符串中使用 127.0.0.1,而不是指定“localhost”来完全避免这个问题。

【讨论】:

接受的答案是给系统管理员的,这个是给开发者的;)谢谢!【参考方案5】:

我在这个项目中使用 MAMP 2.0.1 和 Symfony 1.4 with Doctrine。

第三个选项对我有用,只需稍作修改: 在 /config/databases.yml

dsn: 'mysql:unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock;dbname=MY_DB_NAME;'

【讨论】:

以上是关于在 PHP 中创建与 PDO 的连接时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 XAMPP 中创建数据库(MySQL PDO)并将其与 php 代码连接

如何在 Mosaic 中创建与任何外部数据库的连接?

未在 mongoengine 中创建与新 dbname 的连接

如何在 Anylogic 中创建与特定代理的连接并为代理显示动画连接

如何在另一个 DataMap 中创建与 ObjEntity 的关系?

从 PHP 类和 DBMS 技术创建 PDO 连接字符串