2016-01-26 7 views
0

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

Я выяснил, как манипулировать и создавать базы данных через 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», появляется ошибка при попытке распечатать: значение = «print $ input»

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

  • Проблема 3, я узнал, что могу переместить функцию «заголовок» туда, где она закомментирована, но тогда значение = «...» не остается на представлении.

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

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

+0

Попробуйте не смешивать логику (если isset (blah, blah, blah), то перенаправить) с выходом (HTML). Реорганизовать ваши файлы и выполнить всю необходимую обработку и принять все необходимые решения ** до ** любого выхода. Не включайте файлы, которые обрабатывают данные из файлов, выводящих HTML; делайте это наоборот. – axiac

+0

После того, как вы пробовали простой образец дизайна, как MVC. – Ali

ответ

2

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. Это не является строго обязательным в данном случае, но это хорошая практика, так как вы не можете установить заголовки (например, для редиректа) после того, как тело ответа посылается в выходной поток

EDIT Если вы хотите, чтобы избежать форма повторно вводится при обновлении, тогда вы правы, что вам нужно будет отправить отдельную конечную точку и перенаправить. Для этого вам нужно будет передать опубликованные данные обратно в индексный файл, так как перенаправление - это новый запрос (GET), поэтому данные для сообщений теряются.

Два основных способа сделать это будут с параметрами СЕССИИ или URL. я покажу, как сделать это с параметрами:

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

<?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 
+0

Это то, что вызывает проблему 4, при обновлении я получаю «Подтверждение повторной формы формы», и везде, где я смотрел, говорится, чтобы решить эту проблему, добавьте перенаправление «header», так как я могу сделать то и другое? – user3502489

+0

Я сделаю редактирование, показывающее, как это сделать – Steve

+0

Мне нравится эта практика, но она по-прежнему подходит для Resubmission thing – user3502489

0

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

$input = ""; 

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

require_once 'index.php'; 
?> 
+0

Если я не включаю 'other.php' в 'index.php', значение = "..." выдаст ошибку, он не знает, что $ input – user3502489

+0

Нет, это не будет. Если вам требуется index.php из other.php, то index.php имеет доступ к области other.php. Другими словами, он может получить доступ к своим переменным. –