我有一台运行超过10年的服务器运行了一些老的开源程序和一些手写的过时代码,例如DEDECMS的老版本,记事狗的老版本,PHPWIND的老版本,春节假期手贱,进行了PHP的版本升级,从PHP5.6升级到了PHP7.x。升级之后,安全性肯定会高一些,在这台服务器上也可以做更多的事情了。但是问题来了,很多代码都无法运行,经过检查服务器日志

tail -f /var/log/apache2/error_log

发现问题大多数都是因为PHP7已经不支持mysql扩展库,mysql_* 系列函数在PHP7.x 7.0以后已经废弃。所以报错,报错示例如下:

Uncaught Error: Call to undefined function mysql_connect()

Uncaught Error: Call to undefined function mysql_result()

于是,寻找解决方法,开始我想着替换程序中的所有方法为mysqli的对应方法,后来发现一行一行改工程量巨大,既然函数不存在,我直接写对应的函数或者单独写一个外挂文件include到对应的数据库类就好了。

解决问题代码如下,供大家参考。


if(!function_exists('mysql_pconnect')){
function mysql_pconnect($dbhost, $dbuser, $dbpass){
global $dbport;
global $dbname;
global $linkid;
$linkid = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
return $linkid;
}
function mysql_connect($dbhost, $dbuser, $dbpass){
global $dbport;
global $dbname;
global $linkid;
$linkid = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
return $linkid;
}
function mysql_select_db($dbname){
global $linkid;
return mysqli_select_db($linkid,$dbname);
}
function mysql_fetch_array($result, $type=''){
if ($type) {
return mysqli_fetch_array($result, $type);
}else{
return mysqli_fetch_array($result);
}
}
function mysql_fetch_assoc($result){
return mysqli_fetch_assoc($result);
}
function mysql_fetch_row($result){
return mysqli_fetch_row($result);
}
function mysql_free_result($result){
return mysqli_free_result($result);
}
function mysql_query($cxn){
global $linkid;
return mysqli_query($linkid,$cxn);
}
function mysql_insert_id(){
global $linkid;
return mysqli_insert_id($linkid);
}
function mysql_affected_rows(){
global $linkid;
return mysqli_affected_rows($linkid);
}
function mysql_escape_string($data){
global $linkid;
return mysqli_real_escape_string($linkid, $data);
}
function mysql_real_escape_string($data){
global $linkid;
return mysqli_real_escape_string($linkid, $data);
}
function mysql_close(){
global $linkid;
return mysqli_close($linkid);
}
function mysql_get_server_info(){
global $linkid;
return mysqli_get_server_info($linkid);
}
function mysql_num_rows($result){
return mysqli_num_rows($result);
}
function mysql_result($result,$row){
$arr = mysqli_fetch_array($result);
return $arr[$row];
}
}

 

以记事狗程序为例,我把这些代码粘贴到了include/class/jishigou/mysql.class.php的最下方,经过一番折腾告于段落,对需要的人有所提示。