我目前正在使用PHP框架,它基本上使用PDO的包装器,并且遇到了问题。我有一个页面,它接受任意数量的post变量,可以是以下任意组合:
":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']));
现在的问题是,如果我执行这种更新语句,我将覆盖表中的旧数据,其中大部分仍然有效。我想要做的只是更新我有新信息的行,而不是触及其他行。有没有办法在查询中弄清楚应该和不应该更改哪些?
答案 0 :(得分:2)
假设如果在某个字段中传递空值,则希望它保留原始值。在if
子句中使用UPDATE
,例如
UPDATE user
SET universityID = IF(:universityID = '', universityID, :universityID),
gpa = IF(:gpa = '', gpa, :gpa), ....
或类似的东西
答案 1 :(得分: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);
答案 2 :(得分:0)
进行选择查询以获取当前数据,与发布数据进行比较,并仅更新更改。
答案 3 :(得分:0)
为WHERE
子句添加更多条件。
SELECT
...
WHERE fullName=:fullName
AND thisRowIsNew=1