PHP isset在表单、循环和数组上工作不正常

PHP isset在表单、循环和数组上工作不正常,php,html,arrays,forms,post,Php,Html,Arrays,Forms,Post,老实说,这是我用过的最挑剔、最笨拙的语言。当这个项目完成后,我会很高兴的 无论如何,我必须告诉我们PHP,所以这里是我的问题 我有一个名为$form_data的数组,如下所示: $form_data = array ('trav_emer_med_insur', 'trav_emer_single', 'trav_emer_single_date_go', 'trav_emer_single_date_ba', 'trav_emer_annual', 'trav_emer_annual_da

老实说,这是我用过的最挑剔、最笨拙的语言。当这个项目完成后,我会很高兴的

无论如何,我必须告诉我们PHP,所以这里是我的问题

我有一个名为$form_data的数组,如下所示:

$form_data = array 
('trav_emer_med_insur',
'trav_emer_single',
'trav_emer_single_date_go',
'trav_emer_single_date_ba',

'trav_emer_annual',
'trav_emer_annual_date_go',

'trav_emer_extend',
'trav_emer_extend_date_go',
'trav_emer_extend_date_ef',
'trav_emer_extend_date_ba',


'allinc_insur',

'allinc_insur_opt1',
'allinc_single_date_go',
'allinc_single_date_ba',

'allinc_insur_opt2',
'allinc_annual_date_go',
'allinc_annual_date_ba',



'cancel_insur',
'allinc_annual_date_go', 
'allinc_annual_date_ba',



'visitor_insur', 
'country_select',

'visitor_supervisa', 
'visitor_supervisa_date_go',
'visitor_supervisa_date_ba',

'visitor_student',
'visitor_student_date_go',
'visitor_student_date_ba',

'visitor_xpat',
'visitor_xpat_date_go',
'visitor_xpat_date_ba',

'txtApp1Name',
'txtApp2Name',
'txtApp1DOB',
'txtApp2DOB',
'txtApp1Add',
'txtApp1City',
'selprov',
'txtApp1Postal',
'txtApp1Phone',
'txtApp1Ext',
'txtApp1Email',
'conpref', );
这些是HTML表单上name=”“字段的名称。我已经使用var\u dump($\u POST)验证了所有名称都存在并且具有默认值“”

我想做的非常简单,使用$form_数据作为参考,执行以下操作:

  • 创建一个名为$out_data的新数组,该数组可以处理数据以显示在反流表单上
$out_data的结构很简单,例如,键将是另一个数组$out_data[txtApp1Name]中元素的名称,然后该键的值将是值

  • 现在我想首先检查是否设置了每个name=”“,以消除错误并验证数据。然后,无论是否设置,在$out\u数据数组中创建其占位符

  • 因此,如果未设置$\u POST[$form\u data[1]](名称为'trav\u emer\u single'),请在$out\u数据中创建一个类似于此$out\u数据的条目([trav\u emer\u single]=>“无数据”)

  • 如果设置了$\u POST[$form\u data[1]](名称为'trav\u emer\u single'),则在$out\u数据中创建并输入如下内容:$out\u data([trav\u emer\u single]=>“用户键入的内容”)

我尝试过以下代码:

$out_data = array();
$count = count($form_data); 
for( $i = 0; $i < $count; $i++ ) 
{
    if(!isset($_POST[$form_data[$i]])) {
        $out_data[$form_data[$i]] = "NO_DATA";
        }
    else {
        $out_data[$form_data[$i]] = $_POST[$form_data[$i]];
        }
}
$out_data=array();
$count=计数($form_数据);
对于($i=0;$i<$count;$i++)
{
如果(!isset($\u POST[$form\u data[$i]])){
$out_data[$form_data[$i]]=“无数据”;
}
否则{
$out_data[$form_data[$i]]=$u POST[$form_data[$i]];
}
}
现在这段代码在技术上可以工作了,它正在遍历数组并分配值,但是它没有正确地执行

我在表格上点击了提交,没有输入任何内容。因此,每个项目都应该在我的反流输出上显示“NO_DATA”(供用户查看),但只有一些项目会显示。我确认的所有项目都有name=”“,并且与数组匹配,并且没有输入任何内容。为什么没有将“无数据”分配给数组中的每个项

同样值得注意的是,如果我完全填写表格,$out_数据已完全正确填充。有什么问题吗!伊塞特?我尝试过做$\u POST[$form\u data[$I]]='',它在每个无数据的实例中都没有放置任何数据,但是无论我是否在框中写入内容,它都会为页面上的每个项目抛出一个“未定义索引”警告

真的,我只是想知道WTF正在进行中,这个项目的死线正在快速关闭,PHP的每一步都让我感到悲伤

据我所知,通过阅读我的代码是有效的,但拒绝执行广告

如果您需要更多的代码示例,请询问

这里真的很困惑,没有什么是没有错误的,请帮助

谢谢
-肖恩

而不是检查
!isset()
,使用
empty()
。如果表单发布一个空字符串,它仍将作为一个空字符串显示在
$\u POST
中,
isset()
将返回
TRUE

我已经用
foreach
循环替换了增量
for
循环,这在PHP中几乎总是用于迭代数组

$out_data = array();
foreach ($form_data as $key) {
    if(empty($_POST[$key])) {
        $out_data[$key] = "NO_DATA";
    }
    else {
        $out_data[$key] = $_POST[$key];
    }
}

PHP的
isset
返回
TRUE
,除非变量未定义或
NULL
。空字符串
不会导致它返回
FALSE
empty()
将完全满足您的需要

如果测试已设置为的变量,则isset()将返回FALSE 无效的还请注意,空字节(“\0”)并不等同于PHP 空常量

如果var存在且值不是NULL,则返回TRUE,否则返回FALSE 否则


使用
empty()
而不是
!isset()
空字符串
将为
isset()
返回true,并且您可能有
$\u POST
键,但它们是空字符串。请注意,如果您意识到这一点,请务必注意,但我们中的大多数人可能认为PHP是一种很好的语言。以这样的评论开始你的文章可能会让一些人感到厌烦。只需说,您使用PHP的问题似乎是将其视为C。不要在PHP中使用增量for循环。我们几乎在所有情况下都使用
foreach
。增量循环很少使用。empty()似乎已经解决了这个问题。你说得对,C#是我的母语,我使用它是因为我客户的web服务器不支持ASP.net-谢谢你的帮助。我原以为empty()仍然会抛出“undefined index”错误,所以我尝试使用isset的原因——在我发布建议之前,这里还有其他问题。@SC1988我把它作为一个答案
empty()
隐式调用
isset()
并检查空字符串和空字符串,这样您就不会收到未定义的索引通知。谢谢,我不知道如何在PHP中正确使用foreach和数组。与PERL语言相比,它更习惯于C语言(我想PHP在这两种语言中都有很强的根基,但无论如何)。@SC1988:“我不知道如何使用foreach”--。顺便说一句,你告诉过我你是C#guy。然后我有个坏消息告诉你:C#中有
foreach
,它的工作原理非常接近phpy你是对的,但是C#中的foreach在使用类和asp.net时可以做一些时髦的事情,但更重要的是,我学的第一门语言没有foreach,旧习惯很难消除,哈哈