Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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 - Fatal编程技术网

在PHP中查询mysql并将数据导出为CSV

在PHP中查询mysql并将数据导出为CSV,php,mysql,csv,Php,Mysql,Csv,我有不同表的MySQL数据库。表之间的数据是链接的,我使用userid检索并显示它们。我使用了来自 但是如何将此信息导出为csv文件?我尝试过将它改为字符串,并将字符串打印到csv文件,但它不起作用 我还尝试了以下例子: 但我可以看到数据,但上面还有垃圾(如” 等)在csv文件中 还有其他方法吗?如果要将每个MySQL行写入CSV文件,可以使用内置的PHP5函数fputcsv $result = mysqli_query($con, 'SELECT * FROM table'); $row =

我有不同表的MySQL数据库。表之间的数据是链接的,我使用userid检索并显示它们。我使用了来自

但是如何将此信息导出为csv文件?我尝试过将它改为字符串,并将字符串打印到csv文件,但它不起作用

我还尝试了以下例子:

但我可以看到数据,但上面还有垃圾(如

等)在csv文件中


还有其他方法吗?

如果要将每个MySQL行写入CSV文件,可以使用内置的PHP5函数
fputcsv

$result = mysqli_query($con, 'SELECT * FROM table');
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);

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

foreach ($row as $val) {
    fputcsv($fp, $val);
}

fclose($fp);
对于写入
file.csv的每一行,它应该返回一个逗号分隔的字符串:

row1 val1, row1 val2
row2 val1, row2 val2 
etc..

还要确保检查您正在写入的目录的权限。

您可以尝试使用MySql子句:


这是一种通过使用
fetch\u fields
函数合并标题或字段名的解决方案-

$query = "SELECT * FROM table";
$result = $db->query($query);
if (!$result) die('Couldn\'t fetch records');
$headers = $result->fetch_fields();
foreach($headers as $header) {
    $head[] = $header->name;
}
$fp = fopen('php://output', 'w');

if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    header('Pragma: no-cache');
    header('Expires: 0');
    fputcsv($fp, array_values($head)); 
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    die;
}

这也是一个修改,其中建议了一个类似的解决方案,但标题部分对我不起作用,所以我更改了检索它们的方法。归功于@Jrgns

从mysqli查询中创建和下载csv文件(使用面向对象),我认为这会有所帮助

这是一个与数据库连接的类,函数将使用mysqli和PHP执行任何您想要的操作。在这种情况下,调用此类(require或include),只需使用“downloadCsv()”函数

例如,这将是“class.php”文件:

试试这个

function addRowToCsv(& $csvString, $cols) {
    $csvString .= implode(',', $cols) . PHP_EOL; //Edits must be 6 characters - all I added was a "." before the =. :-)
}

$csvString = '';
$first = true;

while ($row = mysqli_fetch_assoc($query)) {
    if ($first === true) {
        $first = false;
        addRowToCsv($csvString, array_keys($row));
    }
    addRowToCsv($csvString, $row);
}

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyCsvFile.csv');

echo $csvString;
请注意,addRowToCsv的第一个参数是通过引用传递的。这不是必需的,您可以轻松地使用返回值,但这正是我要做的

如果您想将输出保存到一个文件中,而不是将其作为下载使用,那么请使用上面的

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyCsvFile.csv');

echo $csvString;

file_put_contents('MyCsvFile.csv', $csvString);

@dcd08谢谢,我确实试过了,但问题是在csv文件的底部也有类似“”等的垃圾打印。知道是什么造成的吗?好的,我必须把ob_start()放在顶部,这就解决了。有人能在csv/xls导出的同时发布一个示例/链接,说明如何处理搜索框查询吗?我想使用搜索框作为查询和$_GET[“search”]变量,然后从mysql检索数据,显示在表中,然后导出到xls/csv。据我所知,应该有一个搜索框输入和两个提交按钮…这不会将列名添加到csv的第一行。还请建议对上述方法进行更改,以便它也可以导出列名。
function addRowToCsv(& $csvString, $cols) {
    $csvString .= implode(',', $cols) . PHP_EOL; //Edits must be 6 characters - all I added was a "." before the =. :-)
}

$csvString = '';
$first = true;

while ($row = mysqli_fetch_assoc($query)) {
    if ($first === true) {
        $first = false;
        addRowToCsv($csvString, array_keys($row));
    }
    addRowToCsv($csvString, $row);
}

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyCsvFile.csv');

echo $csvString;
header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyCsvFile.csv');

echo $csvString;
file_put_contents('MyCsvFile.csv', $csvString);