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);

为更新数据实现一个独特的占位符也是一个好主意。

它可以大大减少代码量,实际上只有一行,(使用safeMysql作为示例包装器):

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