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ステートメントを作成するにはどうすればよいですか?
私には次の2つのオプションがあるように見えますが、どちらも非常に効率的ではないようです。
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が相互作用し、任意の数のパラメーターを取り、指定された値でその行を正しく更新し、他の元の値を変更しない単一のメソッド(と呼ばれる)をモデルに作成しようとすることです。