首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
tellmenow (22)
cutemouse (22)
softj (78)
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
CSDN - 文档中心 - 其他开发语言 阅读:2436   评论: 0    参与评论
标题   解决PHP问题:Fatal error: Call to undefined function: mysql_connect()     选择自 pizz 的 Blog
关键字   解决PHP问题:Fatal error: Call to undefined function: mysql_connect()
出处  

【问题来源】
近日新装一台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

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

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


相关文章
对该文的评论