PHP脚本在并没有POST的情况下执行IF语句


PHP script executes IF statement even no POST has been done

我有两个PHP脚本,第二个脚本似乎没有正确处理$_POST

a.php

重要部分:

echo "<form action='b.php' method='post'>";
echo "<input type='submit' name='add' value='Add new items'>";
echo "</form>";

b.php

重要部件:

$error_variable1="";
if ($_SERVER["REQUEST_METHOD"] == "POST")  {
    if (empty($_POST["something1"])) {
    $error_variable1="not correct";
    }
}
echo '<form action="'.htmlspecialchars($_SERVER["PHP_SELF"]).'" method="post">';
echo '<textarea name="something1" rows="1" cols="10"></textarea>';
echo $error_variable1;
echo '<input type="submit" name="evaluate" value="Checking inputs">';
echo "  </form>";

不幸的是,即使在b.php的第一次启动时,它也会将$error_variable1的值显示为"不正确"

但为什么它会这样工作呢?用户尚未按下提交按钮。当按下"评估"提交按钮时,我想给这个变量一个"不正确"的值。

编辑:

我怀疑来自a.php的POST(提交)可能会扰乱我的b.php。我想要的是显示一个带有提交按钮的文本表单。当按下提交按钮($POST)并且文本区域为空时,我想向用户显示一条错误消息(不正确)并再次显示表单。

empty($_POST["something1"])更改为empty($_POST["something1"]) && $_POST["evaluate"]

1)CSRF:其他网站的用户可以选择向您的表单处理程序提交表单,因此您应该在表单中的隐藏字段中添加CrossSiteRequestF狂欢预防值,该值在每次加载表单时都会更新,通常与$_SESSION值配对。阅读更多关于此的信息。

使用这个唯一的"密钥"值,您可以在页面顶部简单地检查这个POSTed密钥值是否是正确的值,这将为您确认表单已经发布。

所以

A.php

session_start();
$_SESSION['obscure'] = some obscurevalue generated anew every page load.
echo "<form action='b.php' method='post'>";
echo "<input type='submit' name='add' value='Add new items'>";
echo "<input tye='hidden' name='key' value='".$_SESSION['obscure']."'>
echo "</form>";

然后发送到b.php

session_start();
if($_POST['key'] == $_SESSION['obscure'] && !empty($_POST['key'])){
   //This code will only run if the form has been correctly submitted.
}

这样做的结果是,您可以更确信您的代码是按预期顺序运行的,并且您可以使用POSTED key值来确认表单提交。


顺便说一句,使用PHP_SELF进行表单重定向也是不好的做法。使用静态引用或使用不可编辑的值,因为PHP_SELF可能会被最终用户滥用。

您可以使用strlen()来检查是否设置了变量。

这将计算输入的位数,并在文本区域为空时返回false,因为字符串长度将为0

if (!strlen(trim($_POST['something1']))) {
    $error_variable1="not correct";
}

或者,检查是否单击了提交按钮:

if (isset($_POST['evaluate'])) {
    if (empty($_POST["something1"])) {
        $error_variable1="not correct";
    }
}

关于isset()的更多信息:http://php.net/manual/en/function.isset.php.

更改代码中的以下代码段

if (empty($_POST["something1"])) {}

到下面的一个。

if (strlen($_POST['something1']) > 0) {}

您应该明确选择isset()!而empty()即使其null也将返回true,而isset()则不会!

empty()只是检查给定变量是否有值。这可以是任何东西!IntFloatStringObject以及NULL——这无关紧要。它将返回true

如果变量存在并且不是null,则isset()将返回true

在此内容中最好选择isset();)

编辑:

请参见此处:http://php.net/manual/en/function.empty.php

在这里:http://php.net/manual/en/function.isset.php