2012-12-11 36 views
2

TL的价值; DR版本

我有一个大的形式与数百上的HTML输入元素的,我做了一个PHP的阵列来存储它的所有元素名称。当我运行我的process.php文件时,它使用循环遍历该数组,并创建一个新数组,该数组的键是每个元素的名称,该数组的值是每个元素的值。我知道这段代码作为文本框,单选按钮和下拉选择的元素值工作正常。复选框没有放入数组中的值,而是键和值读取相同的东西,即元素的名称。为什么$ _POST给我的复选框的名称或ID,而不是它的值?

充分说明/ W代码示例:

我遇到的问题似乎相当不寻常我从我的理解它违背$ _ POST应该如何工作。

无论如何,我一直在开发一个过去一年的旅游保险网站,它已接近完成。客户希望我创建一个表单的版本,他们可以在用户提交应用程序后查看这些表单,并从他们选择的文件中获取值。

我的问题是,$ _POST没有得到我的复选框元素的值,而是他们的名字或ID(两者是相同的,所以我不能确定它是哪一个)。 $ _POST成功获取所有广播,文本和下拉元素的值,而不是复选框。

我的process.php文件中有一个非常大的数组,因为窗体非常大。我所做的是创建一个数组,其中包含我希望访问的每个元素的名称。下面是这个数组所遵循的结构的示例,在这里发布整个事物(表单上的400多个元素)是很大的。

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

'trav_emer_annual', 
'trav_emer_annual_date_go', 
'trav_emer_annual_days', 

'trav_emer_extend', 
'trav_emer_extend_date_go', 
'trav_emer_extend_date_ef', 
'trav_emer_extend_date_ba', 
'trav_emer_extend_days', 
); 

这是对process.php运行创建用户数据文件,该文件被保存到服务器上的文件夹保护的代码。

// Create user output data 
$out_data = array(); 
$count = count($form_data); 
for($i = 0; $i < $count; $i++) 
{ 
    if(empty($_POST[$form_data[$i]])) { 
     $out_data[$form_data[$i]] = " "; 
     } 
    else { 
     $out_data[$form_data[$i]] = $_POST[$form_data[$i]]; 
     } 
} 

//Set variable names for new file 
$dir = "/home/imelnick/public_html/getawayinsured.ca/userdata/"; 
$timestamp=date("YmdGis"); 
$name = $out_data['txtApp1Name']; 
$value = str_replace(" ", "", $name); 
$item = $value . "^" . $timestamp . ".txt"; 
$filename = $dir . $item; 

//Put data in file 
//Open file for writing 
$fileHandle = fopen($filename, 'w') or die("Can't open file"); 

//Write contents of out_data array to file 
foreach ($out_data as $key => $value) { 
$fileLine = $key . "\t" . $value . "\r\n"; 
fwrite($fileHandle, $fileLine); 
} 

//Close file 
fclose($fileHandle); 

阵列中的名字的第一个块属于复选框和它们遵循以下的格式:

<input type="checkbox" name="trav_emer_med_insur" id="trav_emer_med_insur_if" value="YES" class="form_elements" onClick="if(this.checked){document.getElementById('trav_emer_med_options').style.display='block';}else{document.getElementById('trav_emer_med_options').style.display='none';}"/> 

的onclick语句膨胀含有提供进一步的选项,以申请人附加复选框一个div 。

从表单数据创建的我的输出数据数组中的每个项的键都具有该元素的名称,并且该数组中的每个项的值都是相应HTML元素的值。

拆分数组并写入$ key/$ value组合时,$_POST[$form_data[0]] (note: $form_data[0] = trav_emer_med_insur)的期望值是上述复选框代码value="YES"的值。但是,文件中的输出如下所示。

trav_emer_med_insur trav_emer_med_insur

我敢肯定,没有与处理窗体本身作为表单上的其他元素有自己的价值观保存得很清楚该文件的代码中的问题(单选按钮,文本框,下拉所有的工作)。复选框不会,它们会拒绝$ _POST HTML元素的值,并且只需继续输出该名称两次。

例如,上面列出的名为smoked_if的数组示例中没有列出的表单中的另一个元素是一个单选按钮对,询问申请人是否吸烟。这是来自最近应用程序的示例输出。

可以看出我的代码的预期结果正在执行。

smoked_if no

我在这里损失,因为这不仅违背了$ _ POST本身,而是因为在表格上的所有其他元素都贴出他们的价值观没有问题,它告诉我的功能有一个与复选框问题元素和$ _POST。

任何援助不胜感激。

+2

尝试把TL; DR版本放在最上面;) – Rob

+1

相关?:http://stackoverflow.com/questions/8613250/process-html-checkboxes-and-their-values – GreenMatt

+1

你做了一个'var_dump( $ _POST)',以确保你的'是'值甚至显示出来?表单字段中的“id”值不会被提交,只是'name'属性。 –

回答

1

只要信息是表单标签内,它将被传递到服务器。这就是说,你需要明白发送给服务器的是项目的名称和值。

当你正在寻找在PHP中,要提交,然后一个字符串像:样品从http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_form_checkbox以及

?vehicle=car&vehicle=truck 

在PHP中,当你将它张贴,这个想法是一样的,但只是隐藏在不熟练的眼睛里。为了得到它的价值在我的例子:

$vehicle= $_POST["vehicle"]; 
echo ''.$vehicle; //shows ARRAY 

foreach($item in $vehicle){ 
    echo ''.$item.'\n'; //will iterate through all the vehicle and print them out 
} 

你也可以说像

if(in_array("car", $vehicle)){ 
    echo "there exists a car\n"; 
} 
http://php.net/manual/en/function.in-array.php 
+0

我的问题是$ _POST没有返回表单元素的值,它返回的名称。我没有未经检查的框的问题。当一个盒子被CHECKED时,它不会返回$ _POST中的值。我的代码中的$ _POST正在处理其他所有内容,但复选框。我不使用?查询字符串我正在使用一个数组和一个外部文件。很明显,你甚至没有阅读我对问题的解释。 – SC1988

+0

当然不是,我在偷看它。这很漫长,但我很诚实。在这种情况下,你是否交叉检查了文件数据以确保它被正确解析?由于复选框有一个名字(通过)和一个值(通过),你可能认为它有一个值,但它没有。也许你指定了复选框的文本/可见内容,但没有设置值。例如:文本和值可能是相同的东西,但该值没有设置,因此通过表单提交传入了一个空值。 – Fallenreaper

+0

我知道这是3岁,但我只想回来说你是对的Fallenreaper,这是一个解析问题,我最终通过更改生成文件的代码中的一行来修复此问题。对不起,如果我在书呆子狂怒之前就像一个家伙一样脱落了。 – SC1988

1

事情既然复选框被张贴只有当他们检查,你需要一个解决方法。我认为最常见的修复方法是使用隐藏输入,其名称与相同,并且通常为0。并且不要忘记在复选框之前放置隐藏的输入:) 这种方式即使未勾选复选框,您也会获得隐藏输入的值。如果选中该复选框,则隐藏字段的值将在复选框中被POST数组覆盖。

+0

这不是我的问题;未经检查的盒子不会造成问题。问题是当一个盒子被选中时,它会返回NAME,而不是盒子的值。所有复选框的值都设置为YES。但是,当用户选中该框时,它将返回名称,而不是值。 – SC1988