Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将错误数据传递到数据库的INSERT和UPDATE语句_Php_Mysql_Sql - Fatal编程技术网

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

Php 将错误数据传递到数据库的INSERT和UPDATE语句,php,mysql,sql,Php,Mysql,Sql,我有这个DB表reset\u尝试,里面有一个 id:int(10)自动增量 reset\u计数器:int(10)默认值1 重置时间:时间戳当前时间戳 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 = mysql

我有这个DB表
reset\u尝试
,里面有一个

  • id
    int(10)
    自动增量
  • reset\u计数器
    int(10)
    默认值1
  • 重置时间
    时间戳
    当前时间戳
  • 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文件的一部分..这只是问题代码..当然它有db连接,我正确地获取了ip..问题是当我点击submit时,它将执行第一个if语句,它正确执行,除了它传递给DB的
reset\u计数器值始终为零,并且所有其他字段都正确


当它再次执行第二条if语句时,它不会更新
reset\u计数器
字段并将其设置为零。我不知道问题出在哪里。也许是这么简单,我看不到它,因为我搜索了这么多!无论如何,先谢谢你

数据库中首次没有该ip的记录,因此$row['reset_counter']的值为零,您可以在数据库中输入值零。然后,当您再次提交时,它会从数据库中获取相同的值,并在输入重置计数器时输入0

$row = mysqli_fetch_array($query);
$reset_counter = $row['reset_counter'];
它为reset_计数器获取带有0的行,并将其再次更新为零

更新

如果您需要在代码中的任何地方添加这些语句,请将其添加到这个inside-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);
}

我不知道你的代码到底出了什么问题,但我认为你使用了太多的PHP和太少的MySQL。我有几个建议

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

第二。当您在MySQL中进行更新时,只需在PHP中进行增量更新即可

UPDATE reset_attempts SET reset_counter = reset_counter+1, reset_time = now() WHERE ip = '$ip';
否则,页面中的两个并行调用在数据库中可能只算一个


第三,如果重置_计数器还不是整数,请更改它。从您的代码来看,它看起来像是char或varchar,将计数器存储为文本没有任何意义。

根据评论中的讨论(在OP和I之间),显示的代码片段自行工作,并已确定是其他原因(在未发布的完整代码中)

让我们考虑这个问题是关闭的,直到剩下的(OP)代码可以进一步研究。< /P> OP和I之间的最后两条评论:

我:好吧,这可能是我最后的建议,因为我不知道还有什么其他原因会导致这种情况。您是否可以尝试在不使用其余代码的情况下自行运行该代码段(您发布的代码),并查看它是否能够自行运行?如果它确实有效,那么您将立即知道完整代码中的其他内容导致了这种情况


OP:你是对的。这是我在尝试它时没有想到的最后一个想法。pfff。这个代码片段本身就可以很好地工作……因此,正如你所说,它是我代码中的另一个东西我很抱歉,我没有测试它从一开始…至少现在我知道什么搜索


对于第一次插入,我根本不使用
$reset\u计数器
变量。。因为我是手动放置的..所以这不会影响代码..然后验证您的ip是否相同,否则应该。同时检查复位计数器的数据类型不需要这样做,因为时间和ip插入和更新正确…只有复位计数器插入/更新错误..复位计数器的数据类型为整数。也许是别的原因,因为Fred ii-尝试了代码并为他工作..所以如果我找到了解决方案,我会在这里发布:)是的,代码看起来不错。最后一件事,检查用户是否拥有所有权限。如果是这样的话,我就没有建议了:pAnd这是检查过的hehe:PSo我发现了问题..这是我拥有的一段代码..一个简单的更新查询,在所有其他过程结束时更新
$reset counter
。。这是如此简单和愚蠢,我没有看到它…所以这是我的错…抱歉再次浪费你的时间与此!!感谢大家的响应和帮助!:)我会让它像这样,让我们完全关闭这个线程!我真的很高兴你找到了这个问题的原因,你没有浪费我的时间;我很高兴能够帮助解决这个问题,并在消除的过程中继续进行@恩贝尔