将 sql 表数据导出到 Excel 工作表时出现内部服务器错误 (PHP)

Internal Server Error when export sql table data to Excel sheet (PHP)

提问人:S.Macualiff 提问时间:11/10/2023 更新时间:11/10/2023 访问量:25

问:

我需要将我的sql数据表导出到Excel工作表。在这里,我提到了所有代码。当我触发名为 exportData() 的函数作为响应时,我遇到了内部服务器错误问题 (500)。我不知道我做错了什么。请帮我解决它。

public function exportData(){
    $sql = "SELECT * FROM `issue recodes`";
    $exe = $GLOBALS['mydatabase']->query($sql);
    $rows = $exe->fetchAll(\PDO::FETCH_ASSOC);
    //print_r($rows);
    //define data file name
    $filename = "Backup_on_".date("Ymd")."xls";
    
    //download file
    header("Content-diposition : attachment; filename = '$filename'");
    header("Content-type : application/vnd.ms-excel");
    
    //render xls data
    $heading = false;
    if(!empty($rows)){
        // if the database has data then
        foreach($rows as $value){
            if(!$heading){
                //Already not heading written
                echo implode("\t" ,array_keys($value) . "\n" );
                $heading = true;
            }else{
                // If heading already wrote
                echo implode("\t" , array_values($value) . "\n");
            }
            
            
        }
        return true;
    }else{
        // if the database has not data
    }
}

依此类推,当我忽略header()行时,它会得到这样的错误

致命错误:未捕获的 TypeError:implode():参数 #2 ($array) 必须是 ?array 类型,字符串在 C:\xampp\htdocs\mos\admin\PHP files\admin.php:114 中给出 堆栈跟踪:#0 C:\xampp\htdocs\mos\admin\PHP files\admin.php(114):implode('\t', 'Array\n') #1 C:\xampp\htdocs\mos\admin\PHP files\export.php(5): PHI\admin\Admin->exportData() #2 {main} 扔在 C:\xampp\htdocs\mos\admin\PHP files\admin.php 上行 114

以下是从中调用上述 exportData() 函数的 export.php 代码

//export issues as excel data sheet
require_once 'admin.php';
$admin = new PHI\admin\Admin();
if($admin->exportData()){
echo "downloaded";
}else{
echo "fail";
}
PHP PDO 导出到Excel

评论


答:

1赞 CBroe 11/10/2023 #1
echo implode("\t" ,array_keys($value) . "\n" );

array_keys($value) . "\n"创建一个字符串值(数组被替换为单词 ,因为当数组被强制到字符串上下文中时会发生这种情况),因此您将字符串作为第二个参数而不是数组提供给此处。Arrayimplode

这需要以相反的方式发生 - 首先内爆数组,在后面附加 \n:

echo implode("\t" ,array_keys($value)) . "\n";

else 分支中的另一行也是如此。

但是你真的应该首先使用 fputcsv,而不是这个结构。如果任何数据字段包含分隔符 \t,则将创建一个错误的 CSV。 对于已经实现的,有必要的“逃逸”机制。fputcsv