a.php:<?php
header("Content-type: image/png");
$im = @imagecreate(110, 20)
    or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 0, 0, 0);
$text_color = imagecolorallocate($im, 233, 14, 91);
$str="A Simple Text String";
imagestring($im, 1, 5, 5, $str , $text_color);
imagepng($im);
imagedestroy($im);session_start();
$_SESSION["AA"]=$str;//我想输出图片里的字符串值,用来做验证码,但session有问题了
?>b.php:<?php
session_start(); 
echo "<img src=\"a.php\" />";
//require("a.php");//用require就不能输出内容
/*$s=session_encode();//第一次没有值,测试需改下'AA'
echo $s;*/
echo $_SESSION["AA"];//问题:第一次运行b.php时获取不到值,第二次才行,为什么?怎么能马上有值?
?>

解决方案 »

  1. 如果你页面中,需要AA值,还是ajax吧实际上你第二次输出的,也不是真实的SESSION值了,
    因为浏览器访问a.php又把值改了
      

  2. 如果你把$_SESSION["AA"]的值,在当前页面显示出来就失去图片验证码的意义了
    ajax应用,也是,将用户填入的信息,发送给服务器端,服务器端跟SESSION比对,返回对或者不对ajax没那么难,网上搜个例子,看看也就会了
      

  3. $_SESSION["AA"] 是在执行 a.php 时产生的这样并不影响你用来做验证码,因为验证是在 a.php 执行后才做的,否则人家填写
      

  4. 先执行a.php,才会有$_SESSION['AA'];
      

  5. 谢谢,我这块去补补..马上结贴吧.
    有ajax的文档吗? 发个给我行吗?ttchenwei@gmail.com
      

  6. 我来分析一下,当b运行完后,浏览器根据img标签,加载a.php,这时才会更改session的值,,
    在b中赋值一个session值  $_SESSION["AA"]="test";//这个可以随机
    a.php中<?php
    session_start();
    header("Content-type: image/png");
    $im = @imagecreate(110, 20)
        or die("Cannot Initialize new GD image stream");
    $background_color = imagecolorallocate($im, 0, 0, 0);
    $text_color = imagecolorallocate($im, 233, 14, 91);
    $str=$_SESSION["AA"];//注意
    imagestring($im, 1, 5, 5, $str , $text_color);
    imagepng($im);
    imagedestroy($im);
    ?>
      

  7. 你没弄懂我的意思,我的session值先在b.php生成出来,传到a中就有了,
    其实按照你的那个做法,完全没必要在b.php输出验证码的值,下次发送的时候(session已经存在),
    比对一下用户的值和验证码的值就可以了.
      

  8. +
    <?php
    session_start(); 
    echo "<img src=\"a.php\" />";
    echo $_SESSION["AA"];//页面地一次执行时,还没有运行a.php,这里当然没有值了。第二次执行的时候实际上得到的都是前一次的值。如果这个值是随机的,那得到的就不是当前正确的值了。//实际上,你用验证码,这里并不需要得到该值,而是用户提交后去获取该值并验证。当然用ajax也可以,但无论是提交还是AJAX实际上都是第二次请求。
    ?>
      

类似问题 »