基于SESSION ID使用INSERT ON DUPLICATE KEY UPDATE实现分数存改的PHP问题
解决INSERT ... ON DUPLICATE KEY UPDATE的语法错误问题
嘿,我来帮你搞定这个SQL语法问题!你想用INSERT ... ON DUPLICATE KEY UPDATE实现"存在则更新,不存在则插入"的逻辑,思路完全没问题,但语法写错了,而且还有个关键前提得先确认。
首先要确认的核心前提
你的selfesteemscore表必须给UserID字段设置唯一约束(UNIQUE KEY),否则ON DUPLICATE KEY UPDATE根本不会生效——这个语法的核心就是靠唯一键冲突来触发更新操作的。如果还没设置,先给表加个唯一键:
ALTER TABLE selfesteemscore ADD UNIQUE KEY idx_userid (UserID);
分析你的错误写法
你尝试的两个SQL都不符合语法规范:
- 第一个错误:
ON DUPLICATE KEY UPDATE后面不需要再写表名和WHERE子句,数据库已经能通过唯一键冲突定位到要更新的行,多余的语法直接导致了报错。 - 第二个错误:用了类似
INSERT的VALUES(...)格式,这不是ON DUPLICATE KEY UPDATE的正确写法,正确的是直接指定列名和对应的更新值。
正确的代码实现
方式1:直接指定更新值
<?php session_start(); // 别忘了开启Session,否则$_SESSION["userID"]拿不到值 include("php/functions.php"); include('connections/conn.php'); $userID = $_SESSION["userID"]; $newsselfesteemscore = mysqli_real_escape_string($conn, $_POST['selfesteemscore']); // 正确的INSERT ... ON DUPLICATE KEY UPDATE语法 $insertquery1 = "INSERT INTO selfesteemscore(selestscore, UserID) VALUES('$newsselfesteemscore', '$userID') ON DUPLICATE KEY UPDATE selestscore = '$newsselfesteemscore'"; $result1 = mysqli_query($conn, $insertquery1) or die(mysqli_error($conn)); mysqli_close($conn); ?>
方式2:用VALUES()函数复用插入值(更简洁)
如果插入和更新的字段值一致,可以用VALUES(列名)来引用插入时的值,这样后面修改值的时候只需要改一处:
$insertquery1 = "INSERT INTO selfesteemscore(selestscore, UserID) VALUES('$newsselfesteemscore', '$userID') ON DUPLICATE KEY UPDATE selestscore = VALUES(selestscore)";
更安全的建议:使用预处理语句
虽然你用了mysqli_real_escape_string来转义,但预处理语句能更彻底地避免SQL注入问题,推荐改成这样:
<?php session_start(); include("php/functions.php"); include('connections/conn.php'); $userID = $_SESSION["userID"]; $newsselfesteemscore = $_POST['selfesteemscore']; // 预处理SQL $stmt = $conn->prepare("INSERT INTO selfesteemscore(selestscore, UserID) VALUES(?, ?) ON DUPLICATE KEY UPDATE selestscore = ?"); // 绑定参数(s代表字符串,i代表整数,根据你的字段实际类型调整) $stmt->bind_param("sii", $newsselfesteemscore, $userID, $newsselfesteemscore); $stmt->execute(); $stmt->close(); $conn->close(); ?>
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

