Как загрузить файл CSV с помощью PHP

#php #sql #csv #download #web-development-server

#php #sql #csv #Скачать #веб-разработка-сервер

Вопрос:

Цель моего кода — загрузить файл CSV, созданный из моей базы данных. Однако вместо загружаемого файла на веб-странице отображается его содержимое. Кроме того, когда я перемещаю функцию загрузки в свой цикл for, она загружает файл CSV, но я не могу получить доступ к веб-странице. Вот весь код:

 <html>
    <style>
        table, th, td{
            padding: 10px;
            border: 1px solid black;
            border-collapse: collapse;
        }
        table, .center{
            text-align: center;
            margin-left: auto;
            margin-right: auto;
        }
    </style>

    <?php

    function array_to_csv_download($array, $filename = "export.csv", $delimiter = ",") {
        // open the "output" stream
        // see http://www.php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq
        header("Content-disposition: attachment; filename=test.csv");
        header("Content-Type: text/csv");

        ob_clean();
        flush();
        $f = fopen('php://output', 'w');
        foreach ($array as $line) {
            fputcsv($f, $line, $delimiter);
        }
        readfile($f);
        ob_end_clean();
    }

    mysql_connect("localhost", "root", "");
    mysql_select_db("gograb");
    $filename = $_FILES["file"]["tmp_name"];
    echo "<table id='center'>"
    . "<tr>"
    . "<th>"
    . "Number"
    . "</th>"
    . "<th>"
    . "Brand"
    . "</th>"
    . "<th>"
    . "Item Name"
    . "</th>"
    . "<th>"
    . "Description"
    . "</th>"
    . "<th>"
    . "Weight"
    . "</th>"
    . "<th>"
    . "Variant1 Name"
    . "</th>"
    . "<th>"
    . "Variant1 Value"
    . "</th>"
    . "<th>"
    . "Variant2 Name"
    . "</th>"
    . "<th>"
    . "Variant2 Value"
    . "</th>"
    . "<th>"
    . "Price"
    . "</th>"
    . "<th>"
    . "Barcode"
    . "</th>"
    . "<th>"
    . "Department"
    . "</th>"
    . "<th>"
    . "Collections"
    . "</th>"
    . "<th>"
    . "Type"
    . "</th>"
    . "<th>"
    . "Tag"
    . "</th>"
    . "<th>"
    . "Image URL"
    . "</th>"
    . "</tr>";
    if ($_POST["action"] == "Find Duplicate") {
        if (($h = fopen("{$filename}", "r")) !== FALSE) {
            $skip_var = 1;
            while (($data = fgetcsv($h, 30000, ",")) !== FALSE) {
                if ($skip_var == 1) {
                    $skip_var  = 1;
                    continue;
                }
                echo "<tr>";
                $select = "SELECT * FROM global_catalog where Barcode='$data[10]'";
                $query = mysql_query($select);
                if (mysql_num_rows($query) > 0) {
                    $row = mysql_fetch_assoc($query);
                    foreach ($data as $field => $value) {
                        echo "<td>" . $value . "</td>";
                    }
                    echo "</tr>";
                }
                $big_array[] = $data;
                
            }
        }
        array_to_csv_download($big_array);
    }
    $counter = 0;
    if ($_POST["action"] == "Find New") {
        if (($h = fopen("{$filename}", "r")) !== FALSE) {
            $skip_var = 1;
            while (($data = fgetcsv($h, 30000, ",")) !== FALSE) {
                if ($skip_var == 1) {
                    $skip_var  = 1;
                    continue;
                }
                echo "<tr>";
                $select = "SELECT * FROM global_catalog where Barcode='$data[10]'";
                $query = mysql_query($select);
                if (mysql_num_rows($query) == 0) {
                    $counter =1;
                    $row = mysql_fetch_assoc($query);
                    foreach ($data as $field => $value) {
                        echo "<td>" . $value . "</td>";
                    }
                    echo "</tr>";
                }
            }
            fclose($h);
        }
    }
    echo "</table>";
    ?>
</html>


  

Ответ №1:

В верхней части вашей страницы выводится HTML, что предотвратит отправку заголовков.

Вы должны переместить весь if ($_POST["action"] == "Find Duplicate") { ... } блок в самый верх вашей страницы и добавить вызов exit(); в конце array_to_csv_download() функции.