0

我正在创建一个与通过 PDO 连接到我的数据库的 MVC 设置(CodeIgniter)交互的 API,我想知道如何最好地实现下面描述的场景......

假设以下内容作为一行存在于 中Table1

| Id: 1 | Object: Box | Color: "red" | Length: 1 | Height: 2 | Width: 3 |

如果我进行以下 API 调用(伪代码):

$this->post( 'Table1/update', array('id'=>1, 'color' => "blue") );

假设颜色参数更新为“蓝色”,但所有其他参数保持不变。

*我要通过什么过程只更新颜色参数而不更新其他空参数?[假设有很多可能的参数,而不仅仅是4个] *

在我的模型中,我是否表现得像要更新所有内容并列出每个可能的参数,bindParam还是动态地(通过foreach循环)迭代所有可用参数以创建 PDO 语句以仅更新这些值?更简单地说,如何编写 PDO 语句以处理所有可能的行更新组合?

在我看来,我有以下两种选择,但它们似乎都不是很有效:

使用 foreach 循环仅考虑当前参数:

$sql = "UPDATE `Table1` 
        SET ";
$i = 0;
foreach( $params as $key => $val )
{
    $sql .= '`' . $key . '` = :' . $key;
    if( $i < count( $params )-1 )
    {
        $sql .= ', ';
    }
    $i++;
} 

$sql .= ' WHERE `Id` = :Id';

$stmt = $this->db->prepare( $sql );
foreach( $params as $key => $val )
{
    $stmt->bindParam( ':' . $key, $val, PDO::PARAM_STR );
}
$stmt->bindParam( ':Id', $params['id'], PDO::PARAM_INT );*/
$stmt->execute();
$stmt->closeCursor();

考虑所有参数:

$sql = "UPDATE `Table1` 
        SET `Color` = :Color, `Length` = :Length, `Height` = :Height, `Width` = :Width 
        WHERE `Id` =:Id";

$stmt = $this->db->prepare( $sql ); 
$stmt->bindParam( ':Color', $params['color'], PDO::PARAM_STR );
$stmt->bindParam( ':Length', $params['length'], PDO::PARAM_INT );
$stmt->bindParam( ':Height', $params['height'], PDO::PARAM_INT );
$stmt->bindParam( ':Width', $params['width'], PDO::PARAM_INT );
$stmt->bindParam( ':Id', $params['id'], PDO::PARAM_INT );
$stmt->execute();
$stmt->closeCursor();

更新:

问题的真正症结在于尝试在模型中创建一个方法(称为update),API 可以与之交互并可以采用任意数量的参数并使用给定值正确更新该行,同时保持其他原始值不变。

4

2 回答 2

0

我遇到了同样的问题。我目前的想法是将所有字段值传递给 update(...) 函数,并使用布尔 $update 值成功每个值。仅当为此变量传入值 TRUE 时,相应的字段值才会包含在更新语句中。

function update_ad($id, $title, $update_title, $text, $update_text, $price, $update_price, $visible, $update_visible) {
            if ($update_title) {$this->db->set('title', $title);}
    if ($update_text) {$this->db->set('text', $text);}
    if ($update_price) {$this->db->set('price', $price);}
    if ($update_visible) {$this->db->set('visible', $visible);}

    $this->db->where('id', $id);
    $this->db->update('ad');
}
于 2012-10-09T13:09:47.650 回答
0

将所有列包含在更新语句中并将值/参数绑定到语句没有任何意义。您可以将颜色字段放在 set 语句中,并在 where 子句中给出 id。

于 2012-07-09T05:29:53.630 回答