2009-04-16 69 views
0

我有以下條件代碼,如果具有相應用戶名的記錄不存在,它將插入新記錄,並在記錄存在時更新記錄。這工作正常。sql更新時不會覆蓋現有信息

但是,目前,如果我插入一條新記錄,並且只插入名字和姓氏,並且可能地址詳細信息中的電話信息被留爲空白,這很好。如果我希望只用電話記錄更新記錄,則名稱和地址信息將被替換爲無。

我想知道的是,如果它可能有一個簡單的方法來填充我的PHP的HTML形式更新信息,與我將更新字段的內容?我使用

<input type="text" name="uniquename" /> 

爲了得到用戶輸入,然後將其傳遞給javascript函數,然後將其傳遞迴下面PHP代碼。如果這是不可能的,有沒有一種簡單的方法來工作一些SQL/PHP的魔術,只更新一個字段相應的userinput不是空的?

$usernameQuery = "select username from USERS where username = '" . $con->escape_string($username) . "'"; 

$xblah = $con->query($usernameQuery); 
    while ($row = mysqli_fetch_assoc($xblah)) 
    { 
    $checkUsername = $row['username']; 
    } 

if ($checkUsername == null) { 

$userQuery = "INSERT INTO USERS VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 
if ($userInfo = $con->prepare($userQuery)) { 
    $userInfo->bind_param("ssssssssssssssssssss", $username, $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $comments); 
    $userInfo->execute(); 
    $userInfo->close(); 
    echo "true"; 
} else { 
echo "false"; 
} 
print_r($con->error); 
} 

else if ($checkUsername == $username) { 

$userQuery = "UPDATE USERS SET firstname = ?, lastname = ?, flaggedauctions = ?, lastauction = ?, street1 = ?, city1 = ?, postcode1 = ?, street2 = ?, city2 = ?, postcode2 = ?, phone = ?, mobilephone = ?, fax = ?, email = ?, website = ?, bank = ?, banknumber = ?, accoutnumber = ? WHERE username = ?"; 
if ($userInfo = $con->prepare($userQuery)) { 
    $userInfo->bind_param("sssssssssssssssssss", $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $username); 
    $userInfo->execute(); 
    $userInfo->close(); 
    echo "true"; 
} else { 
echo "false"; 
} 
print_r($con->error); 
} 

回答

1

你只需要建立你的更新語句並動態地綁定參數。 例如

$userQuery = "UPDATE "; 

if (!empty($firstname)) { 
    $userQuery += "firstname = ?,"; 
} 

...  

if (!empty($firstname)) { 
    $bindArgs[] = $firstname; 
} 
... 

因此,您的查詢不會更新不應更改的列。

+0

嗯,謝謝。 bindArgs發生了什麼? – 2009-04-16 04:05:10

+0

我的PHP技巧有點生疏,但我認爲你可以將$ bindArgs傳遞給bind_param函數。 我相信你可以將數組傳遞給PHP中的可變數字參數函數。 – oscarkuo 2009-04-16 04:17:43

0

更一般地,注意:

  • 這是明智的INSERT指定的列名... VALUES否則,如果有人將一列你會生氣,如果有人重新排序列你」會感到困惑。

  • 有你的選擇,你的更新之間的競爭條件......另一個進程可以插入/刪除行,而你還在想,造成你的插入/更新失敗考慮之一:

    • INSERT ...對重複密鑰更新...
    • REPLACE INTO ...