1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作 php pdo sqlite php pdo odbc php开启pd

[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作 php pdo sqlite php pdo odbc php开启pd

时间:2023-12-23 19:33:54

相关推荐

[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作 php pdo sqlite php pdo odbc php开启pd

后端开发|php教程

php,pdo

后端开发-php教程

最近有一个批量更新数据库表中某几个字段的需求,在做这个需求的时候,使用了PDO做参数绑定,其中遇到了一个坑。

富贵电玩源码论坛,vscode代码调用树插件,ubuntu掉网卡,tomcat部分日志乱码,js判断爬虫,百度是用php,古诗词网站seo,php采集asp网站,p2p网贷网站模板lzw

方案选择

百度霸屏 源码,ubuntu机投屏,爬虫 放阿里云,php88888888,seo企业实质lzw

笔者已知的做批量更新有以下几种方案:

追格 小程序商店源码,如何打开vscode,硬盘安装ubuntu16,停用tomcat,sqlite管理桌面,可上传服务器免费空间,中文 验证码插件,前端框架基础学习,智联招聘java爬虫,php 概率,有哪些seo工具,png素材网站大全,编写网页播放视频,新闻管理html模板,页面滚动 文字动画效果怎么做,数据库餐饮管理系统课设,舵机 程序lzw

1、逐条更新

这种是最简单的方案,但无疑也是效率最低的方案。

2、CASE WHEN

类似如下的语句

UPDATE tbl_test SET val =CASE id WHEN1THEN2WHEN2THEN3ENDWHERE id IN(1, 2);

PDO绑定参数

为了防止SQL注入,使用了PDO扩展绑定参数。上面的数字在一般情况下是变量,那么就需要做参数绑定。刚开始是想着在IN的时候将id组成的字符串作为变量绑定过去,第一次实现的代码如下:

1 1, val => 2), array(id => 2, val => 3)); 3$ids = implode(,, array_map(function($v) {return$v[id];}, $data)); //获取ID数组 4$update_sql = UPDATE tbl_test SET val = CASE id; 5$params = array(); 6$params[":ids"] = $ids; 7foreach($dataas$key => $item) { 8$update_sql .= "WHEN :id_" . $key . "THEN :val_" . $key . " "; 9$params[":id_" . $key] = $item[id];10$params[":val_" . $key] = $item[val];11 }12$update_sql .= "END WHERE id IN (:_ids)";13TEST::execute($update_sql, $params);//此处会调用bindParam绑定参数

后来发现这样是行不通的,而且比较诡异的是这样只能更新第一条记录。查阅资料后,发现这样的绑定方式是不行的,IN语句的参数应该一个一个地绑定。看看文档中对bindParam函数的描述:

可以看到,说明里写的是会绑定一个PHP变量到占位符里,所以如果绑定了:ids为1, 2的字符串,那么MySQL解析语句的时候会将1,2解析为单个的变量,而不会当作一串。这也是PDO防SQL注入的原理,通过占位符的绑定,只将绑定的值当作一个值,而不是语句之类的其它东西,这样MySQL只会把传递过去的值当作一个变量的值。

修改后的写法:

1 1, val => 2), array(id => 2, val => 3)); 3$update_sql = UPDATE tbl_test SET val = CASE id; 4$params = array(); 5$params[":ids"] = $ids; 6$in_arr = array(); 7 8foreach($dataas$key => $item) { 9$update_sql .= "WHEN :id_" . $key . "THEN :val_" . $key . " ";10$params[":id_" . $key] = $item[id];11$params[":val_" . $key] = $item[val];12$params[":ids_" . $key] = $item[id];13array_push($in_arr, ":id_" . $key);14 }15$update_sql .= "END WHERE id IN (" . implode(, $in_arr) . ")";16TEST::execute($update_sql, $params);//此处会调用bindParam绑定参数

总结

这是最近遇到的一个小问题,其实更多的是说明在MySQL的IN语句里面做参数绑定时应该一个一个的绑定。

参考链接:

mysql语句:批量更新多条记录的不同值

Can I bind an array to an IN() condition?

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,请点下推荐,写文章不容易。

以上就介绍了[PDO绑定参数]使用PHP的PDO扩展进行批量更新操作,包括了php,pdo方面的内容,希望对PHP教学有兴趣的朋友有所帮助。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。