[英]PHP/MySQL - UPDATE Query inserts new record instead updating the record
[英]UPDATE table record instead of adding a new record MySQL
好的..這是東西。 我想列出已登錄的用戶,並在注銷后更改其狀態。 這完美。 我為此創建了一個名為tblaudit_users的表。 我從tbl_users表中選擇的現有用戶。
我想要的是,如果tblaudit_users表中已經存在一個用戶,它將使用NOW()更新LastTimeSeen時間。 但是,它沒有更新該記錄,而是創建了一條新記錄。 這樣,桌子會越來越大,我想避免這種情況。 我為此使用的代碼如下所示:
+++++++++++++++++++
$ipaddress = $_SERVER['REMOTE_ADDR'];
if(isset($_SESSION['id'])){
$userId = $_SESSION['id'];
$username = $_SESSION['username'];
$achternaam = $_SESSION['achternaam'];
$district = $_SESSION['district'];
$gemeente = $_SESSION['gemeente'];
$query = $db->prepare("SELECT * FROM tblaudit_users WHERE username = '{$username}' AND active = '1' LIMIT 1");
$query->execute();
foreach($query->fetchAll(PDO::FETCH_OBJ) as $value){
$duplicate = $value->username;
}
if($duplicate != 1){
$insert = $db->prepare("
INSERT INTO tblaudit_users (user_id, username, achternaam, district, gemeente, ipaddress, LastTimeSeen, status)
VALUES ('{$userId}', '{$username}', '{$achternaam}', '{$district}', '{$gemeente}', '{$ipaddress}', NOW(), '1')
");
$insert->execute();
} elseif($duplicate = 1){
$update = $db->prepare("UPDATE tblaudit_users SET LastTimeSeen = NOW(),status = '1' WHERE username = '{$username}'");
$update->execute();
} else {
header('Location: index.php');
die();
}
}
我迷路了,搜尋了許多網站/頁面來解決這個問題,所以希望這里有人可以幫助我? 提前致謝 !!
更新:
我已經嘗試了以下方法,但沒有結果。
+++++
$insert = $db->prepare("
INSERT INTO tblaudit_users (user_id, username, achternaam, district, gemeente, ipaddress, LastTimeSeen, status)
VALUES ('{$userId}', '{$username}', '{$achternaam}', '{$district}', '{$gemeente}', '{$ipaddress}', NOW(), '1')
ON DUPLICATE KEY UPDATE set LastTimeSeen = NOW(), status = '1'
");
$insert->execute();
好。 我更改了查詢和代碼:
$query = $db->prepare("SELECT * FROM tblaudit_users WHERE username = '{$username}' LIMIT 1");
$query->execute();
if($query){
$insert = $db->prepare("
INSERT INTO tblaudit_users (user_id, username, achternaam, district, gemeente, ipaddress, LastTimeSeen, status)
VALUES ('{$userId}', '{$username}', '{$achternaam}', '{$district}', '{$gemeente}', '{$ipaddress}', NOW(), '1')
ON DUPLICATE KEY UPDATE set LastTimeSeen = NOW(), status = '1'
");
$insert->execute();
} else {
header('Location: index.php');
die();
}
}
我還添加了一個稱為pid(主ID)的UNIQUE密鑰。 還是行不通。
基於http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html ,請勿在更新語法中使用'set'
頁面中的示例:
INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9;
幾個問題:
$query
上進行測試,但這是您的語句對象,即使您沒有從select
語句返回的記錄,該對象也將有效。 insert
語句中有語法錯誤( set
不應該存在); insert ... on duplicate key update
的insert ... on duplicate key update
生效,您提供的值必須包含唯一鍵; select
和insert
不必要的分割:這可以在一個語句中完成 您可以使用num_rows()
編寫測試。 要獲取正確的計數,請調用store_result()
。 同樣好的做法是在發出下一個語句之前先關閉一條語句:
$query = $db->prepare("SELECT * FROM tblaudit_users
WHERE username = '{$username}' LIMIT 1");
$query->execute();
$query->store_result();
if($query->num_rows()){
$query->close();
// etc...
但是,當您insert ... on duplicate key update
時,整個查詢是不必要的:無需先進行select
檢查該用戶是否實際存在。 這全部由insert ... on duplicate key update
語句insert ... on duplicate key update
的insert ... on duplicate key update
完成。
INSERT
錯誤 ON DUPLICATE KEY UPDATE
的語法后面不應帶有單詞SET
。
盡管您使用准備好的語句(好!),但仍將字符串插入SQL語句中(壞!)。 准備好的語句的優點之一是,您可以使用bind_param()
來在查詢中使用參數,而無需將字符串實際注入SQL字符串中:
$insert = $db->prepare("
INSERT INTO tblaudit_users (user_id, username, achternaam, district,
gemeente, ipaddress, LastTimeSeen, status)
VALUES (?, ?, ?, ?, ?, ?, NOW(), '1')
ON DUPLICATE KEY UPDATE LastTimeSeen = NOW(), status = '1'
");
$insert->bind_param("ssssss", $userId, $username, $achternaam,
$district, $gemeente, $ipaddress);
$insert->execute();
這樣可以避免SQL注入 。
確保user_id
在tblaudit_users
具有唯一約束。 將另一個(auto_increment)字段用作主鍵是沒有幫助的。 它必須是您要為其插入值的字段之一。
上面的代碼不再使用$query
。 不用了
我發現了問題
if(isset($_SESSION['id'])){
$userId = $_SESSION['id'];
$username = $_SESSION['username'];
$achternaam = $_SESSION['achternaam'];
$district = $_SESSION['district'];
$gemeente = $_SESSION['gemeente'];
$query = $db->prepare("SELECT * FROM tblaudit_users WHERE user_id = '{$userId}' LIMIT 1");
$query->execute();
if($query->rowcount()<1){
$insert = $db->prepare("
INSERT INTO tblaudit_users (user_id, username, achternaam, district, gemeente, ipaddress, LastTimeSeen, status)
VALUES ('{$userId}', '{$username}', '{$achternaam}', '{$district}', '{$gemeente}', '{$ipaddress}', NOW(), '1')
");
$insert->execute();
} elseif($query->rowcount()>0) {
$update = $db->prepare("UPDATE tblaudit_users SET LastTimeSeen = NOW(),status = '1' WHERE user_id = '{$userId}'");
$update->execute();
} else {
header('Location: index.php');
die();
}
}
我選擇使用$ userId而不是在查詢中使用$ username,它可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.