PHP und MySQL: Exportieren Sie eine Abfrage in eine tabulatorgetrennte oder CSV-Datei
Dieses Wochenende wollte ich ein bauen PHP Seite, die jede sichern würde MySQL Abfrage oder Tabelle in eine durch Tabulatoren getrennte Datei. Bei den meisten Beispielen im Internet sind die Spalten fest codiert.
In meinem Fall wollte ich, dass die Spalten dynamisch sind, also musste ich zuerst alle Tabellenfeldnamen durchlaufen, um die Kopfzeile mit Spaltennamen zu erstellen, und dann alle Datensätze für die verbleibenden Datenzeilen durchlaufen. Außerdem habe ich den Header so eingestellt, dass der Browser den Dateidownload im Dateityp (txt) mit dem Namen der Datei, Datum und Zeitstempel initiiert.
Tabulatorgetrennter Export aus MySQL in PHP
<?php
$today = date("YmdHi");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$today."_Backup.txt\"");
$conn = new mysqli("hostname", "username", "password", "database_name"); // Replace with your database credentials
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$query = "SELECT * FROM `mytable` ORDER BY `myorder`";
$result = $conn->query($query);
if ($result->num_rows > 0) {
$fields = $result->fetch_fields();
// Prepare the header row
$header = [];
foreach ($fields as $field) {
$header[] = $field->name;
}
$data = implode("\t", $header) . "\n";
// Fetch and process the data rows
while ($row = $result->fetch_assoc()) {
$rowValues = [];
foreach ($fields as $field) {
$rowValues[] = $row[$field->name];
}
$data .= implode("\t", $rowValues) . "\n";
}
// Output the data
echo $data;
} else {
echo "No data found";
}
// Close the database connection
$conn->close();
?>
Lassen Sie uns den Code Schritt für Schritt durchgehen und die einzelnen Teile erklären:
<?php
// Get the current date and time in a specific format
$today = date("YmdHi");
// Set HTTP headers for file download
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$today."_Backup.txt\"");
// Create a MySQL database connection
$conn = new mysqli("hostname", "username", "password", "database_name"); // Replace with your database credentials
// Check if the database connection was successful
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
- Wir generieren das aktuelle Datum und die aktuelle Uhrzeit im „YmdHi“-Format und speichern es im
$today
variabel. - HTTP-Header werden so eingestellt, dass sie angeben, dass der Inhalt als Oktett-Stream (Binärdaten) behandelt werden soll und einen Dateidownload mit dem angegebenen Dateinamen auslösen.
- Mithilfe der Erweiterung erstellen wir eine MySQL-Datenbankverbindung und ersetzen Platzhalter durch Ihre tatsächlichen Datenbankanmeldeinformationen.
- Wir prüfen, ob die Datenbankverbindung erfolgreich war. Wir beenden das Skript und zeigen eine Fehlermeldung an, wenn ein Fehler vorliegt.
// Define the SQL query to select data from the `mytable` table
$query = "SELECT * FROM `mytable` ORDER BY `myorder`";
// Execute the SQL query
$result = $conn->query($query);
// Check if there are any rows returned
if ($result->num_rows > 0) {
// Fetch the field (column) names
$fields = $result->fetch_fields();
// Prepare the header row for the export file
$header = [];
foreach ($fields as $field) {
$header[] = $field->name;
}
$data = implode("\t", $header) . "\n";
- Wir definieren die SQL-Abfrage, um alle Daten aus dem auszuwählen
mytable
Tisch, sortieren nachmyorder
Spalte. - Die Abfrage wird ausgeführt und das Ergebnis wird im gespeichert
$result
variabel. - Wir prüfen, ob Zeilen zurückgegeben werden, indem wir die überprüfen
num_rows
Eigenschaft des Ergebnisobjekts. - Wir verwenden
fetch_fields()
um die Feld-(Spalten-)Namen abzurufen und sie im zu speichern$fields
Array. - Die Kopfzeile für die Exportdatei wird vorbereitet, indem die Feldnamen in einer Schleife durchlaufen und mit Tabulatoren verkettet werden.
// Fetch and process the data rows
while ($row = $result->fetch_assoc()) {
$rowValues = [];
foreach ($fields as $field) {
$rowValues[] = $row[$field->name];
}
$data .= implode("\t", $rowValues) . "\n";
}
- Wir benutzen ein
while
Schleife zum Abrufen jeder Datenzeile aus der Ergebnismenge mitfetch_assoc()
. - Innerhalb der Schleife bereiten wir die Werte jeder Zeile vor, indem wir die Felder durchlaufen und die entsprechenden Daten sammeln.
- Die Werte für jede Zeile werden mit Tabulatoren verkettet, um eine durch Tabulatoren getrennte Zeile zu erstellen, und diese Zeile wird der hinzugefügt
$data
variabel.
// Output the data to the browser
echo $data;
} else {
// If no data is found, display a message
echo "No data found";
}
// Close the MySQL database connection
$conn->close();
?>
- Wenn Daten gefunden werden (überprüft mit
num_rows
), geben wir die verketteten Daten zurück, die den Inhalt der Exportdatei darstellen. Dadurch wird der Dateidownload im Browser des Benutzers ausgelöst. - Wenn keine Daten gefunden werden, zeigen wir eine Meldung an, dass keine Daten verfügbar sind.
- Wir schließen die MySQL-Datenbankverbindung mit
$conn->close()
Ressourcen freizugeben.
Dieser Code exportiert Daten effizient aus einer MySQL-Datenbanktabelle in eine tabulatorgetrennte Textdatei und behandelt verschiedene Szenarien, wie z. B. Datenbankverbindungsfehler und leere Ergebnismengen.
Durch Kommas getrennte Werte aus MySQL in PHP exportieren
Ich kann den Code ändern, um Daten als CSV-Datei zu exportieren. Hier ist der Code, aktualisiert für den CSV-Export:
<?php
// Get the current date and time in a specific format
$today = date("YmdHi");
// Set HTTP headers for file download
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=\"".$today."_Backup.csv\"");
// Create a MySQL database connection
$conn = new mysqli("hostname", "username", "password", "database_name"); // Replace with your database credentials
// Check if the database connection was successful
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Define the SQL query to select data from the `mytable` table
$query = "SELECT * FROM `mytable` ORDER BY `myorder`";
// Execute the SQL query
$result = $conn->query($query);
// Check if there are any rows returned
if ($result->num_rows > 0) {
// Prepare the output file handle for writing
$output = fopen('php://output', 'w');
// Fetch and process the data rows
while ($row = $result->fetch_assoc()) {
// Output each row as a CSV line
fputcsv($output, $row);
}
// Close the output file handle
fclose($output);
} else {
// If no data is found, display a message
echo "No data found";
}
// Close the MySQL database connection
$conn->close();
?>
In diesem geänderten Code:
- Die Header für die HTTP-Antwort werden aktualisiert, um a anzugeben
text/csv
Inhaltstyp und der Dateiname hat die Erweiterung „.csv“. - Anstatt den CSV-Inhalt manuell zu erstellen, verwenden wir den
fputcsv
Funktion, um jede Zeile aus dem MySQL-Ergebnissatz als CSV-Zeile auszugeben. Diese Funktion übernimmt die CSV-Formatierung für Sie, einschließlich der Behandlung von Sonderzeichen und dem Einschließen von Feldern in doppelte Anführungszeichen, wenn nötig. - Wir öffnen das Ausgabedatei-Handle mit
fopen
mit „php://output“ als Dateinamen. Dadurch können wir direkt in den HTTP-Antwort-Ausgabestream schreiben. - Der Code ist so strukturiert, dass er den CSV-Export effizient abwickelt und das Dateihandle schließt, wenn er fertig ist.
Dieser Code exportiert die Daten aus der MySQL-Tabelle als CSV-Datei, sodass Benutzer sie problemlos in Tabellenkalkulationsanwendungen wie Excel öffnen und damit arbeiten können. Vergessen Sie nicht, die Datenbankanmeldeinformationen durch Ihre eigenen zu ersetzen.