CRM и платформи за податоци

PHP и MySQL: извезете барање во разграничена картичка или CSV-датотека

Овој викенд сакав да изградам а PHP страница која би направила резервна копија на која било MySQL, барање или табела во датотека со разграничени јазичиња. Повеќето од примерите на мрежата ги имаат колоните хард-кодирани.

Во мојот случај, сакав колоните да бидат динамични, па морав прво да ги вртам сите имиња на полињата на табелата за да го изградам редот на заглавието со имињата на колоните и потоа да ги вртам сите записи за преостанатите редови со податоци. Го поставив и заглавието така што прелистувачот ќе го иницира преземањето на датотеката во типот на датотека (txt) со името на датумот на датотеката и временскиот печат.

Ограничени јазичиња извоз од MySQL во 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();
?>

Ајде да одиме низ кодот чекор по чекор со објаснувања за секој дел:

<?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);
}
  • Го генерираме тековниот датум и време во формат „YmdHi“ и ги складираме во $today променлива.
  • Заглавјата на HTTP се поставени да специфицираат дека содржината треба да се третира како октет-стрим (бинарни податоци) и да активира преземање датотека со наведеното име на датотека.
  • Користејќи ја наставката, создаваме поврзување со базата на податоци MySQL, заменувајќи ги местата со вашите вистински акредитации за базата на податоци.
  • Проверуваме дали врската со базата е успешна. Ја прекинуваме скриптата и прикажуваме порака за грешка ако има грешка.
// 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";
  • Ние го дефинираме SQL барањето за да ги избереме сите податоци од mytable маса, нарачувајќи ја од страна на myorder колона.
  • Барањето се извршува, а резултатот е зачуван во $result променлива.
  • Проверуваме дали има вратени редови со испитување на num_rows својство на резултатот објект.
  • Ние ги користиме fetch_fields() да ги вратите имињата на полињата (колоните) и да ги складирате во $fields низа
  • Редот за заглавие за датотеката за извоз се подготвува со вртење низ имињата на полињата и нивно поврзување со јазичиња.
    // 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";
    }
  • Ние користиме а while јамка за преземање на секој ред со податоци од множеството резултати користејќи fetch_assoc().
  • Внатре во јамката, ги подготвуваме вредностите на секој ред со повторување низ полињата и собирање на соодветните податоци.
  • Вредностите за секој ред се поврзуваат со јазичиња за да се создаде ред разграничен со јазичиња, а овој ред се додава на $data променлива.
    // 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();
?>
  • Ако има пронајдени податоци (проверено со num_rows), ги повторуваме конкатенираните податоци, што е содржината на датотеката за извоз. Ова го активира преземањето на датотеката во прелистувачот на корисникот.
  • Ако не се најдат податоци, прикажуваме порака што покажува дека нема достапни податоци.
  • Ја затвораме врската со базата на податоци MySQL користејќи $conn->close() за ослободување ресурси.

Овој код ефикасно извезува податоци од табела со база на податоци MySQL во текстуална датотека разграничена со јазичиња и се справува со различни сценарија, како што се грешки во поврзувањето со базата на податоци и празни групи на резултати.

Вредности разделени со запирки Извезете од MySQL во PHP

Можам да го менувам кодот за да извезувам податоци како CSV-датотека. Еве го кодот, ажуриран за извоз на 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();
?>

Во овој изменет код:

  • Заглавјата за одговорот на HTTP се ажурираат за да наведат a text/csv тип на содржина, а името на датотеката има екстензија „.csv“.
  • Наместо рачно креирање на содржината CSV, ние го користиме fputcsv функција за излез на секој ред од резултатот MySQL поставен како CSV линија. Оваа функција се справува со форматирањето на CSV за вас, вклучувајќи ракување со специјални знаци и затворање полиња во двојни наводници кога е потребно.
  • Ја отвораме рачката на излезната датотека користејќи fopen со „php://output“ како име на датотеката. Ова ни овозможува да пишуваме директно на излезниот поток на одговор HTTP.
  • Кодот е структуриран така што ефикасно се справува со извозот на CSV и ја затвора рачката на датотеката кога ќе заврши.

Овој код ќе ги извезе податоците од табелата MySQL како CSV-датотека, со што ќе им олесни на корисниците да ги отвораат и работат во апликациите за табеларни пресметки како Excel. Не заборавајте да ги замените ингеренциите на базата на податоци со ваши.

Douglas Karr

Douglas Karr е основач на Martech Zone и признат експерт за дигитална трансформација. Даглас помогна во започнувањето на неколку успешни стартапи на MarTech, помогна во длабинската анализа на над 5 милијарди американски долари за аквизиции и инвестиции на Martech и продолжува да лансира свои платформи и услуги. Тој е ко-основач на Highbridge, консултантска фирма за дигитална трансформација. Даглас е исто така објавен автор на водич за Dummie и книга за бизнис лидерство.

поврзани написи

