Решил сделать своими руками скрипт выполняющий функцию экспорта данных в 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
например пробел перед <? или ошибка которая на прямую идет в оутпут.
просто гдето в твоем коде перед хедером существует 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?
И ещё вот эта строчка не понятна
Каким образом из всего этого должен получится документ в формате 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==""
согласен
тогда просто $value==""
Спустя 2 минуты, 52 секунды (2.06.2011 - 13:44) tatti написал(а):
dozent
а нужно именно самому или это от безысходности? если второе тогда стоит ознакомится с Navicat : How to import Excel, Access or XML data into MySQL database?
а нужно именно самому или это от безысходности? если второе тогда стоит ознакомится с Navicat : How to import Excel, Access or XML data into MySQL database?
Спустя 24 минуты, 42 секунды (2.06.2011 - 14:09) dozent написал(а):
Нашел решение . Решил проблему пере сохранив файл на utf8 without BOM. Вопрос закрыт всем thank's.
killer8080
killer8080
Цитата |
А я вообще не понял как этот скрипт может работать Каким образом из всего этого должен получится документ в формате Excel? И ещё вот эта строчка не понятна |
скрипт работает для, точнее разбивает по строкам и столбцам с кавычками (проще говоря), а в формат excel все это загоняют headers -ы.
tatti
Цитата |
а нужно именно самому или это от безысходности? если второе тогда стоит ознакомится с Navicat : How to import Excel, Access or XML data into MySQL database? |
Уточню бывший уже вопрос, нужно было из mysql в excel закинуть данные (предварительно выполнив запросы на несколько таблиц)
Спустя 1 час, 5 минут, 23 секунды (2.06.2011 - 15:14) killer8080 написал(а):
Цитата (dozent @ 2.06.2011 - 14:09) |
скрипт работает для, точнее разбивает по строкам и столбцам с кавычками (проще говоря), а в формат excel все это загоняют headers -ы. |
Хэдеры ничего никуда не загоняют, они лишь указывают браузеру что в контенте идут данные, которые нужно сохранить как файл с определённым именем. А Excel, как оказалось действительно может работать с такими типами файлов, но документами Excel они не являются, даже по умолчанию он сохраняет их с расширением txt.