我的网络应用程序中有一个功能,其中一个表格是“可快速编辑的”,也就是说,它的单元格可以直接编辑。当用户保存更改时,客户端会向服务器发送已更改的行及其更改的列(不包括未更改的列,只是为了澄清)及其相应的ID。
为了有效地进行UPDATE
查询,我使用的是PDO准备好的语句功能。这是我目前提出的同等声明:
UPDATE table
SET
col1 = :arg_col1,
col2 = :arg_col2,
col3 = :arg_col3
WHERE
ID = :arg_ID
然后我想出了这个问题,我无法将列设置为其当前值。因为只提交了一行中已编辑的列,所以我只需要将数据绑定到它们各自的列。例如,如果仅更改col1
和col2
,则生成的语句应为
UPDATE table
SET
col1 = 'new data',
col2 = 'an edit',
col3 = col3 /* Use the current value of the column */
WHERE
ID = 153454
直接修改语句肯定会使使用相同的预准备语句更新多行的性能改进无效。遗憾的是,PDO似乎没有选择将列绑定到其当前值。
我该如何解决这个问题?
ADDITIONAL:出于性能原因,我不希望发送所有列。
答案 0 :(得分:1)
你实际上不希望sql中有col3
,你需要做的是动态构建sql,只将更改的列添加到sql中。
答案 1 :(得分:1)
不幸的是,您所针对的方法实际上并不起作用。你不能在一个电话中准备一个声明,然后在所有后续电话中使用它 - 你必须每次都准备它。
因此,创建通用查询没有意义。因此,您可以为该数据集创建自定义查询。后一个任务可以自动化:只需动态创建UPDATE语句。
基于tag wiki的解决方案(滚动到最底部):
// first, have your update data in array (you can omit this line though)
$update = $_POST;
// next, list all fields a user allowed to
$allowed = array("col1","col2","col3");
// finally, create a SET statement query dynamically
$set = pdoSet($fields,$values, $update);
// voila - your query contains only fields were POSTed:
$sql = "UPDATE users SET $set WHERE id = :id";
$stm = $dbh->prepare($sql);
// just add an ID and execute
$values["id"] = $_POST['id'];
$stm->execute($values);