Thinkphp怎么批量更新数据
thinkphp批量更新数据可以参考如下三种方法:
创新互联长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为江州企业提供专业的网站设计制作、成都网站建设,江州网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
方法一:
//批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式
function batch_update($table_name='',$data=array(),$field=''){
if(!$table_name||!$data||!$field){
return false;
}else{
$sql='UPDATE '.$table_name;
}
$con=array();
$con_sql=array();
$fields=array();
foreach ($data as $key = $value) {
$x=0;
foreach ($value as $k = $v) {
if($k!=$field!$con[$x]$x==0){
$con[$x]=" set {$k} = (CASE {$field} ";
}elseif($k!=$field!$con[$x]$x0){
$con[$x]=" {$k} = (CASE {$field} ";
}
if($k!=$field){
$temp=$value[$field];
$con_sql[$x].= " WHEN '{$temp}' THEN '{$v}' ";
$x++;
}
}
$temp=$value[$field];
if(!in_array($temp,$fields)){
$fields[]=$temp;
}
}
$num=count($con)-1;
foreach ($con as $key = $value) {
foreach ($con_sql as $k = $v) {
if($k==$key$key$num){
$sql.=$value.$v.' end),';
}elseif($k==$key$key==$num){
$sql.=$value.$v.' end)';
}
}
}
$str=implode(',',$fields);
$sql.=" where {$field} in({$str})";
$res=M($table_name)-execute($sql);
return $res;
}
//测试
function test(){
$update_array=array();
for ($i=2; $i 7 ; $i++) {
$data=array();
$data['id']=$i;
$data['memeber_type']=2;
$data['memeber_type_state']=1;
$update_array[]=$data;
}
$res=$this-batch_update('yl_member',$update_array,id);
var_dump($res);
}
方法二:
即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。
那么能不能一条sql语句实现批量更新呢?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
WHERE id IN (1,2,3)
这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
如果更新多个值的话,只需要稍加修改:
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
实际运用
$display_order = array(
1 = 4,
2 = 1,
3 = 2,
4 = 3,
5 = 9,
6 = 5,
7 = 8,
8 = 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id = $ordinal) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
方法二不建议使用。
方法三:
/*
* @param $saveWhere :想要更新主键ID数组
* @param $saveData :想要更新的ID数组所对应的数据
* @param $tableName : 想要更新的表明
* @param $saveWhere : 返回更新成功后的主键ID数组
* */
public function saveAll($saveWhere,$saveData,$tableName){
if($saveWhere==null||$tableName==null)
return false;
//获取更新的主键id名称
$key = array_keys($saveWhere)[0];
//获取更新列表的长度
$len = count($saveWhere[$key]);
$flag=true;
$model = isset($model)?$model:M($tableName);
//开启事务处理机制
$model-startTrans();
//记录更新失败ID
$error=[];
for($i=0;$i$len;$i++){
//预处理sql语句
$isRight=$model-where($key.'='.$saveWhere[$key][$i])-save($saveData[$i]);
if($isRight==0){
//将更新失败的记录下来
$error[]=$i;
$flag=false;
}
//$flag=$flag$isRight;
}
if($flag ){
//如果都成立就提交
$model-commit();
return $saveWhere;
}elseif(count($error)0count($error)$len){
//先将原先的预处理进行回滚
$model-rollback();
for($i=0;$icount($error);$i++){
//删除更新失败的ID和Data
unset($saveWhere[$key][$error[$i]]);
unset($saveData[$error[$i]]);
}
//重新将数组下标进行排序
$saveWhere[$key]=array_merge($saveWhere[$key]);
$saveData=array_merge($saveData);
//进行第二次递归更新
$this-saveAll($saveWhere,$saveData,$tableName);
return $saveWhere;
}
else{
//如果都更新就回滚
$model-rollback();
return false;
}
}
在测试方法中调用:
public function test(){
//要更新的数据表的主键数组
$where['ID']=array(70,73,74,80,83);
//ID主键数组对应的待更新数据
$save=array(
array('School'='DK Univisity01','isExport'=0),
array('School'='DK Univisity02','isExport'=0),
array('School'='DK Univisity03','isExport'=0),
array('School'='DK Univisity04','isExport'=0),
array('School'='','isExport'=0),
// array('School'=' Univisity05','isExport'=0),
);
$f=$this-saveAll($where,$save,'want');
if(count($f['ID'])0){
//返回更新成功的ID数组
echo "This is success :/br";
dump($f);
echo 'ok';
}else{
//更新失败操作
echo "This is failed :/br";
dump($f);
echo 'error';
}
}
php每天抓取数据并更新新
以前我用过querylist插件抓数据,服务器写和定时器,每天固定时间去运行脚本。朝这个方式试试
高并发下数据的更新,应该 update table xxx set num = num - 1 的方式,这种方式可以保证数据的正确性。
但是会出现 num 为负数的问题,如果库存为负数,显然是不合理的。
于是,需要将 num 字段设置为 无符号整型,这样就不会出现负数了,因为,如果减到负数,就会更新失败。
但是这种依然会造成很多无用的更新语句的执行,是不合理的。
于是,update table xxx set num = num - 1 where num 0,
这样当 num 等于0之后就不会去更新数据库了,减少了很多无用的开销。
这种方式被称作“乐观锁”
此外,对于抢红包这种非整数的操作,我们应该转换为整数的操作。
关于抢购超卖的控制
一般抢购功能是一个相对于正常售卖系统来说独立的子系统,这样既可以防止抢购时的高并发影响到正常系统,
也可以做到针对于抢购业务的特殊处理。
在后台设计一些功能,可以就昂正常的商品加入到抢购活动中并编辑成为抢购商品,写入到抢购商品表,当然
也可以把抢购商品表写入redis而不是数据表。并且在原商品表写入一个同样的商品(id相同,用于订单查看,
此商品不可购买)
如果是数据表,为了控制超卖,需要对表进行行锁,更新的时候带上 where goods_amount 0。
如果是redis,使用 hincrby 一个负数来减库存,并且 hincrby 会返回改变后的值,再来判断返回值是否大于0,
因为redis每个命令都是原子性的,这样不用锁表就可控制超卖。
php中如何实现实时更新数据呢?jQuery?
网页一般是单向主动短链接,实时更新实在有些不便,即使一方掉线,另一方也不能及时感知。一般所谓的实时刷新,大多采用定时刷新(轮询),或长轮询的方式做,ajax用于更新数据确实是比较简单方便的。
轮询你就settimeout,长轮询你就每次接收数据成功后,再来一次长轮询。但你链接别人的数据,了解一下供应商的刷新机制、周期再做考虑。
当然这些都是伪实时,真的实时用http协议是不合适的,你得用flash插件做。而你用的是api供应商的东西,这条路就基本走不通了。
PHP CI框架修改数据的方法
CI框架下的PHP增删改查总结:
controllers下的 cquery.php文件
[php] view plain copy
?php
class CQuery extends Controller {
//构造函数
function CQuery() {
parent::Controller();
// $this-load-database();
}
function index() {
//调用model 其中train为外层文件夹 MQuery为model名称 queryList为重命名
$this-load-model('train/MQuery','queryList');
//获得返回的结果集 这里确定调用model中的哪个方法
$result = $this-queryList-queryList();
//将结果集赋给res
$this-smarty-assign('res',$result);
//跳转到显示页面
$this-smarty-view('train/vquery.tpl');
}
//进入新增页面
function addPage() {
$this-smarty-view('train/addPage.tpl');
}
//新增
function add() {
//获得前台数据
//用户名
$memberName = $this-input-post('memberName');
//密码
$password = $this-input-post('password');
//真实姓名
$userRealName = $this-input-post('userRealName');
//性别
$sex = $this-input-post('sex');
//出生日期
$bornDay = $this-input-post('bornDay');
//e_mail
$eMail = $this-input-post('eMail');
//密码问题
$question = $this-input-post('question');
//密码答案
$answer = $this-input-post('answer');
//调用model
$this-load-model('train/MQuery','addRecord');
//向model中的addRecord传值
$result = $this-addRecord-addRecord($memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer);
//判断返回的结果,如果返回true,则调用本页的index方法,不要写 $result == false 因为返回的值未必是false 也有可能是""
if ($result) {
$this-index();
} else {
echo "add failed.";
}
}
//删除
function deletePage() {
//获得ID
$deleteID = $this-uri-segment(4);
//调用model
$this-load-model('train/MQuery','delRecord');
//将值传入到model的delRecord方法中
$result = $this-delRecord-delRecord($deleteID);
//判断返回值
if ($result) {
$this-index();
} else {
echo "delect failed.";
}
}
//修改先查询
function changePage() {
$changeID = $this-uri-segment(4);
$this-load-model('train/MQuery','changeRecord');
$result = $this-changeRecord-changeRecord($changeID);
//将结果集赋给res
$this-smarty-assign('res',$result);
//跳转到显示页面
$this-smarty-view('train/changePage.tpl');
}
//修改
function change() {
//获得前台数据
//ID
$ID = $this-input-post('id');
//用户名
$memberName = $this-input-post('memberName');
//密码
$password = $this-input-post('password');
//真实姓名
$userRealName = $this-input-post('userRealName');
//性别
$sex = $this-input-post('sex');
//出生日期
$bornDay = $this-input-post('bornDay');
//e_mail
$eMail = $this-input-post('eMail');
//密码问题
$question = $this-input-post('question');
//密码答案
$answer = $this-input-post('answer');
//调用model
$this-load-model('train/MQuery','change');
//向model中的change传值
$result = $this-change-change($ID,$memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer);
//判断返回的结果,如果返回true,则调用本页的index方法,不要写 $result == false 因为返回的值未必是false 也有可能是""
if ($result) {
$this-index();
} else {
echo "change failed.";
}
}
}
models中的 mquery.php 文件
[php] view plain copy
?php
class MQuery extends Model {
//构造函数
function MQuery() {
parent::Model();
//连接数据库
$this-load-database();
}
//查询列表
function queryList() {
//防止select出的数据存在乱码问题
//mysql_query("SET NAMES GBK");
//SQL语句
$sql = "SELECT ID,member_name,sex,e_mail FROM user_info_t";
//执行SQL
$rs = $this-db-query($sql);
//将查询结果放入到结果集中
$result = $rs-result();
//关闭数据库
$this-db-close();
//将结果集返回
return $result;
}
//新增
function addRecord($memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer) {
//防止select出的数据存在乱码问题
//mysql_query("SET NAMES GBK");
//SQL语句
$sql = "INSERT INTO user_info_t (member_name,password,user_real_name,sex,born_day,e_mail,question,answer) " .
"VALUES ('$memberName','$password','$userRealName','$sex','$bornDay','$eMail','$question','$answer')";
//执行SQL
$result = $this-db-query($sql);
//关闭数据库
$this-db-close();
//返回值
return $result;
}
//删除
function delRecord($deleteID) {
//防止select出的数据存在乱码问题
//mysql_query("SET NAMES GBK");
$sql = "DELETE FROM user_info_t WHERE ID = $deleteID";
$result = $this-db-query($sql);
$this-db-close();
return $result;
}
//修改前查询
function changeRecord($changeID) {
//防止select出的数据存在乱码问题
//mysql_query("SET NAMES GBK");
$sql = "SELECT ID,member_name,password,user_real_name,sex,born_day,e_mail,question,answer FROM user_info_t WHERE ID = $changeID";
//执行SQL
$rs = $this-db-query($sql);
$result = $rs-row();//$result = $rs[0]
//关闭数据库
$this-db-close();
//将结果集返回
return $result;
}
//修改
function change($ID,$memberName,$password,$userRealName,$sex,$bornDay,$eMail,$question,$answer) {
//防止select出的数据存在乱码问题
//mysql_query("SET NAMES GBK");
//SQL语句
$sql = "update user_info_t set member_name = '$memberName',password = '$password', user_real_name = '$userRealName'," .
"sex = '$sex',born_day = '$bornDay',e_mail = '$eMail',question = '$question',answer = '$answer'" .
"where ID = $ID";
//执行SQL
$result = $this-db-query($sql);
//关闭数据库
$this-db-close();
//返回值
return $result;
}
}
views 下的 addPage.tpl文件
[php] view plain copy
html
head
/head
bodyform action="{{site_url url='train/cquery/add'}}" method="post"
table border='1'
tr
td用户名/td
tdinput type="text" class="text" name="memberName" id="memberName"//td
/tr
tr
td密码/td
tdinput type="text" class="text" name="password" id="password"//td
/tr
tr
td真实姓名/td
tdinput type="text" class="text" name="userRealName" id="userRealName"//td
/tr
tr
td性别/td
tdinput type="text" class="text" name="sex" id="sex"//td
/tr
tr
td出生日期/td
tdinput type="text" class="text" name="bornDay" id="bornDay"//td
/tr
tr
tde_mail/td
tdinput type="text" class="text" name="eMail" id="eMail"//td
/tr
tr
td密码问题/td
tdinput type="text" class="text" name="question" id="question"//td
/tr
tr
td密码答案/td
tdinput type="text" class="text" name="answer" id="answer"//td
/tr
/table
table
tr
tdinput type="submit" class="button" name="OK" value="提交" /
/td
/tr
/table/form
/body
/html
PHP里面, 想要更新数据,但是数据一开始不存在。请问要怎么写才能达到更新的效果?
这里常规的做法就是先用select判断数据是否存在,存在则update,不存在则insert
不过如果是mysql,那么还有replace的用法,他会自动判断是否有数据,有则更新,没有则插入,sql的写法跟insert很相似
replace into table_name (id, name) values (1, 'name')
两种方法有各自的优缺点,具体用那种还是需要结合实际情况来判断
标题名称:phpci更新数据,php更新数据库数据
标题网址:http://scgulin.cn/article/hdgpoo.html