解决PHP问题:Fatal error: Call to undefined function: mysql_connect()

博主在RHEL AS3服务器安装MySQL 4.1后,安装论坛执行数据库连接出现致命错误。经多方排查,发现是PHP不支持mysql_connect()函数、模块未装载成功、调用方式不兼容等问题。通过安装特定RPM包、修改密码加密方式,最终解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题来源】
近日新装一台RHEL AS3 的服务器;在安装的时候,没有选择安装数据库(MYSQL)相关的包。由于RHELAE3自带的MYSQL是3.23版本的,我想安装的时候,当MOUNT光驱的时候整个系统就死掉键盘鼠标毫无反应远程登录不入,所以我干脆就直接安装MYSQL4.1。问题也许就在此引发了。

RHEL AS3 自带APACHE2和PHP4.3.2。当我把 [MySQL-server-4.1.7-0.i386.rpm]安装好之后,试图安装[MolyX]论坛时,发现执行数据库连接时发生致命错误:
Fatal error: Call to undefined function: mysql_connect()
这个问题真是够致命的。

经过在 httpd.conf ,php.ini 和 my.cnf 这几个配置文件多方修改测试,问题依然。
之后到 [google] 搜啊搜,找到很多相关的解决方案。
----------------------------------------------
说法[1] :这个问题概括起来说就是你的PHP不支持mysql_connect()函数。为什么呢?这是由于PHP是一种模块化的设计,除了核心的内容,其他都是可选的。之所以不支持,是因为在编译PHP时没有加入对MYSQL数据库的支持。

说法[2] :
- 如果你的操作系统是Linux/Unix
1.如果PHP是自己编译的,那么要重新做。在configure后面加上--with-mysql选项
2.如果是用的RPM,建议到网上去找找已经内置MYSQL支持的RPM包,重新装上去

说法[3]:因为卸载了以前的mysql,重装的mysql又不是rpm装的
所有安装后的路径不同了;但是在原先装apache的时候需要./configure /
--prefix=/usr/local/php /
--with-mysql=/usr/local/mysql / (主要是这句)
用来指定mysql的安装路径
所以在重装了之后因为路径不一样,apache就无法找到mysql的安装路径
也就出现了mysql_connect:未被定义的错误
----------------------------------------------------------------

头痛的是我的 phpinfo() 打出来的信息均是正常的。在RHEL光盘上找了很多PHP、MYSQL相关的LIB/DBI/ODBC等包都装了,问题还是没解决。

后来在MYSQL的论坛上看到可以使用 dl('mysql.so') 来动态装载模块。于是做了一个测试的PHP文件:
----------------------------------------
<?
#test.php

echo "php version=";
echo phpversion();
echo "<br>";
 
dl('mysql.so');
require "inc.php";
 
test();
echo "<br>";
 
dbconnect();
?>
----------------------------------------
<?
# cat inc.php
function test(){
echo "function test output";
}
 function dbconnect(){
mysql_connect("localhost","root","password");
}
?>
----------------------------------------

结果错误信息如下:
----------------------------------------
php version=4.3.2

Warning: dl(): Unable to load dynamic library '/usr/lib/php4/mysql.so' - libmysqlclient.so.10: cannot open shared object file: No such file or directory in /usr/www//test.php on line 9
function test output

Fatal error: Call to undefined function: mysql_connect() in /usr/www/inc.php on line 7
----------------------------------------

结果又多了一个线索:libmysqlclient.so.10。原来是这个模块没有装载成功。
然后我在系统 find 一下,发现根本没有这个文件存在。应该是少装了什么东西。
--------------------------------------------
# rpm -ivh /home/dkk/libdbi-dbd-mysql-0.6.5-5.i386.rpm
error: Failed dependencies:
        libdbi = 0.6.5-5 is needed by libdbi-dbd-mysql-0.6.5-5
        libmysqlclient.so.10 is needed by libdbi-dbd-mysql-0.6.5-5
    Suggested resolutions:
        libdbi-0.6.5-5.i386.rpm
        mysql-3.23.58-1.i386.rpm
--------------------------------------------

在MYSQL.com那个搜索 libmysqlclient.so ,终于找到了问题症结所在:
MYSQL4版本以上,调用libmysqlclient.so 的方式改了,跟MYSQL3.23不一样,而PHP4.3.2和APACHE还是以旧的方式来调用,因此就找不到libmysqlclient.so 了。
英文原文如下:
-------------------------------------------
Ensure that you don't have any MySQL clients that use shared libraries (like the Perl DBD::mysql module). If you do, you should recompile them, because the data structures used in `libmysqlclient.so' have changed. The same applies to other MySQL interfaces as well, such as the Python MySQLdb module.
-------------------------------------------
具体描述见帖子:
http://dev.mysql.com/doc/mysql/en/Upgrading-from-3.23.html


