2015-07-13 83 views
0

我試圖存儲在一個會話變量笨驗證碼幫手挑戰字,如下:CodeIgniter通過會話userdata消失的驗證碼值?

$cap = create_captcha($val /* array of params */); // Works fine 
$this->session->set_userdata('cap-word', $cap['word']); 

如果我之前和會話集後回聲$帽[「字」],它是正確的(即在瀏覽器中顯示的內容)。如果我在設置它之後立即檢索會話變量,它也是正確的。

但是存儲在會話中的內容完全不同 - 它是正確的長度(字符數),但是是完全不同的字符串。因此,當我嘗試檢索服務器端的用戶數據(驗證碼驗證)時,它會得到錯誤的值。

(。我被配置爲「sess_use_database」和每個頁面加載之後檢查在phpMyAdmin用戶數據值的Cookie加密被禁止)

調試嘗試:

  • 我試圖預先考慮/將已知字符串附加到驗證碼挑戰詞中,然後將其存儲在會話中。已知的字符串使其進入會話用戶數據就好了,但被預先附加/附加到不正確的驗證字。
  • 我試圖用固定字符串完全替換質詢詞。這使得通過會話往返沒有問題。
  • 我已經嘗試將captcha挑戰詞保存到不同的字符串變量(而不是直接從$ cap ['word]'傳遞它)與相同的結果;只有挑戰部分在會議中着陸時纔會「消失」。

調試之後,我的代碼看起來更像:

$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')); 

這產生在瀏覽器中的輸出如下:

帽=陣列([字] => 5CZaDeHm [時間] => 1436765602.678 [圖像] => {圖像})

帽[ '單詞'] = 5CZaDeHm

theword = 5CZaDeHm

後theword = 5CZaDeHm

屆輸出之前= 5CZaDeHmabcdefg

然而,什麼是存儲在會話表用戶數據字段(和,因此,那些彈出時,我調用$這 - >會話級>用戶數據( '帽字')上提交請求)是:

a:2:{s:9:"user_data";s:0:"";s:8:"cap-word";s:15:"3g5hb1I3abcdefg";} 

因此, $ thisword內的'5CZaDeHm'在$ this-> session-> set_userdata的調用過程中似乎已被'3g5hb1I3'取代。我不知道爲什麼,甚至這可能如何?!


更新2015-07-12 07:50 EDT:像往常一樣,奧卡姆剃刀適用。在每個頁面加載時,我的控制器被調用兩次,生成2個驗證碼圖像和2個相應的質詢單詞。其中一個出現在瀏覽器中,另一個出現在會話的數據庫行中。現在想明白爲什麼......

回答

0

原來CodeIgniter控制器被調用了兩次,因爲我在CSS標籤的href參數中使用了一個相對路徑。這導致瀏覽器試圖加載相對於頁面的樣式表,這觸發了頁面的第二次加載。