首页 > 后端开发 > 正文

php中tp框架sql更新 THINKPHP 用sql原生语句update 不管用

2023-09-26 08:26:53 | 我爱编程网

对于后端开发比较关注的小伙伴们一定非常关心php中tp框架sql更新 THINKPHP 用sql原生语句update 不管用,今天我爱编程网小编为大家整理了以下内容,下面一起来看看吧。

php中tp框架sql更新 THINKPHP 用sql原生语句update 不管用

php如何实现更新功能


php实现更新功能的方法:首先制作升级包,增量更新;然后验证上传文件,并验证当前系统版本;接着备份原来的代码,并当升级失败时进行回滚;最后记录升级日志,返回升级进度即可。
推荐:《PHP视频教程》
php 实现一个简单的项目升级功能
思路
1.制作升级包,增量更新
2.升级包上传验证上传文件,验证当前系统版本
3.升级之前要先备份原来的代码,升级失败要进行回滚
4.记录升级日志,返回升级进度
5.升级包应该是加密的(暂时没实现)
说明
1.升级包的目录结构必须如下
/**
* 升级包规定的目录结构
* xxx_版本号.zip(如:xxx_1.0.0.zip)
* |
* |————mysql
* | |
* | |___mysql_update.sql(更新脚本)
* | |___mysql_rockback.sql(回滚脚本)
* |
* |____php
*
*/2.mysql_update.sql
create table test(id init(11));
create table test2(id init(11));
mysql_rockback.sql
drop table test;
drop table test2;
4.代码
class UpgradeSys{
public $update_log = "/tmp/web/update_log.log"; //系统升级日志
public $return_log = "/tmp/web/return_log.log"; //系统回滚日志
public $progress_log = "/tmp/web/progress_log.log"; //记录进度
public $root_dir = "/Users/feng/Documents/work/test"; //站点代码的根目录
public $aFile = ["log","runtime"];//忽略文件夹相对路径
public $backup_dir = "/tmp/web/backup_dir";//备份目录
public $upload_dir = "/tmp/web/upload_dir";//升级包目录
public $sys_version_num = '1.0.0';//当前系统的版本 这个在实际应用中应该是虫数据库获取得到的,这里只是举个例子
/** 展示升级界面 */
public function index()
{
include("update.html");
}
/**
* 处理升级包上传
*/
public function upload()
{
$params = $_POST;
if($_FILES)
{
$name = $_FILES['file']['tmp_name'];
if(!$name || !is_uploaded_file($name))
{
echo json_encode(["status"=>0,"msg"=>"请上传升级包文件"]);
die;
}
}
//校验后缀
$astr = explode('.',$name);
$ext = array_pop($astr);
if($ext != 'zip')
{
echo json_encode(["status"=>0,"msg"=>"请上传文件格式不对"]);
die;
}
//校验升级密码
// if(!isset($params['password']) || $params['password'] != $this->password)
// {
// echo json_encode(["status"=>0,"msg"=>"密码错误"]);
// die;
// }
//对比版本号
$astr = explode('_',$name);
$version_num = str_replace(".zip", '',array_pop($astr));
if(!$version_num)
{
echo json_encode(["status"=>0,"msg"=>"获取版本号失败"]);
die;
}
//对比
if(!$this->compare_version($version_num))
{
echo json_encode(["status"=>0,"msg"=>"不能升级低版本的"]);
die;
}
$package_name = $this->upload_dir.'/'.$version_num.'.zip';
if(!move_uploaded_file($name,$package_name))
{
echo json_encode(["status"=>0,"msg"=>"上传文件失败"]);
die;
}
//记录下日志
$this->save_log("上传升级包成功!");
$this->update_progress("20%");
//备份code
$result = $this->backup_code();
if(!$result)
{
$this->save_log("备份失败!");
echo json_encode(["status"=>0,"msg"=>"备份失败"]);
die;
}
$this->update_progress("30%");
//执行升级
$this->execute_update($package_name);
}
/**
* 升级操作
* @return [type] [description]
*/
private function execute_update($package_name)
{
//解压 如何使用zip加密压缩,这里解压缩的时候注意要解密
exec(" cd $upload_dir && unzip $package_name ");
$package_name = str_replace(".zip","",$package_name);
if(!is_dir($package_name))
{
$this->save_log("解压失败");
echo json_encode(["status"=>0,"msg"=>"解压失败"]);
die;
}
$this->update_progress("50%");
//升级mysql
if(file_exists($this->upload_dir.'/'.$package_name."/mysql/mysql_update.sql"))
{
$result = $this->database_operation($this->upload_dir.'/'.$package_name."/mysql/mysql_update.sql");
if(!$result['status'])
{
echo json_encode($result);die;
}
}
$this->update_progress("70%");
//升级PHP
if(is_dir($this->upload_dir.'/'.$package_name.'/php'))
{
exec("cd {$this->upload_dir}/{$package_name}/php && cp -rf ./* $this->root_dir ",$mdata,$status);
if($status != 0 )
{
$this->save_log("php更新失败");
//数据库回滚
if(file_exists($this->upload_dir.'/'.$package_name."/mysql/mysql_rockback.sql"))
{
$this->save_log("数据库回滚");
$this->database_operation($this->upload_dir.'/'.$package_name."/mysql/mysql_rockback.sql");

}
//php代码回滚
$cmd = "cp -rf " .$this->backup_dir."/".$this->sys_version_num.'/'.basename($this->root_dir)."/* ".$this->root_dir;
exec($cmd,$mdata,$status);
$this->save_log("php回滚");
echo json_encode(["status"=>0,"msg"=>"php更新失败"]);
die;
}
}
//把解压的升级包清除
exec("rm -rf $upload_dir/$package_name ");

$this->update_progress("100%");
//更新系统的版本号了
//更新php的版本号了(应该跟svn/git的版本号一致)
//更新数据库的版本号了(应该跟svn/git的版本号一致)
echo json_encode(["status"=>1,"msg"=>"升级成功"]);
die;
}
/**
* 比较代码版本
* @return [type] [description]
*/
private function compare_version($version_num='1.0.0')
{

return version_compare($version_num,$this->sys_version_num,'>');
}
/**
* 备份代码
*/
private function backup_code()
{
//rsync 要确定系统是否已经安装
$cmd = "cd $root_dir && cd .. && rsync -av ";
foreach ($this->aFile as $key => $value) {
$cmd ."--exclude ". basename($this->root_dir) ."/".$value ." ";
}
$cmd .= basename($this->root_dir)." ".$this->backup_dir."/".$this->sys_version_num;
exec($cmd,$mdata,$status);
if($status != 0)
{
return false;
}
//这里还可以对备份的文件进行压缩
return true;
}
/**
* 数据库操作
*/
public function database_operation($file)
{
$mysqli = new mysqli("localhost","root","root","test");
if($mysqli->connect_errno)
{
return ["status"=>0,"msg"=>"Connect failed:".$mysqli->connect_error];
}
$sql = file_get_contents($file);
$a = $mysqli->multi_query($sql);
return ["status"=>1,"msg"=>"数据库操作OK"];
}
/**
* 返回系统升级的进度
*/
public function update_progress($progress)
{
exec(" echo '".$progress."' > $this->progress_log ");
}
/**
* 记录日志
*/
public function save_log($msg,$action="update")
{
$msg .= date("Y-m-d H:i:s").":".$msg."
";
if($action == "update")
{
exec(" echo '".$msg."' >> $this->update_log ");
}else
{
exec(" echo '".$msg."' >> $this->return_log ");
}
}
}

