这是我的普通CSV查询。我想从用户输入中获取列名。比如包含复选框或下拉列表的表单。我应该如何修改它?我试过了复选框,但isset($_POST["checkboxname"])
无效。
<?php
include("../../../config.php");
//if(isset($_POST["submit"])){
$xls_filename = 'export_'.date('Y-m-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 & 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";
}
?>
答案 0 :(得分:0)
首先,这不是Excel格式。您正在创建一个tsv文件(并通过删除换行符来破坏数据)。使用fputcsv
和write straight to output,它会正确地转义您的数据,因此您不必这样做。
对于列选择器,设置一个关联数组,其中列名称为键,用户友好标签为值。使用带有通过迭代数组创建的复选框的表单,所有复选框都带有name="columns[]"
,值设置为列名称,标签回显于复选框旁边。在脚本中读取接收值的部分,首先检查是否isset($_POST['columns'])
,然后检查发布值数组中的每个值是否实际存在于第一个数组中。如果一切正常,implode()
要在查询中使用的POSTed列。
<?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
...
}