PHP:将MYSQL查询写入CSV
我正在尝试将MySQLi查询写入可下载的CSV。以下标题为CSV打开一个流:PHP:将MYSQL查询写入CSV,php,mysql,csv,mysqli,php-stream-wrappers,Php,Mysql,Csv,Mysqli,Php Stream Wrappers,我正在尝试将MySQLi查询写入可下载的CSV。以下标题为CSV打开一个流: $fileName = ''; //empty file name, file name is cast later header("Cache=Control: must-revalidate, post-check=0, pre-check=0"); header('Content-Description: File Transfer'); header("Content-type: text/csv"); hea
$fileName = ''; //empty file name, file name is cast later
header("Cache=Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = @fopen( 'php://output', 'w' );
在下面,我将尝试查询并将查询的每一行转换为CSV文件中的新行:
if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')){
$fileName .= 'OutputWeightNull.csv';
$query = mysqli_query($conn, 'SELECT * FROM `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL')or die(mysql_error());
$result = mysqli_fetch_array($query) or die(mysql_error());
$headerDisplayed = false;
foreach ($result as $data){
if (!headerDisplayed){
fputcsv($fh, array_keys());
$headerDisplayed = true;
}
fputcsv($fh, $data);
}
}
CSV正在根据需要下载到浏览器,但是它显示为空,查询结果不会发送到CSV。有谁能告诉我为什么会这样
这是我第一次尝试使用比hello world更复杂的PHP脚本。如果答案非常简单或明显,请道歉。试着这样做
if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight')){
$fileName = 'OutputWeightNull.csv';
$fh = @fopen( 'php://output', 'w' );
header("Cache=Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$query = mysqli_query($conn, 'SELECT * FROM `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL')or die(mysql_error());
$headerDisplayed = false;
while($result = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
if (!$headerDisplayed){
fputcsv($fh, array_keys($result));
$headerDisplayed = true;
}
fputcsv($fh, $result);
}
}
您需要将csv头放在“if”循环中点击清理代码以循环返回的行,并使用mysqli_uuu错误函数:-
<?php
if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight'))
{
$fileName = ''; //empty file name, file name is cast later
header("Cache=Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = @fopen( 'php://output', 'w' );
$fileName .= 'OutputWeightNull.csv';
$query = mysqli_query($conn, 'SELECT * FROM `Some_Table` WHERE WEIGHT = 0 OR weight IS NULL') or die(mysqli_error($conn));
if ($result = mysqli_fetch_array($query, MYSQLI_ASSOC))
{
fputcsv($fh, array_keys($result));
fputcsv($fh, $result);
while ($result = mysqli_fetch_array($query, MYSQLI_ASSOC))
{
fputcsv($fh, $result);
}
}
}
MySQL有一个内置的查询类型,用于将数据直接输出到CSV格式 修改
选择查询,使其采用以下格式:
SELECT fieldlist FROM table
INTO OUTFILE 'filename.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
现在你不必做任何循环或类似的事情;PHP所要做的就是运行该查询,然后对MySQL生成的CSV文件执行readfile()
,最后将其从磁盘中删除
这将为您的PHP程序节省大量内存,而且运行速度也会快得多(如果您有一个大数据集,这将非常明显)。空csv输出的文件名是什么?下载仅显示为“下载”。我确信IF语句的条件得到了满足。mysqli_fetch_数组将向php返回一行(即字段数组),而不是作为行数组返回整个结果集。这不是脚本的主要问题,但确实意味着您将只输出查询的第一行。进一步注释。您正在混合使用mysqli_*和mysql_*调用。如果查询失败,则脚本将死亡,但尝试输出mysql\u error()。这将并没有意义,也和mysqli_error()无关。Brilliant,这解决了下载文件名不正确的问题。谢谢你。不幸的是,文件中仍然没有内容,包括没有标题值。您现在可以检查我的代码了吗?我已经更改了此行fputcsv($fh,array_keys($data));。还有if(!$headerDisplayed){谢谢Arun,在那里传递$data作为参数是有意义的。不幸的是,仍然没有乐趣,csv文件仍然显示为空白,没有标题。上面的代码对我很有用。请检查并让我知道是否有任何问题是Arun,这太棒了。谢谢,它似乎不喜欢“,”但是这里:如果($result=mysqli\u fetch\u array($query),mysqli\u ASSOC)。我正在寻找原因。我在错误的地方放了一个括号。做了一些其他的小调整。这里描述了fetch array方法-感谢Kickstart,如果($result=mysqli\u fetch\u array($query,mysqli\u ASSOC))的话,我似乎仍然会陷入以下问题一般来说,我对编程非常陌生,所以我很难理解为什么您在那里使用的语法不起作用。它应该起作用(看不到任何拼写错误)。您是否收到错误消息?它应该起作用的是,它将mysqli_fetch_数组的结果赋给变量$result。如果结果为false,则它在IF语句中(即,获取失败,例如如果没有返回任何行),则绕过if中的代码。我所做的是使用if获取第一行(您还希望处理其标题),如果我用了一段时间来处理后续行,则在中。抱歉@Kickstart,我担心服务器无法跟上TTL值。现在可以了,非常感谢。在这里学到了很多。这是一个好主意(尽管昨天做了一些事情,但我完全忘记了!)下边是输出文件是本地的MySQL服务器而不是PHP脚本。所以如果你有一个单独的数据库服务器,那是不可能的。我确实考虑过这个问题,但是我希望CSV出现在浏览器中。我的理解是上面会出现在服务器的目录上吗?谢谢。s@LiamFell-是的,查询将在服务器上生成一个文件;然后使用PHP的readfile()
函数将该文件转储到浏览器。因此,您的PHP程序将运行查询,调用readfile()
,删除文件以在其自身之后进行清理,然后退出。您仍然需要标题,但不需要打开文件句柄或循环查看结果。