【问题标题】:Adding another JOIN to query and getting table column titles添加另一个 JOIN 以查询并获取表列标题
【发布时间】:2015-05-26 14:46:41
【问题描述】:

我正在处理数据到 CSV 函数,但我卡住了。

到目前为止,它从两个表中获取所有数据,并将每个订单的发票数据和客户数据全部放在 1 行中的 CSV 文件中。

我还需要通过 ID 获取 invoice_items(我猜这些需要循环,因为可能有超过 1 个项目,但不确定如何将 invoice_items 添加到查询中,并且我还需要为列,但不确定如何)。

如果可以是这样就很棒了:

|发票详细信息客户详细信息|发票项目

                               LIST ITEM

                               LIST ITEM

                               LIST ITEM

而不是

发票详情 |客户详情 |发票项目 LIST ITEM LIST ITEM 列表项

真实的数据和标题看起来像

标识 |发票号码 |金额 |姓名 |地址 |发票项目(和 在这部分下面列出)

PHP

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

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

    $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

    $query_table_columns_data = "SELECT * 
                                    FROM invoices i
                                    JOIN customers c
                                    ON c.invoice = i.invoice
                                    WHERE i.invoice = c.invoice
                                    ORDER BY i.invoice";

    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, ",", '"');
        }

    }

【问题讨论】:

  • 你不能循环通过 $table_column_data 并在循环中使用 fputcsv,所以每张发票都在下一行吗?
  • 我已经进入下一行,我想我不会导出项目,因为我看不到我正在解决这个问题,但我正在尝试解决如何设置列标题名称 - 有什么想法吗?
  • 我试过 // 获取标题 while ($headers = mysqli_fetch_field($result_column_data)) { foreach($headers as $header) { $head[] = $header->name; } }
  • 嗨詹姆斯。下面来自 Kickstart 的一个实质性答案,这需要相当长的时间才能写出来,两年多之后仍然明显没有得到答复。他们现在有我的支持,但如果你放弃了这个问题,你至少会给他们打勾吗?您显然仍在登录。值得记住的是,像 Stack Overflow 这样的网站是在善意和游戏化的基础上运作的。

标签: php mysql csv mysqli


【解决方案1】:

如果我理解正确,您需要加入另一个表才能获取发票项目。

我还怀疑您当前的示例查询未正确连接表,因为您似乎是根据发票连接客户和发票表。正如我所期望的那样,一个客户可能有许多发票,但一张发票只有一个客户,我希望发票表存储相关的客户 ID,然后基于该 ID 进行连接。

因此,您可以通过以下方式获取详细信息:-

SELECT i.id,
    i.invoice_number,
    i.amount,
    c.name,
    c.address,
    ii.invoice_item
FROM invoices i
INNER JOIN customers c
ON c.id = i.customer_id
INNER JOIN invoice_items ii
ON ii.invoice_id = i.id
ORDER BY i.invoice

请注意,我已从 SELECT * 切换到选择列名(我猜是这样),因为 SELECT * 因各种原因不受欢迎。如果你想要更易读的东西,你可以给列名加上别名。

但是您想要从列名中获取的标题列表。假设您不想只是硬编码这些,我建议您从使用 mysqli_fetch_row 切换到 mysqli_fetch_assoc,这将返回列名。

然后您可以处理第一行的列名并输出它们。像这样的东西:-

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

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

    $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

    $query_table_columns_data = "SELECT i.id,
                                    i.invoice_number,
                                    i.amount,
                                    c.name,
                                    c.address,
                                    ii.invoice_item
                                FROM invoices i
                                INNER JOIN customers c
                                ON c.id = i.customer_id
                                INNER JOIN invoice_items ii
                                ON ii.invoice_id = i.id
                                ORDER BY i.invoice";

    if ($result_column_data = mysqli_query($mysqli, $query_table_columns_data)) 
    {
        // fetch table fields data
        if ($column_data = $result_column_data->fetch_assoc()) 
        {
            $table_column_head = array();
            $table_column_data = array();
            foreach($column_data as $field_name->$data) 
            {
                $table_column_head[] = $field_name;
                $table_column_data[] = $data;
            }
            // Format array as CSV and write to file pointer
            fputcsv($file, $table_column_head, ",", '"');
            fputcsv($file, $table_column_data, ",", '"');
            while ($column_data = $result_column_data->fetch_assoc()) 
            {
                $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, ",", '"');
            }
        }
    }

稍微扩展一下,只在发票的第一行显示发票详细信息

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

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

    $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

    $query_table_columns_data = "SELECT i.id,
                                    i.invoice_number,
                                    i.amount,
                                    c.name,
                                    c.address,
                                    ii.invoice_item
                                FROM invoices i
                                INNER JOIN customers c
                                ON c.id = i.customer_id
                                INNER JOIN invoice_items ii
                                ON ii.invoice_id = i.id
                                ORDER BY i.invoice";

    if ($result_column_data = mysqli_query($mysqli, $query_table_columns_data)) 
    {
        // fetch table fields data
        if ($column_data = $result_column_data->fetch_assoc()) 
        {
            $table_column_head = array();
            $table_column_data = array();
            foreach($column_data as $field_name->$data) 
            {
                $table_column_head[] = $field_name;
                $table_column_data[] = $data;
            }
            $prev_id = $column_data['id'];
            $prev_invoice_number = $column_data['invoice_number'];
            $prev_amount = $column_data['amount'];
            $prev_name = $column_data['name'];
            $prev_address = $column_data['address'];

            // Format array as CSV and write to file pointer
            fputcsv($file, $table_column_head, ",", '"');
            fputcsv($file, $table_column_data, ",", '"');
            while ($column_data = $result_column_data->fetch_assoc()) 
            {
                if ($prev_id == $column_data['id'] AND $prev_invoice_number == $column_data['invoice_number'] AND $prev_amount == $column_data['amount'] AND $prev_name == $column_data['name'] AND $prev_address == $column_data['address'])
                {
                    $different_invoice = true;
                }
                else
                {
                    $different_invoice = false;
                    $prev_id = $column_data['id'];
                    $prev_invoice_number = $column_data['invoice_number'];
                    $prev_amount = $column_data['amount'];
                    $prev_name = $column_data['name'];
                    $prev_address = $column_data['address'];
                }
                $table_column_data = array();
                foreach($column_data as $field_name->$data) 
                {
                    $table_column_data[] = (($different_invoice or $field_name == 'invoice_item') ? $data : '');
                }
                // Format array as CSV and write to file pointer
                fputcsv($file, $table_column_data, ",", '"');
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多