2012-09-28 34 views
2

我目前正在使用基本上使用PDO包裝的PHP框架,並且難以解決問題。我有一個網頁,其中採用任何數量的職位變數,這可能是以下的任意組合:與UPDATE命令一起使用mysql 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'])); 

現在問題是如果我做這種更新聲明,我將覆蓋表中的舊數據,其中大部分仍然有效。我想要做的只是更新我有新信息的行,而不是觸及其他行。有沒有辦法在查詢中找出哪些應該被改變?

+0

東西嘗試'的var_dump($ _ POST);',看看裏面有什麼 – alfasin

+0

你寫的「我只更新行新信息「。你不是指專欄,而是專欄? – Barmar

+0

@Barmar,我的道歉,你是對的,我的意思是專欄。 – theother404

回答

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

我花了一分鐘的時間閱讀這個解決方案,弄清楚它是如何工作的,但現在我看到我喜歡它!我一定要嘗試一下。 – theother404

+0

我最終使用您的解決方案進行了一些修改以解決我的問題,非常感謝! – theother404

0

進行選擇查詢以獲取當前數據,與發佈數據進行比較,並僅更新更改。

+0

我明白了,那是我正在嘗試做的事情,我只是在練習中遇到了麻煩,現在我明白了:) – theother404

0

爲您的WHERE條款添加更多條件。

SELECT 
... 
WHERE fullName=:fullName 
    AND thisRowIsNew=1 
+0

我只需要根據用戶標識選擇1行進行更新,但如果我理解了什麼你的意思是,但我不認爲這會奏效。 – theother404

+0

如果這是你真正要問的問題,那就太好了。 –

2

假設如果您在某個字段中傳遞空值,您希望它保留原始值。在UPDATE子句中使用if,例如

UPDATE user 
SET universityID = IF(:universityID = '', universityID, :universityID), 
    gpa = IF(:gpa = '', gpa, :gpa), .... 

或類似的

+1

我最初正在考慮這一點,我只是在努力尋找我能夠如何實現if語句來工作,謝謝你的例子,它對你有很大的幫助! – theother404

+0

即使我沒有使用這個解決方案,我很高興現在看到我在查詢中如何使用IF,所以謝謝。 – theother404

+0

這很好。謝謝!! – Zoolander