Ошибка объекта класса DateTime при экспорте данных в Excel - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть таблица, которая содержит много столбцов. Некоторые столбцы содержат числовые значения, некоторые содержат текст, а некоторые содержат дату.

Когда я пытаюсь экспортировать данные в Excel, числовое значение и значение можно экспортировать, однако, когда я хочу экспортировать данные даты, он показывает мне эту ошибкуMsgstr "Объект класса DateTime не может быть преобразован в строку".

Моя функция экспорта работает таким образом, что пользователь может выбрать, какой столбец он хочет экспортировать из SQL, чтобы преуспеть через PHP. Мой столбец хранится в массиве. Ниже мой код:

   //Get list of selected column from selected checkboxes
    $colarray = $_GET['colarray'];

    //convert string to array 
    $string1 = ['[',']'];
    $string2 = ["",""];
    $newcolarray = str_replace($string1, $string2, $colarray);
    $newarray = explode(",",$newcolarray);

    $filename = "File name " . date('d-M-y') . ".csv"; // Create file name

    $f = fopen('php://memory', 'w');

//Insert column name in first row of excel
    fputcsv($f, $newarray);

    //dynamic Select query statement
    $query = "SELECT "; 
    $query .= $colarray;
    $query .= " FROM OVERALL_SUMMARY_ORIGINAL"; // Get data from Database from OVERALL_SUMMARY_ORIGINAL table
    $stmt = sqlsrv_query($conn, $query);

    while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){

/**how can i place this code $row['Date']->format('d M Y') here***/ 
        fputcsv($f, $row);

    }

    //move back to beginning of file
    fseek($f, 0);

    //set headers to download file rather than displayed
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="' . $filename . '";');

    //output all remaining data on a file pointer
    fpassthru($f);

Может кто-нибудь помочь, как я могу преобразовать мои данные даты в строку, так как мои столбцы хранятся в массиве для экспорта в CSV?

1 Ответ

0 голосов
/ 01 ноября 2019

С драйвером PHP для SQL Server вы можете извлекать объекты даты и времени PHP в виде строк или объектов DateTime, используя параметр 'ReturnDatesAsStrings' в строке подключения или на уровне оператора.

Если я правильно понимаю ваш случай, столбцы в выражении SQL являются динамическими. В этом случае вы можете попробовать использовать эту функцию на уровне выписки.

<?php

    ...
    $query = "SELECT "; 
    $query .= $colarray;
    $query .= " FROM OVERALL_SUMMARY_ORIGINAL"; // Get data from Database from OVERALL_SUMMARY_ORIGINAL table
    $options = array('ReturnDatesAsStrings' => true);
    $stmt = sqlsrv_query($conn, $query, array(), $options);
    if ($stmt === false) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }
    while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
        fputcsv($f, $row);
    }   
    ...

?>  

Другой вариант, конечно, - отформатировать объект PHP DateTime с использованием метода DateTime::format, но после проверки, что эти значения являются объектами PHP DateTime.

<?php

    ...
    $query = "SELECT "; 
    $query .= $colarray;
    $query .= " FROM OVERALL_SUMMARY_ORIGINAL"; // Get data from Database from OVERALL_SUMMARY_ORIGINAL table
    $stmt = sqlsrv_query($conn, $query);
    if ($stmt === false) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }
    while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
        foreach($row as $key => $value) {
            if ($value instanceof DateTime) {
                $row[$key] = $row[$key]->format('d M Y')
            }
        }
        fputcsv($f, $row);
    }   
    ...

?>
...