【发布时间】:2015-06-25 15:28:21
【问题描述】:
我正在尝试使用 PHP Simple HTML Dom Parser 从 SQL 查询结果中解析一些信息。但它似乎存在一些巨大的内存问题。我使用 SQL 查询结果创建了一个 html 表,然后将 html 表导出到一个 csv 文件。我对此真的很陌生,所以我的代码不是最有效的。当我的查询结果很小时,会成功创建 csv 文件。但是当查询结果很大时,导出的csv文件没有任何sql结果,而是显示如下:
致命错误:在第 101 行的 /opt/lampp/htdocs/test.php 中的布尔值上调用成员函数 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') ;
}
当我尝试运行代码时,我的浏览器给了我这个错误:
致命错误:/opt/lampp/htdocs/test.php:96 中未捕获的异常 'Exception' 和消息 'exception' 堆栈跟踪:#0 /opt/lampp/htdocs/test.php(62): sql_to_html_table( Object(mysqli_result), '\n') #1 {main} 在第 96 行的 /opt/lampp/htdocs/test.php 中抛出
【问题讨论】:
-
你为什么要从 sql 到 html 到 csv?为什么不用mysql自带的csv导出功能呢?
-
我基本上是在使用 php 开发前端。所以我需要从下拉菜单中选择一个 SQL 查询,然后单击一个按钮来生成并保存 csv 文件。我知道如何使用 csv 导出功能来保存文件,但我的老板想使用弹出窗口保存它。
-
好吧,您的错误并不表示存在任何内存问题。它说您正在尝试在第 101 行的布尔值上调用函数 find()。我假设这是这一行: foreach($html->find('tr') as $element) 如果是的话 $html 包含什么,我会 print_r($html);查找内容以查看它是字符串还是布尔值并从那里开始
-
但是我之前提到过,当我运行一个结果中有几行的 SQL 脚本时,它工作得非常好。仅当我使用结果中包含大量行的 sql 脚本时才会出现此问题。你还觉得没有内存问题吗?
-
我一直在说没有发布内存错误。大多数 DOM 加载器会将行一一加载到内存中。我们在谈论多少个结果?你得到什么内存错误?
标签: php html mysql csv simple-html-dom