PHPExcel | Хотя цикл внутри, а цикл не работает должным образом

У меня есть некоторые данные SQL, которые я хочу передать в документ Excel, используя PHPExcel.

Есть 3 таблицы:

  1. Книги:

    1.1 bookID

    1.2 bookName

  2. Метки:

    2.1 tagID

    2.2 tagName

  3. Post_Tags:

    3.1 id

    3.2 tagID

    3.3 bookID

Я хочу, чтобы теги были во втором столбце листа xls, разделенные запятыми. Так что здесь у меня есть цикл while внутри цикла while.

Эта проблема:

В произведенном листе Excel в ячейке каждого столбца B перечислены не все теги книги, а только один тег.

Есть идеи почему? Заранее спасибо 🙂

require_once "includes/config.php";
require_once "includes/functions.php";
require_once 'phptoxls/PHPExcel.php';

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
$F = $objPHPExcel -> getActiveSheet();/*      START: RECORDS      */

$line = 2;
$query = mysql_query('SELECT * FROM `books`') or die(mysql_error());
while($row = mysql_fetch_assoc($query)){

$bookID = $row['bookID'];
$bookName = $row['bookName'];

$query2 = mysql_query('SELECT * FROM `books`
INNER JOIN `post_tags`
ON post_tags.bookID = books.bookID
INNER JOIN `tags`
ON tags.tagID = post_tags.tagID
WHERE books.bookID = "'.$bookID.'"') or die(mysql_error());

if(mysql_num_rows($query2) > 0){
$rowNum = mysql_num_rows($query2);
$i = 1;
while($row1 = mysql_fetch_assoc($query2)){
$tags = $row1['tagName'];
if($i < $rowNum){
$tags .= ', ';
}
}
}

$F  -> setCellValue('A'.$line, $bookName)
-> setCellValue('B'.$line, $tags);

++$line;
}

/*      END: RECORDS        */// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="books.xls');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;

0

Решение

Здесь кроется ваша проблема:

while($row1 = mysql_fetch_assoc($query2)){
$tags = $row1['tagName'];

Вы сбрасываете значение тегов $ с каждым циклом. Чтобы заставить его работать с предоставленным вами кодом, просто сделайте следующее:

if(mysql_num_rows($query2) > 0){
$rowNum = mysql_num_rows($query2);
$i = 1;
$tags = "";
while($row1 = mysql_fetch_assoc($query2)){
$tags .= $row1['tagName'];
if($i < $rowNum){
$tags .= ', ';
}
}
}

Однако я бы посоветовал вам исправить это, выполнив это:

if(mysql_num_rows($query2) > 0){
while($row1 = mysql_fetch_assoc($query2)){
$tags[] = $row1['tagName'];
}
$tags = implode(', ',$tags);
}
0

Другие решения

Прежде всего, пожалуйста, сделайте отступ в вашем коде лучше, потому что он почти не читается (http://beta.phpformatter.com). Второе: я думаю, что вы просто объединяете теги с ‘,’ — s. Чувак серьезно в начале вашего первого в то время как:

<?php
require_once "includes/config.php";
require_once "includes/functions.php";
require_once 'phptoxls/PHPExcel.php';

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
$F = $objPHPExcel->getActiveSheet();/*      START: RECORDS      */

$line = 2;
$query = mysql_query('SELECT * FROM `books`') or die(mysql_error());
while ($row = mysql_fetch_assoc($query)) {
$all_tags_for_one_row = '';
$bookID = $row['bookID'];
$bookName = $row['bookName'];

$query2 = mysql_query('SELECT * FROM `books`
INNER JOIN `post_tags`
ON post_tags.bookID = books.bookID
INNER JOIN `tags`
ON tags.tagID = post_tags.tagID
WHERE books.bookID = "' . $bookID . '"') or die(mysql_error());

if (mysql_num_rows($query2) > 0) {
$rowNum = mysql_num_rows($query2);
$i = 1;
while ($row1 = mysql_fetch_assoc($query2)) {
$tags = $row1['tagName'];
if ($i < $rowNum) {

$all_tags_for_one_row .= ($i != $rowNum ? $tags . ', ' : $tags );
}
$i++;
}
}

$F->setCellValue('A' . $line, $bookName);
$F->setCellValue('B' . $line, $all_tags_for_one_row);

++$line;
}

/*      END: RECORDS        */// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="books.xls');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
0

По вопросам рекламы [email protected]