За последние 24 часа нас посетили 33979 программистов и 1709 роботов. Сейчас ищут 796 программистов ...

Вопрос по header('Location...)

Тема в разделе "PHP для новичков", создана пользователем Атм_Евгений, 22 авг 2017.

  1. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Здравствуйте! У меня такая проблема, есть код:

    Код (Text):
    1. if (...) {
    2. header ('Location: /error.php')
    3. }
    4. else {
    5. header ('Location: /index.php')
    6. }
    При любом раскладе срабатывает только последний header. Почему так? Нельзя в коде иметь более 1 header Location?
     
  2. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    попробуй добавить exit сразу после своих хедеров
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    ну или проблема в условии - которое всегда верно
     
  4. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Какое условие? Скинь подробней код.
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Danil005, так ведь он хочет код, поподробнее))
     
  6. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Обработчик:

    Код (Text):
    1. <?php
    2. include './func/func_processor.php';
    3. if (isset($_POST)) {
    4.     $data = $_POST;
    5.     $connect = mysqli_connect('localhost', 'user', '12345', 'conspekt');
    6.     mysqli_query($connect, 'SET NAMES utf8');
    7.     $table = ['a1', 'b2', 'c3', 'd4', 'e5', 'f6', 'g7', 'h8', 'i9', 'j10', 'k11', 'l12', 'm13', 'n14'];
    8.     if (array_key_exists('saveAll', $data)) { // ищет в массиве указанное значение - Записать все
    9.         save_all($data, $table, $connect);
    10.     }
    11.     elseif (array_key_exists('subUp', $data)) { // ищет в массиве указанное значение - Добавить строки в самом верху
    12.         sub_up($data, $table, $connect);
    13.     }
    14.     elseif (array_key_exists('subStr', $data)) { // ищет в массиве указанное значение - Добавить строки ниже
    15.         sub_str($data, $table, $connect);
    16.     }
    17.     elseif (array_key_exists('subDel', $data)) { // ищет в массиве указанное значение - Удаление строки
    18.         sub_del($data, $table, $connect);
    19.     }
    20.     elseif (array_key_exists('subBlock', $data)) { // ищет в массиве указанное значение - Вставка блока в строку
    21.         sub_block($data, $table, $connect);
    22.     }
    23.     elseif (array_key_exists('subString', $data)) { // ищет в массиве указанное значение - Запись строки
    24.         sub_string($data, $table, $connect);
    25.     }
    26.     mysqli_close($connect); // Закрывает соединение
    27.    header('Location: ./index.php);
    28. }
    29. else {
    30.     header('Location: ./error.php?err=3'); // Ошибка - отсутствие массива POST
    31. }
    32. ?>
    func_processor.php:
    Код (Text):
    1. <?php
    2. function save_all($data, $table, $connect) { // Записать все
    3.     $result = mysqli_query($connect, "DELETE FROM html_form");
    4.     if ($result == true) {
    5.         $i = 1;
    6.         while (array_key_exists('id'.$i, $data)) {
    7.             foreach ($table as $key => $el) {
    8.                 $code = $i.$el.'opt';
    9.                 if (array_key_exists($code, $data)) {
    10.                     if ($data[$code] == '00') {
    11.                         $$el = '';
    12.                     }
    13.                     elseif ($data[$code] == '01' || $data[$code] == '02' || $data[$code] == '03' || $data[$code] == '04' || $data[$code] == '05' ||
    14.                     $data[$code] == '06' || $data[$code] == '07' || $data[$code] == '08' || $data[$code] == '09') {
    15.                         $text = $i.$el;
    16.                         $$el = $data[$code].htmlspecialchars($data[$text], ENT_QUOTES);
    17.                     }
    18.                     elseif ($data[$code] == '10' || $data[$code] == '14') {
    19.                         $text = $i.$el;
    20.                         $$el = $data[$code].$data[$text];
    21.                     }
    22.                     elseif ($data[$code] == '11' || $data[$code] == '12' || $data[$code] == '13') {
    23.                         $$el = $data[$code];
    24.                     }
    25.                     else {
    26.                         $$el = '';
    27.                     }
    28.                 }  
    29.                 else {
    30.                     $$el = '';
    31.                 }
    32.             }
    33.             $result = mysqli_query($connect, "INSERT INTO html_form (id,a1,b2,c3,d4,e5,f6,g7,h8,i9,j10,k11,l12,m13,n14)
    34.             VALUES ('$i','$a1','$b2','$c3','$d4','$e5','$f6','$g7','$h8','$i9','$j10','$k11','$l12','$m13','$n14')");
    35.             $i++;
    36.             if ($result !== true) {
    37.                 mysqli_close($connect); // Закрывает соединение
    38.                 header('Location: ./error.php?err=1'); // Ошибка вставки в БД
    39.             }
    40.         }
    41.     }
    42.     else {
    43.         mysqli_close($connect); // Закрывает соединение
    44.         header('Location: ./error.php?err=2'); // Ошибка удаления БД
    45.     }
    46. }
    47. ?>
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    и что, у вас всегда уходит на
    PHP:
    1.     header('Location: ./error.php?err=3'); // Ошибка - отсутствие массива POST
    ?

    так может $_POST не приходит просто?
     
  8. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Если код нормально выполняется, то все приходит на header('Location: ./index.php); Допустим сделаем специально ошибку изменим код функции:
    Код (Text):
    1. if ($result == true) {
    2.                 mysqli_close($connect); // Закрывает соединение
    3.                 header('Location: ./error.php?err=1'); // Ошибка вставки в БД
    4.             }
    Т.е. если данные вставились в БД, то придет true и нас должно перекинуть на header('Location: ./error.php?err=1');
    Но этого не происходит, все равно перекидывает на header('Location: ./index.php);
    --- Добавлено ---
    Спасибо, exit; помог!
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    а почему так, понял?
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    не успевает просто перекинуть )))) код идет дальше - и там перекидывает не совсем туда

    в самом первом примере где только if 1 else 2 такого не может быть)))
     
  11. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Дак в первом примере то все нормально, первый пример это и есть сам код, а второй пример это функция для кода первого примера. Из функции не перекидывало куда надо.
    --- Добавлено ---
    Нет, не понял. Вроде же ясно написано, что если if. то перекинь на error, но все проходит дальше, до последнего header.
    Почему так?
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    header location никуда не перекидывает. это блин заголовок, часть сообщения которое получит браузер. получив этот заголовок браузер согласно стандартов должен обратиться с новым запросом по указанному адресу.

    заголовок это просто блин выведенная строка, она не останавливает выполнение скрипта. то есть блин, всё, что ниже header location будет выполнено и выведено. но ты, вероятно, этого не увидишь. это будет бесполезная работа. поэтому нужен exit сразу за выводом заголовка.

    если честно, я не ебу как браузер отреагирует на два заголовка header location если ты умудришся их выдать в одном сообщении. это против правил и нафиг никому не нужно. просто ставь exit после каждого header location чтобы больше ничего не выводилось в этом сообщении. ибо незачем.

    --- Добавлено ---
    теперь понял?
     
    #12 artoodetoo, 23 авг 2017
    Последнее редактирование: 23 авг 2017
  13. Атм_Евгений

    Атм_Евгений Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    206
    Симпатии:
    5
    Да, теперь понял!
    А я то думал дошло до header и далее на Location.)
    Функция exit - останавливает работу скриптов и выводит то, что было до этой функции.
    Спасибо!
     
  14. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    тоже честно не ебу, но два заголовка в таком виде не пропустит пхп-машина, пока не указан второй аргумент функции - не затирать значение уже существующего заголовка с таким именем