我有以下UPDATE语句:
"UPDATE table SET value=:value, symbol=:symbol WHERE id=:id";
值总是设置,但符号不一定是(意思是,如果用户不更新符号,它将保持不变)
对应的php代码:
$stmtDS->bindParam("value", $value);
if (isset($symbol))
$stmtDS->bindParam("symbol", $symbol);
问题是,如果未设置符号,则
出错参数号无效:绑定变量数与令牌数不匹配
那么有什么方法可以保留原始值而不需要另外选择查询来找出原始值?
答案 0 :(得分: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)));
这种方法提供了最大的灵活性。
答案 1 :(得分: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)