使用参数重新加载页面

Posted

技术标签:

【中文标题】使用参数重新加载页面【英文标题】:Reloading a page with parameters 【发布时间】:2011-09-09 23:29:57 【问题描述】:

我有一个页面在每次重新加载时显示随机图片。此页面仅在通过 $_GET 传递数字时显示(表示用户配置文件)。要转到下一张随机图片,我想要一个提交按钮来简单地重新加载页面。但是,我遇到了两个障碍:

php 中使用 header 函数会产生臭名昭著的“标头已发送”错误。加上用户被重定向,因为没有传递参数。 在 javascript 中,location.reload 确实会重新加载页面,但同样缺少参数会导致相同的结果。

所以我的问题是是否可以在 Javascript 中重新加载带有参数的页面?或者您知道其他解决方案吗?

编辑:使用警告框进行了一些测试,并且 URL 显示在地址栏中。不知道为什么没有传递参数。

【问题讨论】:

【参考方案1】:

您应该想知道为什么会收到headers already sent 错误。这通常是因为您的流程不正确。确保在生成输出之前处理您的 PHP。在代码顶部检查提交的表单 - 并在不执行任何其他操作的情况下安全地重定向。应该能解决你的问题。

【讨论】:

正如下面@Berry Langerak 的回答所解释的,有几条require_once 行很难移到其他地方。我一开始就尝试使用header,但到目前为止没有成功。【参考方案2】:

在另一个话题中我发现

window.location.replace(window.location.href)

将保留参数。

【讨论】:

【参考方案3】:

在 PHP 中使用 header 函数会产生臭名昭著的“headers already sent by”错误。

这很简单:将执行 header() 调用的代码移到顶部(在任何其他输出之前)。 “标头已发送”是臭名昭著的,但也非常容易解决。

在 Javascript 中,location.reload 确实会重新加载页面,但同样缺少参数会导致相同的结果。

然后传下去?我认为这应该可行?

window.location( window.location.toString( ) );

【讨论】:

刚刚用“toString”作为变体再次测试了这个。结果是一样的,就好像参数没有被传递一样。页面顶部附近的检查是这样的:isset($_GET['param']) && intval($_GET['param']) > 0。至于标题错误,这很可能是由靠近顶部的几行 require_once 引起的,它们执行诸如初始化用户和数据库连接之类的操作。【参考方案4】:

您可以使用document.location 代替location.reload 将页面重定向到具有通过GET 传递的参数的同一页面。例如,

<?php
    $id = $_GET['user_id'];
    echo "<script type='text/js'>
          document.location='".$_SERVER['PHP_SELF']."&id=".$id."';
          </script>";
?>

【讨论】:

【参考方案5】:

好的,我不妨发布这个,因为通过 javascript 和 PHP 工作很痛苦,而且我没有足够的时间让 ajax 工作。一个简单的解决方法是简单地在表单的 action 属性中指定参数(特殊标记来自 smarty)。

   <form Method="POST" ACTION="my_page.php?param=$smarty.get.i">
          <!-- PHP: If ( isset($_POST['next']) ) do SQL ... -->
          <input type="submit" name="like" value="I like">
          <input type="submit" name="next" value="Next" >
   </form>

【讨论】:

以上是关于使用参数重新加载页面的主要内容,如果未能解决你的问题,请参考以下文章

使用 asp.net MVC 中的参数将 javascript 中的页面重新加载到特定控制器的操作方法

Nuxt:页面重新加载时页面崩溃

router不重新加载数据

我真的需要重新加载我的页面两次吗?

无法传递参数以加载JSTree(重新渲染)

vue路由多个子路由页面加载多次