![](/img/trans.png)
[英]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.