导出到PHP中的CSV更改

导出到PHP中的CSV更改,php,phpmyadmin,export-to-csv,Php,Phpmyadmin,Export To Csv,我正在用PHP进行导出到CSV的工作。我有工作正常的代码,它可以根据我的需要在ExcelSheet中输出。 代码段: public function generate_csv() { $data_rows = array(); $table = 'ProductDetails'; $data_rows = array(); global $wpdb, $bp; $data= $wpdb->get_results("SELECT * FROM " . $tab

我正在用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在数据库中添加/删除列,那么为了获得完美的ExcelSheet,还需要在此代码中进行必要的更改。谁能帮我把这段代码变成动态的。?比如,应该用什么来代替$row[0]、$row[1]、$row[2]


谢谢你

更全面的方法是使用双前肢

 $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: https://stackoverflow.com/a/31068464/1171074
    $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

    }

更全局的方法是使用双前额

 $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: https://stackoverflow.com/a/31068464/1171074
    $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

    }

可以使用虚拟信息_SCHEMA.COLUMNS表获取列名,如下所示:


“从INFORMATION\u SCHEMA.COLUMNS中选择COLUMN\u NAME,其中table\u NAME={$table}”

您可以使用virtual INFORMATION\u SCHEMA.COLUMNS表获取列名,如下所示:


“从INFORMATION\u SCHEMA.COLUMNS WHERE table\u NAME={$table}中选择COLUMN\u NAME”

这应该可以让您非常接近,如果不是全部的话。它将查询该表,为csv构建一个标题行,然后将组装每个数据行。如果将响应行作为值进行迭代,则不需要知道行名称

如果有点问题,我首先道歉,因为我手边没有一个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;
 }

这应该会让你非常接近,如果不是一直到那里的话。它将查询该表,为csv构建一个标题行,然后将组装每个数据行。如果将响应行作为值进行迭代,则不需要知道行名称

如果有点问题,我首先道歉,因为我手边没有一个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;
 }


如果您的表架构经常更改,或者人们没有将更改传达给涉众。。您需要确保列始终匹配,然后我解决这个问题的方法是连接到数据库,获取表的模式转储并将其保存为名称转换表,然后您可以使用该数组自动分配输出中的列标题。这是一个相当健壮的解决方案,但是为了构建翻译数组,您必须从模式结果的开始处修剪一些积垢。。?抱歉,这很愚蠢,但我在PHP的年龄只有一天。更多的问题是如何使用SQL来帮助您。。我会想出一些东西,并在稍后将其作为一个答案发布。如果您的表架构经常更改,或者人们没有将更改传达给利益相关者。。您需要确保列始终匹配,然后我解决这个问题的方法是连接到数据库,获取表的模式转储并将其保存为名称转换表,然后您可以使用该数组自动分配输出中的列标题。这是一个相当健壮的解决方案,但是为了构建翻译数组,您必须从模式结果的开始处修剪一些积垢。。?抱歉,这很愚蠢,但我在PHP的年龄只有一天。更多的问题是如何使用SQL来帮助您。。我会想出一个办法,并把它作为一个答案在一点点后发布。传奇兄弟。。你救了我的小屁股。。感谢您为标题行提供建议?$Header\u row=array(0=>'productCode',1=>'productTitle',2=>'productDescription',3=>'specification',4=>'whereToBuy');你能给我一个选项吗?请看更新后的答案:)在那之前我得到了解决方案,但我还是用你的答案测试了一下,它不起作用..Legend Bro。。你救了我的小屁股。。感谢您为标题行提供建议?$Header\u row=array(0=>'productCode',1=>'productTitle',2=>'productDescription',3=>'specification',4=>'whereToBuy');你能给我一个选项吗?请看更新后的答案:)在那之前我得到了解决方案,但我还是用你的答案进行了测试,它不起作用。它抛出一个错误警告:为C:\some path\plugins\Export\Export.php中的foreach()提供的参数无效,第101行是foreach($wpdb->get\u results($sql)as$colname){array_push($headers,$colname);}它应该将响应视为一个数组…或者我可能将错误的查询拉到了数组方法..我会在有更改时对其进行编辑,以便为其生成完整的测试用例。一旦您提出op,请告诉我们。谢谢thoughOK,我明白了,wpdb是一个特定于WordPress的模块,它似乎与我最常用的模块不同。我正在编辑e立即回答。致命错误:无法在C:\somePath\plugins\Export\Export.php的第102行使用stdClass类型的对象作为数组。它抛出一个错误警告:为C:\somePath\plugins\Export\Export.php的第101行的foreach()提供的参数无效
并且第101行是foreach($wpdb->get\u results($sql)as$colname){array\u push($headers,$colname);}它应该将响应视为一个数组…或者我可能将错误的查询拉到了数组方法..我会在有更改时对其进行编辑,以便为其生成完整的测试用例。一旦您提出op,请告诉我们。谢谢thoughOK,我明白了,wpdb是一个特定于WordPress的模块,它似乎与我最常用的模块不同。我正在编辑e立即回答。致命错误:无法在第102行的C:\somePath\plugins\Export\Export.php中将stdClass类型的对象用作数组