php中tp框架sql更新 THINKPHP 用sql原生语句update 不管用

THINKPHP 用sql原生语句update 不管用

$row=mysql_query("update survey set option1=".$pro['option1'].""); 修改为 $row=mysql_query("update survey set option1='".$pro['option1']."'"); option1这个变量如果是int类型的话,你第一句是可以的,如果是字符,这个是更新不进去的,需要在变量外面加入单引号('变量值'); 还有一点,这个更新操作,最好别判断$row,因为如果用户在修改的时候,想来想去,最终所有字段都未修改,你这个程序进去了,最终还是会判断的,但是你sql语句没有修改,还是原来的值sql默认是不会做操作的,也就是说没修改的情况下,$rows还是返回false,这样你这个就会提示文章修改失败!! 希望能对你有所帮助

php中tp框架sql更新 THINKPHP 用sql原生语句update 不管用我爱编程网

使用PHP语言向SQL中的一个表update多条记录,使用for循环语句只能更新最后一条信息,请问应该怎么写语句?

你是想实现什么?是要把指定的记录更新成一样的?还是更新的每天数据的值都不一样?我这有集中解决思路:
a)建议你面向对象的方式写,把更新的过程(语句)写进了function里(也可以不用写,直接执行sql语句),再在for循环内层调用,这样就会相当于批量执行,这样想更新数据,就要根据for循环的数组中的值而确定。如这样:
$arr=array('desetang','d.n.sky','time');
for($i=0;$i<count($arr);$i++){
//update 语句或过程
$a=sqlupdate('表名';所选字段';'条件','更新内容$arr[$i]');//这是我举得例子
}
b)在调试过程中建议echo一下SQL语句,这样会方便的找出是否是sql语句错误
c)检查一下你的for循每次是不会在相同的数据中插入,付sql update
UPDATE`desetang`.`tags`SET`describe`='ui' WHERE`tags`.`id`=36;

以上就是我爱编程网小编为大家带来的内容了,希望能够帮助到大家,了解更多后端开发资讯敬请关注我爱编程网。
与“php中tp框架sql更新 THINKPHP 用sql原生语句update 不管用”相关推荐
php框架打印sql语句 请教thinkphp3打印sql语句
php框架打印sql语句 请教thinkphp3打印sql语句

