我试图在Session变量中存储CodeIgniter验证码助手挑战词,如下所示:
$cap = create_captcha($val /* array of params */); // Works fine
$this->session->set_userdata('cap-word', $cap['word']);
如果我在会话设置之前和之后回显$ cap [' word'],那么它是正确的(即浏览器中显示的内容)。如果我在设置后立即检索会话变量,它也是正确的。
然而会话中存储的内容完全不同 - 它是正确的长度(字符数)但是完全不同的字符串。因此,当我尝试在服务器端检索用户数据时(验证码验证),它会得到错误的值。
(我为' sess_use_database'配置并在每次加载页面后检查phpMyAdmin中的用户数据值。禁用Cookie加密。)
调试尝试:
调试后,我的代码看起来更像:
$cap = create_captcha($vals);
echo("<br>cap = ");
print_r($cap);
echo("<br>cap['word'] = " . $cap['word']);
$theword = $cap['word'];
echo("<br> Before theword = " . $theword);
$this->session->set_userdata('cap-word', $theword . 'abcdefg');
echo("<br> After theword = " . $theword);
echo("<br> Session output = " . $this->session->userdata('cap-word'));
这会在浏览器中生成以下输出:
cap = Array([word] =&gt; 5CZaDeHm [time] =&gt; 1436765602.678 [image] =&gt; {图像})
cap [&#39; word&#39;] = 5CZaDeHm
在theword = 5CZaDeHm之前
theword = 5CZaDeHm
之后会话输出= 5CZaDeHmabcdefg
但是,会话表中存储的内容是userdata字段(因此,当我调用$ this-&gt; session-&gt; userdata(&#39; cap-word&#39;)时会弹出什么内容)提交请求)是:
a:2:{s:9:"user_data";s:0:"";s:8:"cap-word";s:15:"3g5hb1I3abcdefg";}
因此,子串&#39; 5CZaDeHm&#39;在$ theword中,似乎已被&#39; 3g5hb1I3&#39;取代。在致电$ this-&gt; session-&gt; set_userdata期间。我不知道为什么,甚至这怎么可能?!
更新2015-07-13 07:50 EDT:像往常一样,Occam的Razor适用。结果显示每个页面加载,我的控制器被调用两次,生成2个验证码图像和2个相应的挑战词。其中一个出现在浏览器中,另一个出现在会话的数据库行中。现在弄明白为什么......
答案 0 :(得分:0)
原因是CodeIgniter控制器被调用两次,因为我在CSS标记的href参数中使用了相对路径。这导致浏览器尝试相对于页面加载样式表,这触发了页面的第二次加载。