PHP Session Karışıklık

4 Cevap php

Tamam, ben cehennem gibi kafam karıştı. Ben bir oturumda saklamak bir nesne var. Ben bu nesneye öğeler ekleyebilirsiniz. Şimdiye kadar oldukça basit. Ben böyle nesnesi başlatılamıyor:

$template = new Template($mysqli);
$_SESSION['template'] = serialize($template);

Şimdi bu yeni nesneyi spanking bir marka yaratmak ve oturuma atamak gerekir. Ben daha sonra bir AJAX isteği ile öğeleri ekler bazı kodlar var. Aşağıdaki gibi bu kodu:

$template = unserialize($_SESSION['template']);
$prodid = $_GET['product_id'];
$template->addItem($prodid);
echo var_dump($template->getItems());
$_SESSION['template'] = serialize($template);

Yine, basit olmalıdır. Şimdi burada mesele o, ben şimdiye kadar eklediğiniz tüm öğeleri almak gerekir iken kodunun ilk biti sayfa düzeltmek değil yeniden, $_SESSION['template'] sıfırlamayı olmadığını, var.

Ben yaramazlık neden olan dosyayı buldum ama ben bu konuda ne yapabilirim bilmiyorum. Bir dahil oluyor ve bu işlev için sitenin farklı bölümleri için gerekli oluyor. Ben siteye ekleyerek işlevselliği değilim, ben işlevsellik kaldırıldı eğer sahipleri lütfen olurdu sanmıyorum. İşte dosya:

<?php

include_once( 'DBE.class.php' ) ;

################################################
# Function: Sessions_open
# Parameters: $path (string), $name (string)
# Returns: bool
# Description: This is an over-ride function call
#		that we need to create so that the php internal
#		session manager doesn't store our session in the
#		file system, since we are storing it in the
#		db. Storing a session in a file system on the
#		server inhibits scalability for two reasons:
#		1: A large number of users may be hitting the site
#			and clog the space on the hard-drive of the server
#			due to the sheer amount of session files stored
#		2: The website may be behind a load-balancer and
#			therefore the server handling the page request
#			may not have the session stored on its file system
################################################
function Sessions_open ( $path, $name ) {
	return TRUE ;
}


################################################
# Function: Sessions_close
# Parameters: N/A
# Returns: bool
# Description: This is an over-ride function call
#		that we need to create so that the php internal
#		session manager doesn't store our session in the
#		file system, since we are storing it in the
#		db. Storing a session in a file system on the
#		server inhibits scalability for two reasons:
#		1: A large number of users may be hitting the site
#			and clog the space on the hard-drive of the server
#			due to the sheer amount of session files stored
#		2: The website may be behind a load-balancer and
#			therefore the server handling the page request
#			may not have the session stored on its file system
################################################
function Sessions_close () {
	return TRUE ;
}


################################################
# Function: Sessions_read
# Parameters: $SessionID (string)
# Returns: (string) or (false) on error
# Description: This function is used at startup to read
#			the contents of the session. 
#			If no sess data, the empty string ("") is returned.
#			Otherwise, the serialized sess data is returned.
#			On error, false is returned.
################################################
function Sessions_read ( $SessionID ) {

	include_once( 'DBE.class.php' ) ;
	$dbe = new DBE() ;

	//default return value to false
	$returnVal = FALSE ;

	$query = "SELECT DataValue
					 	FROM Sessions 
						WHERE SessionID = '$SessionID' " ;

	$result = $dbe->Select( $query ) ;

	if( count( $result ) == 1 ) {
		$returnVal = $result[0]['DataValue'] ;

		//update the session so that we don't time-out after creating
		$query = "UPDATE Sessions
							SET LastUpdated = NOW()
							WHERE SessionID = '$SessionID'" ;
		$dbe->Update( $query ) ;

	} else {
		//Insert here to simplify the write function
		$query = "INSERT INTO Sessions (SessionID, DataValue) VALUES ( '$SessionID', '' )" ;

		$dbe->Insert( $query ) ;			//pass the insert stmt

		//set returnVal to '' being that we didn't find the SessionID
		$returnVal = '' ;
	}

	return( $returnVal ) ;
}

################################################
# Function: Sessions_write
# Parameters: $SessionID (string), $Data
# Returns: bool
# Description: This function is used at startup to read
#			the contents of the session. 
#			If no sess data, the empty string ("") is returned.
#			Otherwise, the serialized sess data is returned.
#			On error, false is returned.
################################################
function Sessions_write( $SessionID, $Data ) {

	include_once( 'DBE.class.php' ) ;
	$dbe = new DBE() ;

	//default to true
	$returnVal = TRUE ;

	//update the session
	$query = "UPDATE Sessions 
							SET DataValue = '$Data'
						WHERE SessionID = '$SessionID'" ;

	$result = $dbe->Update( $query ) ; //pass the update stmt to the dbEngine..

	//test for success
	if( $result == -1 )
		$returnVal = FALSE ;

	//return the return value
	return( $returnVal ) ;
}


################################################
# Function: Sessions_delete
# Parameters: $SessionID (string)
# Returns: bool
# Description: This function is used to delete the session
################################################
function Sessions_destroy( $SessionID ) {

	include_once( 'DBE.class.php' ) ;
	$dbe = new DBE() ;

	$query = "DELETE FROM Sessions WHERE SessionID = '$SessionID' " ;

	$dbe->Delete( $query ) ;

	return( TRUE ) ;
}

