PHPExcel | While循环内部While循环无法正常工作

PHPExcel | While循环内部While循环无法正常工作,php,phpexcel,Php,Phpexcel,我有一些SQL数据要用PHPExcel传递到Excel文档 共有3个表格: 书籍: 1.1图书编号 1.2书名 标签: 2.1 tagID 2.2标记名 张贴标签: 3.1身份证 3.2标记ID 3.3图书编号 我希望标签位于xls表的第二列,用逗号分隔。这里有一个while循环 问题是: 在生成的excel工作表中,并非所有书籍的标记都列在每个列B的单元格中,而是仅列出一个标记 你知道为什么吗?提前感谢: 这就是你的问题所在: while($row1 = mysql_fetch_assoc(

我有一些SQL数据要用PHPExcel传递到Excel文档

共有3个表格:

书籍:

1.1图书编号

1.2书名

标签:

2.1 tagID

2.2标记名

张贴标签:

3.1身份证

3.2标记ID

3.3图书编号

我希望标签位于xls表的第二列,用逗号分隔。这里有一个while循环

问题是:

在生成的excel工作表中,并非所有书籍的标记都列在每个列B的单元格中,而是仅列出一个标记

你知道为什么吗?提前感谢:

这就是你的问题所在:

while($row1 = mysql_fetch_assoc($query2)){
    $tags = $row1['tagName'];
您正在为每个循环重置$tags的值。要使用您提供的代码,只需执行以下操作:

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 .= ', ';
        }
    }
}

首先,请更好地缩进代码,因为它几乎不可读。第二:我认为您只是将标记与“,”-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;
?> 

我添加了括号,但现在我收到了以下错误:致命错误:[]运算符不支持stringsUpdated我的答案。请注意,我所做的不仅仅是添加括号:谢谢你,黑暗者!然而,我通过简单地添加unset$标记成功地克服了这个问题;在外部while循环结束之前。您认为什么方法是最好的?取决于应用程序的大小。如果你有4本书,并且按照自己的方式去做,那么性能就不会受到影响。但是如果你有10000、20000本书,那么所有这些零碎的东西都会对你的表现产生巨大的影响。如果我是你,我会尝试从第一天开始纠正它,所以我可能会选择我建议的解决方案。可能仍然不是最好的方法。
if(mysql_num_rows($query2) > 0){
    while($row1 = mysql_fetch_assoc($query2)){
        $tags[] = $row1['tagName'];
    }
    $tags = implode(', ',$tags);
}
<?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;
?>