【问题标题】:PHPExcel | While loop inside while loop doesn't work properlyPHPExcel | while 循环内的 while 循环无法正常工作
【发布时间】:2014-10-02 19:53:43
【问题描述】:

我有一些 SQL 数据想要使用 PHPExcel 传递给 Excel 文档。

有3张桌子:

  1. 书籍:

    1.1 bookID

    1.2 书名

  2. 标签:

    2.1 标记ID

    2.2 标记名称

  3. Post_Tags:

    3.1 身份证

    3.2 标记ID

    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;

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    这是你的问题:

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

    不过,我建议您通过以下方式修复它:

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

    【讨论】:

    • 我添加了括号,但现在我收到以下错误:致命错误:字符串不支持 [] 运算符
    • 更新了我的答案。请注意,我所做的不仅仅是添加括号。 :)
    • 感谢 DarkRanger!但是我设法通过简单地添加 unset($tags); 来克服这个问题。在外部 while 循环结束之前。您认为哪种方法最好?
    • 取决于您的应用程序的大小。如果您有 4 本书并按照自己的方式去做,那么性能不会受到真正的影响。但是如果达到 10 000、20 000 本书,那么所有这些零碎的东西都会对性能产生巨大影响。如果我是你,我会从第一天起就尝试做正确的事情,所以我可能会采用我建议的修复方法。可能仍然不是最好的方法。
    【解决方案2】:

    首先请更好地缩进你的代码,因为它几乎不可读(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;
    ?> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2015-01-06
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多