PHP ve MySQL: Bir Sorguyu Sekmeyle Ayrılmış Bir Dosyaya veya CSV Dosyasına Aktarma
Bu hafta sonu bir inşa etmek istedim. PHP herhangi bir şeyi yedekleyecek sayfa MySQL sorguyu veya tabloyu Sekmeyle Ayrılmış bir dosyaya aktarabilirsiniz. İnternetteki örneklerin çoğunda sütunlar sabit kodlanmıştır.
Benim durumumda, sütunların dinamik olmasını istedim, bu nedenle sütun adlarıyla başlık satırını oluşturmak için önce tüm tablo alanı adları arasında döngü yapmam ve ardından kalan veri satırları için tüm kayıtlar arasında döngü yapmam gerekiyordu. Ayrıca başlığı, tarayıcının, dosya tarihi adı ve zaman damgasıyla birlikte dosya türünde (txt) dosya indirmeyi başlatacağı şekilde ayarladım.
PHP'de MySQL'den Sekmeyle Sınırlandırılmış Dışa Aktarma
<?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();
?>
Her parça için açıklamalarla kodu adım adım inceleyelim:
<?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);
}
- Güncel tarih ve saati “YmdHi” formatında oluşturup saklıyoruz.
$today
değişkeni. - HTTP üstbilgileri, içeriğin bir sekizli akış (ikili veri) olarak ele alınması gerektiğini belirtecek ve belirtilen dosya adıyla bir dosya indirmeyi tetikleyecek şekilde ayarlanmıştır.
- Uzantıyı kullanarak, yer tutucuları gerçek veritabanı kimlik bilgilerinizle değiştirerek bir MySQL veritabanı bağlantısı oluşturuyoruz.
- Veritabanı bağlantısının başarılı olup olmadığını kontrol ediyoruz. Bir hata olması durumunda betiği sonlandırıyoruz ve bir hata mesajı görüntülüyoruz.
// 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";
- Tüm verileri seçmek için SQL sorgusunu tanımlıyoruz.
mytable
masa tarafından sipariş edilerekmyorder
sütun. - Sorgu yürütülür ve sonuç,
$result
değişkeni. - İnceleyerek döndürülen herhangi bir satır olup olmadığını kontrol ediyoruz.
num_rows
sonuç nesnesinin özelliği. - Biz kullanmak
fetch_fields()
alan (sütun) adlarını almak ve bunları depolamak için$fields
dizisi. - Dışa aktarma dosyasının başlık satırı, alan adları arasında döngü yapılarak ve bunların sekmelerle birleştirilmesiyle hazırlanır.
// 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";
}
- Kullanırız
while
kullanarak sonuç kümesinden her veri satırını almak için döngüfetch_assoc()
. - Döngünün içinde, alanlar arasında yinelemeler yaparak ve ilgili verileri toplayarak her satırın değerlerini hazırlarız.
- Her satırın değerleri, sekmeyle ayrılmış bir satır oluşturmak için sekmelerle birleştirilir ve bu satır,
$data
değişkeni.
// 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();
?>
- Veri bulunursa (ile kontrol edilir)
num_rows
), dışa aktarma dosyasının içeriği olan birleştirilmiş verileri yansıtırız. Bu, kullanıcının tarayıcısında dosya indirmeyi tetikler. - Hiçbir veri bulunamazsa, veri bulunmadığını belirten bir mesaj görüntüleriz.
- MySQL veritabanı bağlantısını kullanarak kapatıyoruz.
$conn->close()
kaynakları serbest bırakmak için.
Bu kod, verileri bir MySQL veritabanı tablosundan sekmeyle ayrılmış bir metin dosyasına verimli bir şekilde aktarır ve veritabanı bağlantı hataları ve boş sonuç kümeleri gibi çeşitli senaryoları işler.
PHP'de MySQL'den Virgülle Ayrılmış Değerler Dışa Aktarma
Verileri CSV dosyası olarak dışa aktarmak için kodu değiştirebilirim. CSV dışa aktarımı için güncellenen kod aşağıda verilmiştir:
<?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();
?>
Bu değiştirilmiş kodda:
- HTTP yanıtının üstbilgileri, bir
text/csv
içerik türü ve dosya adı “.csv” uzantısına sahiptir. - CSV içeriğini manuel olarak oluşturmak yerine,
fputcsv
MySQL sonuç kümesindeki her satırın CSV satırı olarak çıktısını alma işlevi. Bu işlev, özel karakterlerin işlenmesi ve gerektiğinde alanların çift tırnak içine alınması da dahil olmak üzere CSV biçimlendirmesini sizin için yönetir. - Çıktı dosyası tanıtıcısını kullanarak açıyoruz
fopen
dosya adı 'php://output' ile. Bu, doğrudan HTTP yanıt çıkış akışına yazmamıza olanak tanır. - Kod, CSV dışa aktarımını verimli bir şekilde gerçekleştirecek şekilde yapılandırılmıştır ve işlem tamamlandığında dosya tanıtıcısını kapatır.
Bu kod, verileri MySQL tablosundan CSV dosyası olarak dışa aktararak kullanıcıların Excel gibi elektronik tablo uygulamalarını açmasını ve bunlarla çalışmasını kolaylaştırır. Veritabanı kimlik bilgilerini kendinizinkiyle değiştirmeyi unutmayın.