Помогите правильно создать и скачать файл

Valter

Новичок
Помогите правильно создать и скачать файл

Всем привет,
опыта работы с php почти нет поэтому мой вопрос возможно покажется очень простым, мне нужно при запуске скрипта получить нужные данные из БД и каким нить образом их вернуть, вот и все. Возможно файл для этого создавать и не нужно. собственно примерно мой скрипт
PHP:
   require_once('../core.php');
   require_once(config_get('core_path') . 'database_api.php');

   $t_filename = fopen("pvs_bt.csv", w);
   .......
   // тут запрос к БД, и кое какие манипуляции с полученными данными
   .......

   fwrite($t_filename, $something);

   fclose($t_filename);

   header('Pragma: public');
   header('Location: pvs_bt.csv');
   header('Content-Type: application/csv');
   header('Content-Disposition: attachment; filename = "pvs_bt.csv"');
Проблемы две

1) Если результат селекта большой, то со стороны сервера приходит ошибка Error 500 Internal server error, если же не большой то все нормально, это главная и основная проблема. Просил РНР выводить все ошибки - ничего не вывел....

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

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

Заранее спасибо
 

SiMM

Новичок
> Просил РНР выводить все ошибки - ничего не вывел...
Плохо просил. В логах сервера смотри.
 

Valter

Новичок
Сервер удаленный, как добраться до его логов я не знаю

-~{}~ 22.09.06 13:25:

Сейчас пробую сделать так:

PHP:
   require_once('../core.php'); 
   require_once(config_get('core_path') . 'database_api.php'); 

   ob_start();

   header( 'Pragma: public' );
   header( 'Content-Type: text/plain; name=pvs_bt.csv' );
   header( 'Content-Transfer-Encoding: BASE64;' );
   header( 'Content-Disposition: attachment; filename="pvs_bt.csv"');
   ....... 
   // тут запрос к БД, и кое какие манипуляции с полученными данными 
   .......
   // выпуливание результата 
   while ($row = db_fetch_array($t_result)){
      foreach ( $t_columns as $t_column ){
         echo $row[$t_column];  
      }
   }
    
   ob_end_flush();
Результат такой же, если из БД данных приходит не много, то все работает, если много, то Error 500 Internal server error. Наверняка я просто забыл заюзать какую нибудь функцию php-шную либо что то еще в этом духе. Мне нужно всего лишь создать файл для скачивания, не думаю что для php эта задача непосильна, пожалуйста, подскажите как это сделать, наверняка ведь многие с этим сталкивались, еще раз заранее благодарю за помощь
 

ngm

Новичок
Убери
PHP:
header('Location: pvs_bt.csv');
и в конце добавь
PHP:
fpassthru('pvs_bt.csv');
У тебя происходит редирект соответсвенно отсылаемые заголовки не имеют никакого значения. После редиректа броузер просто скачивает файл (статичный -- никакие скрипты не вып-ся).
 

Valter

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

ngm

Новичок
Ты не показал код работающий с бд
Код в студию!
И логи тоже постарайся показать.
Возможные причины:
memory_limit
max_execution_time

Пиши в файл построчно! Не держи все в памяти!
 

Valter

Новичок
PHP:
   $db_connection = mysql_connect('xxx', 'xxx', 'xxx');
   mysql_select_db('xxx', $db_connection);
    $t_result = mysql_query($db_query);

   // export the titles
   $fields_count = mysql_num_fields($t_result);
   for ($i = 0; $i < $fields_count; $i++){
      fwrite($t_filename, mysql_field_name($t_result, $i));
      if ($i < $fields_count - 1){
      	fwrite($t_filename, ";");
      }
   }
   fwrite($t_filename, "\r\n");

   while($row = mysql_fetch_assoc($t_result)){
      $fields_count = mysql_num_fields($t_result);
      for ($i = 0; $i < $fields_count; $i++){
         $t_column = mysql_field_name($t_result, $i);
         $str = "";

         switch ($t_column){
               // здоровенный свитч для того чтобы
               // эскейпить данные зависимости от типа
               // Строки могут быть очень большими 
         }
         fwrite($t_filename, $str);

         if ($i < $fields_count - 1){
            fwrite($t_filename, ";");
         }
         fwrite($t_filename, "\r\n");   
      }
   }
max_execution_time 50000
Логов показать не могу, у меня их нет
 
Сверху