2010-04-16 108 views
1

我正在寫一個自定義會話處理程序,對於我的生活,我無法獲得一個cookie來設置它。在設置cookie之前,我沒有向瀏覽器輸出任何內容,但它仍然無效。這太痛苦了。在兒童班級PHP設置Cookie

如果我在我定義的腳本中設置cookie,並在會話處理程序中調用該cookie,則會設置cookie。如有需要,我會發布代碼。任何想法的人?

<?php 




/* require the needed classes comment out what is not needed */ 
require_once("classes/sessionmanager.php"); 
require_once("classes/template.php"); 
require_once("classes/database.php"); 


$title=" "; //titlebar of the web browser 
$description=" "; 
$keywords=" "; //meta keywords 
$menutype="default"; //default or customer, customer is elevated 
$pagetitle="dflsfsf "; //title of the webpage 
$pagebody=" "; //body of the webpage 


$template=template::def_instance(); 
$database=database::def_instance(); 

$session=sessionmanager::def_instance(); 
$session->sessions(); 
session_start(); 
?> 

,這是實際設置Cookie的會話

function write($session_id,$session_data) 
{ 
    $session_id = mysql_real_escape_string($session_id); 
    $session_data = mysql_real_escape_string(serialize($session_data)); 
    $expires = time() + 3600; 
    $user_ip = $_SERVER['REMOTE_ADDR']; 
    $bol = FALSE; 
    $time = time(); 
    $newsession = FALSE; 
    $auth = FALSE; 
    $query = "SELECT * FROM 'sessions' WHERE 'expires' > '$time'"; 
    $sessions_result = $this->query($query); 
    $newsession = $this->newsession_check($session_id,$sessions_result); 
    while($sessions_array = mysql_fetch_array($sessions_result) AND $auth = FALSE) 
    { 
     $session_array = $this->strip($session_array); 
     $auth = $this->auth_check($session_array,$session_id); 
    } 

    /* this is an authentic session. build queries and update it */ 
    if($auth == TRUE AND $newsession == FALSE) 
    { 
     $session_data = mysql_real_escape_string($session_data); 
     $update_query1 = "UPDATE 'sessions' SET 'user_ip' = '$user_ip' WHERE 'session_id' = '$session_id'"; 
     $update_query2 = "UPDATE 'sessions' SET 'data' = '$session_data' WHERE 'session_id = '$session_id'"; 
     $update_query3 = "UPDATE 'sessions' SET 'expires' = '$expires' WHERE 'session_id' = '$session_id'"; 
     $this->query($update_query1); 
     $this->query($update_query2); 
     $this->query($update_query3); 
     $bol = TRUE; 
    } 
    elseif($newsession == TRUE) 
    { 
     /* this is a new session, build and create it */ 
     $random_number = $this->obtain_random(); 
     $cookieval = hash("sha512",$random_number); 
     setcookie("rndn",$cookieval,$expires,'/'); 
     $query = "INSERT INTO sessions VALUES('$session_id','0','$user_ip','$random_number','$session_data','$expires')"; 
     $this->query($query); 
     //echo $cookieval."this is the cookie <<"; 
     $bol = TRUE;  
    } 
    return $bol; 
} 

代碼更新之一。仍然沒有運氣

由於某種原因,如果有任何html會話管理器啓動後呼應cookie後調用的HTML。這對我沒有任何意義

+0

您無法獲取cookie或無法設置它? – 2010-04-16 15:59:33

+0

你可以發佈你使用的代碼嗎? – 2010-04-16 16:01:42

+0

你可以在父類中設置cookie嗎? – thetaiko 2010-04-16 16:11:20

回答

0

setcookie()返回false如果php無法添加標題。因此,對於調試嘗試像

setcookie("rndn",$cookieval) or die('setcookie failed'); 

可以結合起來,與一個測試首先

$rc = setcookie("rndn",$cookieval); 
/* DEBUG-code don't forget to remove me */ 
error_log(sprintf("%s %s\n", date('Y-m-d H:i:s setcookie():'), $rc?'success':'failed')); 

setcookie()函數是否被調用(甚至更好的使用調試器像xdebug和如netbeans爲前端)。

您是否在瀏覽器中檢查了響應標題?例如。通過firebug extension。也許客戶端收到cookie頭,但不接受它。

+0

如果setcookie被調用與死亡腳本總是死亡。但它確實接受Cookie。似乎在我的會話處理程序失敗後,默認啓動並開始會話。該cookie確實被接受 – steve 2010-04-16 16:57:10

+0

所以,setcookie()的確失敗了。然後增加error_reporting級別並留意error.log。 – VolkerK 2010-04-16 19:05:00

0

根據旅遊代碼,至少你必須在cookie參數中設置/目錄。
但無論如何,首先你必須從HTTP日誌中嗅探cookie。您可以使用Firebug來觀察服務器是否設置了任何cookie,並且如果瀏覽器發回任何回

1

這個問題可能在您的if/else聲明中。您正在使用:

if($auth = TRUE AND $newsession = FALSE) 
... 
elseif($newsession = TRUE) 

使用單一=意味着你是分配值,而不是比較他們。您需要使用==而不是=

改成這樣:

if($auth == TRUE AND $newsession == FALSE) 
... 
elseif($newsession == TRUE) 

有了,你現在所擁有的代碼,你的代碼將運行每次,第一if塊,以便您的通話setcookie()從未達到。

+0

+1良好的觀察 – thetaiko 2010-04-16 16:45:15

+0

作業總是返回真正的方式 – steve 2010-04-16 17:09:54