2

私は現在、基本的に PDO のラッパーを使用する PHP フレームワークを使用しており、問題に悩まされています。私は、次の任意の組み合わせである可能性のある任意の数の投稿変数を取るページを持っています:

":fullname" => $_POST['fullName'],
    ":universityID" => $_POST['university'], 
    ":gpa" => $_POST['gpa'], 
    ":major" => $_POST['major'], 
    ":gradYear" => $_POST['gradYear'], 
    ":photo" => "", 
    ":description" => $_POST['description'], 
    "howDidYouHear" => $_POST['howDidYouHear']

そして、次のような更新ステートメントがあります。

$affectedRows = getDatabase()->execute('UPDATE user SET universityID = :universityID, 
gpa = :gpa, etc, WHERE fullName=:fullName', array(':universityID' =>     
$_POST['universityID'], ':gpa' => $_POST['gpa']));

問題は、この種の更新ステートメントを実行すると、テーブル内の古いデータを上書きしてしまうことです。そのほとんどはまだ有効です。私がしたいのは、新しい情報がある行のみを更新し、他の行には触れないことです。クエリ内で変更すべきものとすべきでないものを把握する方法はありますか?

4

4 に答える 4

2

特定のフィールドに空の値を渡す場合、元の値を保持したいとします。ifあなたのUPDATE句で使用してください、例

UPDATE user 
SET universityID = IF(:universityID = '', universityID, :universityID),
    gpa = IF(:gpa = '', gpa, :gpa), ....

またはそのようなもの

于 2012-09-28T03:01:21.930 に答える
1
$sets = array();
$vals = array();

for ($_POST as $key => $value) {
  if ($value == '') { continue; }
  switch ($key) {
  case "university":
    $sets[] = 'universityID = ?';
    $vals[] = $value;
    break;
  case "gpa":
  case "major":
  case "gradYear":
  case "description":
  case "howDidYouHear":
    $sets = "$key = ?";
    $vals = $value;
    break;
  }

$sql = 'UPDATE user SET ' . implode(', ', $sets) . 'WHERE fullname = ?';
$vals[] = $_POST['fullname'];
$affectedRows = getDatabase()->execute($sql, $vals);
于 2012-09-28T03:57:24.103 に答える
0

選択クエリを作成して現在のデータを取得し、投稿データと比較して、変更のみを更新します。

于 2012-09-28T02:58:59.283 に答える
0

WHERE句に条件を追加します。

SELECT
 ...
WHERE fullName=:fullName
  AND thisRowIsNew=1
于 2012-09-28T03:00:38.260 に答える