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