我希望如果记录不存在我添加它,否则更新它...但它不起作用,这个代码是错误的:
<?php
$user_id=$_POST['user_id'];
$user_email="user_email";
$last_stage=$_POST['last_stage'];
$score=$_POST['score'];
$note=$_POST['note'];
$con=mysqli_connect("localhost","ferfer","Drfrj","ferfw");
$result = mysqli_query($con,"SELECT user_email FROM rating WHERE user_email='".$user_email."'");
$num_rows = mysqli_num_rows($result);
if ($num_rows > 0) {
//echo "exist";
mysqli_query($con,"UPDATE rating SET user_id=".$user_id.", user_email='".$user_email."', last_stage=".$last_stage.", score=".$score.", note='".$note."' WHERE user_email='".$user_email."'";
mysqli_close($con);
}else{
//echo "does not exist";
mysqli_query($con,"INSERT INTO rating(user_id, user_email, last_stage, score, note)VALUES (".$user_id.",'".$user_email."',".$last_stage.",".$score.",'".$note."') ");
mysqli_close($con);
}
?>
答案 0 :(得分:9)
您实际上可以在一个查询中执行此操作,因为MySQL
已经实现了INSERT ... ON DUPLICATE KEY UPDATE,如果它不存在,则基本上INSERT
是一个记录,否则为UPDATE
。
您需要做的第一件事是在表格上添加UNIQUE
列。在您的示例中,我看到user_email
是您要搜索的列。如果这不是唯一的,则需要更改UNIQUE
约束
ALTER TABLE rating ADD CONSTRAINT tb_uq UNIQUE(user_email)
实现后,构建一个这样的查询,
INSERT INTO rating(user_id, user_email, last_stage, score, note)
VALUES($user_id, '$user_email', last_stage, score, '$note')
ON DUPLICATE KEY UPDATE
user_id = $user_id,
last_stage = $last_stage,
score = $score,
note= '$note'
作为旁注,如果变量的值( s )来自外部,则查询易受SQL Injection
攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements
,您可以摆脱在值周围使用单引号。
答案 1 :(得分:3)
$user_email="user_email";
应改为
$user_email=$_POST['user_email'];
缺少(simbol,正如@Yogesh Suthar所说。你也应该考虑使用mysql_real_escape_string函数转义字符串中的字符。
答案 2 :(得分:2)
你忘记了)
mysqli_query($con,"UPDATE rating SET user_id=".$user_id.", user_email='".$user_email."', last_stage=".$last_stage.", score=".$score.", note='".$note."'
WHERE user_email='".$user_email."'");
^ // here
答案 3 :(得分:2)
更好的方法是使用
REPLACE INTO `rating` (user_id,user_email,last_stage,score,note)
VALUES(@user_id,@user_email,@last_stage,@score,@note) WHERE user_email=@email
还使用绑定和预处理语句使其更安全。你的代码非常不安全,因为你既没有转义也没有转义函数。
使用PHP绑定的示例。 $ dbh是PDO对象。
$stmt = $dbh->prepare("REPLACE INTO `rating` (user_id,user_email,last_stage,score,note)
VALUES(@user_id,@user_email,@last_stage,@score,@note) WHERE user_email=@email");
$stmt->bindParam('@name', (int)$user_id);
$stmt->bindParam('@user_email', $user_email);
$stmt->bindParam('@last_stage', $last_stage);
$stmt->bindParam('@score', $score);
$stmt->bindParam('@note', $note);
使用绑定您不必转义字符串,因为它直接进入数据库层而不必粗略地拼接到SQL语句中。
MySQL REPLACE语句的工作方式类似于带有附加规则的INSERT语句:
如果您要插入的记录不存在,则MySQL REPLACE会插入新记录。 如果您要插入的记录已存在,则MySQL REPLACE首先删除旧记录,然后插入新记录。
答案 4 :(得分:0)
$user_email="user_email";
应为$user_email=$_POST["user_email"];