Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как сохранить информацию из базы на компьютере?
 
 автор: Владимир55   (15.05.2013 в 17:22)   письмо автору
 
 

Информация во всплывающую форму подгружается из JSON. Оператор выбирает таблицу, которую требуется сохранить на компьютере, и эти данные поступают в файл SERVER, на котором считывается из базы содержимое соответствующей таблицы (производитель, артикул, название, цена и количество). Все эти данные необходимо сохранить на компьютере в виде CSV файла. А вот как это сделать, я не знаю…

  Ответить  
 
 автор: confirm   (15.05.2013 в 17:54)   письмо автору
 
   для: Владимир55   (15.05.2013 в 17:22)
 

Как обычно - скачивать и сохранять.

  Ответить  
 
 автор: Владимир55   (15.05.2013 в 18:03)   письмо автору
 
   для: confirm   (15.05.2013 в 17:54)
 

А обычно - как это делается?

  Ответить  
 
 автор: confirm   (15.05.2013 в 18:16)   письмо автору
 
   для: Владимир55   (15.05.2013 в 18:03)
 

Обычно, это отдается файл посредством скрипта, либо просто ссылкой на него. Но судя по вашему описанию, то что готовится по запросу не сохраняется в файл, но это не важно, отдать можно не файл, а поток, а можно и содержимое буфера:
<?
ob_start
();
//здесь код создания csv-данных
$csv ob_get_contents(); //это содержимое буфера (подготовленные csv-данные) присваиваются переменной
ob_end_clean();
//здесь код выдачи данных пользователю
//где в качестве данных выступает $csv

  Ответить  
 
 автор: Владимир55   (15.05.2013 в 18:27)   письмо автору
 
   для: confirm   (15.05.2013 в 18:16)
 

то что готовится по запросу не сохраняется в файл

Да, без крайней необходимости не хотелось бы этого делать.

Нюанс еще и в том, что header работать не будет, поскольку уже использована всплывающая форма. Так что типовой прием не будет работать (как я предполагаю).

<? 

header
('Content-type: application/csv'); 
header('Content-Disposition: attachment; filename=my_file.csv');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.strlen($content));
echo 
$content;

  Ответить  
 
 автор: confirm   (15.05.2013 в 18:34)   письмо автору
 
   для: Владимир55   (15.05.2013 в 18:27)
 

Все будет, если разместить все на своих местах. Например, ваш файл который выдает что-то и передает заголовки какие либо:
<?
if($_GET['file']) { //или POST, что в сущности не важно, является запросом на файл
   //тут код подготовки данных и выдачи его
   
exit; //с обязательным прекращением работы скрипта  
}
//а здесь основной код, где вы можете работать с заголовками сколь угодно
//так как выдача файла в самом начале, и основного кода не касается

PS. header('Content-Disposition: attachment; filename=my_file.csv'); - если речь идет о выдачи не файла, а данных, то не my_file.csv должно быть, а переменная содержащая данные. (Хотя это имеется ввиду имя для сохранения, а остальное вы уяснили, тогда все верно)

  Ответить  
 
 автор: Владимир55   (16.05.2013 в 11:40)   письмо автору
 
   для: confirm   (15.05.2013 в 18:34)
 

>Все будет, если разместить все на своих местах.

На практике получается вот что.
<?php
    
// ЭКСПОРТ
    
if ($module == "export")
    {
        
$gruppa    $_POST['gruppa'];      // Название таблицы. В данном примере не используем.
        
$myfile $_POST['file_export']; // Имя файла для вывода

        
$myCsvFile "Вова;Петя";        // Эквивалент полученной из базы инфы

        
header("Content-Description: File Transfer\r\n");
        
header("Pragma: public\r\n");
        
header("Expires: 0\r\n");
        
header("Cache-Control: must-revalidate, post-check=0, pre-check=0\r\n");
        
header("Cache-Control: public\r\n");
        
header("Content-Type: text/plain; charset=UTF-8\r\n");
        
header("Content-Disposition: attachment; filename=\"$myfile.csv\"\r\n");
        echo 
$myCsvFile;
        exit;

        
// Переадресация при успешном сохранении
        
$success_href = (empty($_POST['success_href'])) ? 'server.php' $_POST['success_href'];
        echo 
'<script id="success">location.href="'.$success_href.'";</script>';

    }

