it-swarm.com.de

Fragen Sie mysql ab und exportieren Sie Daten als CSV in PHP

Ich habe myssql db mit verschiedenen Tabellen. Die Daten zwischen den Tabellen sind verknüpft und ich rufe sie ab und zeige sie mit der Benutzer-ID an. Ich habe die Referenz von PHP MYSQLi verwendet. Alle Tabellen in einer Datenbank anzeigen

Aber wie exportiere ich diese Informationen als CSV-Datei? Ich habe versucht, anstelle des Echos es in eine Zeichenfolge zu ändern und die Zeichenfolge in eine CSV-Datei zu drucken, aber es funktioniert nicht.

Ich habe das Beispiel auch aus folgenden Quellen ausprobiert: http://sudobash.net/php-export-mysql-query-to-csv-file/

Aber ich kann die Daten sehen, aber oben ist auch Müll (wie "<font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>"
usw.) in der CSV-Datei.

Gibt es eine andere Möglichkeit, dies zu tun?

7
aandroidtest

Wenn Sie jede MySQL-Zeile in eine CSV-Datei schreiben möchten, können Sie die integrierte PHP5-Funktion fputcsv verwenden.

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

Welche sollte eine durch Kommas getrennte Zeichenfolge für jede in file.csv geschriebene Zeile zurückgeben: 

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

Überprüfen Sie auch die Berechtigungen für das Verzeichnis, in das Sie schreiben.

13
dcd0181

Dies ist eine Lösung, die die Kopf- oder Feldnamen enthält, indem die Funktion MySQLi'sfetch_fields - verwendet wird. 

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

Dies ist auch eine Modifikation einer anderen Antwort , bei der eine ähnliche Lösung vorgeschlagen wurde, aber der Kopfzeilenteil für mich nicht funktionierte. Daher habe ich die Methode zum Abrufen geändert. Die Gutschrift erfolgt an @Jrgns 

12
RCNeil

Sie können versuchen, MySql INTO OUTFILE / zu verwenden:

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

für das Erstellen und Herunterladen einer CSV-Datei aus einer Mysqli-Abfrage (mit Objektorientierung) denke ich, dass dies helfen würde.

Dies ist eine Klasse, die eine Verbindung zur Datenbank herstellt, und die Funktionen können mit mysqli und PHP nach Belieben arbeiten. Wenn Sie diese Klasse aufrufen (Require oder Include), verwenden Sie einfach die Funktion "downloadCsv ()".

Dies wäre zum Beispiel die Datei "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";

}
?>

Nach dem Erstellen der Datei "class.php" verwenden Sie in diesem Beispiel diese Funktion für die Datei "download.php":

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

Öffnen Sie nach dem Download die Datei mit MS Excel.

Ich hoffe, das hilft Ihnen, ich glaube, ich habe es gut geschrieben, ich habe mich mit dem Text- und Code-Feld nicht wohl gefühlt.

1
manuelmatas

Probieren Sie es aus.

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;

Beachten Sie, dass das erste Argument für addRowToCsv als Referenz übergeben wird. Dies ist nicht erforderlich und Sie können leicht einen Rückgabewert verwenden, aber so würde ich es tun.

Wenn Sie die Ausgabe in einer Datei speichern möchten, anstatt sie als Download zu verwenden, verwenden Sie die obigen Anweisungen, und ersetzen Sie sie

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

echo $csvString;

Mit..

file_put_contents('MyCsvFile.csv', $csvString);
1
Tom Wright