У меня myssql db с разными таблицами. Данные между таблицами связаны, и я извлекаю их и отображаю их с помощью идентификатора пользователя. Я использовал ссылку из PHP MYSQLi. Отображение всех таблиц в базе данных.
Но как я могу экспортировать эту информацию в виде файла csv? Я попытался вместо echo изменить его на строку и напечатать строку в файле 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.
Есть ли другой способ сделать это?
Если вы хотите написать каждую строку 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..
Также обязательно проверяйте разрешения для каталога, в котором вы пишете.
Это решение, которое включает заголовки или имена полей, используя функцию fetch_fields
MySQLi –
$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
Вы можете попытаться использовать предложение 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 из запроса mysqli (используя объектно-ориентированный), я думаю, что это поможет.
Это класс, который соединяется с базой данных, и функции будут делать то, что вы хотите, используя 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.
Надеюсь, это поможет вам, я думаю, что написал это хорошо, я не чувствовал себя комфортно с текстом и полем кода.
Попробуйте это.
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);