Если я вас правильно понимаю, вы должны присоединиться к другому столу, чтобы получить позиции счета-фактуры.
Я также подозреваю, что ваш текущий пример запроса неправильно соединяет таблицы, поскольку вы, кажется, присоединяетесь к таблицам клиентов и счетов-фактур на основе счета-фактуры. Поскольку я ожидаю, что у клиента может быть много счетов-фактур, но у счет-фактуры только один клиент, я бы ожидал, что таблица счетов сохранит соответствующий идентификатор клиента, а затем сделайте соединение на основе этого.
Таким образом вы можете получить детали с чем-то вроде этого: -
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, ",", '"');
}
}
}
не может вам рамочное корыто $ table_column_data и использовать fputcsv в так что каждый счет-фактура будет на следующей строке? – driedoezoe
У меня уже есть следующая строка, я думаю, что я не буду экспортировать элементы, так как не могу видеть, как я это работаю, но пытаюсь выяснить, как установить имена заголовков столбцов - любые идеи? – James
Я попытался // принести титулы \t время ($ заголовков = mysqli_fetch_field ($ result_column_data)) { \t \t \t Еогеасп ($ заголовки в $ заголовка) { \t \t \t головы [] = $ header-> имя $; \t \t \t \t \t – James