我在MySQL和Microsoft SQL Server中有相同的表:
我可以使用PHP fputcsv 功能在Web浏览器中显示来自MySQL的数据。为了解决我面临的问题的原因,我已经注释掉了标题,强制fputcsv函数在Web浏览器中显示数据而不是CSV文件。以下PHP将在Web浏览器中生成以下输出:
<?php
//header("Content-Type: text/csv;charset=utf-8");
$con = new mysqli('domain','username','password','database');
$select = "select * from tablename";
$select_query = mysqli_query($con, $select);
$fp= fopen('php://output', 'w');
while ($row = mysqli_fetch_array($select_query,MYSQL_ASSOC)) {
fputcsv($fp, array_values($row));
}
fclose($fp);
?>
当使用类似的PHP使用fputcsv函数在Microsoft SQL Server表中显示数据时,Web浏览器会显示500错误,例如页面无法显示。
<?php
//header("Content-Type: text/csv;charset=utf-8");
$ServerName = "domain";
$ConnectionString = array("Database"=>"Database", "UID"=>"username", "PWD"=>"password");
$con = sqlsrv_connect($ServerName, $ConnectionString);
$select = "select * from tablename";
$select_query = sqlsrv_query($con, $select);
$fp= fopen('php://output', 'w');
while ($row = sqlsrv_fetch_array($select_query, SQLSRV_FETCH_ASSOC)) {
fputcsv($fp, array_values($row));
}
fclose($fp);
?>
在while循环中,如果我将 fputcsv($ fp,array_values($ row)); 替换为 echo $ row ['column1']; ,则为500错误不再出现,并显示 Hello world 。这告诉我while循环能够获取数组,并且使用SQL Server时这行代码存在一些问题:
fputcsv($fp, array_values($row));
我注意到this post on StackOverflow使用 array_keys 和 foreach 循环而不是 array_values 。当我使用 array_keys 和 foreach 循环时,将显示SQL Server表列。
while ($row = sqlsrv_fetch_array($select_query, SQLSRV_FETCH_ASSOC)) {
fputcsv($fp, array_values($row));
foreach ($row as $data) {
fputcsv($fp, $data);
}
}
我注意到this post on StackOverflow的第一个答案也使用 array_keys 而不是 array_values 。这使我确保array_key应该与SQL Server一起使用。
在使用 array_keys 和SQL Server时,我不确定为什么Web浏览器会显示列名而不是数据。如果有任何提示,建议或想法可能会引导我进入下一步的故障排除步骤,我一定会感激不尽。