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ステートメントを作成するにはどうすればよいですか?

私には次の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が相互作用し、任意の数のパラメーターを取り、指定された値でその行を正しく更新し、他の元の値を変更しない単一のメソッド(と呼ばれる)をモデルに作成しようとすることです。

4

2 に答える 2

0

すべての列を更新ステートメントに含めて、値/パラメーターをステートメントにバインドしても意味がありません。setステートメントにカラーフィールドのみを配置し、where句にIDを指定できます。

于 2012-07-09T05:29:53.630 に答える
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 に答える