INSERT和UPDATE语句将错误的数据传递到数据库中

时间:2014-01-29 19:46:16

标签: php mysql sql

我有这个数据库表reset_attempts,里面有一个

  • idint(10) auto_increment
  • reset_counterint(10) default 1
  • reset_timetimestamp current_timestamp
  • ipvarchar(255)

我有这个简单的PHP代码

$sql = "SELECT * FROM reset_attempts WHERE ip = '$ip'";
$query = mysqli_query($db_conx, $sql);
$num_rows = mysqli_num_rows($query);
$row = mysqli_fetch_array($query);
$reset_counter = $row['reset_counter'];
$reset_time = $row['reset_time'];
if ($num_rows == 0) {
    $sql = "INSERT INTO reset_attempts (reset_counter, reset_time, ip) VALUES ('1',now(),'$ip')";
    $query = mysqli_query($db_conx, $sql);
} else if ($num_rows == 1) {
    $reset_counter = $reset_counter + 1;
    $sql = "UPDATE reset_attempts SET reset_counter = '$reset_counter', reset_time = now() WHERE ip = '$ip'";
    $query = mysqli_query($db_conx, $sql);
}

这只是整个php文件的一部分..这只是问题代码..当然它有数据库连接并且我正确地接受了ip ..问题是当我点击提交它将执行第一个如果语句,它正确执行,除了它传递给DB的reset_counter值始终为零,所有其他字段都正确。

当它再次执行第二个if语句时,它不会更新reset_counter字段并将其设置为零。我不知道问题出在哪里。也许是如此简单,我无法看到它,因为我正在搜索它!无论如何,提前谢谢!

3 个答案:

答案 0 :(得分:1)

第一次数据库中没有该ip的记录,所以$ row ['reset_counter']的值为零,你在数据库中输入零值。然后当你再次提交时,它会从数据库中获取相同的值,并进入 0 以获得reset_counter,所以当你这样做时

$row = mysqli_fetch_array($query);
$reset_counter = $row['reset_counter'];

它为reset_counter取0的行并将其更新为零

<强>更新

如果您在代码中的任何位置需要它,请在else else语句中添加这些,否则也将其删除

$reset_time = $row['reset_time'];

并删除

reset_counter = $row['reset_counter'];

使用此代码

$sql = "SELECT * FROM reset_attempts WHERE ip = '$ip'";
$query = mysqli_query($db_conx, $sql);
$num_rows = mysqli_num_rows($query);
$row = mysqli_fetch_array($query);

if ($num_rows == 0) {
$sql = "INSERT INTO reset_attempts (reset_counter, reset_time, ip) VALUES ('1',now(),'$ip')";
    $query = mysqli_query($db_conx, $sql);
} else if ($num_rows == 1) {
    $reset_time = $row['reset_time'];
$sql = "UPDATE reset_attempts SET reset_counter = reset_counter+1, reset_time = now() WHERE ip = '$ip'";
$query = mysqli_query($db_conx, $sql);
}

答案 1 :(得分:1)

我不知道你的代码到底出了什么问题,但我认为你使用的是太多的PHP和太少的MySQL。我会提出一些改变

首先,大多数时候你都会进行更新,对吗?然后我会跳过SELECT,执行UPDATE然后询问驱动程序更新的行数。如果它为0则执行INSERT。

二。当您在MySQL内部进行更新时,不需要在PHP中执行此操作。

UPDATE reset_attempts SET reset_counter = reset_counter+1, reset_time = now() WHERE ip = '$ip';

否则两个并行调用您的页面可能只算作数据库中的一个。

第三,如果你的reset_counter还没有整数改变它。从你的代码来看,它看起来像是char或varchar,将计数器存储为文本没有任何意义。

答案 2 :(得分:1)

根据评论中的讨论(OP和I 之间的),显示的代码片段自行运行并确定其他原因导致此问题(在未示出的完整代码)。

让我们考虑关闭这个问题,直到可以进一步调查其余的(OP)代码。

OP和我之间的最后两条评论:

  

我: 好的,这可能是我的最后一个建议,因为我不知道还有什么可能导致这个问题。您可以尝试自己运行该代码段(您发布的代码),而不需要其余的代码,并查看它是否可以自行运行?如果确实有效,那么您就会立即知道完整代码中的其他内容会导致此问题。


  

OP: 你是对的..这是我最后一次没想到它的想法pfff ..这个片段在它自己的工作正常...所以这是一些东西或者在我的代码中,你说...:/我很抱歉,我没有从开始测试它...至少现在我知道要搜索什么..!