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:没有那个文件或目