2013-04-25 42 views
0

我在我的web应用程序中有一个功能,其中一个表是“快速编辑”,也就是说,它的单元格可以直接编辑。当用户保存其更改时,客户端会将更改的行(其中包含更改的列(不包括未更改的列,仅用于说明))及其对应的ID发送到服务器。如何绑定PDO中的当前列值?

为了有效地做UPDATE查询,我使用了PDO准备的语句功能。以下是我目前来到了一个等效的语句:

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

于是我想出了这个问题,我不能设置一个列到它的当前值。因为只有一行中的编辑列被提交,所以我只需要将数据绑定到它们各自的列。例如,如果只col1col2发生变化,由此产生的说法应该是

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

直接修改声明肯定会抵消使用同样准备好的声明中更新多行的性能改进。可悲的是,PDO似乎没有将列绑定到当前值的选项。

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


补充:我不想把所有的列,出于性能的考虑。

+0

存储在一个变量中的值和列绑定到变量 – Satya 2013-04-25 06:41:58

+0

尝试在真实第一这个“有效”的解决方案。你会感到惊讶。 – 2013-04-25 07:39:25

+0

@YourCommonSense是的。我只是充分利用每一个机会。 :) – 2013-04-25 07:41:38

回答

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); 
1

你实际上不想在sql中使用col3,你需要做的是动态构建sql,只添加改变的列到sql中。

+0

但我想准备一次陈述并将其应用于所有行。没有其他选择吗? – 2013-04-25 07:14:02