Php 如何在PDO中绑定当前列值?

Php 如何在PDO中绑定当前列值?,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我的web应用程序中有一个功能,表可以“快速编辑”,也就是说,它的单元格可以直接编辑。当用户保存其更改时,客户端将更改的行及其更改的列(不包括未更改的列,只是为了澄清)和相应的ID发送给服务器 为了高效地执行UPDATE查询,我使用了PDO的prepared statement特性。下面是我目前提出的一个同等声明: 更新表 设置 col1=:arg_col1, col2=:arg_col2, col3=:arg_col3 哪里 ID=:arg\u ID 然后我提出了一个问题,在这个问题中,我不

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

为了高效地执行
UPDATE
查询,我使用了PDO的prepared statement特性。下面是我目前提出的一个同等声明:

更新表
设置
col1=:arg_col1,
col2=:arg_col2,
col3=:arg_col3
哪里
ID=:arg\u ID
然后我提出了一个问题,在这个问题中,我不能将一列设置为它的当前值。因为一行中只有编辑过的列被提交,所以我只需要将数据绑定到它们各自的列。例如,如果仅更改了
col1
col2
,则结果语句应为

更新表
设置
col1=‘新数据’,
col2=‘编辑’,
col3=col3/*使用列的当前值*/
哪里
ID=153454
直接修改语句肯定会抵消使用同一条准备好的语句更新多行的性能改进。遗憾的是,PDO似乎没有将列绑定到其当前值的选项

我应该如何解决这个问题



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

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

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

解决方案,基于(滚动至最底部):


将值存储在一个变量中,并将列绑定到该变量。首先,尝试使用real中的“高效”解决方案。你会感到惊讶的。@你的常识是的。我只是在充分利用每一个机会。:)但我想准备一次语句并将其应用于所有行。没有其他选择吗?
// 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);