CRM dhe Platformat e të Dhënave

PHP dhe MySQL: Eksportoni një pyetje në një skedar të ndarë me skedë ose CSV

Këtë fundjavë, doja të ndërtoja një PHP faqe që do të kopjonte ndonjë MySQL pyetje ose tabelë në një skedar të ndarë me skeda. Shumica e shembujve në rrjet i kanë kolonat të koduara.

Në rastin tim, doja që kolonat të ishin dinamike, kështu që fillimisht më duhej të bëja një cikli nëpër të gjithë emrat e fushave të tabelës për të ndërtuar rreshtin e kokës me emrat e kolonave dhe më pas të bëja një cikli nëpër të gjitha rekordet për rreshtat e mbetur të të dhënave. Vendosa gjithashtu kokën në mënyrë që shfletuesi të fillojë shkarkimin e skedarit në llojin e skedarit (txt) me emrin e datës së skedarit dhe vulën kohore.

Eksporti i ndarë me skeda nga MySQL në 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();
?>

Le të ecim nëpër kodin hap pas hapi me shpjegime për secilën pjesë:

<?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);
}
  • Ne gjenerojmë datën dhe orën aktuale në formatin "YmdHi" dhe e ruajmë atë në $today ndryshueshme.
  • Titujt e HTTP janë caktuar për të specifikuar që përmbajtja duhet të trajtohet si një rrymë oktet (të dhëna binare) dhe të aktivizojë një shkarkim skedari me emrin e skedarit të specifikuar.
  • Duke përdorur shtesën, ne krijojmë një lidhje të bazës së të dhënave MySQL, duke zëvendësuar mbajtësit e vendeve me kredencialet tuaja aktuale të bazës së të dhënave.
  • Ne kontrollojmë nëse lidhja e bazës së të dhënave ishte e suksesshme. Ne e mbyllim skriptin dhe shfaqim një mesazh gabimi nëse ka një gabim.
// 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";
  • Ne përcaktojmë pyetjen SQL për të zgjedhur të gjitha të dhënat nga mytable tryezë, duke e porositur atë nga myorder kolona.
  • Pyetja ekzekutohet dhe rezultati ruhet në $result ndryshueshme.
  • Ne kontrollojmë nëse ka ndonjë rresht të kthyer duke ekzaminuar num_rows veti e objektit të rezultatit.
  • Ne përdorim fetch_fields() për të marrë emrat e fushave (kolonave) dhe t'i ruani ato në $fields grup
  • Rreshti i kokës për skedarin e eksportit përgatitet duke kaluar nëpër emrat e fushave dhe duke i bashkuar ato me skeda.
    // 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";
    }
  • Ne përdorim një while lak për të marrë çdo rresht të dhënash nga grupi i rezultateve duke përdorur fetch_assoc().
  • Brenda ciklit, ne përgatisim vlerat e çdo rreshti duke përsëritur nëpër fusha dhe duke mbledhur të dhënat përkatëse.
  • Vlerat për çdo rresht bashkohen me skeda për të krijuar një rresht të kufizuar me skeda dhe ky rresht shtohet në $data ndryshueshme.
    // 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();
?>
  • Nëse gjenden të dhëna (kontrolluar me num_rows), ne i bëjmë jehonë të dhënave të lidhura, që është përmbajtja e skedarit të eksportit. Kjo shkakton shkarkimin e skedarit në shfletuesin e përdoruesit.
  • Nëse nuk gjenden të dhëna, ne shfaqim një mesazh që tregon se nuk ka të dhëna të disponueshme.
  • Ne mbyllim lidhjen e bazës së të dhënave MySQL duke përdorur $conn->close() për të liruar burimet.

Ky kod eksporton në mënyrë efikase të dhënat nga një tabelë e bazës së të dhënave MySQL në një skedar teksti të kufizuar me skeda dhe trajton skenarë të ndryshëm, të tillë si gabimet e lidhjes së bazës së të dhënave dhe grupet boshe të rezultateve.

Vlerat e ndara me presje Eksporto nga MySQL në PHP

Mund ta modifikoj kodin për të eksportuar të dhënat si skedar CSV. Këtu është kodi, i përditësuar për eksportimin CSV:

<?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();
?>

Në këtë kod të modifikuar:

  • Titujt për përgjigjen HTTP përditësohen për të specifikuar a text/csv lloji i përmbajtjes dhe emri i skedarit ka ekstensionin “.csv”.
  • Në vend që të krijojmë manualisht përmbajtjen CSV, ne përdorim fputcsv funksion për të nxjerrë çdo rresht nga rezultati MySQL i vendosur si një linjë CSV. Ky funksion trajton formatimin CSV për ju, duke përfshirë trajtimin e karaktereve speciale dhe mbylljen e fushave në thonjëza të dyfishta kur është e nevojshme.
  • Ne hapim dorezën e skedarit të daljes duke përdorur fopen me 'php://output' si emër skedari. Kjo na lejon të shkruajmë drejtpërdrejt në rrjedhën e daljes së përgjigjes HTTP.
  • Kodi është strukturuar për të trajtuar me efikasitet eksportin CSV dhe mbyll dorezën e skedarit kur të përfundojë.

Ky kod do t'i eksportojë të dhënat nga tabela MySQL si një skedar CSV, duke e bërë të lehtë për përdoruesit hapjen dhe punën me të në aplikacionet e tabelave si Excel. Mos harroni të zëvendësoni kredencialet e bazës së të dhënave me tuajat.

Douglas Karr

Douglas Karr është CMO i OpenINSIGHTS dhe themeluesi i Martech Zone. Douglas ka ndihmuar dhjetëra startup të suksesshëm të MarTech, ka ndihmuar në analizën e duhur prej mbi 5 miliardë dollarësh në blerjet dhe investimet e Martech dhe vazhdon të ndihmojë kompanitë në zbatimin dhe automatizimin e strategjive të tyre të shitjeve dhe marketingut. Douglas është një ekspert dhe folës i transformimit dixhital dhe i njohur ndërkombëtarisht në MarTech. Douglas është gjithashtu një autor i botuar i një udhëzuesi Dummie dhe një libri për udhëheqjen e biznesit.

Artikuj Të Ngjashëm

Kthehu në krye të faqes
afër

Blloku i reklamave u zbulua

Martech Zone është në gjendje t'ju ofrojë këtë përmbajtje pa kosto, sepse ne fitojmë para nga faqja jonë përmes të ardhurave nga reklamat, lidhjeve të filialeve dhe sponsorizimeve. Do të vlerësonim nëse do të hiqnit bllokuesin tuaj të reklamave ndërsa shikoni faqen tonë.