使用多个PHP文件,同时避免重定向循环和重新提交

时间:2016-01-26 10:51:44

标签: php multiple-files

所以我对PHP很陌生,我已经完成并学习了很多基于控制台的经验,所以我不是一个完全的编程初学者。但是我决定学习如何数据库,因为它总是让我着迷,而且我已经学会了基本的HTML和CSS和JS,现在基本的PHP和SQL,但是在我身上变得非常奇怪。

我已经弄清楚如何通过PHP代码和类似的东西来操作和创建数据库,但它们都是简单的东西,在一个文件中,我想要一个更大的项目,我需要把所有的PHP和#39;在单独的文件中,这就是问题所在。

说我的' 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>

和我的&#39; other.php&#39;是:

<?php

$input = "";

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

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

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

?>

所以我的问题:

  • 问题1,如果我不包含&#39; other.php&#39;文件,当我尝试打印时出错:value =&#34; print $ input&#34;

  • 问题2,如果我没有重新定位&#39;标题&#39;,它显然不会重定向并返回到&quot; index.php&#39;我想要发生。但是在那里,它会导致TOO_MANY_REDIRECT错误。我发现这是由于问题1原因而无法删除的问题引起的问题。

  • 问题3,我发现我可以移动&#39;标题&#39;函数到它被注释掉的地方,但是值=&#34; ...&#34;并不会继续提交。

  • 问题4,如果我完全摆脱了标题&#39;重定向,并将表单的操作更改为&#39; index.php&#39;,然后我获得“确认表单重新提交”#39;我想避免的事情。

所以我希望有一个人能够理解并且可以提供帮助,并且非常高兴。

2 个答案:

答案 0 :(得分: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'];
}

请注意,在任何html输出之前,我还将include移动到index.php中的第1行。 在这种情况下,这不是严格要求的,但这是一个很好的做法,因为在将响应主体发送到输出流之后,您无法设置标头(例如,用于重定向)

EDIT 如果您想在刷新时避免重新提交表单,那么您需要提交到单独的端点并重定向是正确的。 为此,您需要将发布的数据传递回索引文件,因为重定向是一个新的(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>

然后将所需数据作为参数附加到重定向网址 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

答案 1 :(得分:0)

在最后一行的other.php中,尝试使用index.php而不是redirrecting。 同时删除index.php中包含other.php。

$input = "";

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

require_once 'index.php';
?>