PHP 验证表单未返回正确的响应

PHP validation form not returning correct response

提问人:Max 提问时间:6/28/2013 最后编辑:Nir AlfasiMax 更新时间:6/28/2013 访问量:244

问:

我是PHP的新手,并试图编写一些代码来验证同一页面上的表单,然后再将帖子提交到数据库。

我想要的是代码;

  1. 询问是否有任何字段已填写
  2. 如果是这样,请检查是否有任何字段为空(因此输出消息)
  3. 如果没有,则每次向数组添加任何错误时,都要对数据进行一系列验证检查。
  4. 最后询问是否发现任何错误
  5. 如果没有,则将数据插入数据库(此位代码已写入,但未显示在我下面提供的代码中。

所以这是我的代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>


if(isset($_POST['title']) || isset($_POST['content']) || isset($_POST['comment_option']));

{


$title = $_POST['title'];
$content = $_POST['content'];
$comment_option = $_POST['comment_option']; 
$form_errors = array();

if (empty($title) || empty($content) || empty($comment_option)) 
{

    $form_errors[] = "All fields are required!";

} else {

    if (strlen($title < 3)){

        $form_errors[] = "The title is too short!";

    }

    if (strlen($title > 50)){

        $form_errors[] = "The title is too long!";

    }

    if (strlen($content < 50)){

        $form_errors[] = "Post is a bit short!";

    }
}


if(!empty($form_errors)) {

print_r($form_errors);


}else{

//insert data into database

}

}
?>

<form action="add_post.php" method="post">

Title: <input type="text" name="title"><br>

Content: <input type="text" name="content"><br>

Comments enabled?<br>

<input type="radio" name="comment_option" value="true">Yes<br>
<input type="radio" name="comment_option" value="false">No<br>

<input type="submit">


</form>




<body>
</body>
</html>

当我加载页面时,我在设置 $title $content 和 $comment_option 变量的行上收到三个未定义索引的错误。如果我只是点击提交,那么我只会在我设置 $comment_option 变量的行上收到错误,但我确实看到“所有字段都是必填字段”。如果未填写任何字段,我也会看到此错误,因此这部分有效。

如果所有字段都已填写。无论长度如何,我总是看到“标题太短”和“博客文章有点短”,即使它们不是。

我花了一段时间看这个,只是想不通我做错了什么!

任何帮助将不胜感激!

谢谢 麦克斯

PHP HTML 表单 验证 undefined-index

评论


答:

2赞 joshuahealy 6/28/2013 #1

您已将比较放在函数调用中(以及其他两个)。所以从< 3strlen

if (strlen($title < 3)){

if (strlen($title) < 3){

其他比较也是如此。

可以通过将变量的设置更改为如下所示来修复未定义的索引错误:

$title = isset($_POST['title']) ? $_POST['title'] : '';

评论

0赞 Max 6/28/2013
啊,好的,已经对验证位进行了排序,并且正在工作,谢谢!问题是我仍然收到未定义的索引错误。是因为如果 $_POST['?'] 中没有任何内容,我设置了一个没有任何内容的变量吗?
0赞 Niro 6/28/2013
这是因为您正在检查是否设置了任何变量,然后假设它们都设置了。因此,如果设置了但未设置,则在尝试设置时将得到一个未定义的索引$_POST['title']$_POST['content']$content = $_POST['content']
0赞 Gohn67 6/28/2013 #2

看起来你做错了条件。

您正在这样做:

if (strlen($title < 3))

何时应执行此操作:

if (strlen($title) < 3)

你的条件失败的原因是因为你得到了 的结果,这导致了 ,这导致了 的答案(我相信),因此条件被看作是 。strlen($title < 3)strlen(true)1true

在更正后的情况下,以下是条件的工作原理:

我们正在使用该函数来计算 的长度,我们可以说是“测试”。所以这样做会产生.现在条件变为 ,结果为 。strlen$titlestrlen($title)44 < 3false

评论

0赞 Max 6/28/2013
哦,对了,我明白了。有点 nooby 错误 x)。谢谢你告诉我这个。
0赞 Mr. Llama 6/28/2013 #3

第一个 IF 语句的末尾有一个分号:

|| isset($_POST['comment_option']));

这意味着,如果陈述是真的,则什么都不做。然后它总是执行它下面的块。

评论

0赞 Max 6/28/2013
好的,谢谢,它摆脱了开始时未定义的索引错误,但是如果我不按单选按钮上的某些内容,我仍然会遇到comment_option错误。我想这是因为广播是真的/假的?
0赞 Mr. Llama 6/28/2013
单选按钮为 或 。如果需要确保至少选中一个,则将 HTML 修改为默认的单选按钮之一。"checked"""checked
0赞 Mr. Llama 6/28/2013
在您的例子中,您有两个同名的单选按钮。这不是一个好主意。我会将其中一个名称更改为 ,另一个名称更改为 ,然后检查哪个名称设置为 。yes_btnno_btn$_POST['yes_btn']$_POST['no_btn']"checked"
0赞 Max 6/28/2013
啊,我明白了。Iv 将一个设置为默认选中,这样就可以解决问题。现在一切都整理好了:)。感谢大家的投入!
0赞 Raghav 6/28/2013 #4

如果不需要服务器基础设施,我认为提交表单并在服务器端(PHP端)进行这些验证不是一个好主意。您仍然可以使用 JavaScript 进行这些验证。

评论

0赞 Gohn67 6/28/2013
是的,但是如果用户关闭 JavaScript 或尝试使用 curl 或其他东西提交表单怎么办?您仍然需要服务器端验证。
0赞 Max 6/28/2013
我不懂任何javascript,也不知道如何以任何其他方式去做:/
0赞 Niro 6/28/2013 #5

首先,命名您的:form

<form action="add_post.php" method="post" name="myForm">

然后,将第一个语句作为 的名称,并删除该行末尾的 ';':ifform

if(isset($_POST['myForm'])){ . . . }

在其中,如果,检查并设置每个变量,如下所示:$_POST

if(isset($_POST['title']) && isset($_POST['content']) && isset($_POST['comment_option']))
{
 $title = $_POST['title'];
 $content = $_POST['content'];
 $comment_option = $_POST['comment_option'];
}
else
{
 $form_errors[] = "All fields are required!";
}

等。

按照其他答案中提到的进行长度验证。

评论

0赞 Max 6/28/2013
使用这个,当并非所有字段都包含数据时,如何输出消息?感谢您的建议。
0赞 Niro 6/28/2013
更新了所有变量是否为空的检查。
0赞 Roey Haim 6/28/2013 #6

整个问题是,在if语句末尾的末尾有“ ; ”。if(isset($_POST['title']) || isset($_POST['content']) ||
isset($_POST['comment_option']));

删除它 !

其他问题出在条件上:这应该是等等......if (strlen($title < 3)){if(strlen($title) < 3){

strlen 返回一个 Integer,只有这样您才能检查条件。 你在此代码中写的是:或任何其他数字......这永远是正确的!if(1)

希望它有所帮助......