PHP 中导出为 CSV 的更改

Export to CSV changes in PHP

我正在 PHP 中导出到 CSV。我的代码运行良好,它可以根据需要在 ExcelSheet 中输出。 代码片段:

public function generate_csv() {
 $data_rows = array();
   $table = 'ProductDetails';
    $data_rows = array();
    global $wpdb, $bp;
    $data= $wpdb->get_results("SELECT * FROM " . $table . "");
    $fh = @fopen( 'php://output', 'w' );

foreach ($data as $u ) {
        $row = array();
        $row[0] = $u->productCode;
        $row[1] = $u->productTitle;
        $row[2] = $u->productDescription;
        $row[3] = $u->specification;
        $row[4] = $u->whereToBuy;       
        $data_rows[] = $row;
    }

  header("Pragma: public");
      ... Some more header ...
  header("Content-Transfer-Encoding: binary");

  fputcsv( $fh, $header_row );
  foreach ( $data_rows as $data_row ) {
         fputcsv( $fh, $data_row );
  }
   fclose( $fh );
   die();
 } 

正如您在代码中看到的那样,我正在对所有列名进行硬编码并创建数组。问题是如果数据库中的 phpMyAdmin add/remove 列那么为了获得完美的 ExcelSheet 还需要在此代码中进行必要的更改。任何人都可以帮助我使这段代码动态化吗?比如应该用什么代替 $row[0]、$row[1]、$row[2]... ??

谢谢

更全局的方法是使用双foreaches

 $data_rows=array();
    foreach ($data as $u ) {
        $row = array();
        foreach ($u as $field)
            {
            $row[] = $field; // collect dynamic row fields

            }
    $data_rows[] = $row;  // each row will have own array of fields
    }

/// 已编辑

public function generate_csv($table) // better to have table name here
{
 $data_rows = array();
    $data_rows = array();
    global $wpdb, $bp;
    $sql = "SELECT * FROM " . $table . "";

    $data= $wpdb->get_results($sql);    
    $fh = @fopen( 'php://output', 'w' );


    //following the example from: 
    $header_data=array(); 
    foreach ( $wpdb->get_col( "DESC " . $table, 0 ) as $column_name ) {
        $header_data[] = $column_name; 
    }

    array_push($data_rows,$header_data); // first array will be columns names

     foreach ($data as $u ) {
        $row = array();
        foreach ($u as $field)
            {
            $row[] = $field; // collect dynamic row fields

            }
    $data_rows[] = $row;  // each row will have own array of fields
    }

    ............  // rest of the code

    }

您可以使用虚拟 INFORMATION_SCHEMA.COLUMNS table 来获取列名,如下所示:

"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = {$table}"

这应该让你很接近,如果不是一直到那里。它将查询 table,为 csv 构建一个 headers 行,然后它将 assemble 每个数据行。如果您将响应行作为值进行迭代,则您不需要知道行名。

如果有小问题,我先道歉,因为我手头没有 PHP 框来验证精确的语法。

public function generate_csv() {

    global $wpdb;
    global $bp;
    $headers   = array();
    $data_rows = array();
    $table     = 'ProductDetails';
    $data_rows = array();
    $header_row;

    # determine table field names
    $table_sql = sprintf("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '%s'",$table);

    # this will run the query and stuff field names into
    $resp = $wpdb->get_results($table_sql);
    foreach($resp as $row){
        array_push($headers,$row[0]);
    }

    # get the records from the datbase
    $data= $wpdb->get_results(sprintf("SELECT * FROM %s",$table));

    # open output handle
    $fh = @fopen( 'php://output', 'w' );

    foreach ($data as $record ) {
       $row = array();
       foreach($record as $value){
           array_push($row,$value);
       }
       array_push($data_rows,$row);
    }
    header("Pragma: public");
      ... Some more header ...
    header("Content-Transfer-Encoding: binary");

    fputcsv( $fh, $headers );
    foreach ( $data_rows as $data_row ) {
        fputcsv( $fh, $data_row );
    }
    fclose( $fh );
    return;
 }