2012-02-08 10 views
2

私は、ユーザがデータベースにユーザを追加、編集、削除できるアプリケーションを構築しています。PHPでテーブルを動的に更新する方法

は、私は「表示のユーザーの(結合されたテーブルを返すSELECT文を)やったと「ユーザーの追加」を(記入するユーザーのためのフォームを返し、そしてもちろんの検証後、データベースへの挿入)

しかし、私を'ユーザーの編集'に問題があります。

マイ編集フォームは、追加フォームと同じですが、テキストボックスの値はデータベースの値で埋められます。

提出する際に、ユーザの入力やデータベースの値間のミスマッチのためのロジックをチェックし(だから我々は我々が実際にデータベースに更新しているか知っている)

だから私はそのすべての値の配列で終わります

$values_to_update = array (
    "telephone" => "07788991010" 
    "email_address" => "[email protected]" 
); 

この配列の値は動的であり、各フィールドを動的に更新する方法が必要です。

また、フィールドは異なるテーブルに由来する場合もあります。

私はしたくない:

if (isset ($values_to_update[ "telephone" ])) 
    $database->update("UPDATE users SET telephone = '{$values_to_update[ "telephone" ]}' WHERE user_id = $user_id"); 

else if (isset ($values_to_update[ "email_address" ])) 
    $database->update("UPDATE authentication SET email_address = '{$values_to_update[ "email_address" ]}' WHERE user_id = $user_id"); 

else if (/* ... */) 
    // etc etc etc 

誰が私はこれを行うことができ、より良い方法のいずれかのアイデアを持っていますか?

私はおそらく、1つのHUGEアップデートステートメントを使用できると思っていましたが、データをフェッチする同じselectステートメントが使用されていました。しかし、私はこれがどのように機能するのかわかりません。

動的クエリ生成のためのフィールド配列をアプリケーションに格納するのが標準的な方法ですか?

+0

すばらしいSQL注入穴があります。誰かがトラックを運転した場合、残念です。 –

+0

それはコピーされたコードではありません。そのコード私はすぐにポイントを取得するために書きました。ありがとうございました –

答えて

4

(また、Zend Frameworkのに使用されている)私はPDOスタイルのORMマッパーでこれを行うので見つけたきれいな方法:

public function save($model) { 
    // Possible values to insert 
    $values = array(
     ":id" => $model->id, 
     ":name" => $model->name, 
     //... 
     ":contact_number" => $model->telephone 
    ); 

    // If model id is set, we are updating a record, otherwise inserting 
    if (isset($model->id)) { 
     $sql = "UPDATE tbl SET name = :name, ..., contact_number = :contact_number WHERE id = :id LIMIT 1"; 
    } else { 
     // Don't pass the ID when it isn't in the query 
     unset($values[":id"]); 
     $sql = "INSERT INTO tbl (name, ..., contact_number) VALUES (:name, ..., :contact_number)"; 
    } 

    // Execute the query with our values (below is a PDO example) 
    $stmt = $this->db->prepare($sql); 
    $stmt->execute($values); 
    $stmt->closeCursor(); 

    // Get the new ID if we inserted 
    if (!isset($model->id)) { 
     $model->id = $this->db->lastInsertId(); 
    } 

    return $model; 
} 

通常、これは各モデルのための単一のsave方法を書くになります。最初に検索されたモデルのコピーを保持することで、変更された列のみを更新できるようにすることができますが、すべての列を更新することで大きなオーバーヘッドは見られません。

関連する問題