2

我目前正在使用一个 PHP 框架,该框架基本上使用 PDO 的包装器,并且被一个问题难住了。我有一个页面,其中包含任意数量的帖子变量,可以是以下任意组合:

":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 回答