PHP中POST方法的问题

时间:2016-05-29 05:52:51

标签: php html forms phpstorm

问题:

表单提交后未定义的POST变量。

研究和疑难解答:

  • 在这里阅读了很多问题,几乎所有问题都与表单字段上没有名称标签有关。我的所有字段都有标记和ID。
  • 将我的PHP.ini配置为将$ HTTP_RAW_POST_DATA设置为-1
  • PHP.net和W3SChools的后续教程

此时我迷路了。数据只是拒绝发布,所有这些都是未定义的。下面是HTML,PHP和两个显示问题的屏幕截图。

我在Windows上使用PHPStorm的内置服务器。

signup.html

<div class="text-center col-md-4 col-md-offset-4">
        <form id="user_signup" class="form-horizontal signInFields" action="../php/register.php" method="POST">
            <input type="text" id="first_name" name="first_name" placeholder="First Name">
            <input type="text" id="last_name" name="last_name" placeholder="Last Name">
            <input type="email" id="user_email" name="user_email" placeholder="Email">
            <input type="text" id="user_id" name="user_id" placeholder="User ID">
            <input type="password" id="user_password" name="user_password" placeholder="Password">
            <input type="password" id="confirm_password" name="confirm_password" placeholder="Confirm Password">
            <button id="btn_signup" type="submit" name="signup_button">Sign Me Up!</button>
        </form>

register.php

// Variables from the sign-up form POST action
$first_name = $_POST["first_name"];
$last_name = $_POST["last_name"];
$user_email = $_POST["user_email"];
$user_id = $_POST["user_id"];
$user_password = $_POST["user_password"];
$confirm_password = $_POST["confirm_password"];

// Add a new user to the database
$conn = new mysqli($servername, $username, $password);
$testQuery = mysql_insert($first_name,$last_name,$user_email,$user_id,$user_password);

if($conn->query($testQuery) === TRUE){
    echo "New Record Created Successfully!";
} else {
    echo "Error: " . $testQuery . "<br>" . $conn->error;
}

$conn->close();

填写字段的表单 enter image description here

提交后的输出: enter image description here

此时我感到困惑。据我所知,W3Schools,PHP.net以及各种问题,我已经正确设置了它。然而有些事情显然已经消失任何和所有的帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

修改

您正在使用 PHPStorm built-in web server,其目前存在一些问题,尤其是POST请求,例如WEB-17317。您也可以在这方面参考此answer

这可能是您无法处理表单的原因。

因此,最好的解决方案是将PHPStorm配置为使用您的本地Web服务器(在您的情况下为您的当前项目)。按照以下步骤进行相同的操作:

  1. 使用当前项目目录配置本地服务器的虚拟主机作为根目录
  2. 确保在上述步骤中进行配置后可以访问项目文件。例如:http://localhost/signup.html应该可以通过浏览器访问。
  3. 现在,在PHPStorm中,转到运行 - &gt;编辑配置并选择每个文件并配置每个文件的网址,如图片中所示。例如。对于signup.html文件使用http://localhost/signup.html
    • 您无需为项目中的所有文件设置网址(步骤3)。只需为默认(起始)文件执行此操作 - 例如index.html或login.html或signup.html。表单中与<a>action="register.php"关联的所有其他文件将自动与本地服务器一起提供。
  4. Run - Edit Configuration - Screenshot

    现在,您可以使用PHPStorm中的绿色按钮运行您的HTML / PHP文件,它将在您的浏览器中使用您的网址打开这些文件在步骤1中配置。您应该能够毫无问题地处理表单。

    但如果您的问题是由其他原因引起的,请考虑检查以下几点:

    • 表单字段应具有名称属性,例如&#34; name =&#39; first_name&#34;`在 signup.html 文件中。
    • echo $_SERVER["REQUEST_METHOD"] == "POST"在用 register.php 文件编写时打印1,表示您的表单已成功提交。
    • php.ini 中的值post_max_size设置为 #M 格式,例如10M10MB等任何其他格式均无效。请参阅php.net
    • 检查echo file_get_contents("php://input");是否以格式显示数据:first_name=John&last_name=Doe ....。请参阅php.net
    • 检查var_dump($_POST)是否在数组中显示表单数据。

    希望它能帮到你。随意评论。

答案 1 :(得分:1)

试试这个

<强> register.php

<?php

$errors = [];

$fields =
[
    'first_name',
    'last_name',
    'user_email',
    'user_id',
    'user_password',
    'confirm_password',
];

$data = [];


