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

8
我有一个包含不同表格的mysql数据库。这些表格之间的数据是相互关联的,我通过使用userid来检索和显示它们。我参考了PHP MYSQLi Displaying all tables in a database
但是,我该如何将这些信息导出为csv文件呢?我已经尝试将echo更改为字符串并将其打印到csv文件中,但它不起作用。
我还尝试了以下示例:http://sudobash.net/php-export-mysql-query-to-csv-file/
但我可以看到csv文件中还有垃圾(例如"<font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>"
等)。是否还有其他方法可以实现此操作?
5个回答

15

如果你想要将每一行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..

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


@dcd08 谢谢,我实际上已经尝试过了,但问题在于 CSV 文件底部还打印了一些垃圾信息,例如 "<font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>" 等等。你有什么想法是什么原因导致的吗? - aandroidtest
好的,完成了,我必须在顶部放置ob_start(),问题解决了。 - aandroidtest
有人可以发布一个如何处理搜索框查询和csv / xls导出的示例/链接吗? 我想使用搜索框作为查询和$_GET [“search”]变量,然后从mysql检索数据,在表中显示,然后导出到xls / csv。 就我所了解的而言,应该有一个搜索框输入和两个提交按钮... - Aleksandr

12
使用MySQLifetch_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值得赞扬。


4

您可以尝试使用 MySql 的 INTO OUTFILE 语句:

SELECT *
  INTO OUTFILE '/tmp/tablename.csv'
       FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
       LINES TERMINATED BY '\n'
   FROM tablename
  WHERE userid = 1

这不会将列名添加到csv的第一行。请还建议上述方法的更改,以便它也可以导出列名。 - thepunitsingh

1

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

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

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

<?php
class DB{

private $con;

//this constructor connects with the database
public function __construct(){
$this->con = new mysqli("Your_Host","Your_User","Your_Pass","Your_DatabaseName");

if($this->con->connect_errno > 0){
    die('There was a problem [' . $con->connect_error . ']');
    }
}

//create the function that will download a csv file from a mysqli query

public function downloadCsv(){

$count = 0;
$header = "";
$data = "";
//query
$result = $this->con->query("SELECT * FROM Your_TableName");
//count fields
$count = $result->field_count;
//columns names
$names = $result->fetch_fields();
//put column names into header
foreach($names as $value) {
    $header .= $value->name.";";
    }
}
//put rows from your query
while($row = $result->fetch_row())  {
    $line = '';
    foreach($row as $value)       {
        if(!isset($value) || $value == "")  {
            $value = ";"; //in this case, ";" separates columns
    } else {
            $value = str_replace('"', '""', $value);
            $value = '"' . $value . '"' . ";"; //if you change the separator before, change this ";" too
        }
        $line .= $value;
    } //end foreach
    $data .= trim($line)."\n";
} //end while
//avoiding problems with data that includes "\r"
$data = str_replace("\r", "", $data);
//if empty query
if ($data == "") {
    $data = "\nno matching records found\n";
}
$count = $result->field_count;

//Download csv file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=FILENAME.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $header."\n".$data."\n";

}
?>

在创建了名为"class.php"的文件之后,在本示例中,在"download.php"文件中使用该函数:
<?php
//call the "class.php" file
require_once 'class.php';
//instantiate DB class
$export = new DB();
//call function
$export->downloadCsv();
?>

下载后,使用MS Excel打开文件。

希望这可以帮到您,我认为我写得不错,但对于文本和代码字段我感觉不太舒适。


1
尝试一下。
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;

With..

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接