尽管在PHP中使用$_POST检查isset(),代码仍会执行



我正在尝试检查用户输入的值是否与我定义的值匹配。为此,我使用方法POST创建了一个<form>。由于我只是在尝试代码,所以我添加了一个引用同一value.php页面的action属性。然后我想让页面echo判断值是否匹配。我遇到了一个奇怪的问题,我在另一篇关于Stack Overflow的文章中读到了这个问题,但我仍然不太明白为什么会发生这种情况。

这是<form>的代码,它是value.php文件的内容:

<form action="value.php" method="POST">
<input type="text" name="fruit" placeholder="FRUIT HERE"><br>
<input type="text" name="vegetable" placeholder="VEGETABLE HERE">
<button type="submit">CHECK</button>
</form>

<form>上面的同一个文件value.php中,我有以下PHP代码:

<?php
$db_fruit = 'apple';
$db_vegetable = 'tomato';
if (isset($_POST['fruit']) && isset($_POST['vegetable'])) {
$fruit= htmlentities($_POST['fruit']);
$vegetable = htmlentities($_POST['vegetable']);
if (!empty($fruit) && !empty($vegetable)) {
if ($fruit == $db_fruit && $vegetable == $db_vegetable) {
echo 'The values do match.';
} else {
echo 'The values do not match.';
}
}
}
?>

由于PHP代码中有isset();函数,我希望除非用户用type="submit"点击<button>,否则不会执行echo。然而,如果事实上提供了错误的值,并且执行了echo 'The values do not match.';,则即使在页面刷新后,尽管接受了Confirm form resubmission警告并单击了Continueecho也不会消失。我如何使CCD_ 17不会出现在页面刷新上;全新的"?

我还应该指出,我正在寻找一个不需要使用JavaScript的解决方案。

它与您在这里发布的代码完全相同,我合并了两个不同的部分,在这种情况下,您需要防止在刷新时重新提交表单,所以我在脚本标记之间添加了javascript。此外,逻辑发生了一些变化,在我看来,收集将在数组中进行回声处理的文本,并将它们回声在一起是更好的方法,但变化不大。您也可以通过包含脚本来尝试上一个版本。

<?php
$db_fruit = 'apple';
$db_vegetable = 'tomato';
$result = array();
if (isset($_POST['fruit']) && isset($_POST['vegetable'])) {
$fruit= htmlentities($_POST['fruit']);
$vegetable = htmlentities($_POST['vegetable']);
if (!empty($fruit) && !empty($vegetable)) {
if ($fruit == $db_fruit && $vegetable == $db_vegetable) {
$result[] = 'The values do match.';
} else {
$result[] = 'The values do not match.';
}
}
}
if (!empty($result)) {
foreach ($result as $val) {
echo "$val";
}
}
?>
<script> //this part will not allow form resubmit on refresh !
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
</script>
<form action="" method="POST"> //because php code is on same file action empty 
<input type="text" name="fruit" placeholder="FRUIT HERE"><br>
<input type="text" name="vegetable" placeholder="VEGETABLE HERE">
<button type="submit">CHECK</button>
</form>

在没有重新提交表单的情况下,回波仍然出现?这很奇怪,也许你的浏览器仍然发送POST点击继续。。。

不管怎样,您可以应用的技巧是使用会话控制变量。

就在表单之前,但在管理POST之后,您定义了一个会话变量,并给它一个随机值,例如:

$_SESSION['control'] = rand(100000, 999999);

并将该值作为隐藏输入放入表单中:

<input type="hidden" name="control" value="<?php echo $_SESSION['control']; ?>" >

现在你可以检查发送的控件是否与当前控件匹配,而不是检查水果和蔬菜(如果你愿意,你仍然可以这样做):

if (isset($_POST['control']) && isset($_SESSION['control']
&& $_POST['control'] == $_SESSION['control`]) {

当然,不要忘记在脚本开始时开始会话:

session_start();

仅此而已。

相关内容

  • 没有找到相关文章

最新更新