PHP: запись в файл CSV, когда заголовки потоков находятся в функции

Я пытаюсь записать запрос SQL в файл CSV на PHP. У меня была эта работа, благодаря некоторому совету [в предыдущем вопросе][1]. Однако я пытаюсь уменьшить количество повторений в моем коде, что возможно из предыдущего примера.

Я создаю заголовки / потоковую оболочку в функции здесь:

function csvCreate($filename){
    header("Cache=Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Description: File Transfer');
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename={$filename}");
    header("Expires: 0");
    header("Pragma: public");
    $fh = @fopen( 'php://output', 'w' );
}

Затем я вызываю функцию в условном выражении и передаю $filename в качестве параметра здесь:

if(isset($_POST["Submit"]) && ($_POST['Weight'] == 'Weight'))
{
    //csvCreate->$fileName .= 'OutputWeightNull.csv';
    csvCreate('OutputWeightNull.csv');
    $query = mysqli_query($conn, 'SELECT * FROM  `bfi_product_volumne_data` WHERE weight = 0 OR weight IS NULL') or die(mysqli_error($conn));
    if ($result = mysqli_fetch_array($query,MYSQLI_ASSOC))
    {
        fputcsv($fh, array_keys($result));
        fputcsv($fh, $result);
        while ($result = mysqli_fetch_array($query,MYSQLI_ASSOC))
        {
            fputcsv($fh, $result);
        }
    }
}

Проблема в том, что данные не записываются в CSV. Я чувствую, что мне нужно указать вызов функции fputcsv. Я попытался сделать это с помощью 'csvCreate->fputcsv', который не работает. Может ли кто-нибудь предложить, в чем проблема может быть здесь. Спасибо

  [1]: http://stackru.com/questions/33433737/php-writing-a-mysql-query-to-cs

1 ответ

Решение

Проблема в том, что вы создаете указатель файла $fh внутри функции. Таким образом, он виден только внутри функции, а не снаружи функции (как это было, вероятно, до того, как вы поместили код в функцию). Вам нужно передать эту переменную из функции во внешний мир. Это может быть сделано с return, Затем во "внешнем" мире вам нужно присвоить это возвращаемое значение переменной во "внешней" области и использовать ее.

Вам нужно пройти $fh вне функции. Т.е.

function csvCreate($filename){
    // .. rest of the code
    $fh = @fopen( 'php://output', 'w' );
    return $fh;
}

затем в коде, где вы пишете для вывода, выполните следующие действия $fh видно в этом объеме.

// .. rest of the code
$fh = csvCreate('OutputWeightNull.csv');
// .. rest of the code
Другие вопросы по тегам