2013-05-06 19 views
6

Tôi có db myssql với các bảng khác nhau. Dữ liệu giữa các bảng được liên kết và tôi truy xuất và hiển thị chúng bằng cách sử dụng userid. Tôi đã sử dụng tham chiếu từ PHP MYSQLi Displaying all tables in a databaseTruy vấn mysql và xuất dữ liệu dưới dạng CSV trong PHP

Nhưng làm cách nào để xuất thông tin này dưới dạng tệp csv? Tôi đã thử thay vì echo thay đổi nó thành một chuỗi và in chuỗi vào một tập tin csv nhưng nó không hoạt động.

Tôi cũng đã cố gắng dụ từ: http://sudobash.net/php-export-mysql-query-to-csv-file/

Nhưng tôi có thể xem dữ liệu nhưng trên đầu vẫn còn có rác (như "<font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>"
vv) bên trong tập tin csv.

Có cách nào khác để thực hiện việc này không?

Trả lời

12

Nếu bạn muốn viết mỗi hàng MySQL vào một tập tin CSV, bạn có thể sử dụng được xây dựng trong chức năng 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); 

nào phải trả lại một dấu phẩy tách chuỗi cho mỗi hàng ghi vào file.csv:

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

Cũng đảm bảo kiểm tra quyền đối với thư mục bạn đang ghi.

+0

@ dcd08 Cảm ơn Tôi thực sự đã cố gắng điều này nhưng vấn đề là ở dưới cùng của tập tin csv cũng có rác in như "

" v.v ... Bất kỳ ý tưởng nào gây ra nó? – aandroidtest

+0

Ok xong, tôi phải đặt ob_start() ở trên cùng và điều này được giải quyết. – aandroidtest

+0

Có ai có thể đăng ví dụ/liên kết về cách xử lý truy vấn hộp tìm kiếm cùng với xuất csv/xls không? Tôi muốn sử dụng hộp tìm kiếm dưới dạng truy vấn và biến $ _GET ["search"], sau đó truy xuất dữ liệu từ mysql, hiển thị trong bảng và sau đó xuất sang xls/csv. Theo tôi hiểu, cần có một hộp nhập tìm kiếm và hai nút gửi ... –

4

Bạn có thể thử sử dụng MySql INTO OUTFILE khoản:

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

Điều đó thực sự tuyệt vời! Cám ơn rất nhiều! – nrubin29

9

Đây là một giải pháp kết hợp các tiêu đề hoặc tên trường bằng cách sử dụng MySQLi'sfetch_fields chức năng -

$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; 
} 

Đây cũng là một sự sửa đổi of a different answer nơi một giải pháp tương tự đã được đề xuất nhưng phần tiêu đề không làm việc cho tôi, vì vậy tôi đã thay đổi phương pháp truy xuất chúng. Tín dụng là do @Jrgns

+0

Làm việc tốt cho tôi ... cảm ơn! – user2662680

1

để tạo và tải xuống tệp csv từ truy vấn mysqli (sử dụng định hướng đối tượng) Tôi nghĩ điều này sẽ hữu ích.

Đây là Lớp kết nối với cơ sở dữ liệu và các chức năng sẽ làm bất cứ điều gì bạn muốn bằng cách sử dụng mysqli và PHP. Trong trường hợp này, hãy gọi lớp này (yêu cầu hoặc bao gồm), chỉ cần sử dụng hàm "downloadCsv()".

Như một ví dụ, đây sẽ là "class.php" file:

<?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"; 

} 
?> 

Sau khi tạo "class.php" tập tin, trong ví dụ này, sử dụng chức năng đó trong hồ sơ "download.php" :

<?php 
//call the "class.php" file 
require_once 'class.php'; 
//instantiate DB class 
$export = new DB(); 
//call function 
$export->downloadCsv(); 
?> 

Sau khi tải xuống, mở tệp bằng MS Excel.

Tôi hy vọng điều này sẽ giúp bạn, tôi nghĩ rằng tôi đã viết nó tốt, tôi không cảm thấy thoải mái với trường văn bản và mã.

1

Hãy dùng thử.

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; 

Lưu ý rằng đối số đầu tiên để thêmRowToCsv được chuyển qua tham chiếu. Điều này là không cần thiết và bạn có thể dễ dàng sử dụng một giá trị trả về, nhưng đây chỉ là cách tôi sẽ làm điều đó.

Nếu bạn muốn lưu kết quả vào một tập tin chứ không phải phục vụ nó như là một tải về sau đó sử dụng trên nhưng thay

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

echo $csvString; 

Với ..

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