我有一台运行超过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的最下方,经过一番折腾告于段落,对需要的人有所提示。
Harrie
我是王岩,2010年为了扩展自己的事业,我成立了一家互联网公司:上海岩创网络科技有限公司,2011年加入宏路数据任技术总监,2017年成立动乂岩数据技术有限公司同时兼任动点科技CTO。现在我正在搭建团队,在微信生态和企业服务领域进行探索。我的联系方式是:手机:13918304704 微信: harriewang QQ:13689186 欢迎大家跟我交流和讨论。