PHP的PDO能不能打印出上一条执行的sql语句打印sql语句,直接在你执行SQL语句后输出$queries=DB::getQueryLog();$a=end($queries);$tmp=str_replace('?','"'.'%s'.'"',$a["query"]);echovsprintf($tmp,$a['bindings']);exit;实例:

2023-09-22 21:08:26
php框架打印sql语句 PHP的PDO能不能打印出上一条执行的sql语句
php框架打印sql语句 PHP的PDO能不能打印出上一条执行的sql语句

请教thinkphp3打印sql语句thinkphp如何打印sql语句thinkphp如何打印sql语句?比如$member=M("member");$map['id']=1;$result=$member-&gt;where($map)-&gt;delete();SQL语句应该是delete*fromtablememberwhereid=1;怎样输出这个sql判断?我记得有个函

2023-09-22 21:08:43
php原生和框架哪个好 php框架中的方法与原生sql语句的区别,面试的时候被问到这个问题。
php原生和框架哪个好 php框架中的方法与原生sql语句的区别,面试的时候被问到这个问题。

在php框架中,是用框架提供的方法函数还是用原生php代码写,哪个效率高?同样逻辑下hp框架本身就是由原生的php代码写成的,原理上是和原生php没什么区别的。只是php框架在程序结构上和文件目录上对php代码做了很好的规范,使php程序更有调理、结构更加清晰,而且php框架本身就写好了很多常用的类和方法,可以大大的节约开发者时间。所以,理论上说php框架相对原生php的性能或效率是

2023-09-27 03:04:40
PHP原生好还是框架好 php框架中的方法与原生sql语句的区别,面试的时候被问到这个问题。
PHP原生好还是框架好 php框架中的方法与原生sql语句的区别,面试的时候被问到这个问题。

纠结使用原生PHP还是框架?php本身就可以理解为一个web开发框架,针对web,针对http已经把很多细节封装好了,你就直接用就OK。比如,你调用setcookie,下次就能通过$_COOKIE获取到值,使用框架只是为了避免重复造轮子而已,框架一般集合了ORM、缓存机制、模板机制等等,如果不用框架自己从零开始写的话,那任务量繁重而且基本一个人也很难实现这么多功能,如果有框架的话,那么就方便

2023-09-28 07:36:49
php框架模型和直接sql比较 在php程序员里用面向对象写sql语句好还面向过程好?那个效率更快、速度更高?
php框架模型和直接sql比较 在php程序员里用面向对象写sql语句好还面向过程好?那个效率更快、速度更高?

php模板与框架区别问题smarty主要是模板引擎,功能是将MVC中view层的php和html代码分离,并不算框架,比如将&lt;?phpecho$var;?&gt;替换为&lt;!--{$var}--&gt;,以便让美工可以更好的阅读html布局,不过老实说在这点上有点脱裤子放P的感觉。现在一般主流的框架都直接用php来当模板语言了,不太建议使用smarty,当然这东西比较简单,随便看下

2023-10-05 04:48:24
php原生和框架有什么区别 php框架中的方法与原生sql语句的区别,面试的时候被问到这个问题。
php原生和框架有什么区别 php框架中的方法与原生sql语句的区别,面试的时候被问到这个问题。

在php框架中,是用框架提供的方法函数还是用原生php代码写,哪个效率高?同样逻辑下hp框架本身就是由原生的php代码写成的,原理上是和原生php没什么区别的。只是php框架在程序结构上和文件目录上对php代码做了很好的规范,使php程序更有调理、结构更加清晰,而且php框架本身就写好了很多常用的类和方法,可以大大的节约开发者时间。所以,理论上说php框架相对原生php的性能或效率是

2023-10-06 16:44:54
php框架中如何防止sql注入 ThinkPHP如何防止SQL注入?
php框架中如何防止sql注入 ThinkPHP如何防止SQL注入?

如何防范sql注入防止SQL注入的方式有:执行sql语句时使用addslashes进行sql语句转换,过滤掉sql语句中的一些关键词,提高数据库表和字段的命名技巧等。SQL注入产生的原因程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。防止SQL注入的方式1、开启配置文件中的magic_quot

2023-10-03 15:10:33
tp框架好用还是原生php好用 thinkphp和microphp哪个好
tp框架好用还是原生php好用 thinkphp和microphp哪个好

纠结使用原生PHP还是框架?php本身就可以理解为一个web开发框架,针对web,针对http已经把很多细节封装好了,你就直接用就OK。比如,你调用setcookie,下次就能通过$_COOKIE获取到值,使用框架只是为了避免重复造轮子而已,框架一般集合了ORM、缓存机制、模板机制等等,如果不用框架自己从零开始写的话,那任务量繁重而且基本一个人也很难实现这么多功能,如果有框架的话,那么就方便

2023-10-06 09:08:32