问题:
表单提交后未定义的POST变量。
研究和疑难解答:
此时我迷路了。数据只是拒绝发布,所有这些都是未定义的。下面是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();
此时我感到困惑。据我所知,W3Schools,PHP.net以及各种问题,我已经正确设置了它。然而有些事情显然已经消失任何和所有的帮助将不胜感激。
答案 0 :(得分:3)
修改强>
您正在使用 PHPStorm 的built-in web server,其目前存在一些问题,尤其是POST请求,例如WEB-17317。您也可以在这方面参考此answer。
这可能是您无法处理表单的原因。
http://localhost/signup.html
应该可以通过浏览器访问。http://localhost/signup.html
。
<a>
或action="register.php"
关联的所有其他文件将自动与本地服务器一起提供。现在,您可以使用PHPStorm中的绿色按钮运行您的HTML / PHP文件,它将在您的浏览器中使用您的网址打开这些文件在步骤1中配置。您应该能够毫无问题地处理表单。
echo $_SERVER["REQUEST_METHOD"] == "POST"
在用 register.php 文件编写时打印1
,表示您的表单已成功提交。post_max_size
设置为 #M 格式,例如10M
,10MB
等任何其他格式均无效。请参阅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数组是否会被填充?