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 / $值组合后,$_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存在问题。 / p>
非常感谢任何帮助。
答案 0 :(得分:2)
我认为您的问题可能与未选中复选框时未发布复选框有关。
参见Post the checkboxes that are unchecked 如果你需要绕过这种行为
答案 1 :(得分:1)
只要信息在Form标签内,它就会传递给服务器。话虽如此,您需要了解发送到服务器的内容是项目的名称和值。
当您查看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
答案 2 :(得分:1)
由于复选框仅在选中时才会过帐,因此您需要一种解决方法。我认为最常见的解决方法是使用与复选框名称相同的隐藏输入 ,通常为0作为值。并且不要忘记将隐藏的输入放在复选框之前:) 这样,即使未选中复选框,您也可以获得隐藏输入的值。如果选中该复选框,则隐藏字段的值将在POST数组中被复选框中的值覆盖。