【问题标题】:PHP/MySQLi function that generates CSV from 3 tables but separately and need in 1 linePHP/MySQLi 函数,从 3 个表生成 CSV,但单独需要 1 行
【发布时间】:2015-05-24 00:34:08
【问题描述】:

这是我在这个项目上的最后一项任务,我不确定如何根据需要进行调整。我对这一切都很陌生,很高兴我能走到这一步!

以下函数从 3 个表中获取数据并生成一个 CSV 文件(很好并且工作正常),但是它将文件分成 3 个部分,理想情况下,我希望每行每个订单的所有数据。

就目前而言,您可以在 3 个部分中看到 3 个表格,但我确实需要 1 行内的发票 ID 中的所有数据。

代码:

// download invoice csv sheet
if ($action == 'download_csv'){

    header("Content-type: text/csv"); 

    // output any connection error
    if ($mysqli->connect_error) {
        die('Error : ('.$mysqli->connect_errno .') '. $mysqli->connect_error);
    }

    $tables = array('invoices', 'customers', 'invoice_items'); // array of tables need to export

    $file_name = 'invoice-export-'.date('d-m-Y').'.csv';   // file name
    $file_path = 'downloads/'.$file_name; // file path

    $file = fopen($file_path, "w"); // open a file in write mode
    chmod($file_path, 0777);    // set the file permission

    // loop for tables
    foreach($tables as $table) {
        $table_column = array();
        $query_table_columns = "SHOW COLUMNS FROM $table";

        // fetch table field names
        if ($result_column = mysqli_query($mysqli, $query_table_columns)) {
            while ($column = $result_column->fetch_row()) {
                $table_column[] = $column[0];
            }
        }

        // Format array as CSV and write to file pointer
        fputcsv($file, $table_column, ",", '"');

        $query_table_columns_data = "SELECT * FROM $table";

        if ($result_column_data = mysqli_query($mysqli, $query_table_columns_data)) {

            // fetch table fields data
            while ($column_data = $result_column_data->fetch_row()) {
                $table_column_data = array();
                foreach($column_data as $data) {
                    $table_column_data[] = $data;
                }

                // Format array as CSV and write to file pointer
                fputcsv($file, $table_column_data, ",", '"');
            }

        }
    }

    //if saving success
    if ($result_column_data = mysqli_query($mysqli, $query_table_columns_data)) {
        echo json_encode(array(
            'status' => 'Success',
            'message'=> 'CSV has been generated and is available in the /downloads folder for future reference, you can download by <a href="/downloads/'.$file_name.'">clicking here</a>.'
        ));

    } else {
        //if unable to create new record
        echo json_encode(array(
            'status' => 'Error',
            //'message'=> 'There has been an error, please try again.'
            'message' => 'There has been an error, please try again.<pre>'.$mysqli->error.'</pre><pre>'.$query.'</pre>'
        ));
    }


    // close file pointer
    fclose($file);

    $mysqli->close();

}

【问题讨论】:

  • 这是一个相当大的改变,你要求别人为你做。您需要更改 SQL 查询以连接所有 3 个表并为每个 invoice_item 生成一行。尝试这样做,然后在遇到问题时寻求帮助

标签: php mysql csv mysqli


【解决方案1】:

假设invoiceinvoices 表和customers 表中是唯一的,并且它包含我们用来“匹配”所有表中的行的通用值...

(这里有个简短的说明:这是实际表定义,包括主键、唯一键、外键、列的数据类型,甚至列 cmets,对于帮助通信和我们不必做出可能错误的假设...)

这是一个 SQL 查询示例,您需要“组合”所有表中的行,每个 invoice_item 一行

SELECT i.id
     , i.invoice
     , i.foo
     , i.bar

     , c.id        AS c_id
     , c.invoice   AS c_invoice
     , c.name      AS c_name
  -- , c.fee
  -- , c.fi

     , t.id        AS t_id
     , t.invoice   AS t_invoice
     , t.product   AS t_product
     , t.qty       AS t_qty
  -- , t.fo
  -- , t.fum       

  FROM invoice i
  LEFT
  JOIN customer c
    ON c.invoice = i.invoice
  LEFT
  JOIN invoice_item t
    ON t.invoice = i.invoice
 ORDER
    BY i.id
     , c.id
     , t.id

从每个表中添加您需要的任何列,并确保每列在返回的行中有一个 唯一 名称(在 SELECT 列表中的每个表达式之后使用 AS column_alias。)

【讨论】:

  • 如果不清楚,请处理此 SQL 语句的结果,而不是处理查询 SELECT * FROM invoices 的结果。要获取列标题,您可以从结果集中检索元数据。 (我确定有一个 mysqli 函数可以从结果集中检索列名和数据类型;mysqli 函数的函数名中可能有“元”。)让数据库根据列中的共同值;一个名为“join”的基本 SQL 构造可以为您完成这些工作。
  • 这是 mysqli 函数,用于检索关于查询返回的结果集的“元数据”...列名和数据类型,mysqli_stmt_result_metadata http://php.net/manual/en/mysqli-stmt.result-metadata.php。您可以遍历它以获取要在 .CSV 文件的“标题”行上使用的列名。 (注意:使用结果集中的元数据对于现有代码也是一种更好的模式,而不是运行单独的 SHOW COLUMNS 语句。)
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2015-12-16
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多