【问题标题】:How can I pass information to a php script called with header()?如何将信息传递给使用 header() 调用的 php 脚本?
【发布时间】:2022-01-03 05:51:39
【问题描述】:

我在运行 php 脚本时遇到问题,使用 header() 调用第二个脚本。

主脚本 (a.php) 在运行时调用第二个脚本 (b.php)。

当使用此表单时,一切都按预期进行(执行ActionA 和ActionB):

https://example.com/a.php

使用此其他形式时,不会发生预期的行为(ActionAX 和 ActionBX)。而是执行 ActionAX 和 ActionB:

https://example.com/a.php?V=X

换句话说,b.php 没有得到 V=X 位的信息。

a.php 文件如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html; CHARSET=UTF-8">
<TITLE>MyWebApp</TITLE>
<STYLE>
INPUT[type='Submit'] {font-size: 19px;}
</STYLE>
</HEAD>
<BODY bgcolor="#A1E3D2">

<?php
session_start();
.....
function getVarStr()
{/* Beginning of getVarStr */
if ($_GET['V'] == 'X') performActionAX();
else  performActionA();
}/* End of getVarStr */
.....
getVarStr();
.....
if ($_GET['V'] == 'X') header("Location: ./b.php?V=X");
header("Location: ./b.php");
.....
?>
</BODY>
</HTML>

b.php 文件如下所示:

<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width,  initial-scale=1">
        <title>Extra Page</title>
        <STYLE>
                INPUT[type='Submit'] {font-size: 19px;}
        </STYLE>
</head>
<body>

<?php
session_start();
.....
function getVarStr()
{/* Beginning of getVarStr */
if ($_GET['V'] == 'X') performActionBX();
else  performActionB();
}/* End of getVarStr */
.....
getVarStr();
.....
?>
</BODY>
</HTML>

谁能指出我犯的错误?

我也尝试过使用会话变量来处理这个问题,但我遇到了完全相同的问题。

在这种情况下,我将 b.php 中的 getVarStr() 更改为:

function getVarStr()
{/* Beginning of getVarStr */
if ($_SESSION['V'] == 'X') performActionBX();
else  performActionB();
}/* End of getVarStr */

【问题讨论】:

    标签: php http-headers


    【解决方案1】:

    如果 “使用 header() 调用的 php 脚本” 你指的是代码中的 header("Location.... 行,那么你对这里真正发生的事情的理解是完全错误的。

    位置标头只是添加到http响应的字符串; header() 的作用与echo 大致相同,只是它打算在更早的时候发生,在任何 http 回复的正文被写入之前(稍后会详细介绍)。


    从功能上讲,Location 标头 真正 所做的只是让用户的网络浏览器知道,您希望他们访问另一个页面/网址,这(在大多数情况下)它会遵守。这与发送一个

       <script> window.location = 'https://....';</script>
    

    在您的 html 回复中;除了 http 标头不依赖于启用的 java 脚本。


    现在,真正的问题是您构建代码的方式。在尝试向 http 回复添加标头之前,您不能编写 任何 输出。这样做会阻止 PHP 被允许/能够添加该标头。

    您的header() session_start()(也间接使用header() 放置cookie)在您的代码中位置太低而无法正常运行。

    事实上,在您的 a.phpb.php 文件中,第一行 (&lt;!DOCTYPE...) 已经产生了输出,这是一个很大的禁忌。

    【讨论】:

    • 感谢您的 cmets。这是否意味着我需要放置此标头(“位置:.....”);我的源代码最开始的行。我必须承认我几乎从未使用过这个 header("Location: .....") 东西,也不太了解它是如何工作的。
    • 我不确定你在问什么。如果您问是否应该逐字添加?不。该行只是您已经在使用的行的缩写(仅在错误的位置)。
    • 好的。那么我的问题是:合适的地方在哪里?
    • 最简单的修复方法是停止在 php 文件中内联 html。这基本上意味着:&lt;?php ?&gt;out* 的任何内容都是不好的。就在顶部;从&lt;!DOCTYPE html&gt;&lt;body&gt;;应该全部拿走并放在其他地方。
    • 在执行标题/会话功能之前,您不能制作任何内容。所以除了内联的html。这也意味着任何echo/print/printf/var_dump等函数都不能出现在headersession_start之前。
    【解决方案2】:

    如果他们修改 cookie 或会话以防止遇到“警告:无法修改标头信息 - 标头已发送”问题,请始终将 php 源代码放在 html 之上已申请

    
    echo "SESSION NAME: " . session_name();
    echo "<br>";
    echo "SESSION ID: " . session_id();
    echo "<br>";
    echo "TIME: " . time();
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2016-02-14
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多