首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不了解这些$_POST、数组和验证技术

不了解这些$_POST、数组和验证技术
EN

Stack Overflow用户
提问于 2011-12-24 22:45:30
回答 3查看 352关注 0票数 1

我正在通过教程学习,老师使用了一个验证例程,我对此感到困惑。

在表单页面上,他有具有以下名称的输入字段:

  • menu_name
  • position
  • visible

在表单处理页面上,他有以下php块(让我们称它为块A):

代码语言:javascript
复制
$menu_name = mysql_prep($_POST['menu_name']);
$position = mysql_prep($_POST['position']);
$visible = mysql_prep($_POST['visible']);

在这个块下面是另一个php块,它将数据插入到MySQL中--这一切都很好。

然后,他在块A (我们称之为块B)之上添加了以下php块:

代码语言:javascript
复制
$errors = array();
$required_fields = array('menu_name', 'position', 'visible');

foreach ($required_fields as $fieldname) {
    if (!isset($_POST[$fieldname]) || empty($_POST[$fieldname])) {
        $errors[] = $fieldname;
    } 
}   
if (!empty($errors)) {
    redirect_to("new_subject.php");
    exit;
}

问题1

我不明白为什么在他的$required_fields数组中,他直接引用字段名。为什么不将块A移到块B之上,然后只引用从$_POST分配的变量?

然后,只需在if statement中使用foreach loop中的这些变量。

我想我是在问我的替代方法是否有效?他采取行动有什么明显的原因吗?

( mysql_prep是他构建的一个自定义函数,用于删除斜杠等。)

问题2

如果我正确理解他的代码,他的第一个if statement是测试$fieldname!isset (即未设置)还是 empty

有什么关系呢?因为我不知道区别,我也不清楚为什么他使用||运算符。你能解释一下吗?

问题3

最后,他的第一个if statement似乎是捕捉任何错误,并将它们放入块B顶部的$errors array中。

然后,他使用第二个if statement来检查该$errors array中是否有任何内容,如果有,则重新定向+退出。

是否有明显的理由采取这种做法?在我看来,如果发现任何错误,第一个if statement就可以重定向+退出。为什么要在那个$errors array里捕获它们

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-24 22:56:04

问题1

这里发生的是,他首先检查某些变量的存在。如果它们不存在,则需要重定向。

我不知道prep函数是干什么的,但是在可能的空变量上调用prep函数是不合逻辑的。你可以扭转局面,但那将是..。好吧..。(使事情好转;)

先检查你是否有你需要的东西,然后开始清理。

问题2

Not意味着它在帖子中不可用。这将发生在复选框(如果你不检查,他们不会兴奋。文本输入将为空。

即使您只有文本输入,在检查它们的内容之前,最好确保它们的存在(在调用post中可能有问题,有人可能正在侵入您的表单):PHP当然是非常宽容的,但是检查一些不存在的内容并不太好。

摘要: isset正在查看它是否存在,空正在检查它的值。

问题3

您可以将重定向和退出语句放在if中,这样会稍微快一点。但是没有那么多,对于一些程序员来说,您所做的事情是出乎意料的:您在循环中间的某个地方改变了程序的流(2个循环)。这对我来说是可读的,但我不认为在第一个“错误”时退出会有任何问题。

稍后,您可能想要处理丢失的POST值(所有这些值),比如给它们一个特定的类,所以这是以后这样做的可能原因吗?

票数 2
EN

Stack Overflow用户

发布于 2011-12-24 22:54:19

据我所理解,如果您想在准备输入之前检查输入是否存在,或者around.

  • isset()检查变量是否存在(存在),则
  1. 没有区别,而如果变量存在,empty()将返回true,但不包含任何数据。||运算符是OR运算符。如果isset()返回false (!),则语句为true。或者empty()返回true。
  2. 我怀疑他填充错误数组的原因是能够用表单显示所有错误,而不仅仅是第一个错误,当用户重新提交时,他得到了下一个。

票数 3
EN

Stack Overflow用户

发布于 2011-12-25 09:06:15

在学习如何编码时,学生最常受到的挑战不是语言的语法,而是如何在逻辑结构中编码。您对代码所做的解释显示了您的理解,并提出了有效的问题。国际海事组织的守则是以合乎逻辑和简洁的方式编写的。原因如下:

块A在提交到数据库之前,将准备三个POST vars中的每个。足够清楚了。就块A中的代码执行而言,重要的是,如果这3个vars中的任何一个不存在,那么PHP将抛出一个异常并停止。而且,如果所有的vars都存在,但是其中任何一个都是空的,那么MySQL可能会抛出一个异常并导致PHP停止执行。这就是为什么我们有块B到a)接收POST vars;( b)验证它们;和( c)在将vars传递给块A之前处理任何错误。让我们考虑块B的三个逻辑部分

如果变量名称包含任何arrays

  • validate名称,然后将用户重定向到另一个页面,则继续执行var准备& db提交validation

  • check

$required_fields是一个由3个预期变量名称组成的数组(从前面形式的“必需字段”中获取)。因此,$required_fields的内容不是POST变量本身,而是它们名称的列表。

然后,$required_fields列表中的每个项(var名称)由foreach循环迭代(按顺序使用),以避免我们需要写出3次if语句(每个变量一次)。因此,关于您的第一个问题,创建$required_fields数组是因为方便的foreach循环需要它(例如,假设有20个vars!)。

摘要:

代码语言:javascript
复制
foreach (list as item) {
    if (condition1 is true) or (condition2 is true) {
        #do something
    } 
}

实际:

代码语言:javascript
复制
foreach ($required_fields as $fieldname) {
    if (!isset($_POST[$fieldname]) || empty($_POST[$fieldname])) {
        $errors[] = $fieldname;
    } 
}

if语句将(例如,在foreach循环的第一次迭代期间)计算var $_POST['menu_name'] --首先确定它是否未设置(即不存在--例如,它从未从表单传递)或第二,它被设置(即确实存在),但它是空的(没有值)。如果这些条件之一为True,那么将将var名称(现在包含在var $fieldname中)添加到$errors列表中。你的第三个问题正确地识别了这个动作。

回答Q3:是的,如果出现错误,第一个if语句可以重定向和退出,但这会混淆我们目前在代码中的逻辑分离。想想看:如果第一个if语句也完成了错误处理,那么一旦任何一个var验证失败,我们就会有一个重定向和退出(这个脚本)。通过将代码分割成具有特定功能的块(就像现在这样),我们现在有了一个错误列表,可以在我们的web应用程序的其他地方使用。

代码语言:javascript
复制
echo "You must enter values in the following required fields: ";
foreach ($errors as &$item) {
    echo $item . " ";
}

希望澄清了代码结构和逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8627274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档