【问题标题】:PHP: store input variable in session and then echo it on a page is not workingPHP:将输入变量存储在会话中,然后在页面上回显它不起作用
【发布时间】:2011-08-10 21:19:40
【问题描述】:

好的,我试着解释一下:

我有一个 php 页面“index.php”,其中有一个表单发布到 form.php?form=1 处理数据,然后在瞬间重定向到一个名为“paso2”的“谢谢”页面.php"

我想要做的是将电子邮件变量存储在会话中,然后在 paso2.php 上回显它

所以我在 form.php 的最顶部做了这个:

<?php error_reporting(-1);
ini_set('display_errors', 1);
session_start();
// Validation here...
$_SESSION['email_address'] = $_POST['email'];

"email" 是 index.php 中输入的电子邮件名称

然后在 paso2.php 上,我在最顶部执行此操作:

<?php
error_reporting(-1);
ini_set('display_errors', 1);
session_start();?>

然后在 paso2.php 的输入中我回显该值

<input type="text" name="email2" value="<?php echo htmlspecialchars($_SESSION['email_address']);?>" /> 

但它不起作用!我可以在该值中读取的错误是:

值内

<br /> <b>Notice</b>: Undefined index: email_address in     <b>/home/gulp1986/public_html/cupon0km.com/paso2.php</b> on line <b>59</b><br />

谁能告诉我发布这个值我做错了什么?

【问题讨论】:

  • 第一件事...你能验证 $_SESSION['email_address'] 是否通过在 index.php 中设置后回显该值来设置?
  • 也许使用“在另一个页面上”而不是“在一个页面上”(在你的标题中)会更清楚。是的,我知道,我帮不上什么忙,但我看不出问题所在.. 将电子邮件作为 GET 变量传递是一种可能的替代方法吗?
  • 不可能通过 GET 来完成,因为它会转到 form.php,然后转到我想要的页面 paso2.php
  • 一切都按照我在这里的描述设置
  • @sebas 这两个页面 index.phpform.php 使用相同的 URL 和端口吗?

标签: php


【解决方案1】:

使用Firebug 和/或HTTPFox 在浏览器从索引-> 表单-> paso2 进入时查看HTTP 标头,并查看会话cookie(和ID)是否在每个阶段正确传输。缺少这种类型的变量总是会导致会话 cookie 配置错误并在每个阶段之后丢失,从而导致每次都创建一个新的/空会话。

【讨论】:

  • 我使用萤火虫,但我是菜鸟,我什至不知道如何检查标题:S
  • 它们将位于“网络”选项卡下。您将看到执行的所有请求,其中任何一个单击 + 以打开该特定请求将显示一个 Headers 选项卡。
  • 这样做我发现 a350bc043d659158f0b16dc655cb8d91 作为 SESSION 你介意看一下吗? cupon0km.com/index.php 我还添加了 session_start();回声 session_id();到 index.php
  • 检查每个页面上请求的值是否相同。如果它发生变化,那么您每次都会获得一个全新的会话,这解释了为什么变量“丢失” - 它仍然存在,但在不同的会话中。
  • 是的,您的会话正在消失。您的 index/paso 页面来自“cupon0km.com”,而表单来自“clientes.cupon0km.com”。
【解决方案2】:

首先,尝试添加:

session_start();
echo session_id();

在您的“form.php”文件中。假设您的会话已启动,您应该会看到相应的会话 ID。

如果可能,请将您的错误报告修改为:error_reporting(E_ALL);,以帮助查看是否存在与会话创建相关的任何错误。

【讨论】:

  • 好的,我现在要添加这个,之后我该怎么办?我的意思是它有什么用?
  • 这是调试过程的一部分,尤其是当您没有“确凿证据”错误时。
  • 你介意看看我把它添加到了 index.php 中,但真的想不通cupon0km.com/index.php
【解决方案3】:

如果你在 form.php 中创建一个隐藏字段。

    <input type='hidden' name='email' value='223218' />

然后将此表单发布到 paso2.php。

<form id='form_223218' class='appnitro'  method='post' action='paso2.php'>

会话变量不应为空。

【讨论】:

  • 不能改变 form.php 处理帖子的方式
【解决方案4】:

尝试将session_start() 放在其他所有内容之前。 session_start() 可能有点古怪。

【讨论】:

  • 是的,它是最顶部的第一件事,这不是问题
【解决方案5】:

Marc B 评论的跟进。你需要在每个 session_start 之前使用 do this

<?php
$cookie_params = session_get_cookie_params();

session_set_cookie_params( 
    $cookie_params["lifetime"], 
    $cookie_params["path"], 
    '.cupon0km.com', 
    $cookie_params["secure"], 
    $cookie_params["httponly"] 
);

session_start();

您还可以将上面的代码放入一个文件中,并将其包含在需要会话的每个页面的顶部。

一些调试:

在form.php中:

注释掉header('Location: ...')重定向

在 form.php 和 paso2.php 底部添加:

echo 'session name' . session_name() . '<br>';
echo 'session id' . session_id() . '<br>';
echo 'cookies <br>'; print_r($_COOKIES);
echo 'session <br>'; print_r($_SESSION);

【讨论】:

  • nop,它不工作在 form.php 和 paso2.php 上都使用了上面的代码相同的结果错误说
    注意:未定义的索引:电子邮件地址在 /home/gulp1986/public_html/cupon0km.com/paso2.php 第 68 行
  • 嘿伙计,你正在做一些测试,对吧?我看到一些 1@example 电子邮件正在发布
  • 是的,如果它给您带来任何问题,我很抱歉。使用 chrome 检查元素,PHP 似乎正在创建两个会话 cookie。 session_start 是否有可能在任何页面(可能是包含的文件)上被多次调用?
  • 不,这不是问题。并且没有其他 session_start 并且没有包含在表单上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2013-10-09
  • 1970-01-01
  • 2017-08-26
  • 2013-03-21
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多