【问题标题】:PHP isset('submit') is always returning FALSEPHP isset('submit') 总是返回 FALSE
【发布时间】:2017-01-23 13:45:57
【问题描述】:

我在我的 HTML 表单的“操作”字段中使用了一个外部 php 文件,以便在单击“提交”按钮时执行 php 文件中提到的操作。

为此,我在 php 文件中使用了 isset() 函数。

但是,我发现 isset 函数总是返回 FALSE,从而导致执行 else 语句(如控制台日志中所示)。

如果我删除 isset() 函数(以及 if-else 语句),那么代码运行良好。

您能检查一下我的代码中的问题吗?

另外,我在其他帖子中看到我需要使用其他参数以及isset(),例如,

if(isset($_POST['submit']) && !empty($_POST["xyz"]))

这是必需的吗?

P.S.:我仍处于页面开发的初始阶段,因此我请求您忽略我的代码的安全问题,我承认它存在。 :)

我的子代码:

我的 HTML 表单:

<form id="info-form" method="POST" action="form-submit.php">
    <label for="Name">What is your Name? </label> 
    <input required type="text" name="name" placeholder="Enter your full name here." />

    <label for="Email">What is your email ID? </label>
    <input required type="email" name="email" placeholder="your.name@email.com" />

    <label for="mobile">What is your 10-Digit Mobile Number? </label>
    <input required type="text" name="mobile" maxlength="10" />

    <button name="submit-form" type="submit" class="btn btn-lg btn-success"><i class="fa fa-paper-plane" aria-hidden="true"></i>
        Submit
    </button>
    <button type="reset" class="btn btn-lg btn-warning"><i class="fa fa-undo" aria-hidden="true"></i>
        Reset
    </button>
</form>

我的 form-submit.php 文件:

<?php
    if(isset($_POST['submit-form']))
    {
        require("database-connect.php");

        $name = $_POST['name'];
        $email = $_POST['email'];
        $mobile = $_POST['mobile'];

        $sql = "INSERT INTO tbl_details ".
               "(name,email_id,mobile_number) ".
               "VALUES ".
               "('$name','$email','$mobile')";

        mysql_select_db('db_info');
        $return = mysql_query( $sql, $connect );

        if(! $return )
        {
            die('Could not enter data: ' . mysql_error());
        }

        echo "Entered data successfully\n";
        mysql_close($connect);
    }

    else
    {
        echo "Not Set\n";
    }
?>

【问题讨论】:

  • submit != submit-form(您的提交按钮的名称)。所以你想在你的声明中使用isset($_POST['submit'-form'])
  • 另外,关于安全和编程标准的旁注:mysql_* 函数自 PHP 5.5 起已弃用(在 PHP 7 中完全删除),您应该 @987654322 @ 如果你可以的话。您应该选择另一个允许您使用预准备语句的 API(在处理用户输入时确实应该),例如 mysqli_* 或 PDO - 请参阅 choosing an API。基本上,您对 SQL 注入持开放态度 - 请阅读 How can I prevent SQL-injection in PHP?
  • 首先检查 isset 中的按钮名称,如果仍然有效,然后尝试输入 type='submit',因为按钮类型提交在任何地方都不起作用
  • var_dump($_POST); 看到了什么? isset($_POST['submit-form']) 应该适用于您拥有的表格。不要检查!empty($_POST['submit-form']),因为它当前是作为空白值提交的。

标签: php html forms isset


【解决方案1】:

您真的不应该一开始就检查提交按钮值的存在。如您所见,前端的一些细微的外观变化,例如用于提交表单的按钮类型,不应该对后端产生任何影响。提交按钮及其值与处理表单完全无关。

您真正想在服务器上检查的是请求是否为 POST 请求,或者您要使用的值是否已设置,或者两者都设置:

if ($_SERVER['REQUEST_METHOD'] == 'POST') …
if (isset($_POST['name'], $_POST['email'], $_POST['mobile'])) …

最合理的做法是:

if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    header('HTTP/1.0 405 Method Not Allowed');
    exit;
}

或:

if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    header('Location: myform.html');
    exit;
}

在您断言您正在处理正确的 HTTP 方法后,处理您的数据:

$data = filter_input_array(INPUT_POST, [
    'name'   => FILTER_DEFAULT,
    'email'  => FILTER_VALIDATE_EMAIL,
    'mobile' => FILTER_DEFAULT
]);

如您所见,您甚至根本不需要直接与$_POST 交互。见http://php.net/filter_input_array

【讨论】:

  • 谢谢@deceze。我不知道该怎么感谢你才足够。您不仅回答了我的问题,还提供了一种更好的做事方式,这对于像我这样的初学者来说至关重要。你教会了我一个重要的教训 - “前端的一些轻微的外观变化......不应该对后端产生任何影响”。非常感谢。顺便说一句,如果像我这样的其他初学者不清楚,此回复中提供的解决方案有效!干杯。
  • 提示:了解有关 HTTP 协议的更多信息,并了解在您的服务器上处理 HTTP 请求。通过使用 curl(或您喜欢的任何其他工具)发出原始 HTTP 请求,养成测试服务器的习惯。让您的服务器充当正确的 HTTP 端点。它将使您的应用程序比考虑 HTML 按钮和表单更加理智。
【解决方案2】:

您应该使用input-元素而不是按钮。

<button name="submit-form" type="submit" class="btn btn-lg btn-success">
<i class="fa fa-paper-plane" aria-hidden="true"></i>Submit
</button>

应该用这样的输入代替:

<input name="submit-form" value="ButtonText" type="submit" class="btn btn-lg btn-success" />

输入的值是它向用户显示的文本。

另外,在您的问题中,您提到了isset('submit')isset($_POST['submit']),虽然其他人是正确的并且这不是您的HTML 代码中的现有名称,但您的PHP 代码确实包含正确的isset($_POST['submit-form'])。 它给一些“快速”的读者带来了一些困惑......


至于额外的!empty($_POST["xyz"])),出于您的目的(检查表单是否为回发),这不是必需的。

【讨论】:

  • &lt;button&gt; 元素可以具有value 属性。见:developer.mozilla.org/en-US/docs/Web/HTML/Element/button
  • 另外,&lt;input&gt;valueboth 显示的文本和提交的值。 &lt;button&gt;s 提供更多控制,value 是提交的内容,但您可以向用户显示不同的值(甚至是 HTML 元素)。
【解决方案3】:

像这样更改您的按钮标签。希望对你有帮助!

<input name="submit-form" value="Submit" type="submit" class="btn btn-lg btn-success">

谢谢!

【讨论】:

  • 他为什么要把&lt;button&gt;改成&lt;input&gt;?对我来说毫无意义。
  • 提交按钮的唯一目的是将 HTML 表单的数据发送到表单的 ACTION 属性中指定的服务器端脚本。
  • 是的...那为什么它应该是&lt;input&gt;&lt;button&gt;s 也可以。
  • 请参考此链接。我希望它会帮助你。 stackoverflow.com/questions/4488317/…
  • 我看不出该链接有什么帮助。它来自 6 年前,谈论 IE6。在任何现代浏览器中,&lt;button type="submit"&gt;(甚至只是&lt;button&gt;)都可以很好地提交表单。我仍然不明白切换到&lt;input&gt; 的建议。
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 2014-01-01
  • 2017-05-15
  • 2012-12-14
  • 2020-12-27
  • 2014-08-26
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多