################################################
# Function: Sessions_delete
# Parameters: $SessionID (string)
# Returns: bool
# Description: This function is used to delete the session
################################################
function Sessions_gc( $aMaxLifetime ) {

	include_once( 'DBE.class.php' ) ;
	$dbe = new DBE() ;

	$query = "DELETE FROM Sessions WHERE (UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP( LastUpdated )) > $aMaxLifetime " ;

	$dbe->Delete( $query ) ;

	return( TRUE ) ;
}

	session_set_save_handler( "Sessions_open", "Sessions_close",
                                 "Sessions_read", "Sessions_write",
                                 "Sessions_destroy", "Sessions_gc" ) ;

?>

Ben bu oturumların temel işlevlerini değişiyor olduğunu düşünüyorum, ama ben pek emin değilim. Ve bu oturumda şablonu sıfırlamak ile benim sorun neden oluyor. Herkes herhangi bir fikir var ya ben bu sorunu gidermek için neler yapabileceğini biliyorum. Ben tamamen bu yüzden herhangi bir yardım büyük beğeni topluyor stumped.

4 Cevap

Ben bu sorunu ise emin değilim, ama bu ben kodunuzu okumak zaman dışarı atlar budur:

Sizin tefrika nesne mysql bağlantısı dayanır

$ Template = new Template ($ mysqli);

nesne sorunsuz (belki) serileştirilebilir ve un-tefrika ederken, mysql bağlantısı, böylece un-tefrika $ şablon geçersiz bağlantısı / dosya sap üzerinde çalışmasına çalışır olamaz.

Geçerli bir db bağlantısı için un-tefrika nesneyi yeniden bağlama deneyebilirsiniz.

Şablon sınıf içeride ne olduğunu bilmeden (ve hangi kaynakları kullandığı ve nasıl) olmadan neyin yanlış olduğunu tahmin etmek zor ama ben bu aramaya başlamak için nerede yeterince iyi bir ipucudur umuyoruz.

Sana ben neden bahsettiğimi daha iyi bir fikir vermek için, bu göz önünde bulundurun:

template.php

<?php

class Template {
 function __construct($c) {
   $this->conn = $c;
   $this->foo = "bar";
 }
 function get_data() {
  $result = mysql_query("select 1234 as test", $this->conn);
  $data = mysql_fetch_array($result);
  return $data;
 }

 function attach_db($c) {
   $this->conn = $c;
 }
}

?>

first.php

<?php
session_start();
require('template.php');

$conn = mysql_connect('localhost', 'root', '');
$template = new Template($conn);
?>
<pre>

Your $template var, freshly created:
<?php var_dump($template); ?>

Accessing the resources:
<?php var_dump($template->get_data()); ?>

<?php
$_SESSION['template'] = serialize($template);
?>

</pre>

other.php

<?php
session_start();
require('template.php');

$template = unserialize($_SESSION['template']);
?>
<pre>

Unserialized $template:
<?php var_dump($template); ?>
(notice that $template->foo === "bar" so your session un/serialization is working correctly)

Accessing the (now invalid) mysql resources:
<?php var_dump($template->get_data()); ?>

</pre>

First.php arayarak bu vermelidir:

Your $template var, freshly created:
object(Template)#1 (2) {
["conn"]=>
resource(3) of type (mysql link)
["foo"]=>
string(3) "bar"
}

Accessing the resources:
array(2) {
[0]=>
string(4) "1234"
["test"]=>
string(4) "1234"
}

Others.php çağırarak neden:

Unserialized $template:
object(Template)#1 (2) {
["conn"]=>
int(0)
["foo"]=>
string(3) "bar"
}
(notice that $template->foo === "bar" so your session un/serialization is working correctly)

(Şimdi geçersiz) mysql kaynaklara erişme:

Uyarı: mysql_query (): Verilen argüman hattı 9 template.php geçerli MySQL-Link kaynak değil

Warning: mysql_fetch_array (): Verilen argüman hattı 10 template.php geçerli MySQL result resource değildir

bool (false)

To solve that you can re-create the resources that cannot be un/serialized.
Like this:

solution.php

<?php
session_start();
require('template.php');

$template = unserialize($_SESSION['template']);
?>
<pre>

Unserialized $template:
<?php var_dump($template); ?>

Attaching a valid db connection:
<?php
$conn = mysql_connect('localhost', 'root', '');
$template->attach_db($conn);
var_dump($template);
?>

Accessing the resources:
<?php var_dump($template->get_data()); ?>

</pre>

Şimdi, first.php denilen sonra solution.php çağırarak bu vermelidir:

Unserialized $template:
object(Template)#1 (2) {
["conn"]=>
int(0)
["foo"]=>
string(3) "bar"
}

Attaching a valid db connection:
object(Template)#1 (2) {
["conn"]=>
resource(3) of type (mysql link)
["foo"]=>
string(3) "bar"
}

Accessing the resources:
array(2) {
[0]=>
string(4) "1234"
["test"]=>
string(4) "1234"
}

Ben senin şablon sınıf ne bilmeden, dediğim gibi, bu sadece bir olasılık .. ne oluyor kesin olarak söylemek mümkün değil ;)

İyi şanslar!

Onlar DB mağaza oturum verilerine standart oturum işleyicisi geçersiz gibi görünüyor.

Oturumlar tabloda bir görünüm var ve tefrika nesne doğru saklanır olduğunu kontrol edin.

Peki, sizin veri (hiç değilse) saklanır oluyor nasıl görmek için veritabanını kontrol etmek gerekir. Ben başlamak istiyorum burada kesinlikle bulunuyor.

Bu AJAX çağrı oturum tanımlama veri içermiyorsa mümkün ve farklı oturumda yazıyor.

Kullanmak Fiddler ve kesin istek gönderilen belirleyebilir misiniz?