if( !empty( $_POST ) )
{
    foreach ($fields as $field)
    {
        if( isset( $_POST[$field] ) )
        {
            $data[$field] = $_POST[$field];
        }
        else
        {
            //empty field handling
            $errors[$field] = $field.' required!';
        }
    }
}

if( empty($errors) )
{
    // Add a new user to the database
    $conn = new mysqli($servername, $username, $password);

    $testQuery = mysql_insert
    (
        $data['first_name'],
        $data['last_name'],
        $data['user_email'],
        $data['user_id'],
        $data['user_password']
    );

    if($conn->query($testQuery) === TRUE)
    {
        echo "New Record Created Successfully!";
    }
    else
    {
        echo "Error: " . $testQuery . "<br>" . $conn->error;
    }

    $conn->close();
}

<强> signup.php

<?php require('path/to/register.php'); ?>

  <form id="user_signup" class="form-horizontal signInFields" action="" method="post">
            <input type="text" id="first_name" name="first_name" placeholder="First Name">
            <input type="text" id="last_name" name="last_name" placeholder="Last Name">
            <input type="email" id="user_email" name="user_email" placeholder="Email">
            <input type="text" id="user_id" name="user_id" placeholder="User ID">
            <input type="password" id="user_password" name="user_password" placeholder="Password">
            <input type="password" id="confirm_password" name="confirm_password" placeholder="Confirm Password">
            <button id="btn_signup" type="submit" name="signup_button">Sign Me Up!</button>
        </form>

侧面注意(如果您是新手)

  • 使用method =“post”而不是method =“POST”(只是标准)

  • 您没有验证输入字段(危险)

答案 2 :(得分:0)

您可以使用输入类型按钮而不是您正在使用的按钮。在这种情况下,您可以使用ajax发送数据。

答案 3 :(得分:0)

我复制了您的register.php文件的表单和(部分),并且没有任何问题。数据按预期发布。我之前遇到类似的问题,结果却是一个奇怪的重定向问题,所以我的POST数据在到达我的控制器时就丢失了。可悲的是,我只能提供一些调试建议。

我确实想提一下,一旦你弄明白你的POST问题,你需要查看你的数据库交互内容......你创建了一个mysqli对象,然后调用一个名为mysql_insert的函数(我从未见过的功能,在php.net上找不到,所以我倾向于认为这不会做任何事情)。快速搜索将引导您进行有关如何使用mysqli的许多详尽教程和演练,因此我将遵循这些而不是尝试在此解释所有内容(因为您仍在尝试解决POST问题)

1]您不必使用PDO; mysqli很好,只要你正确使用它就完全可以接受(here's some information about both from php.net directly)。

2]我从未见过在<form>标签中指定使用小写“post”而不是“POST”的标准,但是会喜欢它的链接!

3] <input type="submit" value="text"><button type="submit">text</button> 功能相同,因为,两者都会发布表格没问题。两者之间存在一些差异(例如,能够动态设置“值”而非“em> text 的”innerHTML“,但这是另一个问题。

关于进一步的调试工作......在register.php中,与Orions提到的一样,我很好奇$_SERVER['REQUEST_METHOD']报告的内容。在该文件的开头,尝试die($_SERVER['REQUEST_METHOD'])并查看其内容。如果它说“POST”,那么你就是在正确的轨道上。如果你在那个文件的开头做var_dump($_POST);,之后有一个die / exit,你看到了什么?

我记得有两个实例,重定向正在抢夺我的POST变量,这两个变量都是由mod_rewrites引起的。一个是将请求从mydomain.com重定向到www.mydomain.com,由于我的表单action明确mydomain.com,所以一切都丢失了。另一个问题是mod_rewrite要么从请求中追加或剥离尾随/(我不记得哪个),但这也有相同的基本结果。如果你有一个.htaccess文件,请检查一下,确保没有任何恶意或遗嘱。

其他要检查的事项:

a]在您的php.ini中,确保variables_order某处有“P”(reference

b]同样在你的php.ini中,确保post_max_size是合理的;我怀疑这是问题所在,因为你没有上传文件,但是如果它被设置为非常小的东西,我可以想象它可能是一个问题

c]如果您要从http页面发布到https页面,有时会删除POST数据(这可能是特定于服务器的,因为我觉得我已经看到了这个有时工作而不是其他工作)

d]您是否按其他地方的建议获得了file_get_contents("php://input");?它是否包含您的数据(看起来像这样:key1=value1&key2=value2)还是太空白了?

e]如果您在另一个页面上创建另一个表单并将其发布到另一个文件,那么$ _POST数组是否会被填充?