0

我的网络应用程序中有一个功能,表格是“可快速编辑的”,也就是说,它的单元格可以直接编辑。当用户保存他的更改时,客户端将更改的行、更改的列(不包括未更改的列,只是为了澄清)及其相应的 ID 发送到服务器。

为了UPDATE有效地进行查询,我使用了 PDO 的预处理语句功能。这是我目前提出的等效声明:

UPDATE table
SET
   col1 = :arg_col1,
   col2 = :arg_col2,
   col3 = :arg_col3
WHERE
   ID = :arg_ID

然后我想出了这个问题,我无法将列设置为其当前值。因为只提交了一行中已编辑的列,所以我只需要将数据绑定到它们各自的列。例如,如果只有col1andcol2被改变,结果语句应该是

UPDATE table
SET
   col1 = 'new data',
   col2 = 'an edit',
   col3 = col3   /* Use the current value of the column */
WHERE
   ID = 153454

直接修改语句肯定会使使用相同的预处理语句更新多行的性能提升无效。可悲的是,PDO 似乎没有将列绑定到其当前值的选项。

我应该如何解决这个问题?


附加:出于性能原因,我不希望发送所有列。

4

2 回答 2

1

不幸的是,您打算采用的方法实际上行不通。您只是不能在一次调用中准备一个语句,然后在所有后续调用中使用它 - 您必须每次都再次准备它。
因此,创建通用查询毫无意义。因此,您可以为数据集创建自定义查询。后一项任务可以自动化:只需动态创建 UPDATE 语句。

一个基于标签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);
于 2013-04-25T07:46:57.960 回答
1

您实际上不希望col3在sql中,您需要做的是动态构建sql,只需将更改的列添加到sql中。

于 2013-04-25T07:10:00.600 回答