Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:将MYSQL查询写入CSV_Php_Mysql_Csv_Mysqli_Php Stream Wrappers - Fatal编程技术网

PHP:将MYSQL查询写入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

我正在尝试将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");
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()
,删除文件以在其自身之后进行清理,然后退出。您仍然需要标题,但不需要打开文件句柄或循环查看结果。