我有这个数据库表reset_attempts
,里面有一个
id
:int(10)
auto_increment
reset_counter
:int(10)
default 1
reset_time
:timestamp
current_timestamp
ip
:varchar(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
字段并将其设置为零。我不知道问题出在哪里。也许是如此简单,我无法看到它,因为我正在搜索它!无论如何,提前谢谢!
答案 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 ..这个片段在它自己的工作正常...所以这是一些东西或者在我的代码中,你说...:/我很抱歉,我没有从开始测试它...至少现在我知道要搜索什么..!