我尝试使用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}
答案 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;
这将使您能够在运行时查看变量的内容,并且可以在您的异常中给出更好的指示,给出异常中的行号。
古德勒克。