仅通过我自己的API通过PDO更新数据库行

时间:2012-07-09 05:01:32

标签: php mysql codeigniter pdo

我正在创建一个与通过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可以与之交互,并且可以使用任意数量的参数并使用给定的值正确更新该行,同时保持其他原始值不变。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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');
}