Так что я довольно новичок в 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, то получил сообщение «Подтвердить повторную отправку формы», которого я хочу избежать.
Так что я надеюсь, что это полный рот, кто-то понимает и может помочь, и спасибо в продвинутом.
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
В other.php в последней строке попробуйте указать index.php вместо перенаправления.
Также удалите включение other.php в index.php.
$input = "";
if (isset ($_POST['subTest']))
{
$input = $_POST['textTest'];
}
require_once 'index.php';
?>