我想从mysql数据库导出一个excel。我希望在复选框的帮助下获得用户的列名

时间:2016-08-08 10:49:59

标签: php mysql excel csv

这是我的普通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 &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";
    }

    ?>

1 个答案:

答案 0 :(得分:0)

首先,这不是Excel格式。您正在创建一个tsv文件(并通过删除换行符来破坏数据)。使用fputcsvwrite straight to output,它会正确地转义您的数据,因此您不必这样做。

对于列选择器,设置一个关联数组,其中列名称为键,用户友好标签为值。使用带有通过迭代数组创建的复选框的表单,所有复选框都带有name="columns[]",值设置为列名称,标签回显于复选框旁边。在脚本中读取接收值的部分,首先检查是否isset($_POST['columns']),然后检查发布值数组中的每个值是否实际存在于第一个数组中。如果一切正常,implode()要在查询中使用的POSTed列。

<小时/> 有些事要让你开始,你不必使用只有数据读取形式的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
    ...
}