使用带有UPDATE命令的mysql PDO,但不要覆盖所有值

时间:2012-09-28 02:56:46

标签: php mysql pdo

我目前正在使用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']));

现在的问题是,如果我执行这种更新语句,我将覆盖表中的旧数据,其中大部分仍然有效。我想要做的只是更新我有新信息的行,而不是触及其他行。有没有办法在查询中弄清楚应该和不应该更改哪些?

4 个答案:

答案 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