За последние 24 часа нас посетили 16649 программистов и 1681 робот. Сейчас ищут 837 программистов ...

Помогите с редирект header Location

Тема в разделе "PHP для новичков", создана пользователем vzun, 12 мар 2014.

  1. vzun

    vzun Новичок

    С нами с:
    10 мар 2014
    Сообщения:
    9
    Симпатии:
    0
    Всем доброй ночи.

    Недавно начал изучать PHP и при решении задачи столкнулся с проблемой насчёт header.

    Вопрос в следующем:

    Форма для закачки фото скачивает картинки в папку 'img' и записывает данные в БД. После чего перенаправляет на эту же страницу.
    Если не делать перенаправление то при перезагрузке страницы F5 данные из формы повторно загружаются в БД.

    Проблема в том что header ("Location: index.php/") не срабатывает.
    Мануал читал но без работающего примера так и не смог понять что делать с этим header_ом где он должен размещаться чтобы после после перезагрузки страницы старые данные снова НЕ отправлялись в БД.

    Код (Text):
    1.  
    2. <?php
    3. header("Content-type: text/html; charset=utf-8");
    4. include_once ("php/start.php");
    5. start_up();
    6.  
    7. function up_file($ft)
    8.     {if(isset($ft) && isset($_POST['lod']))
    9.         {
    10.         $a=$ft['name'];
    11.         $x='img/'.$ft['name'];
    12.         copy($ft['tmp_name'], $x);
    13.         mysql_query ("INSERT INTO fot (id_ft, name, view) VALUES ('', '$a', '')");
    14.         header ('Location: index.php')
    15.         }
    16.  
    17.     elseif (!isset($ft))
    18.         {
    19.         $arr=scandir('img');                                                                   
    20.         for($i=2; $arr[$i] != null ;$i++)                                          
    21.             {echo "<a href=foto.php?size=$arr[$i]><img src=img/$arr[$i] /></a>";}
    22.         }
    23.     }
    собственно форма:
    Код (Text):
    1.  
    2. <body>
    3.    
    4.     <form method="post" enctype="multipart/form-data">
    5.         <input type="file" name="foto"/>
    6.         <input type="submit" name="lod" value="Загрузить" />
    7.     </form>
    8.     <br>
    9.     <?php up_file($_FILES['foto']);?>
    10.    
    11. </body>
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    1) Слэш долой из хедера.
    2) В самом начале кода поставьте ob_start();
    3) В точке, где заканчивается выполнение, поставьте ob_end_flush();
    4)...
    5)Летс мэджик бегинс!!!!
     
  3. vzun

    vzun Новичок

    С нами с:
    10 мар 2014
    Сообщения:
    9
    Симпатии:
    0
    Fell-x27 спасибо большое. Всё заработало, теперь буду сидеть разбираться.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Раскрываю секрет фокуса:
    1) Слэш означает директорию. Если указать "file.php/", это значит, что вы указываете путь к папке с именем "file.php". Есть такая папка? Ноуп. Редирект не сработает.
    2) ob_start() говорит, что с момента вызова этой функции, php включит сбор всей исходящей инфы в буфер вывода, а не будет сразу отдавать клиенту. Соль в том, что это помогает избежать ошибку, при которой хедеры, отправленные после любого текста, вызывают ошибку. Буфер вывода сортирует входящие данные, и все хедеры ставит в начало ответа. Таким образом, мы можем отдавать заголовки ситуационно, по ходу пьесы, не парясь, что они идут не в начале вывода. И это как раз ваша ситуация.
    3) Буфер открыли, он собирает все в память, а, чтобы он отдал, мы его просим это сделать, через вызов функции ob_end_flush(); Это значит, что пхп должен перестать писать в буфер и отдать его содержимое клиенту. На самом деле, если у вас используется всего один буфер вывода, то ob_end_flush() писать не обязательно. ПХП сам догадается, что по окончании работы скрипта, надо бы отдать результаты.

    Да, как можно понять из пункта 3, буферов может быть несколько. Они могут быть вложены один в другой как матрешки. И для работы с ними предусмотрено больше двух функций. Советую почитать отдельно.
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Вродебы по стандартам в header Location должен быть абсолютный путь, хотя браузеры терпят всякое.
    http://en.wikipedia.org/wiki/HTTP_location

    но если внимательно почитать доки, то даже там где упоминается "относительный" путь, это protocol-relative URL. то есть типа
    //domain.com/path/to/page

    вобщем писать 'Location: index.php' это искать приключений на свою задницу. как с любым недокументированным поведением. безопасно делать
    Код (PHP):
    1. header('Location: http://example.com/site-root/index.php'); 
    2. exit(); 
    не забываем про exit(), мать его так!
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Эт да. Вообще в плане работы со ссылками всегда лучше юзать абсолютные пути. Мороки с ними никакой нет, а профита вагон.
    мне больше нравится die, хоть это одно и то же. Но ставить его надо только если переадресация подразумевает точку остановки работы скрипта. А то автор подумает, что так всегда надо делать. Когда работаешь через буфер вывода, отправка такого хедера не подразумевает прерывание и "вся остальная работа пойдет вхолостую". Если логика подразумевает какие-то действия, пусть они делаются.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    exit или die — так всегда надо делать! ))) а то автор подумает, что header location это команда по которой управление передается на другую страницу.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет, не надо так делать всегда. И пренебрегать не надо. Надо сделать то, что сделал я - объяснить автору причину подобного решения в коде. А что ему нужно - пусть сам решает.

    Если не глупый, то или прочитает, или уже знает о том, что делает функция header(), и как эти хедеры работают.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Fell-x27, ты молодец.

    автор, читай внимательно что он пишет! и, между прочим, не забывай ставить exit.
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    там, где это нужно.
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    то есть всякий раз. потому что ты этого достоин (лол)