1

次の UPDATE ステートメントがあります。

 "UPDATE table SET value=:value, symbol=:symbol WHERE id=:id";

値は常に設定されますが、シンボルは必ずしも設定する必要はありません (つまり、ユーザーがシンボルを更新しない場合、値は同じままになります)

対応するphpコード:

$stmtDS->bindParam("value", $value);
if (isset($symbol))
    $stmtDS->bindParam("symbol", $symbol);

問題は、シンボルが設定されていない場合、エラーが発生することです

無効なパラメータ番号: バインドされた変数の数がトークンの数と一致しません

元の値を見つけるために別の選択クエリを作成せずに元の値を保持する方法はありますか?

4

2 に答える 2

2

さまざまなクエリを作成する必要があります。ただし、以下のようなものが動的クエリの作成に役立ちます。

<?php

$updatedValues = array(
    'value' => $value,
);

if (isset($symbol)) {
    $updatedValues['symbol'] = $symbol;
}

$query = 'UPDATE table SET';
$separator = '';
foreach ($updatedValues as $key => $_) {
    $query .= ' ' . $separator . $key . ' = :' . $key;
    $separator = ',';
}
$query .= ' WHERE id = :id';

$stmt = $connection->prepare($query);
$stmt->execute(array_merge($updateValues, array('id', $id)));

この方法は、最も柔軟性があります。

于 2013-08-14T09:38:43.827 に答える
2

クエリも条件付きにする必要があります

$data = array("value" => $value, "id" => $id);

$symbol_set = '';
if (isset($symbol))
    $symbol_set = ", symbol=:symbol";
    $data["symbol"] => $symbol;
}

$sql = "UPDATE table SET value=:value $symbol_set WHERE id=:id";
$stm = $pdo->prepare($sql);
$stm->execute($data);

また、更新データ用に個別のプレースホルダーを実装することもお勧めします。

コードの量を実際には 1 行に劇的に減らすことができます (サンプル ラッパーとしてsafeMysqlを使用)。

$data = array("value" => $value);
$db->query("UPDATE table SET ?u WHERE id= ?i", $data, $id)
于 2013-08-14T09:40:28.810 に答える