3

我希望如果记录不存在我添加它否则更新它......但它不起作用,这段代码有什么问题:

<?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);
      }
 ?>
4

5 回答 5

9

实际上,您可以在单个查询中执行此操作,因为MySQL已经实现了INSERT ... ON DUPLICATE KEY UPDATEINSERT ,如果它不存在,则基本上是 sa 记录,否则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'

作为旁注,SQL Injection如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-04-30T07:29:19.960 回答
3
$user_email="user_email";

应该改为

$user_email=$_POST['user_email'];

并且缺少( simbol,正如@Yogesh Suthar 所说。您还应该考虑使用 mysql_real_escape_string 函数在字符串中转义字符。

于 2013-04-30T07:26:42.697 回答
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
于 2013-04-30T07:25:49.243 回答
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);

更多关于http://pl1.php.net/pdo

通过绑定,您不必转义字符串,因为它直接进入数据库层,而不必粗略地拼接到 SQL 语句中。

MySQL REPLACE 语句的工作方式类似于带有附加规则的 INSERT 语句:

如果要插入的记录不存在,MySQL REPLACE 会插入一条新记录。如果要插入的记录已经存在,MySQL REPLACE 会先删除旧记录,然后再插入新记录。

于 2013-04-30T07:29:09.723 回答
0

$user_email="user_email";应该$user_email=$_POST["user_email"];

于 2013-04-30T07:25:42.243 回答