CRM in podatkovne platforme

PHP in MySQL: izvozite poizvedbo v datoteko CSV, ločeno s tabulatorji

Ta vikend sem hotel zgraditi PHP stran, ki bi varnostno kopirala katero koli MySQL poizvedbo ali tabelo v datoteko, ločeno s tabulatorji. Večina primerov na internetu ima stolpce trdo kodirane.

V mojem primeru sem želel, da so stolpci dinamični, zato sem moral najprej pregledati vsa imena polj tabele, da sem zgradil naslovno vrstico z imeni stolpcev, nato pa pregledati vse zapise za preostale podatkovne vrstice. Nastavil sem tudi glavo, tako da bo brskalnik sprožil prenos datoteke v vrsti datoteke (txt) z imenom datoteke, datumom in časovnim žigom.

Izvoz, ločen s tabulatorji, iz MySQL v 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();
?>

Sprehodimo se skozi kodo korak za korakom z razlagami za vsak del:

<?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);
}
  • Trenutni datum in čas ustvarimo v formatu »YmdHi« in ju shranimo v $today spremenljivka.
  • Glave HTTP so nastavljene tako, da določajo, da je treba vsebino obravnavati kot oktetni tok (binarni podatki) in sprožijo prenos datoteke z navedenim imenom datoteke.
  • Z razširitvijo ustvarimo povezavo z bazo podatkov MySQL, pri čemer nadomestne oznake nadomestimo z vašimi dejanskimi poverilnicami baze podatkov.
  • Preverimo, ali je bila povezava z bazo uspešna. Zaključimo skript in prikažemo sporočilo o napaki, če pride do napake.
// 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";
  • Definiramo poizvedbo SQL za izbiro vseh podatkov iz mytable mizo, ki jo naroča po myorder stolpec.
  • Poizvedba se izvede, rezultat pa se shrani v $result spremenljivka.
  • Preverimo, ali obstajajo vrnjene vrstice, tako da pregledamo num_rows lastnost predmeta rezultata.
  • Mi uporabljamo fetch_fields() za pridobitev imen polj (stolpcev) in njihovo shranjevanje v $fields matrika.
  • Vrstica z glavo za izvozno datoteko je pripravljena s pomikanjem po imenih polj in njihovim povezovanjem z zavihki.
    // 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";
    }
  • Uporabljamo a while zanke za pridobivanje vsake podatkovne vrstice iz niza rezultatov z uporabo fetch_assoc().
  • Znotraj zanke pripravimo vrednosti vsake vrstice s ponavljanjem po poljih in zbiranjem ustreznih podatkov.
  • Vrednosti za vsako vrstico so povezane z zavihki, da ustvarijo vrstico, ločeno s tabulatorji, in ta vrstica je dodana v $data spremenljivka.
    // 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();
?>
  • Če so najdeni podatki (preverjeno z num_rows), ponovimo povezane podatke, ki so vsebina izvozne datoteke. To sproži prenos datoteke v brskalniku uporabnika.
  • Če podatki niso najdeni, prikažemo sporočilo, da podatki niso na voljo.
  • Povezavo z bazo podatkov MySQL zapremo z uporabo $conn->close() za sprostitev virov.

Ta koda učinkovito izvozi podatke iz tabele baze podatkov MySQL v besedilno datoteko, ločeno s tabulatorji, in obravnava različne scenarije, kot so napake povezave z bazo podatkov in prazni nizi rezultatov.

Izvoz vrednosti, ločenih z vejico, iz MySQL v PHP

Kodo lahko spremenim za izvoz podatkov kot datoteke CSV. Tukaj je koda, posodobljena za izvoz 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();
?>

V tej spremenjeni kodi:

  • Glave za odziv HTTP so posodobljene, da podajo a text/csv vrsto vsebine, ime datoteke pa ima pripono ».csv«.
  • Namesto ročnega ustvarjanja vsebine CSV uporabljamo fputcsv funkcijo za izpis vsake vrstice iz nabora rezultatov MySQL kot vrstico CSV. Ta funkcija obravnava oblikovanje CSV namesto vas, vključno z obravnavanjem posebnih znakov in zapiranjem polj v dvojne narekovaje, kadar je to potrebno.
  • Ročaj izhodne datoteke odpremo z uporabo fopen z 'php://output' kot imenom datoteke. To nam omogoča neposredno pisanje v izhodni tok odziva HTTP.
  • Koda je strukturirana tako, da učinkovito obravnava izvoz CSV in zapre ročaj datoteke, ko je končan.

Ta koda bo izvozila podatke iz tabele MySQL kot datoteko CSV, kar bo uporabnikom olajšalo odpiranje in delo v aplikacijah za preglednice, kot je Excel. Ne pozabite zamenjati poverilnic zbirke podatkov s svojimi.

Douglas Karr

Douglas Karr je CMO of Odpri INSIGHTS in ustanovitelj Martech Zone. Douglas je pomagal na desetine uspešnih startupov MarTech, pomagal je pri skrbnem pregledu več kot 5 milijard USD pri prevzemih in naložbah Martecha ter še naprej pomaga podjetjem pri izvajanju in avtomatizaciji njihovih prodajnih in trženjskih strategij. Douglas je mednarodno priznan strokovnjak in govorec za digitalno transformacijo in MarTech. Douglas je tudi objavljen avtor Dummie's guide in knjige o poslovnem vodenju.

Povezani članki

Nazaj na vrh
Zapri

Zaznan Adblock

Martech Zone vam lahko zagotovi to vsebino brezplačno, ker naše spletno mesto monetiziramo s prihodki od oglasov, pridruženimi povezavami in sponzorstvi. Hvaležni bi bili, če bi med ogledom našega spletnega mesta odstranili zaviralec oglasov.