[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Экспорт данных из MySQL в Excel
dozent
Всем привет!

Решил сделать своими руками скрипт выполняющий функцию экспорта данных в Ms Ecxel. Написал код, но при выполнении скрипта программа ругается, что headers уже отправлены. Код приведен ниже:


$field_1 = $_POST['field1'];
$field_2 = $_POST['field2'];
$tbl = $_POST['ex_option'];

if ($tbl == 'tasks') {
$query = "SELECT to_date, task, reg_time, creator FROM `to-do_tasks` WHERE to_date BETWEEN '".$field_1."' AND '".$field_1."' ORDER BY to_date";
}elseif ($tbl == 'complete') {
$query = "SELECT do_date, s1.task, status, comments FROM `completed`, `to-do_tasks` s1 WHERE to_date BETWEEN '".$field_1."' AND '".$field_1."' AND task_id=s1.task_id ORDER BY to_date";
}elseif ($tbl == 'all') {
$query = "SELECT s1.site, s2.to_date, do_date FROM `sites` s1, `to-do_tasks` s2, `completed` WHERE s2.reg_time BETWEEN '".$field_1."' AND '".$field_1."' AND s2.task_id=s1.task_id ORDER BY to_date";
}

$export = mysql_query($query) or die ("Sql error: ". mysql_error());
$fields=mysql_num_fields($export);
for ($i=0; $i<$fields; $i++) {
$header .= mysql_field_name($export, $i). "\t";
}
while($row=mysql_fetch_row($export)) {
$line='';
foreach($row as $value) {
if ((!isset($value)) || ($value=="" )) {
$value="\t";
}
else {
$value=str_replace('"','""' ,$value);
$value='"' . $value . '"' . "\t";
}
$line .=$value;
}
$data .=trim($line) . "\n";
}
$data=str_replace("\r", "", $data);
if ($data == "") {
$data = "\n(0) Records Found!\n";
}

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=export.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data";?>



Строка ошибки: Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\Vertrigo...)



Спустя 1 час, 39 минут, 56 секунд (1.06.2011 - 15:27) SlavaFr написал(а):
эта проблема не для знатаков.
просто гдето в твоем коде перед хедером существует output
например пробел перед <? или ошибка которая на прямую идет в оутпут.

Спустя 16 минут, 34 секунды (1.06.2011 - 15:44) Michael написал(а):
$data .=trim($line) . "\n";

первый раз тут встречается $data, будет нотис, и дальше - как сказал SlavaFr
Нужно инициализировать переменную перед использованием(перед циклом)
$data = '';

p.s. тему перенес в "PHP для начинающих". Старайтесь в будущем сами в соответствующих разделах создавать темы

Спустя 14 часов, 32 минуты, 29 секунд (2.06.2011 - 06:16) dozent написал(а):
SlavaFr

Цитата

...просто гдето в твоем коде перед хедером существует output
например пробел перед <? или ошибка которая на прямую идет в оутпут


Заново перебрал и перепроверил весь листинг кода, никаких пробелов не обнаружил перед <?

Спустя 3 часа, 5 минут, 4 секунды (2.06.2011 - 09:21) Michael написал(а):
а ошибку исправил?

Спустя 3 часа, 38 минут, 27 секунд (2.06.2011 - 13:00) dozent написал(а):
Michael

Цитата
а ошибку исправил?


да исправил добавив

$data = "";
$header = "";


но все равно те же ошибки (Warning: Cannot modify headers...) выдает в строках
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=export.xls");
header("Pragma: no-cache");
header("Expires: 0");

Спустя 17 минут, 39 секунд (2.06.2011 - 13:17) killer8080 написал(а):
А я вообще не понял как этот скрипт может работать :blink:
Каким образом из всего этого должен получится документ в формате Excel?
И ещё вот эта строчка не понятна
Цитата (dozent @ 1.06.2011 - 13:47)

...
foreach($row as $value) {
if ((!isset($value)) || ($value=="" )) {
...

условие !isset($value) никогда не сработает по определению, переменная $value всегда будет установлена, тут нужно было по другому проверять её содержимое
...
foreach($row as $value) {
if (empty($value)) {
...

Спустя 2 минуты, 20 секунд (2.06.2011 - 13:20) waldicom написал(а):
Цитата (killer8080 @ 2.06.2011 - 11:17)
if (empty($value)) {

В данном случае не есть хорошо, так как empty "сработает" даже если в строке будет 0 или "0", что, скорее всего, не нужно автору топика

Спустя 21 минута, 47 секунд (2.06.2011 - 13:42) killer8080 написал(а):
waldicom
согласен
тогда просто $value==""

Спустя 2 минуты, 52 секунды (2.06.2011 - 13:44) tatti написал(а):
dozent
а нужно именно самому или это от безысходности? если второе тогда стоит ознакомится с Navicat : How to import Excel, Access or XML data into MySQL database?

Спустя 24 минуты, 42 секунды (2.06.2011 - 14:09) dozent написал(а):
Нашел решение biggrin.gif. Решил проблему пере сохранив файл на utf8 without BOM. Вопрос закрыт всем thank's.

killer8080

Цитата
А я вообще не понял как этот скрипт может работать blink.gif
Каким образом из всего этого должен получится документ в формате Excel?
И ещё вот эта строчка не понятна

скрипт работает для, точнее разбивает по строкам и столбцам с кавычками (проще говоря), а в формат excel все это загоняют headers -ы.

tatti

Цитата
а нужно именно самому или это от безысходности? если второе тогда стоит ознакомится с Navicat : How to import Excel, Access or XML data into MySQL database?


Уточню бывший уже вопрос, нужно было из mysql в excel закинуть данные (предварительно выполнив запросы на несколько таблиц) smile.gif

Спустя 1 час, 5 минут, 23 секунды (2.06.2011 - 15:14) killer8080 написал(а):
Цитата (dozent @ 2.06.2011 - 14:09)
скрипт работает для, точнее разбивает по строкам и столбцам с кавычками (проще говоря), а в формат excel все это загоняют headers -ы.

Хэдеры ничего никуда не загоняют, они лишь указывают браузеру что в контенте идут данные, которые нужно сохранить как файл с определённым именем. А Excel, как оказалось действительно может работать с такими типами файлов, но документами Excel они не являются, даже по умолчанию он сохраняет их с расширением txt.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.