依托Thinkphp框架实现APP数据表在线更新升级功能
在开发网站应用时,版本升级是必须具备的功能。对发行出去的版本实现自动化更新数据表信息,对应用的维护都具有实战意义。本文来实现此功能,相比Migrations这种数据表版本管理要简单很多;
首先新建一个Update.php控制器:
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Db;
use think\facade\View;
class Update extends BaseController
{
public function index( ){
$request = $this->request;
/**这里注意站点根目录是绑定到public */
$version_file = BASE_ROOT ."/version.php";
include $version_file;
$isupdate = 0;
$request->version = $version; /*此变量在 version.php文件*/
$update_file = BASE_ROOT ."/update.php";
if(is_file($update_file)) {
include $update_file;
}
if($isupdate ==1){
$text='<?php $version = "'.$request->new_version.'" ;';
file_put_contents($version_file , $text);
}
if($isupdate){
return json(['message' => '升级成功']);
}
return json(['message' => '升级结束']);
}
}
然后再Public目录下有两个文件:
update.php 和version.php文件,里面的代码:
update.php代码内容:
<?php
$new_version = '1.1.91';
/*当前站点版本$request->version 小于发行版本时开始运行下面代码 */
if (version_compare($request->version, $new_version, "<")) {
$request->new_version = $new_version;
/*=============把数据库更新写在这里================*/
// 插入新表
$add_table_sql = "CREATE TABLE IF `ims_cache` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key` varchar(100) NOT NULL,
`value` text NOT NULL,
`expired_at` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `key` (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
if (!table_is_exist('ims_cache')) {
\think\facade\Db::query($add_table_sql);
}
/**更新表字段 */
if (!table_has_field('ims_cache', 'isused')) {
\think\facade\Db::query("ALTER TABLE ims_cache ADD isused tinyint(1) COMMENT '是否再链接中'");
}
/*===============把数据库更新写在这里===========*/
/*下面是固定返回*/
$isupdate = 1;
}
version.php代码内容:
<?php $version = "1.1.91" ;
/*当这个值比 update.php第一行 写的 版本值低的时候,会执行更新*/
然后再app/common.php 公共函数文件,添加两个函数:
function table_is_exist();
function table_has_field();
function table_is_exist($tablename) {
$ret = \think\facade\Db::query("show tables like '$tablename' ");
if (empty($ret)) {
return false;
}
return true;
}
function table_has_field($tablename, $fieldname) {
$ret = \think\facade\Db::query("show full columns from $tablename ");
if (empty($ret)) {
return false;
}
$bool = false;
foreach ($ret as $key => $val) {
if ($val['Field'] == $fieldname) {
$bool = true;
}
}
return $bool;
}
实现的重点在public/ update.php内,它用来写数据表的变更情况;
插入新表 用 table_is_exist先判断,然后再执行插入;
更新表字段先table_has_field判断字段是否存在,再执行增加操作;
好了本文全部内容结束,感谢您的阅读,希望能帮助到您。