Использование нескольких файлов PHP, избегая петли перенаправления и повторной отправки

Так что я довольно новичок в PHP, я сделал и изучил много консольного опыта, поэтому я не начинающий программист. Но я решил научиться работать с базой данных, потому что она всегда очаровывала меня, и я изучил базовые HTML и CSS и JS, а теперь и базовые PHP и SQL, но ввод в действие становится странным для меня.

Я понял, как манипулировать базами данных и делать их с помощью PHP-кода и тому подобного, но все они были простыми и в одном файле, я собираюсь создать более крупный проект и мне нужно поместить все PHP-файлы в отдельные файлы, это это проблема.

скажем мой файл index.php такой:

<!DOCTYPE html>
<html>
<head>
<?php include 'other.php' ?>    //Problem 1
</head>
<body>
<FORM method="POST" action="other.php">
<INPUT type="text" name="textTest" value="<?php print $input; ?>">
<INPUT type="submit" name="subTest" value="TEST" >
</FORM>
</body>
</html>

и мой «other.php» это:

<?php

$input = "";

if (isset ($_POST['subTest']))
{
$input = $_POST['textTest'];

//header("Location : index.php");
}

header("Location: index.php");   //Problem 2

?>

Итак, мои проблемы:

  • Проблема 1, если я не включаю файл «other.php», возникает ошибка, когда я пытаюсь напечатать: value = «print $ input»

  • Проблема 2, если я не перенаправляю с заголовком, он, очевидно, не перенаправляет и не возвращается к «index.php», что я хочу, чтобы произошло. НО с этим там, это вызывает ошибку TOO_MANY_REDIRECT. Я обнаружил, что это проблема, вызванная включением, которое нельзя удалить по причине 1.

  • Задача 3: я обнаружил, что могу переместить функцию ‘header’ туда, где она закомментирована, но тогда значение = «…» не остается при отправке.

  • Проблема 4: если я полностью избавился от перенаправления заголовка и изменил действие формы на index.php, то получил сообщение «Подтвердить повторную отправку формы», которого я хочу избежать.

Так что я надеюсь, что это полный рот, кто-то понимает и может помочь, и спасибо в продвинутом.

0

Решение

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

Чтобы исправить вашу проблему, сначала измените действие формы на index.php (поэтому он отправляет сообщения самому себе), и удалите перенаправление все вместе:

<?php include 'other.php' ?>
<!DOCTYPE html>
<html>
<head>

</head>
<body>
<FORM method="POST" action="index.php">
<INPUT type="text" name="textTest" value="<?php print $input; ?>">
<INPUT type="submit" name="subTest" value="TEST" >
</FORM>
</body>
</html>

other.php:

<?php
$input = "";

if (isset ($_POST['subTest'])){

$input = $_POST['textTest'];
}

Обратите внимание, что я также переместил include до 1-й строки в index.phpперед любым выводом html.
Это не является строго обязательным в этом случае, но это хорошая практика, так как вы не можете установить заголовки (например, для перенаправления) после отправки тела ответа в выходной поток

РЕДАКТИРОВАТЬ
Если вы хотите избежать повторной отправки формы при обновлении, то вы правы в том, что вам нужно будет отправить его на отдельную конечную точку и перенаправить.
Для этого вам нужно будет передать опубликованные данные обратно в индексный файл, так как перенаправление — это новый (GET) запрос, поэтому данные публикации теряются.

Два основных способа сделать это — с помощью параметров SESSION или URL.
Я покажу, как это сделать с параметрами:

Не включайте файл назначения:

<?php
//get value from url parameter, or set to empty string if parameter not present
$input = isset($_GET['input'])? $_GET['input'] : '';
<!DOCTYPE html>
<html>
<head>

</head>
<body>
<FORM method="POST" action="other.php">
<INPUT type="text" name="textTest" value="<?php print $input; ?>">
<INPUT type="submit" name="subTest" value="TEST" >
</FORM>
</body>
</html>

Затем добавьте необходимые данные в URL перенаправления в качестве параметров.
other.php:

<?php
$input = "";

if (isset ($_POST['subTest'])){

$input = $_POST['textTest'];
header("Location: index.php?" . http_build_query(['input'=>$input]));
die(); //always stop execution after redirect
}
//if post data not sent, something went wrong, so set $input parameter to error message
header("Location: index.php?" . http_build_query(['input'=>'No Data posted']));
die(); //always stop execution after redirect
2

Другие решения

В other.php в последней строке попробуйте указать index.php вместо перенаправления.
Также удалите включение other.php в index.php.

$input = "";

if (isset ($_POST['subTest']))
{
$input = $_POST['textTest'];
}

require_once 'index.php';
?>
0

По вопросам рекламы [email protected]