我想从MySQL数据库导出一个Excel。 我想通过checkbox来获取用户的列名

这是我的正常的CSV查询。 我想从用户input的列名。 就像使用包含checkbox或下拉菜单的表单一样。 我应该如何修改它? 我已经尝试checkbox,但isset($ _ POST [“checkboxname”])不工作。 请帮帮我。

<?php include("../../../config.php"); //if(isset($_POST["submit"])){ $xls_filename = 'export_'.date('Ym-d').'.xls'; // Define Excel (.xls) file name $start_date=$_POST["date_time"]; $sql_ex = "Select device_name,description,card,device_module,uid FROM device"; $result = @mysql_query($sql_ex,$conn) or die("Failed to execute query:<br />" . mysql_error(). "<br />" . mysql_errno()); // Header info settings header("Content-Type: application/xls"); header("Content-Disposition: attachment; filename=$xls_filename"); header("Pragma: no-cache"); header("Expires: 0"); /***** Start of Formatting for Excel *****/ // Define separator (defines columns in excel &amp; tabs in word) $sep = "\t"; // tabbed character // Start of printing column names as names of MySQL fields for ($i = 0; $i<mysql_num_fields($result); $i++) { echo mysql_field_name($result, $i) . "\t"; } print("\n"); // End of printing column names // Start while loop to get data while($row = mysql_fetch_row($result)) { $schema_insert = ""; for($j=0; $j<mysql_num_fields($result); $j++) { if(!isset($row[$j])) { $schema_insert .= "NULL".$sep; } elseif ($row[$j] != "") { $schema_insert .= "$row[$j]".$sep; } else { $schema_insert .= "".$sep; } } $schema_insert = str_replace($sep."$", "", $schema_insert); $schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert); $schema_insert .= "\t"; print(trim($schema_insert)); print "\n"; } ?> 

首先,这不是Excel格式。 您正在制作一个tsv文件(并通过删除换行符来破坏数据)。 使用fputcsv并直接写入输出 ,它将正确地转义您的数据,所以您不必。

对于列select器,请将列名称设置为键并将用户友好标签设置为值的关联数组。 使用带有从迭代数组中创build的checkbox的表单,所有都使用name="columns[]"并将值设置为checkbox旁边的列名和标签。 在读取收到的值的脚本部分,首先检查isset($_POST['columns']) ,然后如果发布值数组中的每个值实际上存在于您的第一个数组中。 如果一切正常, implode()在您的查询中使用POST的列。


有些东西可以启动你,你不必使用一个只能读取数据的表单的POST:

 <?php $columns = [ 'device_name' => 'Device name', 'description' => 'Description', ... ]; // validate if (isset($_GET['columns'])) { if (!is_array($_GET['columns'])) { unset($_GET['columns']); } else { foreach ($_GET['columns'] as $k => $column) { if (!is_string($column) || !isset($columns[$column])) { unset($_GET['columns'][$k]); } } if ($_GET['columns']) { $_GET['columns'] = array_values($_GET['columns']); } else { unset($_GET['columns']); } } } // no (valid) column selection if (!isset($_GET['columns']) {?> <form action=""> <?php foreach ($columns as $column => $label) {?> <label><input type=checkbox value="<?php echo $column;?>"> <?php echo $label;?></label> <?php }?> ... <?php } else { ... $sql_ex = 'SELECT ' . implode(', ', $_GET['columns']) . ' FROM device'; ... // column headings fputcsv($output, array_intersect_key($columns, array_flip($_GET['columns']))); // output rows ... }