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

我很确定处理表单本身的代码没有问题,因为表单上的其他元素的值很好地保存到文件中(单选按钮、文本框、下拉菜单都可以使用)。Checkboxes 没有,它们拒绝 $_POST HTML 元素的值,只是不断地输出名称两次。

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

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

smoked_if no

我在这里不知所措,因为这不仅与 $_POST 本身的功能相矛盾,而且由于表单上的所有其他元素的值都没有问题地发布,它告诉我复选框元素和 $_POST 存在问题。

非常感谢任何帮助。

4

3 回答 3

2

我认为您的问题可能与未选中复选框时未发布的事实有关。

如果您需要解决此问题,请参阅发布未选中的复选框

于 2012-12-11T21:42:13.003 回答
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
于 2012-12-11T21:50:06.930 回答
1

由于复选框仅在选中时才会发布,因此您需要一种解决方法。我认为最常见的解决方法是使用与复选框同名的隐藏输入,通常为 0 作为值。并且不要忘记将隐藏输入放在复选框之前:) 这样即使未选中复选框,您也会获得隐藏输入的值。如果复选框被选中,隐藏字段的值在 POST 数组中被复选框中的值覆盖。

于 2012-12-11T22:05:05.823 回答