不理解PHP中的这些$\u POST、数组和验证技术

不理解PHP中的这些$\u POST、数组和验证技术,php,arrays,post,isset,Php,Arrays,Post,Isset,我是通过辅导的方式学习的,老师使用了一个我感到困惑的验证程序 在表单页面上,他有以下名称的输入字段: 菜单名 位置 可见的 在表单处理页面上,他有以下php块(我们称之为块A): 在这个块下面是另一个将数据插入MySQL的php块——这一切都很好 然后,他在块A上方添加了以下php块(我们称之为块B): 问题1 我不明白为什么在他的$required\u fields数组中,他直接引用字段名。为什么不将块A移到块B上方,然后只引用从$\u POST分配的变量 然后在foreach循环中的

我是通过辅导的方式学习的,老师使用了一个我感到困惑的验证程序

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

  • 菜单名
  • 位置
  • 可见的
在表单处理页面上,他有以下php块(我们称之为块A):

在这个块下面是另一个将数据插入MySQL的php块——这一切都很好


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


问题1

我不明白为什么在他的
$required\u fields
数组中,他直接引用字段名。为什么不将块A移到块B上方,然后只引用从$\u POST分配的变量

然后在
foreach循环中的
if语句中使用这些变量

我想我是在问我的替代方法是否有效?他采取这种做法有明显的原因吗

(仅供参考,
mysql\u prep
是他为删除斜杠等而构建的自定义函数。)


问题2

如果我正确理解了他的代码,那么他的第一个
If语句
将测试
$fieldname
是否为
!isset
(即未设置)
为空

有什么区别?由于我不知道两者的区别,我也不清楚他为什么使用
|
操作符。你能解释一下吗


问题3

最后,他的第一个
if语句
似乎捕获了任何错误,并将它们放入块B顶部的
$errors数组中

然后,他使用第二个
if语句
检查
$errors数组
中是否有任何内容,如果有,则重新定向+退出

这种做法有明显的原因吗?在我看来,如果发现任何错误,第一个
if语句可以重定向+退出。为什么要在
$errors数组中捕获它们

  • 据我所知,如果您想在准备输入之前检查输入是否存在,或者以其他方式检查输入是否存在,则没有区别

  • isset()
    检查变量是否已设置(存在),而
    empty()
    将在变量存在但不包含任何数据时返回true。
    |
    运算符是OR运算符。如果
    isset()
    返回false(!)或
    empty()
    返回true,则该语句为true

  • 我怀疑他填充错误数组的原因是为了能够显示表单中的所有错误,而不仅仅是第一个错误,当用户重新提交时,他会得到下一个错误

  • 据我所知,如果您想在准备输入之前检查输入是否存在,或者以其他方式检查输入是否存在,则没有区别

  • isset()
    检查变量是否已设置(存在),而
    empty()
    将在变量存在但不包含任何数据时返回true。
    |
    运算符是OR运算符。如果
    isset()
    返回false(!)或
    empty()
    返回true,则该语句为true

  • 我怀疑他填充错误数组的原因是为了能够显示表单中的所有错误,而不仅仅是第一个错误,当用户重新提交时,他会得到下一个错误

  • 问题1

    这里发生的是他首先检查某些变量的存在性。如果它们不存在,则需要重定向。
    我不知道prep函数做什么,但是对一个可能的空变量调用prep函数是不合逻辑的。你可以扭转局面,但那将是。。好扭转局面;)

    首先检查你是否有你需要的一切,然后开始清理

    问题2

    未设置意味着它在POST中不可用。复选框会出现这种情况(如果不选中它们,则它们不会被激活。文本输入将为空。
    即使你只有文本输入,在你检查它们的内容之前,确认它们的存在(可能在呼叫帖子中有问题,有人可能正在入侵你的表单)也是很好的:PHP当然是非常宽容的,但是检查不存在的内容并不是很好

    概要:isset正在查看它是否存在,empty正在检查它的值

    问题3

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

    稍后,您可能希望对丢失的POST值(所有这些值)执行一些操作,比如给它们一个特定的类,所以这可能是以后这样做的原因

    问题1

    这里发生的事情是,他首先检查某些变量是否存在。如果它们不存在,则需要重定向。
    我不知道prep函数是做什么的,但是对一个可能的空变量调用prep函数是不合逻辑的。你可以把它转过来,但那将是..嗯..把东西转过来;)

    首先检查你是否有你需要的一切,然后开始清理

    问题2

    未设置意味着它在POST中不可用。复选框会出现这种情况(如果不选中它们,则它们不会被激活。文本输入将为空。
    即使您只有文本输入,在检查其内容之前,最好确保它们存在(调用帖子中可能有问题,有人可能正在对您的表单进行黑客攻击):PHP非常缺乏
    $menu_name = mysql_prep($_POST['menu_name']);
    $position = mysql_prep($_POST['position']);
    $visible = mysql_prep($_POST['visible']);
    
    $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;
    }
    
    foreach (list as item) {
        if (condition1 is true) or (condition2 is true) {
            #do something
        } 
    }
    
    foreach ($required_fields as $fieldname) {
        if (!isset($_POST[$fieldname]) || empty($_POST[$fieldname])) {
            $errors[] = $fieldname;
        } 
    }
    
    echo "You must enter values in the following required fields: ";
    foreach ($errors as &$item) {
        echo $item . " ";
    }