在PHP中查询mysql并将数据导出为CSV
我有不同表的MySQL数据库。表之间的数据是链接的,我使用userid检索并显示它们。我使用了来自 但是如何将此信息导出为csv文件?我尝试过将它改为字符串,并将字符串打印到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 =
”
等)在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);