【问题标题】:PHP script executes IF statement even no POST has been donePHP 脚本执行 IF 语句,即使没有完成 POST
【发布时间】:2016-04-10 14:44:30
【问题描述】:

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

一个.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) 并且 textarea 为空时,我想向用户显示一条错误消息(不正确)并再次显示表单。

【问题讨论】:

  • 最好使用isset(...) 而不是empty(...),并确保在两者前面都放置NOT (!)。
  • 如果 b.php 的内容是完整的,那么它缺少右大括号 }。但是,很难确切地知道您想在这里做什么。
  • b.php 处理a.php 发布的值。所以你必须修改你的条件来区分ab检查。如果您无法检查来自 a.php 的请求,请将 a.php 表单替换为链接(或将 POST 方法替换为 GET
  • 再说一次,我不知道你想在这里做什么。我看到Add new items 的输入,这告诉我您可能正在使用一些 JS 来添加项目并试图将它们传递到第二页。我将不得不传递这个。我只会“看”;-)

标签: php


【解决方案1】:

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

【讨论】:

  • 我怀疑这是解决方案。
  • OP:原始海报/人物 ;-)
  • @mertizci 这意味着提出问题的人。它代表原始海报
  • @TassMark 这应该是您问题的一部分,并适用于今天/或以后问题的未来访问者。
  • @TassMark 所以把你的if (empty($_POST["something1"]))改成if (empty($_POST["something1"]) &amp;&amp; $_POST["evaluate"]),我也编辑了我的答案
【解决方案2】:

1) CSRF:其他网站的人可以选择将表单提交给您的表单处理程序,因此您应该添加 Cross Site RF 防暴值请求到表单中的隐藏字段中,每次加载表单时都会更新,通常与 $_SESSION 值配对。 Read more on this.

使用这个唯一的“键”值,您可以简单地在页面顶部检查这个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 可能会被最终用户滥用。

【讨论】:

    【解决方案3】:

    您可以使用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

    【讨论】:

    【解决方案4】:

    在您的代码中更改以下代码段

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

    到下面一个。

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

    【讨论】:

    • " " 将返回 true
    【解决方案5】:

    你一定要选择isset()!虽然empty() 将返回true,即使它的nullisset() 不会!

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

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

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

    编辑:

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

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

    【讨论】:

    • 据我记得,使用isset() 表示&lt;textarea&gt; 将始终返回TRUE,不管
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2017-08-16
    • 2023-04-07
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多