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