2013-05-06 109 views
6

我拥有带不同表的myssql db。表格之间的数据是链接的,我通过使用用户标识来检索和显示它们。我使用的参考PHP MYSQLi Displaying all tables in a database在PHP中查询mysql并将数据导出为CSV

但是,如何将这些信息导出为csv文件?我试过,而不是回声改变它为一个字符串,并打印到csv文件的字符串,但它不工作。

我也曾尝试从例子: http://sudobash.net/php-export-mysql-query-to-csv-file/

但我可以看到的数据,但在顶部也有垃圾(如"<font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>"
等)的CSV文件中。

是否有另一种方法可以做到这一点?

回答

12

如果你想每一个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.. 

另外一定要检查您正在写入的目录的权限。

+0

@ dcd08谢谢我其实已经尝试这但问题是在csv文件的底部也有垃圾打印,如“

“ 等任何想法是什么导致它? – aandroidtest 2013-05-08 06:25:33

+0

好的,我必须把ob_start()放在顶部,这个问题已经解决了。 – aandroidtest 2013-05-08 06:44:18

+0

任何人都可以发布一个示例/链接如何处理搜索框查询以及csv/xls导出?我想使用搜索框作为查询和$ _GET [“搜索”]变量,然后从mysql中检索数据,显示在表中,然后导出到xls/csv。据我了解,应该有一个搜索框输入和两个提交按钮... – 2017-02-28 14:26:49

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 
+0

这真的很酷!非常感谢! – nrubin29 2014-05-21 13:59:45

9

这是通过使用MySQLi'sfetch_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; 
} 

这也是一个修改of a different answer提出了类似的解决方案,但标题部分对我不起作用,所以我改变了检索它们的方法。信用是由于@Jrgns

+0

工作得很好,谢谢! – user2662680 2018-02-05 15:33:47

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; 

随着..

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