【问题标题】:Easiest way to give Javascript alert after PHP header() redirectPHP header() 重定向后提供 Javascript 警报的最简单方法
【发布时间】:2011-04-22 03:32:01
【问题描述】:

我有一个用户提交表单的页面,它转到一个单独的 PHP 脚本。脚本完成后,它 header() 将用户重定向回他们所在的页面。现在我想做的是,如果脚本中有错误或某些条件,将用户重定向到同一页面,但一旦他们到达那里就会显示一个 Javascript 警报作为警告消息。我可以将一些变量附加到 URL 并使用 $_GET 进行检查,但我认为可能有更简单的方法......也许使用一些 POST 数据或类似的东西? 谢谢

【问题讨论】:

  • 我相信您知道有几种解决方案,但听起来您确实在寻找 AJAX。只需让 javascript 在后台发送表单数据并读取响应标头即可。如果是 200/OK,则照常进行。如果是其他情况,请弹出警报。
  • 我真的对AJAX一无所知,除了我提到的之外,我不确定其他任何解决方案。说到 JS,我是个菜鸟。有人能解释一下吗?

标签: php javascript redirect


【解决方案1】:

您可以使用会话在服务器端完成这一切:

  1. “显示表单”php 脚本创建表单并将其返回给用户。

  2. 用户填写并提交给另一个接收表单数据的php脚本“receive script”,并注意到错误、丢失数据等。

  3. “接收脚本”将错误消息存储在会话中(作为项目 err)并重定向到“显示表单”脚本。

  4. “显示表单”脚本(与第 1 步相同)实际上不仅仅是创建表单。它还:

    • 在会话中查看是否有项目“err”,即错误消息。在第 1 步中没有。但现在有了。因此 php 脚本创建了表单,以及一个向用户显示错误消息的 div。
    • 将会话的“错误”项重置为零。
    • php 脚本还可以在页面中包含 javascript,这会使错误消息在一段时间后消失或显示为弹出窗口等。

ps。以上流程就是rails如何处理表单和重新显示表单。

更新:感谢@zod 指出我没有清除会话中的错误项目。

【讨论】:

  • 这不是一个坏主意。我绝对可以使用会话。我不确定我是否会那样做,但它仍然可以工作。谢谢。不过,我仍然愿意接受更多想法。
  • 如果你使用 session 。在什么时候取消会话。您只想在错误时显示警报消息。为此,您应该使用会话
  • 如果你不取消设置会话,错误值在会话中一直存在直到它过期!
【解决方案2】:

如果遇到错误,将错误状态存储到 $_SESSION 数组,然后将浏览器重定向到原始页面。在原始页面上有一个脚本来检查是否设置了错误状态。如果是,请触发 javascript 警报或您想要的任何处理。

并且在普通页脚模板处(或原页面页脚处),检查并清除errors数组,这样当用户移动到其他页面或重新加载当前页面时它不会持续存在。

示例:

processor.php

<?php
if($something == $iswrong){
    $_SESSION['errors']['error5301'] = 1;
    session_write_close();
    header("Location: http://www.example.com/originalpage.php");
    exit;
} ?>

originalpage.php

<!-- Header -->
<?php
if(isset($_SESSION['errors']['error5301']) && $_SESSION['errors']['error5301'] == 1){ ?>
    <script type="text/javascript">
        alert('Something is not correct!');
    </script>
<?php } ?>

<!-- Some page content -->
....
.....
..
......

<!-- Footer -->
<?php
if(isset($_SESSION['errors'])){
    unset($_SESSION['errors']);
} ?>

希望对您有所帮助。

【讨论】:

  • 看起来 Larry K 平行发布了他的答案!无论如何,我们说的是同一件事。
  • @Nimal 是的!这更像是我想我会做的,基于我首先阅读的拉里的想法。一个问题是我有其他会话正在进行,我不想销毁,但我想销毁任何错误会话,这样用户就不会不断收到错误...... unset() 是这样做的吗?如果我在下面检查它的页面上运行它,它仍然会显示我的警报消息然后销毁会话,对吗?谢谢,这是一个非常有用的帖子。
  • 我们没有使用session_destroy(),它只会破坏整个会话cookie。相反,我们使用unset() 仅清除属于当前会话的错误堆栈。将错误维护为堆栈的想法是,您可以根据需要存储尽可能多的错误状态并在原始页面上触发适当的事件。当您处理表单时,它会派上用场:error5301 可以是空的名字,error5304 可以是无效的电子邮件,等等。回答您的问题,是的,页面将显示警报,然后清除错误状态。
  • 您能解释一下堆栈的工作原理吗?我从来没有遇到过它......即使它是以这个网站的名义出现的。据我了解,它本质上是在同一个会话变量中保存多个变量?
  • 我只是说一个多维数组作为“堆栈” :-) 对不起,如果我混淆了你。
【解决方案3】:

首页

<script>
onsubmitfunction()
{

document.getElementByid('errorid').value=1;

}
</script>
<form name='' id='' onsubmit="javascript:onsubmitfunction();">

<input type='hidden' id='errorid' value=''>
</form>

    In destination.php

    <?php
    if($_POST['error']==1)
    {
    ?>
    <script language='javascript'>

    alert('Errrrrorrrr');
    </script>

    <?

    }

    ?>

这对你的问题来说已经足够了。

据我了解

【讨论】:

  • 我在帖子中说过,我考虑过使用这种方法,但我宁愿使用更隐蔽的东西。不过还是谢谢。
  • 在提交表单时设置隐藏字段的值并发布。在目标页面中检查 post 变量。这对你有用吗?检查语法
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 2015-03-19
  • 2023-02-26
  • 1970-01-01
相关资源
最近更新 更多