Естесственно, что в результате просто выводится "Вова Петя". Если же закомментировать exit, то форма просто закрывается и никакого вывода тоже нет.

  Ответить  
 
 автор: confirm   (16.05.2013 в 12:08)   письмо автору
 
   для: Владимир55   (16.05.2013 в 11:40)
 

Вы не поняли о чем я вам рассказывал, или я не понимаю, о чем вы сейчас говорите.

На самом деле все просто. Допустим:

//это код страницы, где в начале есть вывод, или передача заголовка
<html>
<head>
....
<?
//какой-то код, и 
if(isset($_GET['file])) {
  //в этом месте встроен код отдачи файла скриптом
  //который предполагает передачу и заголовков
}
Конечно же при такой структуре кода у вас ничего не получится, так как уже был вывод в браузер, что не позволит передать заголовки отдаваемого файла, и к тому же, это означает, что страница будет перезагружена.

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

Второе решение (зачастую применяемое), это запрос на выдачу файла другим, отдельным скриптом.

  Ответить  
 
 автор: Владимир55   (16.05.2013 в 12:33)   письмо автору
 
   для: confirm   (16.05.2013 в 12:08)
 

>
>Второе решение (зачастую применяемое), это запрос на выдачу файла другим, отдельным скриптом.


Это я понимаю, и если не получится реализация задуманного, то придется перейти на второй вариант. Но только в том случае, если первый вариант действительно не имеет решения. А алгоритм у него такой.

На главной странице имеется ссылка "Экспорт". При клике на нее появляется всплывающая форма, на которой выбирается скачиваемая таблица (и имя создаваемого файла, но это не обязательно). Инфа в форму подгужается из json.php, а результат выбора поступает в файл server.php, где и формирутся информация для скачивания.

При этом всплывающая форма остается открытой.

Чтобы закрыть всплывающую форму, в файле server.php нужно выполнить:
// Переадресация при успешном сохранении 
        $success_href = (empty($_POST['success_href'])) ? 'server.php' : $_POST['success_href']; 
        echo '<script id="success">location.href="'.$success_href.'";</script>';


Вместе с тем, насколько я понимаю, для сохранения файла на компе надо предоставить пользователю другую, специальную форму для согласия на закачку файла. И получается, что, по любому, форм должно быть две? Всплывающая форма должна закрываться и при этом автоматически должна появляться другая форма для одобрения скачивания?
Таков должен быть алгоритм?
Это технически реализуемо?

(Поиск по сети показал, что в решении проблемы сохранения файла на компе при использовании всплываюшей формы я не одинок - это, действительно, проблема.)

  Ответить  
 
 автор: confirm   (16.05.2013 в 12:59)   письмо автору
 
   для: Владимир55   (16.05.2013 в 12:33)
 

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

Я вообще не сторонник иметь кучу скриптов для того, чтобы решать задачу, то есть к чему данные для формы грузить из одного файла, а решения по этой форме принимать в другом?
К тому же, зачем держать форму открытой дожидаясь чего-то, если ее всегда можно открыть вновь? Если это следствие того, что необходимо будет заново что-то в нее впечатывать, ну так есть и cookie, и localStorage, можно и запомнить.

Для скачивания файла совсем не нужно открывать некую другую форму, так как вы ее уже запросили первой - достаточно ответа сервера, что файл подготовлен, и даже автоматом направить запрос на загрузку (посредством JS на основе ответа сервера).

  Ответить  
 
 автор: Владимир55   (16.05.2013 в 13:08)   письмо автору
 
   для: confirm   (16.05.2013 в 12:59)
 

Спасибо, проблема решена.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования