mysql_connect():没有这样的文件或目录

Posted

技术标签:

【中文标题】mysql_connect():没有这样的文件或目录【英文标题】:mysql_connect(): No such file or directory 【发布时间】:2012-09-17 01:51:34 【问题描述】:

我刚刚在旧的 RedHat7 上安装了 mysql 服务器(版本 3.23.58)。由于依赖关系,我无法安装更新的 MySQL 版本。我无法更新此 RedHat 服务器上的库。

但是,我在使用 php 连接到数据库时遇到问题。首先我使用了 PDO,但我意识到 PDO 与 MySQL 3.23 不兼容...

所以我使用了mysql_connect()。现在我有以下错误:

Warning: mysql_connect(): No such file or directory in /user/local/apache/htdocs/php/database.php on line 9
Error: No such file or directory

我的代码是:

$host = 'localhost';
$user = 'root';
$password = '';
$database = 'test';
$db = mysql_connect($host, $user, $password) or die('Error : ' . mysql_error());
mysql_select_db($database);

我检查了两次数据库存在并且登录名和密码正确。

这很奇怪,因为代码在我的带有 Wampp 的 Windows PC 上运行良好。我不知道问题出在哪里。

有什么想法吗?

【问题讨论】:

开始使用 PDO 或 mysqli_* 代替 mysql_* @PLB:你读过问题还是只读过代码? 如果你坚持使用 MySQL 3.x 和 mysql_* 函数,这些函数很快就会被弃用,你可能需要检查你的 php.ini 是否启用了 php_mysql 扩展. 我真的希望这个系统不会暴露在互联网上。听起来它可以在十秒钟内被破解。 MySQL 3.2 非常老旧且漏洞百出,而且 RedHat 7 无法修补以确保安全,这是不可能的。这两款软件都已使用了十二年以上。 几点建议;试试mysqli_connect(),以防有区别。其次,尝试连接到127.0.0.1。第三,打开命令提示符并运行which mysql,然后使用ps -ef | grep mysql 检查进程列表以检查它是否已安装并正在运行。 no such file or directory 似乎表明 mysql 不在 PHP 认为的位置,或者没有安装或配置错误。 【参考方案1】:

是的,你不能这样连接!

@PLB 和@jammypeach mysqli 在 v4.1 之后,他正在使用 v3 :) 如果您真的想提供帮助,请阅读规格!

您无法连接,因为您的套接字文件有点错误。我现在记得旧的RH以前有这个问题。 您的套接字可能是 /var/mysql/mysql.sock 或 /tmp/mysql.sock 但一个或多个应用程序正在寻找另一个。

如果你的是 /tmp/mysql.sock 但没有 /var/mysql/mysql.sock 你应该:

cd /var 
mkdir mysql
cd mysql
ln -s /tmp/mysql.sock mysql.sock

如果你有 /var/mysql/mysql.sock 但没有 /tmp/mysql.sock 那么:

cd /tmp
ln -s /var/mysql/mysql.sock mysql.sock

您需要权限才能进行更改。只需 sudo,如果需要,在上述命令之前!

另一种解决方案(更简单):

创建文件并调用 phpinfo();寻找'mysql.default_socket';或'pdo_mysql.default_socket'; 打开 My.ini 或 My.cnf 找到套接字值,例如socket=/tmp/mysql.sock 打开你的 php.ini 文件(也可以在你的 phpinfo() 页面上找到“加载的配置文件”)并将所有出现的不正确套接字位置更改为 MySQL 中的正确套接字位置。

另一种解决方案(最简单): PDO 的 DSN:

mysql:unix_socket=/tmp/mysql.sock;dbname=...

mysql_connect:

$db = mysql_connect('localhost:/tmp/mysql.sock', ...

你的系统在安全方面真的很可怕,如果你托管敏感数据,我会升级到最新版本。

---- 更新----

啊啊啊啊 PHP 5.0 和 MySQL 3.23 :)

PHP 5 有一个打包的 mysql 客户端,它无法连接到低于 4.1 版本的 MySQL 数据库。 从 4.1 版开始,MySQL 使用了一种与 4.1 之前的数据库不兼容的新密码散列方式。您的配置连接到的服务器是 3.23 版。所以你需要给自己一个更高版本的 MySQL。抱歉,您的情况没有其他实用的解决方案。如果我是你,我会升级整个系统并安装最新的操作系统版本,如果必须的话,我会选择 Debian 和最新的稳定版本的 PHP 和 MySQL。

【讨论】:

很好地发现了规格 - 不过,在我的辩护中,我将这些建议作为评论发布,因为我不确定是否可以发布答案。如果我有时间阅读该版本 MySQL 的规范,我可能也会发布答案;) 试试更新!我的错。 @jammypeach 向我道歉,不想侮辱你! @GTodorov /tmp 中没有套接字,目录 /var/mysql 不存在。这是错的吗?在 phpinfo 页面中,mysql.default_socket 没有任何值。顺便说一句,不要担心安全问题。这台电脑没有连接到公共网络,里面绝对没有重要数据。我知道缺乏安全性;) Aaahhhh PHP 5.0 :) PHP 5 有一个打包的 mysql 客户端,它无法连接到低于 4.1 版本的 MySQL 数据库。从 4.1 版开始,MySQL 使用了一种与 4.1 之前的数据库不兼容的新密码散列方式。您的配置连接到的服务器是 3.23 版。所以,你需要给自己弄一个更高版本的 MySQL。 这些信息是我成功使用 MariaDB 的关键。 phpMyAdmin 已连接,但 mysqli_connect() 不会。我使用上面的phpinfo() 获得了套接字文件的预期位置,并创建了一个符号链接(ln -s ...)以匹配 phpMyAdmin 报告的socket 变量。谢谢@GTodorov!【参考方案2】:

幸运的是,这对我来说效果很好:

$db = mysql_connect('localhost:/var/lib/mysql/mysql.sock', 'Username', 'Password');

【讨论】:

【参考方案3】:

在 MAC OSX 上只需重启 mysql 服务器

sudo /usr/local/mysql/support-files/mysql.server restart

它对我有用

【讨论】:

【参考方案4】:

我有一个类似的问题,我花了几个小时才解决。我将 Mysql / Mariadb 放在单独的驱动器上,PHP 驱动的网站正在默认位置寻找套接字。所以,我创建了一个符号链接,但我认为 SELinux 不会给予许可。所以,然后我将这些行添加到 /etc/php.ini 文件中,它就可以工作了。

pdo_mysql.default_socket = /data/mysql/mysql.sock
mysql.default_socket = /data/mysql/mysql.sock
mysqli.default_socket = /data/mysql/mysql.sock

【讨论】:

【参考方案5】:

我使用 MAMP 并遇到示例问题。我发现tmp中没有mysql.sock。所以使用这个代码

cd /tmp && ln -s /Applications/MAMP/tmp/mysql/mysql.sock

它对我有用

【讨论】:

以上是关于mysql_connect():没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目

zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目

MySQL 连接不工作:2002 没有这样的文件或目录

MySQL 连接不工作:2002 没有这样的文件或目录

MySQL 连接不工作:2002 没有这样的文件或目录

MySQL 连接不工作:2002 没有这样的文件或目录