0

我正在使用 mysql_affected_rows() 来检查我是否必须输入新记录或更新现有记录,但问题是用户是否尝试输入与它运行插入的已存在记录完全相同的数据。

$result = mysql_query("update Data set Score='$score',Comment='$_POST[Comments]' where Date='$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]' AND User='$_POST[UserID]';");
$last = mysql_affected_rows();

if ($last==0) {

    $result1 = mysql_query("INSERT INTO Data (User,Date,Score,Comment) VALUES ('$_POST[UserID]','$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]','$score','$_POST[Comments]')");

我应该怎么做才能避免多余的条目

4

3 回答 3

0
  1. 您可以解析mysql_info()输出(但解决方案本身会受到竞争条件问题的影响)
  2. 您可以使用ON DUPLICATE KEY UPDATE语法创建唯一键User + Date并以单个查询结束:

    INSERT INTO `Data` (User,Date,Score,Comment)
    ('$_POST[UserID]','$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]','$score','$_POST[Comments]')
    ON DUPLICATE KEY UPDATE Score='$score',Comment='$_POST[Comments]'
    
于 2011-09-05T02:07:14.130 回答
0

一些解决方案:

  1. 添加另一个查询以查看数据是否存在,然后决定是否要执行某些操作(更新/删除)或什么也不做。
  2. 添加类型为“TIMESTAMP”的“已修改”列并在更新时进行 - CURRENT_TIMESTAMP

我会选择第一个选项。

顺便说一句,您应该转义您的帖子数据(mysql_real_escape_string)以防止注入或格式错误的查询字符串

于 2011-09-05T02:07:19.947 回答
0

您可能会得到受影响的行数,FOUND_ROWS()而不是mysql_affected_rows()。后者也计算未修改的行。

$result = mysql_query("update Data set Score='$score',Comment='$_POST[Comments]' where Date='$_POST[forDay_3]-$_POST[forDay_1]-$_POST[forDay_2]' AND User='$_POST[UserID]';");
$last = mysql_query("SELECT ROW_COUNT();");
$last = mysql_fetch_array($last);
...

参考:http ://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

于 2011-09-05T02:14:33.943 回答