Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.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

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 导出CSV |奇怪的行为_Php_Mysql_Csv_Export - Fatal编程技术网

Php 导出CSV |奇怪的行为

Php 导出CSV |奇怪的行为,php,mysql,csv,export,Php,Mysql,Csv,Export,所以,我想我已经问了这个问题和其他与之相关的问题两次以上了。但我不知道发生了什么 我使用这个PHP函数将一些数据从一个表导出到一个CSV表。我正在本地主机(XAAMP)上测试: 我有一个执行动作的表单,我的意思是它将动作提交给处理上述函数的PHP文件,这是动作代码: <?php include '../assets/class/login/loginsys.php'; $extension = new extension; if ($_GET['action

所以,我想我已经问了这个问题和其他与之相关的问题两次以上了。但我不知道发生了什么

我使用这个PHP函数将一些数据从一个表导出到一个CSV表。我正在本地主机(XAAMP)上测试:

我有一个执行动作的表单,我的意思是它将动作提交给处理上述函数的PHP文件,这是动作代码:

<?php

    include '../assets/class/login/loginsys.php';

    $extension = new extension; 

    if ($_GET['action'] == 0) {

        $extension->CSVData('exports', 0);

    } elseif ($_GET['action'] == 1) {

        $extension->CSVData('exports', 1);

    } elseif ($_GET['action'] == 2) {

    $extension->CSVData('exports', 2);

    }

    exit();

?>
-我创造了它,让它可以工作; -现在文件夹在那里,CSV文件被创建,数据被转储到CSV表中; -但在我的浏览器中打开的文件(下载附件,就像你点击某个网站上的文件并下载一样)是空的,即使在“导出”中导出的文件中包含数据; -另一件事是,当文件已经存在于“导出”文件夹中时,创建的表会告诉我:

File 'exports/admin_members_2012_01_29.csv' already exists

所以我的问题是为什么我所描述的会发生?有没有办法让MySql查询覆盖以前的CSV文件?

您不需要那个临时文件。这个怎么样:

define('CSV_SEPARATOR', ',');

// CSV download headers
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="my.csv"');

// A file handle to PHP output stream
$fp = fopen('php://output', 'w');

// UTF-8 BOM
echo "\xEF\xBB\xBF";

// Get data from database
$data = ...;

// List of columns
$columns = array(
  'User name',
  'First name',
  'Last name'
);

foreach ($data as $key => $row) {

  // Write columns
  if ($key == 0) {
    fputcsv($fp, $columns, CSV_SEPARATOR);
  }

  // Write data
  fputcsv($fp, $row, CSV_SEPARATOR);
}

fclose($fp);

很漂亮,不是吗?

这个答案会有帮助,你不能覆盖输出的文件,因此在创建新备份之前,你需要使用microtime对文件进行唯一命名,或者将输出的文件移到其他位置。投票关闭此项是“太本地化”,但这里有一些提示供你考虑:你做了什么来跟踪此错误?您考虑并测试了哪些选项?在哪里将文件输出到浏览器?您是否正在从与MySQL相同的文件夹读取该文件?在运行SQL查询之前,为什么不检查文件是否存在?@EmilVikstrom-我不知道该怎么做才能找到这个bug。您看到的代码就是我测试的代码,它按照描述导出文件,但浏览器下载的文件是空的。我将它输出到硬盘上的一个文件夹中,一个单独的分区,不是我的操作系统所在的分区,而是任何其他文件的行为(如果我从网站下载某些内容)。我不确定,但不,我正在阅读下载的文件,但它不应该是空的,对吗?如何检查文件是否存在?我尝试了
如果(!is_file($filename)){unlink($filename);}
但是文件仍然存在。一个猜测是:可能MySQL
到OUTFILE
是异步操作。当
$stmt->execute()
返回时,您确实执行了
readfile
MySQL还没有真正完成导出?也许,这可能是一个原因,但如何修复它?是的,我尝试了这种方法,但没有成功,为什么不使用MySQL查询,因为使用查询比使用PHP更容易。我不确定您的意思,代码工作得很好。回答这个问题的原因:a)没有创建临时文件,没有留下任何东西,b)代码是可移植的(没有MySQL依赖),那么$data将是什么?一个数组还是什么?我正在使用这个方法,它确实工作得很好:)我不得不将标题替换为application/csv,但它现在可以工作了。我的问题是如何在csv中输入字段名称,例如:对于用户名,在所有列行的顶部输入“Username”等等?使用列输出更新代码。如果你觉得我的答案很有帮助,你应该总是投赞成票!谢谢:)
File 'exports/admin_members_2012_01_29.csv' already exists
define('CSV_SEPARATOR', ',');

// CSV download headers
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="my.csv"');

// A file handle to PHP output stream
$fp = fopen('php://output', 'w');

// UTF-8 BOM
echo "\xEF\xBB\xBF";

// Get data from database
$data = ...;

// List of columns
$columns = array(
  'User name',
  'First name',
  'Last name'
);

foreach ($data as $key => $row) {

  // Write columns
  if ($key == 0) {
    fputcsv($fp, $columns, CSV_SEPARATOR);
  }

  // Write data
  fputcsv($fp, $row, CSV_SEPARATOR);
}

fclose($fp);