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

16

我刚刚在旧的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);

我已经检查了两次数据库是否存在,以及登录名和密码是否正确。

这很奇怪,因为在我的Windows PC上使用Wampp时代码可以正常工作。我无法确定问题出在哪里。

有什么想法吗?


2
开始使用PDO或mysqli_*代替mysql_*。 - Leri
8
你读了问题还是只看了代码? - Madara's Ghost
3
如果您坚持使用 MySQL 3.x 并使用即将被弃用的 mysql_* 函数,那么您可能需要检查 php.ini 文件中是否启用了 php_mysql 扩展。请注意,该函数即将被弃用。 - Havelock
2
我真心希望这个系统没有暴露在互联网上,听起来它可能会在十秒钟内被破解。MySQL 3.2非常老旧且存在很多漏洞,而RedHat 7无法修补以确保安全,这是不可能的。这两个软件都已经超过12年了。 - tadman
1
有几个建议:第一,尝试使用mysqli_connect()函数,以防出现差异。第二,尝试连接到127.0.0.1。第三,打开命令提示符并运行which mysql,然后使用ps -ef | grep mysql检查进程列表,以检查它是否已安装和运行。no such file or directory似乎表明MySQL不在PHP认为的位置,或者未安装或配置错误。 - totallyNotLizards
显示剩余7条评论
6个回答

42

是的,你不能像那样连接!

@PLB和@jammypeach, mysqli是在v4.1之后出现的,但他使用的是v3 :) 大家应该仔细阅读规格说明,如果真的想帮忙的话!

你无法连接,因为你的socket文件有点问题。我现在记得旧版RH以前也有这个问题。 你的socket可能是 /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值,例如socket=/tmp/mysql.sock打开您的php.ini文件(也可以在您的phpinfo()页面上找到“Loaded Configuration File”),并将所有不正确的套接字位置出现的地方更改为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。很抱歉,在您的情况下没有其他实际解决方案。如果我是您,我会升级整个系统,并安装最新稳定版本的PHP和MySQL,如果必要的话,我会选择Debian。


2
规格方面你看得很仔细 - 不过为了辩护,我当时把那些建议作为评论发布是因为我不确定是否足够确切可以发布一个答案。如果我有时间阅读那个版本的MySQL规格,我可能也会发布一个答案的 ;) - totallyNotLizards
1
尝试更新吧!我的错。 @jammypeach,接受我的道歉,我不想冒犯你! - GTodorov
@GTodorov,/tmp中没有套接字,/var/mysql目录也不存在。这是不是有问题?在phpinfo页面中,mysql.default_socket没有值。 顺便说一下,不用担心安全问题。这台计算机没有连接到公共网络,里面绝对没有重要数据。我知道缺乏安全性 ;) - Maxbester
1
啊哈 PHP 5.0 :)PHP 5附带了一个mysql客户端,但无法连接到低于4.1版本的MySQL数据库。从4.1版本开始,MySQL使用一种新的密码哈希方式,与4.1之前的数据库不兼容。您的配置连接的服务器版本为3.23。因此,您需要获取更高版本的MySQL。 - GTodorov
2
这些信息是我成功使用MariaDB的关键。phpMyAdmin连接正常,但mysqli_connect()无法连接。我使用phpinfo()获取了预期的套接字文件位置,并创建了一个符号链接(ln -s ...)以匹配phpMyAdmin报告的socket变量。感谢@GTodorov! - Stephan Samuel
显示剩余4条评论

3

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

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

2

不要使用 localhost,而是使用 127.0.0.1 作为您的主机。

$host = '127.0.0.1';
$user = 'root';
$password = '';
$database = 'test';
$db = mysqli_connect($host, $user, $password) or die('Error : ' . mysqli_error());
$tb = mysqli_select_db($db,$database);

如果你使用的是BSD或其他操作系统,这就是要考虑的事情。谢谢伙计。 - undefined
很高兴能帮到你。 - undefined

2

我曾经遇到过类似的问题,花费了几个小时才解决。我将Mysql/Mariadb安装在了另一个磁盘上,而由PHP驱动的网站则在默认位置查找socket。因此,我创建了一个符号链接,但我认为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

2
在MAC OSX上,只需重新启动MySQL服务器即可。
sudo /usr/local/mysql/support-files/mysql.server restart

这对我很有效


1

我使用MAMP并遇到了相同的问题。我发现tmp文件夹中没有mysql.sock文件,因此使用了以下代码:

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

它对我有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接