0

Есть форма с регистрацией, оттуда данные с помощью ajax передаются в файл .php для проверки всяких условий(заполненность полей, корректный логин и т.д.). И там же в файле php, если проверки пройдены, добавляется запись в базу. После этого надо перейти на главную страницу. Вот примерный код файла .php:

<?php
if(empty($_POST['username'])){
    echo 'Заполните поле "Имя пользователя"';
    return;
}//и ещё много всяких проверок
$mysql -> query("INSERT INTO `clients` (`login`, `username`, `password`) VALUES('$login', '$username', '$password')");
$mysql -> close();
header("Location: ../index.php");
?>

последняя строка с header почему-то не выполняется. То есть пользователь ввёл данные, нажал "зарегистрироваться" и остался на той же странице. При этом в базе он появился. В форме установлен атрибут "onsubmit="return false"". Что делаю не так?

ATG54
  • 51
  • 6

1 Answers1

1

Скорее всего у вас и php код и html находятся в одном файле. А для функции header в документации указано

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

Решением может быть парачка вещей:

  1. Перенести код php в отдельный файл. Где исключительно код php и ничего больше.
  2. Если есть перенаправление - может быть это сделать с помощью JS?

Кстати, вполне можно было бы увидеть предупреждения в ответе от сервера, если на сервере включить отображение ошибок

  • Просто раньше, когда на сайте вообще js не было, это работало, хотя данные тоже передавались. И, кстати, в файле .php и так исключительно php-код) – ATG54 Dec 12 '22 at 13:50
  • Чисто от добавления JS такое не ломается, значит правилось что-то ещё. Например путь до index.php или в файле есть незаметные символы в начале, но на которые будет выведено предупреждение если включить отображение ошибок – Алексей Шиманский Dec 12 '22 at 13:55
  • Можно конечно убрать "onsubmit="return false"" а в обработчике js поставить e.reventDefault(); и посмотреть что будет)) https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault ..... только не забыть что e должен быть как параметр в колбэк-функции – Алексей Шиманский Dec 12 '22 at 14:01
  • Попробовал, ничего не поменялось – ATG54 Dec 12 '22 at 14:43
  • надеюсь вы писали именно preventDefault)) а то в комментарии написал с ошибкой)) ну тады не знаю. если сейчас удалить js и ничего больше не менять и опять сделать чтоб был сабмит - то всё норм? – Алексей Шиманский Dec 12 '22 at 14:52
  • Надо попробовать. С этим методом, кстати, уже работал, поэтому написал правильно) – ATG54 Dec 12 '22 at 15:02
  • Написал вот так: window.location.href = "index.php"; Теперь работает, правда, ждёт секунды 2 перед тем как перенаправить. Но уже хорошо) – ATG54 Dec 12 '22 at 15:21
  • Значит запрос долгий. – Алексей Шиманский Dec 12 '22 at 15:23
  • Нет, до этого быстро выполнялся – ATG54 Dec 12 '22 at 15:38
  • Ну это уже другой вопрос, возможно, так и оставлю. Спасибо за помощь! – ATG54 Dec 12 '22 at 15:41