Home CMS Tutorial ECShop How to modify and support PHP7 in ecshop

How to modify and support PHP7 in ecshop

Jul 11, 2020 am 09:54 AM
ecshop

ecshop修改php的方法:首先将mysql扩展的使用替换掉,改为使用mysqli或pdo;然后更改“cls_image.php”的“gd_version()”方法,将这个方法改为静态方法;最后去除使用类名的构造函数。

How to modify and support PHP7 in ecshop

ecshop支持PHP7的修改方法

(1)将mysql扩展的使用替换掉,改为使用mysqli或pdo(推荐使用mysqli):

推荐:《ECShop教程

从php5.5开始,mysql扩展将废弃了。 具体更改的文件在于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, $dbuser, $dbpw, $dbname, $charset, $pconnect, $quiet);
}
function cls_mysql($dbhost, $dbuser, $dbpw, $dbname = '', $charset = 'gbk', $pconnect = 0, $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, $dbuser, $dbpw, $dbname, $charset, $pconnect, $quiet);
}
else
{
$this->settings = array(
'dbhost' => $dbhost,
'dbuser' => $dbuser,
'dbpw' => $dbpw,
'dbname' => $dbname,
'charset' => $charset,
'pconnect' => $pconnect
);
}
}
function connect($dbhost, $dbuser, $dbpw, $dbname = '', $charset = 'utf8', $pconnect = 0, $quiet = 0)
{
if ($pconnect)
{
$this->link_id = new mysqli('p:'.$dbhost, $dbuser, $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, $dbuser, $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 = &#39;<&#39; . "?php\r\n" .
&#39;$this->mysql_config_cache_file_time = &#39; . $this->starttime . ";\r\n" .
&#39;$this->timeline = &#39; . $this->timeline . ";\r\n" .
&#39;$this->timezone = &#39; . $this->timezone . ";\r\n" .
&#39;$this->platform = &#39; . "&#39;" . $this->platform . "&#39;;\r\n?" . &#39;>&#39;;
@file_put_contents($sqlcache_config_file, $content);
}
/* 选择数据库 */
if ($dbname)
{
if ($this->link_id->select_db($dbname) === false )
{
if (!$quiet)
{
$this->ErrorMsg("Can&#39;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(&#39;gbk&#39;, &#39;big5&#39;, &#39;utf-8&#39;, &#39;utf8&#39;)))
{
$charset = str_replace(&#39;-&#39;, &#39;&#39;, $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 = &#39;&#39;)
{
if ($this->link_id === NULL)
{
$this->connect($this->settings[&#39;dbhost&#39;], $this->settings[&#39;dbuser&#39;], $this->settings[&#39;dbpw&#39;], $this->settings[&#39;dbname&#39;], $this->settings[&#39;charset&#39;], $this->settings[&#39;pconnect&#39;]);
$this->settings = array();
}
if ($this->queryCount++ <= 99)
{
$this->queryLog[] = $sql;
}
if ($this->queryTime == &#39;&#39;)
{
if (PHP_VERSION >= &#39;5.0.0&#39;)
{
$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 != &#39;SILENT&#39;)
{
$this->error_message[][&#39;message&#39;] = &#39;MySQL Query Error&#39;;
$this->error_message[][&#39;sql&#39;] = $sql;
$this->error_message[][&#39;error&#39;] = $this->link_id->error;
$this->error_message[][&#39;errno&#39;] = $this->link_id->errno;
$this->ErrorMsg();
return false;
}
if (defined(&#39;DEBUG_MODE&#39;) && (DEBUG_MODE & 8) == 8)
{
$logfilename = $this->root_path . DATA_DIR . &#39;/mysql_query_&#39; . $this->dbhash . &#39;_&#39; . date(&#39;Y_m_d&#39;) . &#39;.log&#39;;
$str = $sql . "\n\n";
if (PHP_VERSION >= &#39;5.0&#39;)
{
file_put_contents($logfilename, $str, FILE_APPEND);
}
else
{
$fp = @fopen($logfilename, &#39;ab+&#39;);
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 = &#39;&#39;, $sql = &#39;&#39;)
{
if ($message)
{
echo "DTXB info: $message\n\n
";
//print(&#39;http://faq.comsenz.com/&#39;);
}
else
{
echo "MySQL server error report:";
print_r($this->error_message);
//echo "
http://faq.comsenz.com/";
}
exit;
}
/* 仿真 Adodb 函数 */
function selectLimit($sql, $num, $start = 0)
{
if ($start == 0)
{
$sql .= &#39; LIMIT &#39; . $num;
}
else
{
$sql .= &#39; LIMIT &#39; . $start . &#39;, &#39; . $num;
}
return $this->query($sql);
}
function getOne($sql, $limited = false)
{
if ($limited == true)
{
$sql = trim($sql . &#39; LIMIT 1&#39;);
}
$res = $this->query($sql);
if ($res !== false)
{
$row = $res->fetch_row();
$res->free();
if ($row !== false)
{
return $row[0];
}
else
{
return &#39;&#39;;
}
}
else
{
return false;
}
}
function getOneCached($sql, $cached = &#39;FILEFIRST&#39;)
{
$sql = trim($sql . &#39; LIMIT 1&#39;);
$cachefirst = ($cached == &#39;FILEFIRST&#39; || ($cached == &#39;MYSQLFIRST&#39; && $this->platform != &#39;WINDOWS&#39;)) && $this->max_cache_time;
if (!$cachefirst)
{
return $this->getOne($sql, true);
}
else
{
$result = $this->getSqlCacheData($sql, $cached);
if (empty($result[&#39;storecache&#39;]) == true)
{
return $result[&#39;data&#39;];
}
}
$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 = &#39;FILEFIRST&#39;)
{
$cachefirst = ($cached == &#39;FILEFIRST&#39; || ($cached == &#39;MYSQLFIRST&#39; && $this->platform != &#39;WINDOWS&#39;)) && $this->max_cache_time;
if (!$cachefirst)
{
return $this->getAll($sql);
}
else
{
$result = $this->getSqlCacheData($sql, $cached);
if (empty($result[&#39;storecache&#39;]) == true)
{
return $result[&#39;data&#39;];
}
}
$arr = $this->getAll($sql);
if ($arr !== false && $cachefirst)
{
$this->setSqlCacheData($result, $arr);
}
return $arr;
}
function getRow($sql, $limited = false)
{
if ($limited == true)
{
$sql = trim($sql . &#39; LIMIT 1&#39;);
}
$res = $this->query($sql);
if ($res !== false)
{
$result = $res->fetch_assoc();
$res->free();
return $result;
}
else
{
return false;
}
}
function getRowCached($sql, $cached = &#39;FILEFIRST&#39;)
{
$cachefirst = ($cached == &#39;FILEFIRST&#39; || ($cached == &#39;MYSQLFIRST&#39; && $this->platform != &#39;WINDOWS&#39;)) && $this->max_cache_time;
if (!$cachefirst)
{
return $this->getRow($sql, true);
}
else
{
$result = $this->getSqlCacheData($sql, $cached);
if (empty($result[&#39;storecache&#39;]) == true)
{
return $result[&#39;data&#39;];
}
}
$arr = $this->getRow($sql, true);
if ($arr !== false && $cachefirst)
{
$this->setSqlCacheData($result, $arr);
}
return $arr;
}
function getCol($sql)
{
$res = $this->query($sql);
if ($res !== false)
{
$arr = array();
while ($row = $res->fetch_row())
{
$arr[] = $row[0];
}
$res->free();
return $arr;
}
else
{
return false;
}
}
function getColCached($sql, $cached = &#39;FILEFIRST&#39;)
{
$cachefirst = ($cached == &#39;FILEFIRST&#39; || ($cached == &#39;MYSQLFIRST&#39; && $this->platform != &#39;WINDOWS&#39;)) && $this->max_cache_time;
if (!$cachefirst)
{
return $this->getCol($sql);
}
else
{
$result = $this->getSqlCacheData($sql, $cached);
if (empty($result[&#39;storecache&#39;]) == true)
{
return $result[&#39;data&#39;];
}
}
$arr = $this->getCol($sql);
if ($arr !== false && $cachefirst)
{
$this->setSqlCacheData($result, $arr);
}
return $arr;
}
function autoExecute($table, $field_values, $mode = &#39;INSERT&#39;, $where = &#39;&#39;, $querymode = &#39;&#39;)
{
$field_names = $this->getCol(&#39;DESC &#39; . $table);
$sql = &#39;&#39;;
if ($mode == &#39;INSERT&#39;)
{
$fields = $values = array();
foreach ($field_names AS $value)
{
if (array_key_exists($value, $field_values) == true)
{
$fields[] = $value;
$values[] = "&#39;" . $field_values[$value] . "&#39;";
}
}
if (!empty($fields))
{
$sql = &#39;INSERT INTO &#39; . $table . &#39; (&#39; . implode(&#39;, &#39;, $fields) . &#39;) VALUES (&#39; . implode(&#39;, &#39;, $values) . &#39;)&#39;;
}
}
else
{
$sets = array();
foreach ($field_names AS $value)
{
if (array_key_exists($value, $field_values) == true)
{
$sets[] = $value . " = &#39;" . $field_values[$value] . "&#39;";
}
}
if (!empty($sets))
{
$sql = &#39;UPDATE &#39; . $table . &#39; SET &#39; . implode(&#39;, &#39;, $sets) . &#39; WHERE &#39; . $where;
}
}
if ($sql)
{
return $this->query($sql, $querymode);
}
else
{
return false;
}
}
function autoReplace($table, $field_values, $update_values, $where = &#39;&#39;, $querymode = &#39;&#39;)
{
$field_descs = $this->getAll(&#39;DESC &#39; . $table);
$primary_keys = array();
foreach ($field_descs AS $value)
{
$field_names[] = $value[&#39;Field&#39;];
if ($value[&#39;Key&#39;] == &#39;PRI&#39;)
{
$primary_keys[] = $value[&#39;Field&#39;];
}
}
$fields = $values = array();
foreach ($field_names AS $value)
{
if (array_key_exists($value, $field_values) == true)
{
$fields[] = $value;
$values[] = "&#39;" . $field_values[$value] . "&#39;";
}
}
$sets = array();
foreach ($update_values AS $key => $value)
{
if (array_key_exists($key, $field_values) == true)
{
if (is_int($value) || is_float($value))
{
$sets[] = $key . &#39; = &#39; . $key . &#39; + &#39; . $value;
}
else
{
$sets[] = $key . " = &#39;" . $value . "&#39;";
}
}
}
$sql = &#39;&#39;;
if (empty($primary_keys))
{
if (!empty($fields))
{
$sql = &#39;INSERT INTO &#39; . $table . &#39; (&#39; . implode(&#39;, &#39;, $fields) . &#39;) VALUES (&#39; . implode(&#39;, &#39;, $values) . &#39;)&#39;;
}
}
else
{
if ($this->version() >= &#39;4.1&#39;)
{
if (!empty($fields))
{
$sql = &#39;INSERT INTO &#39; . $table . &#39; (&#39; . implode(&#39;, &#39;, $fields) . &#39;) VALUES (&#39; . implode(&#39;, &#39;, $values) . &#39;)&#39;;
if (!empty($sets))
{
$sql .= &#39;ON DUPLICATE KEY UPDATE &#39; . implode(&#39;, &#39;, $sets);
}
}
}
else
{
if (empty($where))
{
$where = array();
foreach ($primary_keys AS $value)
{
if (is_numeric($value))
{
$where[] = $value . &#39; = &#39; . $field_values[$value];
}
else
{
$where[] = $value . " = &#39;" . $field_values[$value] . "&#39;";
}
}
$where = implode(&#39; AND &#39;, $where);
}
if ($where && (!empty($sets) || !empty($fields)))
{
if (intval($this->getOne("SELECT COUNT(*) FROM $table WHERE $where")) > 0)
{
if (!empty($sets))
{
$sql = &#39;UPDATE &#39; . $table . &#39; SET &#39; . implode(&#39;, &#39;, $sets) . &#39; WHERE &#39; . $where;
}
}
else
{
if (!empty($fields))
{
$sql = &#39;REPLACE INTO &#39; . $table . &#39; (&#39; . implode(&#39;, &#39;, $fields) . &#39;) VALUES (&#39; . implode(&#39;, &#39;, $values) . &#39;)&#39;;
}
}
}
}
}
if ($sql)
{
return $this->query($sql, $querymode);
}
else
{
return false;
}
}
function setMaxCacheTime($second)
{
$this->max_cache_time = $second;
}
function getMaxCacheTime()
{
return $this->max_cache_time;
}
function getSqlCacheData($sql, $cached = &#39;&#39;)
{
$sql = trim($sql);
$result = array();
$result[&#39;filename&#39;] = $this->root_path . $this->cache_data_dir . &#39;sqlcache_&#39; . abs(crc32($this->dbhash . $sql)) . &#39;_&#39; . md5($this->dbhash . $sql) . &#39;.php&#39;;
$data = @file_get_contents($result[&#39;filename&#39;]);
if (isset($data{23}))
{
$filetime = substr($data, 13, 10);
$data = substr($data, 23);
if (($cached == &#39;FILEFIRST&#39; && time() > $filetime + $this->max_cache_time) || ($cached == &#39;MYSQLFIRST&#39; && $this->table_lastupdate($this->get_table_name($sql)) > $filetime))
{
$result[&#39;storecache&#39;] = true;
}
else
{
$result[&#39;data&#39;] = @unserialize($data);
if ($result[&#39;data&#39;] === false)
{
$result[&#39;storecache&#39;] = true;
}
else
{
$result[&#39;storecache&#39;] = false;
}
}
}
else
{
$result[&#39;storecache&#39;] = true;
}
return $result;
}
function setSqlCacheData($result, $data)
{
if ($result[&#39;storecache&#39;] === true && $result[&#39;filename&#39;])
{
@file_put_contents($result[&#39;filename&#39;], &#39;&#39; . time() . serialize($data));
clearstatcache();
}
}
/* 获取 SQL 语句中最后更新的表的时间,有多个表的情况下,返回最新的表的时间 */
function table_lastupdate($tables)
{
if ($this->link_id === NULL)
{
$this->connect($this->settings[&#39;dbhost&#39;], $this->settings[&#39;dbuser&#39;], $this->settings[&#39;dbpw&#39;], $this->settings[&#39;dbname&#39;], $this->settings[&#39;charset&#39;], $this->settings[&#39;pconnect&#39;]);
$this->settings = array();
}
$lastupdatetime = &#39;0000-00-00 00:00:00&#39;;
$tables = str_replace(&#39;`&#39;, &#39;&#39;, $tables);
$this->mysql_disable_cache_tables = str_replace(&#39;`&#39;, &#39;&#39;, $this->mysql_disable_cache_tables);
foreach ($tables AS $table)
{
if (in_array($table, $this->mysql_disable_cache_tables) == true)
{
$lastupdatetime = &#39;2037-12-31 23:59:59&#39;;
break;
}
if (strstr($table, &#39;.&#39;) != NULL)
{
$tmp = explode(&#39;.&#39;, $table);
$sql = &#39;SHOW TABLE STATUS FROM `&#39; . trim($tmp[0]) . "` LIKE &#39;" . trim($tmp[1]) . "&#39;";
}
else
{
$sql = "SHOW TABLE STATUS LIKE &#39;" . trim($table) . "&#39;";
}
$result = $this->link_id->query($sql);
$row = $result->fetch_assoc();
if ($row[&#39;Update_time&#39;] > $lastupdatetime)
{
$lastupdatetime = $row[&#39;Update_time&#39;];
}
}
$lastupdatetime = strtotime($lastupdatetime) - $this->timezone + $this->timeline;
return $lastupdatetime;
}
function get_table_name($query_item)
{
$query_item = trim($query_item);
$table_names = array();
/* 判断语句中是不是含有 JOIN */
if (stristr($query_item, &#39; JOIN &#39;) == &#39;&#39;)
{
/* 解析一般的 SELECT FROM 语句 */
if (preg_match(&#39;/^SELECT.*?FROM\s*((?:`?\w+`?\s*\.\s*)?`?\w+`?(?:(?:\s*AS)?\s*`?\w+`?)?(?:\s*,\s*(?:`?\w+`?\s*\.\s*)?`?\w+`?(?:(?:\s*AS)?\s*`?\w+`?)?)*)/is&#39;, $query_item, $table_names))
{
$table_names = preg_replace(&#39;/((?:`?\w+`?\s*\.\s*)?`?\w+`?)[^,]*/&#39;, &#39;\1&#39;, $table_names[1]);
return preg_split(&#39;/\s*,\s*/&#39;, $table_names);
}
}
else
{
/* 对含有 JOIN 的语句进行解析 */
if (preg_match(&#39;/^SELECT.*?FROM\s*((?:`?\w+`?\s*\.\s*)?`?\w+`?)(?:(?:\s*AS)?\s*`?\w+`?)?.*?JOIN.*$/is&#39;, $query_item, $table_names))
{
$other_table_names = array();
preg_match_all(&#39;/JOIN\s*((?:`?\w+`?\s*\.\s*)?`?\w+`?)\s*/i&#39;, $query_item, $other_table_names);
return array_merge(array($table_names[1]), $other_table_names[1]);
}
}
return $table_names;
}
/* 设置不允许进行缓存的表 */
function set_disable_cache_tables($tables)
{
if (!is_array($tables))
{
$tables = explode(&#39;,&#39;, $tables);
}
foreach ($tables AS $table)
{
$this->mysql_disable_cache_tables[] = $table;
}
array_unique($this->mysql_disable_cache_tables);
}
/**
+----------------------------------------------------------
* 启动事务
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @return void
+----------------------------------------------------------
*/
public function startTrans() {
//$this->initConnect(true);
if ( !$this->link_id ) return false;
//数据rollback 支持
if ($this->transTimes == 0) {
$this->link_id->autocommit(FALSE);
}
$this->transTimes++;
return ;
}
/**
+----------------------------------------------------------
* 用于非自动提交状态下面的查询提交
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @return boolen
+----------------------------------------------------------
*/
public function commit()
{
if ($this->transTimes > 0) {
$result = $this->link_id->commit();
$this->transTimes = 0;
if(!$result){
$this->error_message[][&#39;message&#39;] = &#39;MySQL Query Error&#39;;
$this->error_message[][&#39;sql&#39;] = $sql;
$this->error_message[][&#39;error&#39;] = $this->link_id->error;
$this->error_message[][&#39;errno&#39;] = $this->link_id->errno;
$this->ErrorMsg();
return false;
}
}
return true;
}
/**
+----------------------------------------------------------
* 事务回滚
+----------------------------------------------------------
* @access public
+----------------------------------------------------------
* @return boolen
+----------------------------------------------------------
*/
public function rollback()
{
if ($this->transTimes > 0) {
$result = $this->link_id->rollback();
$this->transTimes = 0;
if(!$result){
$this->error_message[][&#39;message&#39;] = &#39;MySQL Query Error&#39;;
$this->error_message[][&#39;sql&#39;] = $sql;
$this->error_message[][&#39;error&#39;] = $this->link_id->error;
$this->error_message[][&#39;errno&#39;] = $this->link_id->errno;
$this->ErrorMsg();
return false;
}
}
return true;
}
}
Copy after login

代码当中加了几个方法,用于支持事务。

(2)更改cls_image.php的gd_version()方法,将这个方法改为静态方法,并且所有调用此方法的地方,都改为静态调用。

PHP5.6开始,已经不支持不兼容的上下文调用方法,并且产生 E_DEPRECATED 错误(以前是 E_STRICT)。

更改如下:

includes/cls_images.php,(gd_version方法体添加static关键字)
/**
* 获得服务器上的 GD 版本
*
* @access public
* @return int 可能的值为0,1,2
*/
static function gd_version()
{
....
}
Copy after login

在好几处调用此方法的地方都改为静态调用,比如includes/cls_images.php的好几个方法在调用时使用类对象调用:

function make_thumb($img, $thumb_width = 0, $thumb_height = 0, $path = &#39;&#39;, $bgcolor=&#39;&#39;)
{
$gd = $this->gd_version(); //获取 GD 版本。0 表示没有 GD 库,1 表示 GD 1.x,2 表示 GD 2.x
。。。
}
Copy after login

将其改为:

function make_thumb($img, $thumb_width = 0, $thumb_height = 0, $path = &#39;&#39;, $bgcolor=&#39;&#39;)
{
$gd = self::gd_version(); //获取 GD 版本。0 表示没有 GD 库,1 表示 GD 1.x,2 表示 GD 2.x
。。。
}
Copy after login

还有includes/lib_base.php文件的gd_version函数,改为:

function gd_version()
{
include_once(ROOT_PATH . &#39;includes/cls_image.php&#39;);
return cls_image::gd_version();
}
Copy after login

其他文件代码在调用时,最好改为调用lib_base文件的gd_version的函数。可以搜索更改。

(3)更改includes/lib_main.php文件的get_dyna_libs函数,该第一行的代码:

function get_dyna_libs($theme, $tmp)
{
$ext = end(explode(&#39;.&#39;, $tmp));
。。。
}
Copy after login

更改为:

function get_dyna_libs($theme, $tmp)
{
$tmp_ext = explode(&#39;.&#39;, $tmp);
$ext = end($tmp_ext);
}
Copy after login

end方法的接受的参数必须是引用传递值,这里使用了explode方法返回值,不可以直接套用。

(4)includes/cls_template.php代码:

preg_replace方法,自PHP5.5开始 /e修饰符已经废弃,所以要使用preg_replace_callback代替。此代替有多处:

fetch_str方法:

fetch_str($source)
{
。。。
return preg_replace_callback("/{([^\}\{\n]*)}/",&#39;self::select_replace&#39;, $source);
}
//新增的方法
private function select_replace($matches){
return $this->select($matches[1]);
}
Copy after login

select方法:

function select($tag)
{
。。。
$pregReplace = preg_replace_callback("/(\&#39;\\$[^,]+)/" , function($matches){
return stripslashes(trim($matches[1],&#39;\&#39;&#39;));
}, var_export($t, true));
。。。
}
smarty_prefilter_preCompile方法:
$source = preg_replace_callback($pattern, function($matches){
return &#39;{include file=&#39;.strtolower($matches[1]). &#39;}&#39;;
}, $source);
Copy after login

(5)将所有类的构造函数,都去除使用类名的构造函数,保留__construct():

涉及此改动的超多,用搜索一一找到并改动吧……这个就不列举了。

The above is the detailed content of How to modify and support PHP7 in ecshop. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What is the architecture of ecshop? What is the architecture of ecshop? Feb 23, 2023 am 09:32 AM

ecshop is a "B2C" architecture; ecshop is a B2C independent online store system, suitable for enterprises and individuals to quickly build personalized online stores; the system is a cross-platform open source program developed based on PHP language and MYSQL database architecture.

What are the methods for sorting ecshop articles? What are the methods for sorting ecshop articles? Jun 16, 2023 am 11:30 AM

How to sort ecshop articles: 1. Sort by publication time, you can control the order of articles in the list by modifying the publication time of the article; 2. Sort by clicks, you can achieve this sorting by installing the "Article Click Ranking" plug-in Function, this plug-in can count the number of clicks on articles; 3. Sort by the number of comments, you can implement this sorting function by installing the "Article Comment Ranking" plug-in, which can count the number of comments on articles; 4. Sort by relevance, This sorting function can be achieved by installing the "Search Ranking" plug-in.

What are the characteristics of ecshop? What are the characteristics of ecshop? Feb 13, 2023 am 09:43 AM

Features: 1. Open source system with flexibility, customizability and high scalability; 2. Support independent secondary development; 3. Rich templates and plug-ins; 4. Strong industry adaptability; 5. Avoid being constrained by software vendors; 6. Stronger reliability and stability; 7. Mobile H5 framework upgrade, based on VUE comprehensive replacement, more flexible and open; 8. Multi-level rebate function, supporting QR codes, posters and other promotion methods, unlimited fission development of distributors ; 8. The visual interaction of the management terminal is completely renewed, the UI is simple and beautiful, and the operating experience is upgraded; 9. Supports PHP7.2, and the performance is doubled.

Ecshop product management advanced: learn how to add fields Ecshop product management advanced: learn how to add fields Mar 12, 2024 pm 02:06 PM

Ecshop Product Management Advanced: Learn how to add fields, you need specific code examples. When using Ecshop for product management, you often encounter situations where you need to add some custom fields to meet specific needs. By adding fields, more precise product management and better user experience can be achieved. This article will introduce how to add fields in Ecshop and provide specific code examples. First, we need to clarify the need to add fields. For example, we need to add a "production date" field to the product details page to

What program is ecshop? What program is ecshop? Feb 16, 2023 am 10:38 AM

ECShop is a B2C independent online store system. It is a cross-platform open source program developed based on PHP language and MYSQL database architecture. It is suitable for enterprises and individuals to quickly build personalized online stores. The characteristics of the ecshop mall system: 1. Support independent secondary development; 2. Rich templates and plug-ins; 3. Strong industry adaptability; 4. Avoid being constrained by software vendors; 5. Stronger reliability and stability.

What is the model of ecshop? What is the model of ecshop? Feb 22, 2023 am 09:37 AM

ecshop is a B2C model. ECShop is a B2C independent online store system, suitable for enterprises and individuals to quickly build personalized online stores. B2C refers to a model of e-commerce, and it is also a retail model that sells products and services directly to consumers; the payment method of B2C e-commerce is a combination of cash on delivery and online payment, and most companies choose logistics outsourcing for delivery. to save operating costs.

How to cancel delivery method in ecshop How to cancel delivery method in ecshop Mar 03, 2023 am 09:56 AM

How to cancel the shipping method in ecshop: 1. Find and open the "flow.dwt" file, and then delete "<!--{if $total.real_goods_count neq 0}-->...<!-- {/if} - ->" code; 2. Change "checkOrderForm(frm)" in "js/shopping_flow.js" to "if (document.getElementById(...)".

How to remove copyright at the bottom of ecshop How to remove copyright at the bottom of ecshop Aug 08, 2023 pm 02:42 PM

Method to remove the copyright at the bottom of ecshop: 1. Modify the template file, the specific location is: themes/your_theme directory, find the footer.html file in this directory, open it with a text editor, find the code segment containing the copyright information, delete it or Comment out. Just save the file and close it; 2. To use the plug-in, log in to the backend, click plug-in management, search for copyright and other related keywords at the bottom, select a suitable plug-in to install and enable it; 3. To purchase a theme, purchase it on the official website of ECShop etc.

See all articles