[英]Sessions aren't be saved to mysql
我有一个文件sess_function.php
该文件列出了用于控制会话的各种(6)函数。
function _open()
{
try{
// Open the database
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} //try
catch(PDOException $e){
echo "Oops, We're experiencing an error CONNECTING.";
file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);
} //catch
}
## Kill Connection to Mysql (Using PDO)
function _close(){
$dbh = null;
}
## Read a current session
function _read($id){
try{
// Open the database
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// Begin Query
$id = mysql_real_escape_string($id);
$sth = $dbh->prepare("SELECT data FROM sessions WHERE id = '$id'");
$sth->execute();
}
catch(PDOException $e){
echo "Oops, We're experiencing an error. READING";
file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);
} //catch
## return '';
}
## Write to current session
function _write($id, $data){
// WRITE Vars
try{
// Open the database
## require_once('dbi.php');
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// Begin Query
$access = time();
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$data = mysql_real_escape_string($data);
$sth = $dbh->prepare("REPLACE INTO sessions VALUES ('$id', '$access', '$data')");
$sth->execute();
}
catch(PDOException $e){
echo "Oops, We're experiencing an error. REPLACING SESSION VAL";
file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);
} //catch
}
## Destroy current session
function _destroy($id){
try{
// Open the database
## require_once('dbi.php');
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// Begin Query
$id = mysql_real_escape_string($id);
$sth = $dbh->prepare("DELETE FROM sessions WHERE id = '$id'");
$sth->execute();
}
catch(PDOException $e){
echo "Oops, We're experiencing an error.";
file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);
} //catch
}
## Clean old session data out
function _clean($max){
try{
// Open the database
## require_once('dbi.php');
$dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
// Begin Query
$old = time() - $max;
$old = mysql_real_escape_string($old);
$sth = $dbh->prepare("DELETE FROM sessions WHERE access < '$old'");
$sth->execute();
}
catch(PDOException $e){
echo "Oops, We're experiencing an error. DEL FROM SESSION";
file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);
} //catch
}
和index.php
////////////////////////////////////////////////////////////////////////////////////
###### Require Database ###### ////////////////////////
####### DB Config Setting #######
$host ='localhost'; //////////////
$dbname ='mydb';//////////
$user ='root'; //////////////
$pass =''; //////////////
/////////////////////////////////
////////////////////////
////////////////////////////////////////////////////////////////////////////////////
###### Start session ////////////////////////
session_start(); ////////////////////////
###### Call Session Functions Include ###### ////////////////////////
require_once('src/cfg/sess_function.php'); ////////////////////////
###### Call function as contained in sess_function() ###### //
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean'); //
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
该表如下所示:
问题是:这没有问题,但是sessions
表中没有任何存储...
如果我取消注释session_start();
它会引发以下警告:
Oops, We're experiencing an error. READING
Warning: session_start() Cannot send session cookie - headers already sent by sess_function.php:33)index.php on line 12
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started sess_function.php:33) in index.php on line 12
任何人??
第一条错误消息是您应该查看的内容。 PHP需要发送HTTP标头数据(一个cookie),但是sess_function.php中已经有一些输出。 标头数据不能在常规输出(例如echo
)之后发送。 您输出“糟糕,我们遇到错误。读取”,这是PHP抱怨的输出。 删除所有echo语句将解决会话问题。
然后:未设置$dbname
, $user
, $pass
和$host
变量。 global $dbname, $host, $user, $pass;
声明解决了这个问题。
最后:必须在session_start之前调用session_set_save_handler,因为否则PHP不会调用自定义函数。 输出已发送的错误发生,因为在session_start完成运行之前触发了MySQL错误(MySQL错误在 session_start 期间发生)
为什么您的session_start()被评论? 尝试打开它
您正在自动会话开始吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.