PHP Fputcsv заголовок не отображается - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь создать CSV в php с продуктами из magento, но мой заголовок не отображается в файле CSV, только продукты.

Если я помещу fputcsv для заголовков внутри в каждом случае отображается заголовок, затем один продукт, затем снова заголовок, другой продукт и т. д. ...

    ##### Print product data ####################################################

    $headings = ['category', 'manufacturer', 'productid', 'identifier', 'name', 'description', 'product_url', 'image_url', 'price','show_product', 'availability', 'delivery_cost'];
    $fh = fopen('php://output', 'w');

    ob_start();
    fputcsv($fh, $headings);

    foreach($ALL_PRODS as $productId) {

        // If we've sent this one, skip the rest - this is to ensure that we do not get duplicate products
        if (@$already_sent[$productId] == 1) continue;

        $PRODUCT = array();
        $PRODUCT = smfeed_get_product_details($productId);

        if ($PRODUCT['show_product'] == 1 ) {

        fputcsv($fh, $PRODUCT);

        $string = ob_get_clean();

        $filename = 'csv_' . date('Ymd') . '_' . date('His');

        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false);
        header("Content-Type: application/octet-stream");
        header("Content-Disposition: attachment; filename=\"$filename.csv\";");
        header("Content-Transfer-Encoding: binary");

            $prod_count ++;

            // Debuging
            if (isset($_GET['debug'])) {
                $cnt_prod ++;

                if (@$_GET['stats'] == "off") {
                }
                else {
                    echo $cnt_prod . "."; 
                    echo "\t" . number_format(microtime(true) - $time, 3) . "s \n"; 
                    $time = microtime(true);
                    echo "\t" . number_format(memory_get_usage()/1048576, 3) . "Mb\n";
                }

            }

            // Limit displayed products
            if ($limit > 0 && $prod_count >= $limit && !isset($_GET['pg'])) {

                // Debuging
                if (isset($_GET['debug'])) {
                    echo "\n" . $cnt_prod . "products displayed \n";
                    echo "\npage loaded in " . number_format(microtime(true) - $time_start, 3) . "s \n"; 
                    echo number_format(memory_get_usage()/1048576, 3) . "Mb\n";
                }
                exit;
            }

        }
        $already_sent[$productId] = 1;
    }
    exit($string);

1 Ответ

0 голосов
/ 10 января 2020

ob_start(); запускает буферизацию вывода.

Буфер содержит строку заголовка.

После завершения вывода первого продукта буферизация вывода заканчивается на ob_get_clean();

Поскольку $string = ob_get_clean(); присваивание вызывается в l oop, его содержимое перезаписывается значением false (так как буферизация была закончена ранее), поэтому final exit($string); ничего не выводит.

Существует много другие проблемы в вашем коде. Например, заголовки HTTP будут устанавливаться снова и снова для каждого элемента в l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...