插入一条记录或如果存在,那么在mysql中更新不起作用

时间:2013-04-30 07:22:49

标签: php mysql

我希望如果记录不存在我添加它,否则更新它...但它不起作用,这个代码是错误的:

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

5 个答案:

答案 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);

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

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

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

如果您要插入的记录不存在,则MySQL REPLACE会插入新记录。 如果您要插入的记录已存在,则MySQL REPLACE首先删除旧记录,然后插入新记录。

答案 4 :(得分:0)

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