我正在把头发拉到这个上面。我尝试制作一个简单的脚本来存储会话,这样当用户关闭浏览器时,他们可以稍后再回来,他们的购物篮仍然完好无损。这一切似乎都很顺利,直到我注意到在某些物品上,篮子中的物品与以前的物品相同。经过一些检查后,我注意到这些奇怪页面上的会话 ID 不同!这是我的代码,位于我的框架顶部。
<?php
session_start();
function sessions(){
if( ! isset( $_COOKIE['PHPSESSID'] ) ) {
setcookie( "PHPSESSID", session_id(), strtotime('+ 30 days') );
}else{
$con = Database::getInstance();
if( session_id() != $_COOKIE['PHPSESSID'] ) {
$re = $con->query( "SELECT * FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE session_id = '" . $_COOKIE['PHPSESSID'] . "'" );
if( $re->num_rows != 0 ) {
$ar = $re->fetch_assoc();
$id = $ar['id'];
$_SESSION['basket'] = unserialize( stripslashes( $ar['basket'] ) );
$con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET session_id = '" . session_id() . "' WHERE id = '$id' " );
}
unset($_COOKIE['PHPSESSID']);
setcookie( "PHPSESSID", session_id(), strtotime('+ 30 days') );
header('Location: ' . get_base_url() );
}else{
$re = $con->query( "SELECT * FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE session_id = '" . $_COOKIE['PHPSESSID'] . "'" );
if( $re->num_rows != 0 ) {
$ar = $re->fetch_assoc();
$id = $ar['id'];
if( ! empty( $_SESSION['basket'] ) ) {
$con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET session_id = '" . $_COOKIE['PHPSESSID'] . "', data = '" . addslashes( serialize( $_SESSION['basket'] ) ) . "' WHERE id = '$id'" );
}else{
$con->query( "DELETE FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE id = '$id'" );
}
}else{
if( ! empty( $_SESSION['basket'] ) ) {
$con->query( "INSERT INTO `" . TABLE_PREFIX . "_tbl_sessions` ( `session_id`, `stamp`, `data`) VALUES ( '" . $_COOKIE['PHPSESSID'] . "', NOW(), '" . addslashes( serialize( $_SESSION['basket'] ) ) . "' )" );
}
}
}
}
echo 'cookie: ' . $_COOKIE['PHPSESSID'] . ' : session(): ' . session_id();
}
?>
非常感谢您对此事的任何帮助。
** 编辑 **
我试图让它更简单但仍然是同样的问题
<?php
function sessions(){
$con = Database::getInstance();
if( session_id() == '' ) {
if( isset( $_COOKIE['session_id'] ) ) {
session_start();
$re = $con->query( "SELECT * FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE session_id = '" . $_COOKIE['session_id'] . "'" );
if( $re->num_rows != 0 ) {
$ar = $re->fetch_assoc();
$id = $ar['id'];
if( session_id() != $_COOKIE['session_id'] ) {
$_COOKIE['session_id'] = session_id();
$con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET session_id = '" . session_id() . "' WHERE id = '$id' " );
$_SESSION['basket'] = unserialize( stripslashes( $ar['data'] ) );
}else{
if( isset( $_SESSION['basket'] ) ) {
$con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET data = '" . addslashes( serialize( $_SESSION['basket'] ) ) . "' WHERE id = '$id' " );
}
}
}else{
$con->query( "INSERT INTO `" . TABLE_PREFIX . "_tbl_sessions` ( `session_id`, `stamp`, `data`) VALUES ( '" . $_COOKIE['session_id'] . "', NOW(), '' )" );
}
}else{
session_start();
setcookie( "session_id", session_id(), strtotime('+ 30 days') );
$_COOKIE['session_id'] = session_id();
}
}else{
die('session has previously been created');
}
echo 'cookie: ' . $_COOKIE['session_id'] . ' : session(): ' . session_id();
}
?>