0

テーブルが "クイック編集可能" である、つまりセルを直接編集できる Web アプリの機能があります。ユーザーが変更を保存すると、クライアントは変更された行、変更された列 (変更されていない列を除く)、および対応する ID をサーバーに送信します。

クエリを効率的に行うためにUPDATE、PDO のプリペアド ステートメント機能を使用しています。これは、私が現在思いついた同等のステートメントです。

UPDATE table
SET
   col1 = :arg_col1,
   col2 = :arg_col2,
   col3 = :arg_col3
WHERE
   ID = :arg_ID

次に、列を現在の値に設定できないというこの問題を思いつきました。行内の編集された列のみが送信されるため、データをそれぞれの列にバインドするだけで済みます。たとえば、 と のみcol1col2変更された場合、結果のステートメントは次のようになります。

UPDATE table
SET
   col1 = 'new data',
   col2 = 'an edit',
   col3 = col3   /* Use the current value of the column */
WHERE
   ID = 153454

ステートメントを直接変更すると、同じ準備済みステートメントを使用して複数の行を更新することによるパフォーマンスの向上が確実に無効になります。残念ながら、PDO には、列を現在の値にバインドするオプションがないようです。

この問題を解決するにはどうすればよいですか?


追加:パフォーマンス上の理由から、すべての列を送信したくありません。

4

2 に答える 2

1

残念ながら、あなたが目指しているアプローチは実際には機能しません。1 回の呼び出しでステートメントを準備して、その後のすべての呼び出しでそれを使用することはできません。毎回もう一度準備する必要があります。
したがって、一般的なクエリを作成しても意味がありません。したがって、まさにデータ セットのカスタム クエリを作成できます。そして、この後者のタスクは自動化できます。UPDATE ステートメントを動的に作成するだけです。

タグ wikiに基づく解決策(一番下までスクロール):

// first, have your update data in array (you can omit this line though)
$update = $_POST;

// next, list all fields a user allowed to
$allowed = array("col1","col2","col3");

// finally, create a SET statement query dynamically
$set = pdoSet($fields,$values, $update);

// voila - your query contains only fields were POSTed:
$sql = "UPDATE users SET $set WHERE id = :id";
$stm = $dbh->prepare($sql);

// just add an ID and execute
$values["id"] = $_POST['id'];
$stm->execute($values);
于 2013-04-25T07:46:57.960 に答える
1

実際にはcol3、SQL を使用したくありません。SQL を動的に構築し、変更された列のみを SQL に追加する必要があります。

于 2013-04-25T07:10:00.600 に答える