2014-02-10 3 views
0

Я пытаюсь создать файл csv с выбранными строками из базы данных mssql. Экспорт работает, но форматирование неверно.MSSQL Выбрать экспорт в CSV

PHP:

require_once("config/config.php"); 

$connectionInfo = array("Database"=>DB_DB, "UID"=>DB_USER, "PWD"=>DB_PASSWORD); 
$conn = sqlsrv_connect(DB_HOST, $connectionInfo); 

if ($conn === false) { 
    die (print_r(sqlsrv_errors(), true)); 
} 

$sql = "SELECT * FROM [RC.Appointments]"; 
$result = sqlsrv_query($conn, $sql); 

if (!$result) die ('Couldn\'t fetch records'); 

$headers = array(); 

foreach (sqlsrv_field_metadata($result) as $fieldMetadata) { 
    $headers[] = $fieldMetadata['Name']; 
} 

$fp = fopen('php://output', 'w'); 
if ($fp && $result) { 
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="export.csv"'); 
    header('Pragma: no-cache'); 
    header('Expires: 0'); 
    fputcsv($fp, $headers); 
    while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_NUMERIC)) { 
     fputcsv($fp, array_values($row)); 
    } 
    die; 
} 

не знаю, почему нет никаких заголовков и мне нужно отделить данные по столбцам. Проблема связана с отсутствующими заголовками?

выход в sublimetext

appointment_id,terminname,datum 
151,"Bitte Terminnamen vergeben",18.02.2014 
152,"Bitte Terminnamen vergeben",19.02.2014 
153,"Bitte Terminnamen vergeben",20.02.2014 
154,"Bitte Terminnamen vergeben",25.02.2014 
155,"Bitte Terminnamen vergeben",26.02.2014 
156,"Bitte Terminnamen vergeben",27.02.2014 
157,"Bitte Terminnamen vergeben",31.12.2014 
+0

, пожалуйста, откройте выход редактором (блокнот) и опубликуйте чистый результат здесь, а не Excel, потому что Excel не отображает весь контент должным образом (это попытка alwa импорт на лету) –

+0

обновленный вопрос – mnlfischer

ответ

2

Как со второго выхода с sublimetext, то $headers массив не содержит ничего.

Необходимо проверить заявление $headers[] = sqlsrv_get_field($result , $i);.

Как это, кроме того, демпинг массив вместо того, чтобы напечатать его, я хотел бы попробовать: fputcsv($fp, array_values($headers));

Для того, чтобы получить это истолковано Excel правильно, изменить разделитель ;: fputcsv($fp, array_values($headers), ';');

+0

okay понял, что единственный способ получить имена столбцов с помощью field_metadata. Обновлен мой вопрос с текущим выходом. Когда я добавляю fputcsv ($ fp, array_values ​​($ headers), ';'); Я получаю тот же результат, но значение всегда является заголовком. – mnlfischer

+0

oaky это работает с ';' Seperator! благодаря ! – mnlfischer

0

Проблема заключается в том, что sqlsrv_get_field() возвращает данные в текущем поле, а не имя, и его нужно настроить для использования правильного индекса, вызывая sqlsrv_fetch(). Но это не то, что вы хотите сделать. Что вам нужно сделать, это получить заголовки, которые можно сделать так:

foreach(sqlsrv_field_metadata($result) as $fieldMetadata) 
{ 
    $headers[] = $fieldMetadata['Name']; 
} 

и, как уже указывалось Алексом правильный способ, чтобы написать заголовки в файл CSV является:

fputcsv($fp, array_values($headers)); 

Теперь, когда файл отображается в Excel, вы можете импортировать файл с помощью мастера импорта текста. here