PHP在函数调用中重定向

时间:2012-04-30 18:51:56

标签: php function redirect kiss-mvc

我已经查看了其他一些关于类似主题的帖子,但我无法按照他们的指示进行操作。

基本上我的问题是这样,我想在密码重置成功后重定向到我网站的主登录页面。

这是我到目前为止所做的:

if (isset($_POST['Resetpw'])) {
    if ($query == $_GET['token'] & $_POST['password'] == $_POST['confirmed_password']) {
        $passwordTest = $_POST['password'];

        $result = mysql_query("SELECT `tempTicket` FROM users WHERE `username` = '" . $_POST['username'] . "'limit 1;");
        $query = mysql_fetch_array($result);
        mysql_query("UPDATE users SET `tempPass` = '$passwordTest' WHERE `username` = '" . $_POST['username'] . "'  ");
        echo '<div class="success">Password successfully changed!</div> ';
        //header("Location: www.google.com");
        //exit;

这一切都在一个函数中,注释掉的部分是我想要重定向到我的网页的地方。

所以要把它包起来,我可以强制函数在函数完成后重定向到起始页面。如果重要的话,我正在为这个项目使用KISSMVC框架。

4 个答案:

答案 0 :(得分:3)

您应该删除echo before the redirect

如果你使用完整路径,你所评论的内容应该有用,例如:http://google.com

另一件事:你应该放弃mysql_*函数的使用(它将在the future中弃用)并使用mysqli_*PDO

还有一件事:你的应用程序容易受到SQL injection的攻击。<​​/ p>

答案 1 :(得分:2)

首先,我希望在使用它们访问数据库之前,我不需要深入了解您的输入。

我不知道KISSMVC。但我知道PHP和浏览器 - 服务器交互是如何发生的。所以我会从那种格式来处理你的问题。

我在这里看到两件事。一个是您希望在事务成功发生时向用户发出警报。这可以通过重定向动态完成,但这取决于您发送它们的位置。如果您将用户发送到您无法控制的位置(您的示例引用了google.com),则必须使用javascript和ajax发送提醒(以及您的输入)。这是因为如果您已经将一些输出发送到用户的浏览器,则标题重定向将不起作用。因此,您需要在代码中实现一些.js,该代码对执行代码的脚本进行AJAX调用并返回成功/失败标志,然后触发消息(成功/失败)。

如果您确实控制了要重定向到的内容,并且不希望触及任何.js,则可以重定向到使用您创建的变量来保存成功/失败的中间页面消息,将其输出到浏览器以及之后链接到下一页的按钮,并将数据附加到查询字符串。所有这些都可以在php / MySQL中完成。

答案 2 :(得分:0)

是的,只是摆脱之前的echo声明。在header通话之前,您无法向屏幕回显任何内容。

您可能还想添加一些错误处理,以便确定它是成功的并切换到预准备语句以避免sql注入。

答案 3 :(得分:0)

输出缓冲

此处的其他人都表示在标题调用(包括空格)之前无法回显任何内容。但这是不正确的。如果你在php.ini文件中使用输出缓冲,例如输出整个页面的缓冲区 - 那么你可以在脚本中自由使用header()ANYWHERE(只要代码不手动刷新它)。 http://php.net/manual/en/outcontrol.configuration.php

你想在php.ini

中设置它

output_buffering =开;

然后您可以在代码中的任何位置使用header()。请记住,在重定向之后,使用die()或exit()来防止重定向后PHP页面继续执行。

没有输出缓冲

您不得向浏览器打印任何内容,包括空格,否则标题已经发送,PHP无法再修改。输出缓冲会停止此操作,因为整个生成的页面在脚本末尾一次性发送,这意味着可以在脚本的任何位置随意更改标题。

<强> P.S。

正如其他人所提到的那样,你的SQL很容易受到SQL injection的影响而你不应该再使用mysql_ *而是切换到pdo或mysqli_ *,因为mysql_ *被解散了。