我正在通过教程学习,老师使用了一个验证例程,我对此感到困惑。
在表单页面上,他有具有以下名称的输入字段:
在表单处理页面上,他有以下php块(让我们称它为块A):
$menu_name = mysql_prep($_POST['menu_name']);
$position = mysql_prep($_POST['position']);
$visible = mysql_prep($_POST['visible']);在这个块下面是另一个php块,它将数据插入到MySQL中--这一切都很好。
然后,他在块A (我们称之为块B)之上添加了以下php块:
$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里捕获它们
发布于 2011-12-24 22:56:04
问题1
这里发生的是,他首先检查某些变量的存在。如果它们不存在,则需要重定向。
我不知道prep函数是干什么的,但是在可能的空变量上调用prep函数是不合逻辑的。你可以扭转局面,但那将是..。好吧..。(使事情好转;)
先检查你是否有你需要的东西,然后开始清理。
问题2
Not意味着它在帖子中不可用。这将发生在复选框(如果你不检查,他们不会兴奋。文本输入将为空。
即使您只有文本输入,在检查它们的内容之前,最好确保它们的存在(在调用post中可能有问题,有人可能正在侵入您的表单):PHP当然是非常宽容的,但是检查一些不存在的内容并不太好。
摘要: isset正在查看它是否存在,空正在检查它的值。
问题3
您可以将重定向和退出语句放在if中,这样会稍微快一点。但是没有那么多,对于一些程序员来说,您所做的事情是出乎意料的:您在循环中间的某个地方改变了程序的流(2个循环)。这对我来说是可读的,但我不认为在第一个“错误”时退出会有任何问题。
稍后,您可能想要处理丢失的POST值(所有这些值),比如给它们一个特定的类,所以这是以后这样做的可能原因吗?
发布于 2011-12-24 22:54:19
据我所理解,如果您想在准备输入之前检查输入是否存在,或者around.
isset()检查变量是否存在(存在),则empty()将返回true,但不包含任何数据。||运算符是OR运算符。如果isset()返回false (!),则语句为true。或者empty()返回true。。
发布于 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
$required_fields是一个由3个预期变量名称组成的数组(从前面形式的“必需字段”中获取)。因此,$required_fields的内容不是POST变量本身,而是它们名称的列表。
然后,$required_fields列表中的每个项(var名称)由foreach循环迭代(按顺序使用),以避免我们需要写出3次if语句(每个变量一次)。因此,关于您的第一个问题,创建$required_fields数组是因为方便的foreach循环需要它(例如,假设有20个vars!)。
摘要:
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;
}
}if语句将(例如,在foreach循环的第一次迭代期间)计算var $_POST['menu_name'] --首先确定它是否未设置(即不存在--例如,它从未从表单传递)或第二,它被设置(即确实存在),但它是空的(没有值)。如果这些条件之一为True,那么将将var名称(现在包含在var $fieldname中)添加到$errors列表中。你的第三个问题正确地识别了这个动作。
回答Q3:是的,如果出现错误,第一个if语句可以重定向和退出,但这会混淆我们目前在代码中的逻辑分离。想想看:如果第一个if语句也完成了错误处理,那么一旦任何一个var验证失败,我们就会有一个重定向和退出(这个脚本)。通过将代码分割成具有特定功能的块(就像现在这样),我们现在有了一个错误列表,可以在我们的web应用程序的其他地方使用。
echo "You must enter values in the following required fields: ";
foreach ($errors as &$item) {
echo $item . " ";
}希望澄清了代码结构和逻辑。
https://stackoverflow.com/questions/8627274
复制相似问题