13 Коментари

    1. Претпоставувам дека можеш!

      Во овој случај, јас всушност градев врска „резервна копија“ во веб апликација, така што функционалноста на PHP е она што ми требаше. Сепак, никогаш не знаев дека можете да пишувате во датотека директно од изјавата на MySQL. Многу кул!

      Ви благодариме!

      1. Вашиот начин секако би бил најдобриот начин ако MySQL серверот е на оддалечена машина, бидејќи веројатно нема да може да пишува на машината каде што работи PHP 🙂

        Мило ми е да укажам на други насоки и нови работи сепак 🙂

  1. Одличен пост. Дали знаете за лесен, бесплатен/отворен код метод за увоз/враќање на датотека ограничена со јазичиња (како што штотуку ја создадовте) назад во mysql db?

    1. Грешка… mysqlimport?

      mysqlimport database_name --local backup.txt

      Или со командата SQL:

      LOAD DATA LOCAL INFILE 'backup.txt' INTO TABLE `my_table` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'

      Со mysqlimport, името на датотеката треба да одговара на името на табелата (само нешто на што треба да внимавате)

  2. Само што изгубив повеќе од 6 часа од мојот живот обидувајќи се да откријам зошто Internet Explorer 6/7 го применува типот на датотека „html“ и не ги прифаќа моите сопствени имиња на датотеки наведени во заглавијата.. а исто така не дозволува да се зачуваат датотеките. се обидуваат корисниците да преземаат текстуални датотеки создадени на сличен начин како погоре.

    Користев HTTPS и IE не ги кешира овие датотеки.

    Решението го најдов на коментар на Брендон К кај http://uk.php.net/header.

    Тој вели:

    -
    Само што изгубив шест часа од мојот живот обидувајќи се да го користам следниов метод за да испратам PDF-датотека преку PHP до Internet Explorer 6:

    Кога користите SSL, Internet Explorer ќе ве праша со дијалогот Отвори / Зачувај, но потоа вели „Датотеката е моментално недостапна или не може да се најде. Ве молиме обидете се повторно подоцна.” По многу пребарување, станав свесен за следната статија на MSKB со наслов „Преземањата на датотеките на Internet Explorer преку SSL не функционираат со заглавијата за контрола на кешот“ (KBID: 323308)

    PHP.INI стандардно користи поставка: session.cache_limiter = nocache што ги менува заглавјата Content-Cache и Pragma за да ги вклучат опциите за „nocache“. Можете да ја елиминирате грешката на IE со менување на „nocache“ во „јавно“ или „приватно“ во PHP.INI - Ова ќе го промени заглавието Content-Cache, како и целосно ќе го отстрани заглавието на Pragma. Ако не можете или не сакате да го измените PHP.INI за поправка на целата локација, можете да ги испратите следните две заглавија за да ги презапишете стандардните:

    Сè уште ќе треба да ги поставите заглавјата на содржината како што е наведено погоре за ова да функционира. Ве молиме имајте предвид дека овој проблем влијае САМО Internet Explorer, додека Firefox не го покажува ова неисправно однесување.
    -

    Па, барем изгуби само 6 часа...

  3. Ова функционира добро. Сепак, јас само добивам сè на една линија одделена со празно место. Се обидувам да го модифицирам за да испечатам сè на посебна линија вака:

    Колона1_име
    Поле 1_вредност
    Колона2_име
    Поле 1_вредност
    Колона3_име
    Поле 1_вредност

    Колона1_име
    Поле 2_вредност
    Колона2_име
    Поле 2_вредност
    Колона3_име
    Поле 2_вредност

    На пример:

    Име
    Мајк
    Локација
    работа
    Број
    1

    Име
    Тужи
    Локација
    Почетна
    Број
    2

    Име
    Џон
    Локација
    Патуваат
    Број
    10

    и така натаму. Дали оваа скрипта може да се измени за да се направи тоа?
    Ви благодариме!

    1. Сигурно може.

      Пробајте вакво нешто:

      ИЗБЕРЕТЕ * од MyTableName ВО OUTFILE „MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt“ ПОЛИЊА ПРЕКИНУВАНИ СО „\n“ ЛИНИИ ПРЕКИНУВАНИ СО „\n“;

      Ако сакате двоен простор (две празни линии) помеѓу групите за снимање, само кажете „ЛИНИИ ПРЕКИНУВАНИ СО „\n\n“; наместо тоа.

      Делот „POLYS TRAMINATED BY '\n“ е она што става нова линија после секој запис, наместо таб. Наместо тоа, табот ќе биде '\t'.

      Мараната!

  4. ова е пркосно одличен пост, го пробав и работев одлично, единственото нешто е што мојата txt-датотека има дополнителен ред над насловите на заглавието, а некои резултати се одделени во 2 реда, ова може да е предизвикано од податоците што ги имам во мојата база на податоци нема идеја, но ова е одлична помош за создавање на доводи…

  5. Здраво! Дали има некој од овде што може да ми даде совет за увоз на текстуална датотека во мојата база на податоци (phpmyAdmin) користејќи го мојот php како преден крај. Имам идеја за преземање датотека и отворање, мојот проблем е како можам да го добијам резултатот од редот и како да го вметнам во моите табели, благодарам

Што мислите?

Оваа страница користи Akismet за намалување на спам. Научете како се обработува вашиот коментар.

Затвори

Откриен е блок за рекламирање

Martech Zone може да ви ја обезбеди оваа содржина без трошоци бидејќи ја монетизираме нашата страница преку приходи од реклами, врски со партнери и спонзорства. Ќе ни биде благодарно ако го отстраните вашиот блокатор на реклами додека ја гледате нашата страница.