【问题标题】:fputcsv Creates the file but downloads it emptyfputcsv 创建文件但下载为空
【发布时间】:2016-03-23 16:25:57
【问题描述】:

我有这段 PHP 代码,旨在从 mySQL 数据库中检索数据,并将其导出为 CSV 文件,该文件必须在创建后自动下载。

$connection = mysqli_connect($host, $username, $password, $dbname) or die("Connection Error " . mysqli_error($connection));

// fetch mysql table rows
$sql = "select * from users";
$result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection));

$fp = fopen('users.csv', 'w');

while($row = mysqli_fetch_assoc($result)) {
    fputcsv($fp, $row);
}

fclose($fp);

header('Content-Type: text/csv');

header('Content-Disposition: attachment; filename="users.csv"');

mysqli_close($connection);

这里的问题是:

  • 检索数据。
  • 在服务器上的 export.php 文件的同一目录中检索 CSV 文件上面有数据
  • 下载同名文件但它是空的

谢谢。

【问题讨论】:

  • 您从不费心输出文件。你需要像readfile('users.csv') 这样的东西来从磁盘读取文件并将其吐出给你的客户。
  • 您不输出文件内容您只是发送文件的名称并且它是 CSV。
  • 而不是将其写入服务器上的物理文件(如果您有并发用户则有问题)使用'php://output'作为文件名(并在打开文件之前发送您的标题),它将直接发送它完全不使用任何服务器磁盘到浏览器

标签: php mysql csv fputcsv


【解决方案1】:

您正在将其写入名为 users.csv 的文件中,但您强制用户下载的文件是页面的输出。

只要您的查询是正确的,一旦 PHP 脚本运行,在与包含正确数据的 PHP 文件相同的目录中应该有一个名为 users.csv 的文件。

您需要将数据输出到浏览器,以便将其归因于您正在下载的文件。

试试这个:

//Connect to database
$connection = mysqli_connect($host, $username, $password, $dbname) or die("Connection Error " . mysqli_error($connection));

//Fetch mysql table rows
$sql = "select * from users";
$result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection));

//Close connection
mysqli_close($connection);

//Set $output
$output = "";

//Set header values
$headers = array("Header 1", "Header 2", "Header 3");

//Insert header values to $output
foreach($headers as $h){
    $output .= fieldCheck($h) . ",";
}
$output = rtrim($output, ","). "\n";

//Iterate through results
while($row = mysqli_fetch_assoc($result)) {
    foreach($row as $cell){
        //Comma-separate each value
        $output .= fieldCheck($cell).",";
    }
    //Remove last comma of each line and add newline
    $output = rtrim($output, ",") . "\n";
}

//Set headers
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="users.csv"');

//Output
echo $output;

exit;

//Function in case of comma in field
function fieldCheck($string){
    if(strpos($string, ",") !== false){
        $string = '"'.$string.'"';
    }
    return $string;
}

【讨论】:

  • 除了分隔符之外,这很完美,有没有办法使用“;”而不是“,”,有没有办法为列添加自定义标题?就像我在 $output = ""; 之后添加列的名称时一样excel 告诉我文件格式与扩展名不同,但它仍然可以打开。
  • 嗯,CSV 代表“逗号分隔值”,因此通过使用分号 ; 或制表符,您可以使其无法被 CSV 打开。您可以做的是创建一个函数,如果该字段中有逗号,则将该字段括在引号中 - 我已将其添加到我的答案中。我还在我的答案中添加了标题字段。
  • 它总是说类型与扩展指定的不同。它还说它是 SYLK 格式,但可能有错误(我的 MS EXCEL 是法语)
  • 没有标题它可以完美运行,但是添加列标题时它会在 EXCEL 中显示错误消息但仍然打开
  • 解决了!只需将每个条目都用引号引起来,无论是否包含逗号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多