आप कोडनिर्देशक का उपयोग कर रहे हैं। इसमें पहले से निर्मित डेटाबेस में सत्रों को संग्रहीत करने की सुविधा है।
बस अपना कोड हटा दें जो काम नहीं करता है और इसके बजाय कोडनिर्देशक की सुविधा का उपयोग करें। आपको केवल इसे कॉन्फ़िगर करने की आवश्यकता है।
इसके अलावा, यदि आप वास्तव में "अपने साथ रहना" चाहते हैं, तो अनेक . हैं आपके कोड के साथ समस्याएं। यदि आप निम्नलिखित बिंदुओं का पालन करते हैं तो उन्हें आसानी से पहचाना जा सकता है:
- सत्र सेव हैंडलर के लिए प्रत्येक कॉलबैक फ़ंक्शन के बारे में पढ़ें। विशेष रूप से उन्हें कौन सा डेटा प्राप्त होता है और किस प्रारूप में (ऐसा नहीं करने से कम से कम एक त्रुटि होती है जो उस व्यवहार को ट्रिगर करने में सक्षम होती है जिसे आप "काम नहीं कर रहे" के रूप में वर्णित करते हैं)।
- त्रुटि लॉगिंग करें। सेव हैंडलर के साथ कोई समस्या होने के कारण त्रुटियां हो सकती हैं, जो उन्हें अनदेखी छोड़ सकती हैं क्योंकि ब्राउज़र को आउटपुट अब संभव नहीं है। इसके लिए आपको फाइल करने के लिए त्रुटियों को लॉग करना होगा। जब आप सत्र सेवहैंडलर के साथ समस्या निवारण करते हैं तो यह बहुत महत्वपूर्ण होता है।
- डेटाबेस इंटरैक्शन कोड को रास्ते से हटा दें। यह आपको डेटाबेस इंटरैक्शन के विफल होने की स्थिति में बेहतर त्रुटि जानकारी प्रदान करने की भी अनुमति देता है (ऐसा नहीं करने से कम से कम एक त्रुटि छिप जाती है जिसके परिणामस्वरूप आपके द्वारा वर्णित व्यवहार "काम नहीं कर रहा" के रूप में हो सकता है)।
- उस कोड को हटा दें जिसकी आवश्यकता नहीं है। मेरा मतलब है, इसकी जरूरत नहीं है। कोड होने की आवश्यकता नहीं है, इसमें त्रुटियां शामिल हो सकती हैं जिसके परिणामस्वरूप आपके यहां "काम नहीं कर रहा" परिदृश्य हो सकता है। इसलिए आप अकारण काम करने से खुद को रोक रहे हैं। एक उदाहरण:
ini_set("session.save_handler", "user");
- जब तक आपको कोई सुराग नहीं है कि आप क्या करते हैं, तब तक इसे न करें।user
. नामक कोई पूर्वनिर्धारित सेवहैंडलर नहीं है PHP में, न ही आप उसे परिभाषित कर रहे हैं।
और मूल रूप से यही है। इसलिए मैं इसके कारण होने वाली दो वास्तविक त्रुटियों को देख सकता हूं, अन्य कदम आवश्यक हैं ताकि आप भविष्य की समस्याओं से निपट सकें:
- सुनिश्चित करें कि आप हमेशा एक ही डेटाबेस तालिका से संबंधित हैं। उदाहरण के लिए, यदि आप तालिका में लिखते हैं
MY_SESSIONS
और तालिकाSESSIONS
. से पढ़ें , यह कभी काम नहीं करेगा। - सुनिश्चित करें कि आप जो डेटा PHP को वापस देते हैं वह उस डेटा के अनुकूल है जिसकी वह अपेक्षा करता है। उदाहरण के लिए, यदि आप डेटाबेस में एन्कोड किए गए डेटा बेस 64 को संग्रहीत करते हैं और इसे वापस PHP बेस 64 एन्कोडेड में देते हैं, तो उस डेटा के साथ PHP कुछ भी नहीं कर सकता है।
अन्य संभावित समस्याएं जो आपके कोड से दिखाई नहीं दे रही हैं:
- आपके पास जो डेटाबेस स्कीमा है वह आपके द्वारा वहां संग्रहीत डेटा के लिए उपयुक्त नहीं है (आपने टेबल स्कीमा प्रदान नहीं किया है, इसलिए यह नहीं कहा जा सकता है कि इससे आपको समस्या होती है या नहीं)।
- डेटाबेस लिंक पहचानकर्ता बदल सकता है क्योंकि कोडनिर्देशक स्वयं डेटाबेस कनेक्शन बना रहा है। इससे संभावित दुष्प्रभाव हो सकते हैं। स्पष्ट रूप से डेटाबेस कनेक्शन के लिए लिंक पहचानकर्ता प्रदान करने से आराम से सोने में मदद मिलती है।
- एसक्यूएल प्रश्नों में त्रुटियां जो किसी का ध्यान नहीं गया क्योंकि डेटाबेस भागों के लिए त्रुटि प्रबंधन गायब है।
उदाहरण कोड:
ob_start();
session_name("test");
session_set_cookie_params(0, '/', '.test.com');
$s = new SessionManagement();
$s->register();
session_start();
ECHO $_SESSION['test'], "\n"; # value
रिफैक्टर किया गया SessionManagement
कक्षा:
class SessionManagement
{
private $_timeout;
private $_db;
public function __construct() {
$CI =& get_instance();
$CI->load->database();
$this->_db = new LegacyMysqlDatabase(
$CI->db->hostname, $CI->db->username, $CI->db->password, $CI->db->database
);
$this->_timeout = 60 * 60 * 10;
}
public function _open() {
return TRUE;
}
public function _close() {
return TRUE;
}
public function _read($session_id) {
$db = $this->_db;
$session_id = $db->escape($session_id);
$sql = "SELECT session_data
FROM SESSION
WHERE session_id = '$session_id'";
if (!($result = $db->query($sql)) || !$result->getNumberOfRows()) {
return '';
}
$record = $result->fetchAssoc();
return $record['session_data'];
}
public function _write($session_id, $session_data) {
$db = $this->_db;
$session_id = $db->escape($session_id);
$session_data = $db->escape($session_data);
$session_expires = time() + $this->_timeout;
$sql = "REPLACE INTO SESSION (session_id, session_data, session_expires)
VALUES ('$session_id', '$session_data', $session_expires)";
return (bool)$db->query($sql); // cast to bool because PHP would cast to int
}
public function _gc($max) {
return TRUE;
}
public function _destroy($id) {
$db = $this->_db;
$session_id = $db->escape($id);
$sql = "DELETE
FROM SESSION
WHERE session_id = '$id'";
return $db->query($sql);
}
public function register() {
$registered = session_set_save_handler(
array($this, '_open'),
array($this, '_close'),
array($this, '_read'),
array($this, '_write'),
array($this, '_destroy'),
array($this, '_gc')
);
if (!$registered) {
throw new Exception('Can not register session savehandler.');
}
}
}
त्रुटि प्रबंधन के साथ डेटाबेस इंटरैक्शन कोड:
class LegacyMysqlDatabase
{
private $_hostname;
private $_username;
private $_password;
private $_database;
private $_link;
private $_initError = false;
public function __construct($hostname, $username, $password, $database) {
$this->_hostname = $hostname;
$this->_username = $username;
$this->_password = $password;
$this->_database = $database;
}
public function query($sql) {
$link = $this->getLink();
$result = mysql_query($sql, $link);
if ($result === false) {
trigger_error(sprintf('Query "%s" failed: #%d: %s', $sql, mysql_errno($link), mysql_error($link)));
throw new Exception('Failed to query Mysql database.');
}
return new LegacyMysqlResult($result);
}
public function escape($string) {
return mysql_real_escape_string($string, $this->getLink());
}
private function getLink() {
if ($this->_initError) {
throw new Exception('Failed to initialize the database.');
}
if ($this->_link === null) {
$this->_initError = true;
$result = mysql_connect($this->_hostname, $this->_username, $this->_password);
if (!$result) {
throw new Exception('Can not connect to Mysql database.');
}
$this->_link = $result;
$selected = mysql_select_db($this->_database, $this->_link);
if (!$selected) {
trigger_error(sprintf('Can not select Mysql database "%s": #%d: %s', $this->_database, mysql_errno($result), mysql_error($result)));
throw new Exception(sprintf('Can not select Mysql database "%"', $this->_database));
}
$this->_initError = false;
}
return $this->_link;
}
}
class LegacyMysqlResult
{
private $_result;
public function __construct($result) {
$this->_result = $result;
}
public function getNumberOfRows() {
return mysql_num_rows($this->_result);
}
public function fetchAssoc() {
return mysql_fetch_assoc($this->_result);
}
}