PHP - 无法设置会话变量

时间:2011-09-09 08:29:02

标签: php

我写了一个页面'captcha.php'来生成数学验证码,并通过会话将结果发送到请求它的页面。
在captcha.php中:

$_SESSION['captcha'] = $var;//$var is the calculate result

在index.php中:

<img src="/captcha.php"/><input id="captchaa" type="text" name="a"/>
...
<?php    
if($_POST['a']==$_SESSION['captcha'])
...

但是我收到了'未定义的索引:验证码'错误 任何提示?或者您还需要更多其他信息?

更新: 这些行都在两个文件中     如果(!isset($ _ SESSION))     {         在session_start();     }

更新: 我想我找到了原因。我的index.php在Yii的框架中,它有一个带id的会话,但是captcha.php不在框架内,所以他们不能共享一个session.I试图让它成为一个视图(/ validation / captcha) ,但它不会以这种方式正确生成图像,不知道为什么。

现在的问题是如何在captcha.php中使用Yii的会话。

5 个答案:

答案 0 :(得分:2)

你在两个文件中都使用了session_start功能吗?

答案 1 :(得分:0)

如果没有看到captcha.php的其余内容很难说,你在设置会话变量之前调用了session_start()吗?

答案 2 :(得分:0)

变量$ _SESSION ['captcha']在index.php中不可用,直到下一页加载,因为它是在您当前所在的请求之后创建的,如果有意义的话。

检查表单是否已提交/然后/只要正确使用session_start(),检查$ _SESSION的值就应该有效。

答案 3 :(得分:0)

我同意关于session_start的 mishu 。 '未定义索引:验证码'不是错误。这是一个警告。如果不抑制警告消息的输出,则应检查指定的数组索引是否确实存在:

if(isset($_POST['a']) && isset($_SESSION['captcha'])&&$_POST['a']==$_SESSION['captcha'])
...

要取消警告输出,您应使用error_reportning功能,如果它对您不重要。

答案 4 :(得分:0)

这是因为captcha.php浏览器在单独的请求中处理。因此,流程如下:

  1. PHP执行index.php文件。 $_SESSION['captcha']已设置,因此未输出任何内容
  2. PHP将内容刷新到浏览器。
  3. 浏览器会看到src的{​​{1}}参数,并将该网址加入
  4. PHP执行img并设置captcha.php,但页面已经呈现。
  5. 因此,实际上,$_SESSION['captcha']在处理$_SESSION['captcha']之后设置为,甚至在另一个index.php请求之后设置。

    作为一种解决方法,您可以使用AJAX加载验证码,通过AJAX请求传递验证码值和图像,而不是将它们注入HTML页面。