简单的HTML DOM内存问题

时间:2015-06-25 15:28:21

标签: php html mysql csv simple-html-dom

我尝试使用PHP Simple HTML Dom Parser从SQL查询结果中解析一些信息。但似乎它存在一些巨大的内存问题。我使用SQL查询结果创建一个html表,然后将html表导出到csv文件。我真的很陌生,所以我的代码不是最有效的代码。当我的查询结果很小时,csv文件就会成功创建。但是当查询结果很大时,导出的csv文件没有任何sql结果,而是显示:

  

致命错误:在第101行的/opt/lampp/htdocs/test.php中调用boolean上的成员函数find()

这是我的函数,它接受sqlresult并创建一个html表,然后将其导出到csv文件中:

 echo sql_to_html_table($sqlresult, $delim="\n" );

function sql_to_html_table($sqlresult, $delim="\n") {
// starting table
include_once('simple_html_dom.php');
$htmltable =  "<table>" . $delim ;
$counter   = 0 ;
// putting in lines
//while( $row = $sqlresult->mysqli_fetch_assoc()  ){
while($row = mysqli_fetch_assoc($sqlresult)) {
if ( $counter===0 ) {
// table header
$htmltable .=   "<tr>"  . $delim;
foreach ($row as $key => $value ) {
      $htmltable .=   "<th>" . $key . "</th>"  . $delim ;
  }
  $htmltable .=   "</tr>"  . $delim ;
  $counter = 22;
 }
  // table body
  $htmltable .=   "<tr>"  . $delim ;
  foreach ($row as $key => $value ) {
      $htmltable .=   "<td>" . $value . "</td>"  . $delim ;
  }
  $htmltable .=   "</tr>"   . $delim ;
 }
 // closing table

$htmltable .=   "</table>"   . $delim ;
 // return
//return( $htmltable ) ;
$html = str_get_html($htmltable);

header('Content-type: application/ms-excel');
header('Content-Disposition: attachment; filename=sample.csv');

$fp = fopen("php://output", "w");

foreach($html->find('tr') as $element)
{
$td = array();
foreach( $element->find('th') as $row)
{
    $td [] = $row->plaintext;
}
fputcsv($fp, $td);
$td = array();
foreach( $element->find('td') as $row)
{
    $td [] = $row->plaintext;
}
fputcsv($fp, $td);
}
fclose($fp);
} 

我试过在$ html = str_get_html($ htmltable)之后抛出异常;像这样:

if (!str_get_html($htmltable)) {
throw new exception('exception') ; 
}

当我尝试运行代码时,我的浏览器给出了这个错误:

  

致命错误:未捕获的异常&#39;异常&#39;有消息&#39;例外&#39;在/opt/lampp/htdocs/test.php:96堆栈跟踪:#0 /opt/lampp/htdocs/test.php(62):sql_to_html_table(对象(mysqli_result),&#39; \ n&#39;)#在第96行的/opt/lampp/htdocs/test.php中抛出1 {main}

2 个答案:

答案 0 :(得分:0)

从SourceForge查看simple_html_dom.php的副本,这听起来像是一个足够大的HTML字符串的预期行为。我看到str_get_html()有一个检查,如果字符串的大小大于MAX_FILE_SIZE,它将导致它返回false。 MAX_FILE_SIZE定义为:

define('MAX_FILE_SIZE', 600000);

因此看起来simple_html_dom不会处理任何大于600kb的字符串。由于这是一个内置的限制,我想你的选择是尝试更改限制,看看会发生什么或使用不同的库。

或者,您可以完全跳过HTML部分。如果您需要为其他目的生成HTML,那很好,但是没有理由通过直接从数据库结果而不是HTML中构建CSV来绕过这个问题。

答案 1 :(得分:0)

也许这更容易理解:

function sql_to_csv($sqlresult, $delim = "\n") {

    // Loop each result into a csv row string
    while($row = mysqli_fetch_assoc($sqlresult)) {

        // Create/reset a var to hold the csv row content
        $csvRow = '';

        // Append each column value comma separated
        // Be warned of column values containing commas
        foreach ($row AS $columnValue) {
            $csvRow .= $columnValue . ',';
        }

        // Remove the trailing comma from the final column
        rtrim($csvRow, ',');

        // Send your CSV row to the browser
        echo $csvRow . $delim;
    }

    header('Content-type: text/csv');
    header('Content-Disposition: attachment; filename=sample.csv');
}

这种方法存在各种问题,不仅限于大输出缓冲区,带有多逗号的列......等我认识到这些问题,但希望尽早给出解决方案而不是大块文本。< / p>

调试PHP代码的最简单方法是使用de-bugg输出来运行它,如果以上内容没用,以下内容可能对您有帮助:

var_dump($variable);
exit;

这将使您能够在运行时查看变量的内容,并且可以在您的异常中给出更好的指示,给出异常中的行号。

古德勒克。