Здравствуйте! У меня такая проблема, есть код: Код (Text): if (...) { header ('Location: /error.php') } else { header ('Location: /index.php') } При любом раскладе срабатывает только последний header. Почему так? Нельзя в коде иметь более 1 header Location?
Обработчик: Код (Text): <?php include './func/func_processor.php'; if (isset($_POST)) { $data = $_POST; $connect = mysqli_connect('localhost', 'user', '12345', 'conspekt'); mysqli_query($connect, 'SET NAMES utf8'); $table = ['a1', 'b2', 'c3', 'd4', 'e5', 'f6', 'g7', 'h8', 'i9', 'j10', 'k11', 'l12', 'm13', 'n14']; if (array_key_exists('saveAll', $data)) { // ищет в массиве указанное значение - Записать все save_all($data, $table, $connect); } elseif (array_key_exists('subUp', $data)) { // ищет в массиве указанное значение - Добавить строки в самом верху sub_up($data, $table, $connect); } elseif (array_key_exists('subStr', $data)) { // ищет в массиве указанное значение - Добавить строки ниже sub_str($data, $table, $connect); } elseif (array_key_exists('subDel', $data)) { // ищет в массиве указанное значение - Удаление строки sub_del($data, $table, $connect); } elseif (array_key_exists('subBlock', $data)) { // ищет в массиве указанное значение - Вставка блока в строку sub_block($data, $table, $connect); } elseif (array_key_exists('subString', $data)) { // ищет в массиве указанное значение - Запись строки sub_string($data, $table, $connect); } mysqli_close($connect); // Закрывает соединение header('Location: ./index.php); } else { header('Location: ./error.php?err=3'); // Ошибка - отсутствие массива POST } ?> func_processor.php: Код (Text): <?php function save_all($data, $table, $connect) { // Записать все $result = mysqli_query($connect, "DELETE FROM html_form"); if ($result == true) { $i = 1; while (array_key_exists('id'.$i, $data)) { foreach ($table as $key => $el) { $code = $i.$el.'opt'; if (array_key_exists($code, $data)) { if ($data[$code] == '00') { $$el = ''; } elseif ($data[$code] == '01' || $data[$code] == '02' || $data[$code] == '03' || $data[$code] == '04' || $data[$code] == '05' || $data[$code] == '06' || $data[$code] == '07' || $data[$code] == '08' || $data[$code] == '09') { $text = $i.$el; $$el = $data[$code].htmlspecialchars($data[$text], ENT_QUOTES); } elseif ($data[$code] == '10' || $data[$code] == '14') { $text = $i.$el; $$el = $data[$code].$data[$text]; } elseif ($data[$code] == '11' || $data[$code] == '12' || $data[$code] == '13') { $$el = $data[$code]; } else { $$el = ''; } } else { $$el = ''; } } $result = mysqli_query($connect, "INSERT INTO html_form (id,a1,b2,c3,d4,e5,f6,g7,h8,i9,j10,k11,l12,m13,n14) VALUES ('$i','$a1','$b2','$c3','$d4','$e5','$f6','$g7','$h8','$i9','$j10','$k11','$l12','$m13','$n14')"); $i++; if ($result !== true) { mysqli_close($connect); // Закрывает соединение header('Location: ./error.php?err=1'); // Ошибка вставки в БД } } } else { mysqli_close($connect); // Закрывает соединение header('Location: ./error.php?err=2'); // Ошибка удаления БД } } ?>
и что, у вас всегда уходит на PHP: header('Location: ./error.php?err=3'); // Ошибка - отсутствие массива POST ? так может $_POST не приходит просто?
Если код нормально выполняется, то все приходит на header('Location: ./index.php); Допустим сделаем специально ошибку изменим код функции: Код (Text): if ($result == true) { mysqli_close($connect); // Закрывает соединение header('Location: ./error.php?err=1'); // Ошибка вставки в БД } Т.е. если данные вставились в БД, то придет true и нас должно перекинуть на header('Location: ./error.php?err=1'); Но этого не происходит, все равно перекидывает на header('Location: ./index.php); --- Добавлено --- Спасибо, exit; помог!
не успевает просто перекинуть )))) код идет дальше - и там перекидывает не совсем туда в самом первом примере где только if 1 else 2 такого не может быть)))
Дак в первом примере то все нормально, первый пример это и есть сам код, а второй пример это функция для кода первого примера. Из функции не перекидывало куда надо. --- Добавлено --- Нет, не понял. Вроде же ясно написано, что если if. то перекинь на error, но все проходит дальше, до последнего header. Почему так?
header location никуда не перекидывает. это блин заголовок, часть сообщения которое получит браузер. получив этот заголовок браузер согласно стандартов должен обратиться с новым запросом по указанному адресу. заголовок это просто блин выведенная строка, она не останавливает выполнение скрипта. то есть блин, всё, что ниже header location будет выполнено и выведено. но ты, вероятно, этого не увидишь. это будет бесполезная работа. поэтому нужен exit сразу за выводом заголовка. если честно, я не ебу как браузер отреагирует на два заголовка header location если ты умудришся их выдать в одном сообщении. это против правил и нафиг никому не нужно. просто ставь exit после каждого header location чтобы больше ничего не выводилось в этом сообщении. ибо незачем. --- Добавлено --- теперь понял?
Да, теперь понял! А я то думал дошло до header и далее на Location.) Функция exit - останавливает работу скриптов и выводит то, что было до этой функции. Спасибо!
тоже честно не ебу, но два заголовка в таком виде не пропустит пхп-машина, пока не указан второй аргумент функции - не затирать значение уже существующего заголовка с таким именем