即使没有POST,PHP脚本也会执行IF语句

时间:2016-04-10 14:44:31

标签: php

我有两个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的值为&#34;不正确。&#34;

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

编辑:

我怀疑这可能是a.php的POST(提交)弄乱了我的b.php。我想要的是显示带有提交按钮的文本表单。当按下提交按钮($ POST)并且textarea为空时,我想向用户显示错误消息(不正确)并再次显示该表单。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

这将计算输入的位数,当textarea为空时将返回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

答案 2 :(得分:2)

1)CSRF:来自其他网站的人可以选择向表单处理程序提交表单,因此您应该添加 C ross S ite R equest F orgery prevent value到表单中的隐藏字段,每次加载表单时都会更新,通常与$_SESSION值配对。 Read more on this

使用这个独特的&#34;键&#34;如果此POST ed键值为正确值,那么您只需检查页面顶部的值,即可确认表格已过帐。

所以

<强> 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可能被最终用户滥用。

答案 3 :(得分:1)

更改代码中的以下代码段

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

到下面的一个。

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

答案 4 :(得分:0)

你应该绝对选择isset()!即使empty()null不会,isset()也会返回true!

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

如果变量存在且不是isset()

true将返回null

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

编辑:

见这里: http://php.net/manual/en/function.empty.php

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