《PHP实例:ecshop适应在PHP7的修改方法解决报错的实现》要点:
本文介绍了PHP实例:ecshop适应在PHP7的修改方法解决报错的实现,希望对您有用。如果有疑问,可以联系我们。
ecshop这个系统,到目前也没见怎么推出新版本,如果是新项目,不太建议使用它.不过,因为我一直以来都在使用中,所以不得不更改让其适应PHP新版本.现在PHP 7已经出发行版了,所以更改来继续使用吧.具体的更改有以下方面:
(1)将MysqL扩展的使用替换掉,改为使用MysqLi或pdo:
具体更改的文件在于includes/cls_MysqL.PHP.这是个不小的工程,文件代码太长……
if (!defined('DITAN_ECS')) { die('Hacking attempt'); } class cls_MysqL { var $link_id = NULL; var $settings = array(); var $queryCount = 0; var $queryTime = ''; var $queryLog = array(); var $max_cache_time = 300; // 最大的缓存时间,以秒为单位 var $cache_data_dir = 'temp/query_caches/'; var $root_path = ''; var $error_message = array(); var $platform = ''; var $version = ''; var $dbhash = ''; var $starttime = 0; var $timeline = 0; var $timezone = 0; // 事务指令数 protected $transTimes = 0; var $MysqL_config_cache_file_time = 0; var $MysqL_disable_cache_tables = array(); // 不允许被缓存的表,遇到将不会进行缓存 function __construct($dbhost,$dbuser,$dbpw,$dbname = '',$charset = 'gbk',$pconnect = 0,$quiet = 0) { $this->cls_MysqL($dbhost,$dbname,$charset,$pconnect,$quiet); } function cls_MysqL($dbhost,$quiet = 0) { if (defined('EC_CHARSET')) { $charset = strtolower(str_replace('-','',EC_CHARSET)); } if (defined('ROOT_PATH') && !$this->root_path) { $this->root_path = ROOT_PATH; } if ($quiet) { $this->connect($dbhost,$quiet); } else { $this->settings = array( 'dbhost' => $dbhost,'dbuser' => $dbuser,'dbpw' => $dbpw,'dbname' => $dbname,'charset' => $charset,'pconnect' => $pconnect ); } } function connect($dbhost,$charset = 'utf8',$quiet = 0) { if ($pconnect) { $this->link_id = new MysqLi('p:'.$dbhost,$dbpw); if ($this->link_id->connect_error) { if (!$quiet) { $this->ErrorMsg("Can't pConnect MysqL Server($dbhost)!"); } return false; } } else { $this->link_id = new MysqLi($dbhost,$dbpw); if ($this->link_id->connect_error) { if (!$quiet) { $this->ErrorMsg("Can't Connect MysqL Server($dbhost)!"); } return false; } } $this->dbhash = md5($this->root_path . $dbhost . $dbuser . $dbpw . $dbname); $this->version = $this->link_id->server_version; /* 对字符集进行初始化 */ $this->link_id->set_charset($charset); $this->link_id->query("SET sql_mode=''"); $sqlcache_config_file = $this->root_path . $this->cache_data_dir . 'sqlcache_config_file_' . $this->dbhash . '.PHP'; @include($sqlcache_config_file); $this->starttime = time(); if ($this->max_cache_time && $this->starttime > $this->MysqL_config_cache_file_time + $this->max_cache_time) { if ($dbhost != '.') { $result = $this->link_id->query("SHOW VARIABLES LIKE 'basedir'"); $row = $result->fetch_array(MysqLI_ASSOC); $result->free(); if (!empty($row['Value']{1}) && $row['Value']{1} == ':' && !empty($row['Value']{2}) && $row['Value']{2} == "/") { $this->platform = 'WINDOWS'; } else { $this->platform = 'OTHER'; } } else { $this->platform = 'WINDOWS'; } if ($this->platform == 'OTHER' && ($dbhost != '.' && strtolower($dbhost) != 'localhost:3306' && $dbhost != '127.0.0.1:3306') || date_default_timezone_get() == 'UTC') { $result = $this->link_id->query("SELECT UNIX_TIMESTAMP() AS timeline,UNIX_TIMESTAMP('" . date('Y-m-d H:i:s',$this->starttime) . "') AS timezone"); $row = $result->fetch_array(MysqLI_ASSOC); $result->free(); if ($dbhost != '.' && strtolower($dbhost) != 'localhost:3306' && $dbhost != '127.0.0.1:3306') { $this->timeline = $this->starttime - $row['timeline']; } if (date_default_timezone_get() == 'UTC') { $this->timezone = $this->starttime - $row['timezone']; } } $content = '<' . "?PHP\r\n" . '$this->MysqL_config_cache_file_time = ' . $this->starttime . ";\r\n" . '$this->timeline = ' . $this->timeline . ";\r\n" . '$this->timezone = ' . $this->timezone . ";\r\n" . '$this->platform = ' . "'" . $this->platform . "';\r\n?" . '>'; @file_put_contents($sqlcache_config_file,$content); } /* 选择数据库 */ if ($dbname) { if ($this->link_id->select_db($dbname) === false ) { if (!$quiet) { $this->ErrorMsg("Can't select MysqL database($dbname)!"); } return false; } else { return true; } } else { return true; } } function select_database($dbname) { return $this->link_id->select_db($dbname); } function set_MysqL_charset($charset) { if (in_array(strtolower($charset),array('gbk','big5','utf-8','utf8'))) { $charset = str_replace('-',$charset); } $this->link_id->set_charset($charset); } function fetch_array($query,$result_type = MysqLI_ASSOC) { $row = $query->fetch_array($result_type); $query->free(); return $row; } function query($sql,$type = '') { if ($this->link_id === NULL) { $this->connect($this->settings['dbhost'],$this->settings['dbuser'],$this->settings['dbpw'],$this->settings['dbname'],$this->settings['charset'],$this->settings['pconnect']); $this->settings = array(); } if ($this->queryCount++ <= 99) { $this->queryLog[] = $sql; } if ($this->queryTime == '') { if (PHP_VERSION >= '5.0.0') { $this->queryTime = microtime(true); } else { $this->queryTime = microtime(); } } /* 当当前的时间大于类初始化时间的时候,自动执行 ping 这个自动重新连接操作 */ if (time() > $this->starttime + 1) { $this->link_id->ping(); } if (!($query = $this->link_id->query($sql)) && $type != 'SILENT') { $this->error_message[]['message'] = 'MysqL Query Error'; $this->error_message[]['sql'] = $sql; $this->error_message[]['error'] = $this->link_id->error; $this->error_message[]['errno'] = $this->link_id->errno; $this->ErrorMsg(); return false; } if (defined('DEBUG_MODE') && (DEBUG_MODE & 8) == 8) { $logfilename = $this->root_path . data_dir . '/MysqL_query_' . $this->dbhash . '_' . date('Y_m_d') . '.log'; $str = $sql . "\n\n"; if (PHP_VERSION >= '5.0') { file_put_contents($logfilename,$str,FILE_APPEND); } else { $fp = @fopen($logfilename,'ab+'); if ($fp) { fwrite($fp,$str); fclose($fp); } } } return $query; } function affected_rows() { return $this->link_id->affected_rows; } function error() { return $this->link_id->error; } function errno() { return $this->link_id->errno; } function result($query,$row) { $query->data_seek($row); $result = $query->fetch_row(); $query->free(); return $result; } function num_rows($query) { return $query->num_rows; } function num_fields($query) { return $this->link_id->field_count; } function free_result($query) { return $query->free(); } function insert_id() { return $this->link_id->insert_id; } function fetchRow($query) { return $query->fetch_assoc(); } function fetch_fields($query) { return $query->fetch_field(); } function version() { return $this->version; } function ping() { return $this->link_id->ping(); } function escape_string($unescaped_string) { return $this->link_id->real_escape_string($unescaped_string); } function close() { return $this->link_id->close(); } function ErrorMsg($message = '',$sql = '') { if ($message) { echo "<b>DTXB info</b>: $message\n\n<br /><br />"; //print('<a href="http://faq.comsenz.com/?type=MysqL&dberrno=2003&dberror=Can%27t%20connect%20to%20MysqL%20server%20on" target="_blank">http://faq.comsenz.com/</a>'); } else { echo "<b>MysqL server error report:"; print_r($this->error_message); //echo "<br /><br /><a href='http://faq.comsenz.com/?type=MysqL&dberrno=" . $this->error_message[3]['errno'] . "&dberror=" . urlencode($this->error_message[2]['error']) . "' target='_blank'>http://faq.comsenz.com/</a>"; } exit; } /* 仿真 Adodb 函数 */ function selectLimit($sql,$num,$start = 0) { if ($start == 0) { $sql .= ' LIMIT ' . $num; } else { $sql .= ' LIMIT ' . $start . ',' . $num; } return $this->query($sql); } function getone($sql,$limited = false) { if ($limited == true) { $sql = trim($sql . ' LIMIT 1'); } $res = $this->query($sql); if ($res !== false) { $row = $res->fetch_row(); $res->free(); if ($row !== false) { return $row[0]; } else { return ''; } } else { return false; } } function getoneCached($sql,$cached = 'FILEFirsT') { $sql = trim($sql . ' LIMIT 1'); $cachefirst = ($cached == 'FILEFirsT' || ($cached == 'MysqLFirsT' && $this->platform != 'WINDOWS')) && $this->max_cache_time; if (!$cachefirst) { return $this->getone($sql,true); } else { $result = $this->getsqlCacheData($sql,$cached); if (empty($result['storecache']) == true) { return $result['data']; } } $arr = $this->getone($sql,true); if ($arr !== false && $cachefirst) { $this->setsqlCacheData($result,$arr); } return $arr; } function getAll($sql) { $res = $this->query($sql); if ($res !== false) { $arr = $res->fetch_all(MysqLI_ASSOC); $res->free(); return $arr; } else { return false; } } function getAllCached($sql,$cached = 'FILEFirsT') { $cachefirst = ($cached == 'FILEFirsT' || ($cached == 'MysqLFirsT' && $this->platform != 'WINDOWS')) && $this->max_cache_time; if (!$cachefirst) { return $this->getAll($sql); } else { $result = $this->getsqlCacheData