为什么我不能通过终端运行一个工作PDO连接?


Why can't I run a working PDO connection through terminal?

在浏览器中运行的index.php是这样的:

<?php
    $dbh = new PDO(...whatever

在浏览器中工作得很好。我可以做任何事。

在终端中运行:

shell> php index.php

我得到一些错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory' in /Library/WebServer/Documents/index.php:3
Stack trace:
#0 /Library/WebServer/Documents/index.php(3): PDO->__construct('mysql:host=loca...', 'root', 'frekinpassword')
#1 {main}
  thrown in /Library/WebServer/Documents/index.php on line 3

这是怎么回事?

你的unix_socket变了而你的php客户端php。ini没变

首先,获取您的unix_socket位置

$ mysql -uroot -p

输入mysql密码并从命令行登录mysql服务器

mysql> show variables like '%sock%';
+---------------+---------------------------------------+
| Variable_name | Value                                 |
+---------------+---------------------------------------+
| socket        | /opt/local/var/run/mysql5/mysqld.sock |
+---------------+---------------------------------------+

您的unix_socket可以是不同的

然后修改你的php.ini,从

找到你的php.ini文件
<? phpinfo();

你可能安装了许多不同版本的php,所以请不要假设你的php.ini文件的位置,从你的'phpinfo';

修改php.ini:

mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock
pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
重新启动apache或php-fpm。

看起来您正在使用localhost作为MySQL数据库的连接字符串。当MySQL看到localhost时,它将其解释为"使用MySQL"。袜子"文件。PHP告诉你它找不到mysql。袜子文件。

最可能的原因是您的web服务器和命令行PHP配置为使用不同的php.ini文件,而这些php.ini文件配置不同的mysql.sock文件。你可以通过运行

找到你的web服务器php.ini文件
phpinfo();

从一个PHP文件通过web服务器加载。通过运行以下命令

,可以找到命令行php.ini文件
$ php --ini

如果你不能修复你的命令行php.ini文件,考虑通过127.0.0.1而不是localhost连接到MySQL服务器。当您使用IP地址时,PHP应该尝试通过网络而不是套接字文件进行连接。