问题找到了,可是我并不想重新编译PHP,尽管5.0都已经出来了。在MYSQL.COM那里有些RPM,我把它们都装了上去,具体如下:
# rpm -ivh MySQL-client-4.1.7-0.i386.rpm
# rpm -ivh MySQL-devel-4.1.7-0.i386.rpm
# rpm -ivh MySQL-shared-4.1.7-0.i386.rpm
# rpm -ivh MySQL-shared-compat-4.1.7-0.i386.rpm

我觉得最重要的是最后一个包(-shared-compat-),因为MYSQL.COM注明了该包包含了3.23的模块;而且,我是安装完上述的一个包就(重启mysql和apache)测试一下那个test.php,直到安装到最后一个包,才发现出现了一个新的“成功的”错误:
Warning: Function registration failed - duplicate name - mysql_connect in /usr/www/test.php on line 9

嘿,这个错误的出现,正说明了系统已经成功装载了 mysql.so ,当test.php的 dl('mysql.so') 尝试重复装载时就触发了该错误。到这里终于可以笑一笑了。

把test.php中的 dl('mysql.so')  注释掉,重新测试。嘿,一个“老错误”跑了出来:
Warning: mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client in /usr/www/inc.php on line 7

呵呵,我已经认识它好久啦。只是由于MYSQL4的密码加密方式改变所致。
以root登录到mysql执行语句:update user set password=OLD_PASSWORD('password') where user='root'; 就行啦。
具体描述见以下帖子:
http://dev.mysql.com/doc/mysql/en/Old_client.html

到此,总算可以圆满解决了问题了。嗨,还真费劲,主要原因还是在于自己对于整个系统的东西不甚了解。

如果谁有更好的解决方法,请跟着补充哦。 :-)

### 回答1: 这个错误是因为你的代码中使用了mysql_connect()函数,但是你的PHP版本不支持该函数。mysql_connect()函数已经在PHP 7.版本中被弃用,取而代之的是mysqli_connect()函数或PDO类。如果你的PHP版本低于7.,你可以尝试升级PHP版本或者使用mysqli_connect()函数或PDO类来连接MySQL数据库。 ### 回答2: 这个错误是因为 PHP 7.x 版本已经不再支持 MySQL 扩展,而 MySQLi 或 PDO_MySQL 扩展应该被使用, 以连接到 MySQL 数据库。 MySQL 扩展在 PHP 5.5.x 及更早版本中是默认启用的。在 PHP 5.5.x 之后,该扩展被标记为“已弃用”,因为更好的替代方案已经可用。在 PHP 7.x 中,该扩展已被删除。 要解决这个问题,我们需要在代码中引入新的 MySQL 扩展。替代方法可以使用 MySQLi 或 PDO_MySQL 扩展。我们可以通过下面的代码来替代: 使用 MySQLi 扩展: <?php $mysqli = new mysqli("localhost", "username", "password", "database"); if ($mysqli->connect_error) { die("Connection failed: " . $mysqli->connect_error); } ?> 使用 PDO_MySQL 扩展: <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully"; } catch(PDOException $e) { echo "Connection failed: " . $e->getMessage(); } ?> 以上代码将重新连接到 MySQL 数据库,从而解决了“fatal error: uncaught error: call to undefined function mysql_connect()”这个错误。 ### 回答3: 该错误通常发生于使用 PHP 连接 MySQL 数据库时。它意味着没有找到与 mysql_connect() 相关的函数,导致连接失败。 在新版本的 PHP 中,MySQL 扩展已经被移除了,被 mysqli 和 PDO 代替。因此,如果使用新版本的 PHP,必须使用 mysqli 或 PDO 函数来连接 MySQL 数据库。 要解决这个问题,可以按照下面的步骤进行: 1. 确认你的 PHP 版本是否较新,如果是,则必须使用 mysqli 或 PDO 函数连接数据库。 2. 如果你已经使用了 mysqli 或 PDO 但仍然遇到该错误,请确认 PHP 是否已正确加载 MySQL 扩展。你可以使用 phpinfo() 函数来查看。 3. 如果 MySQL 扩展没有被加载,则需要启用该扩展。你可以编辑 php.ini 文件,并确保以下行没有注释: extension=php_mysql.dll 4. 如果还是没有解决问题,请确认 MySQL 服务器是否正在运行,并且你使用的用户名和密码是否正确。 总之,fatal error: uncaught error: call to undefined function mysql_connect() 错误表明你的 PHP 版本过低或者没有正确连接 MySQL 数据库。使用 mysqli 或 PDO 函数并启用 MySQL 扩展,以解决问题。同时也要确保 MySQL 服务器正在运行,并且使用的用户名和密码正确。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值