我搜索了很多,发现很多类似于我的问题,但没有我在哪里建立我的芒果,所以我在这里问。
我有以下代码。
class Checkout
{
static $dbCon = null;
private $CheckoutId = null;
public function __construct()
{
echo"Contructor";
// Check if have an checkout already
$Prepare = Checkout::$dbCon ->prepare("SELECT * FROM checkouts WHERE SessionId = :SessionId AND LastTouchTime >= :Time ORDER BY Id DESC");
$Prepare -> bindValue(':SessionId',session_id());
$Prepare -> bindValue(':Time',0); // Will be something like time()-(60*60*2)
try{
$Prepare -> execute();
if($Prepare -> rowCount() != 0)
{
$Checkout = $Prepare->fetch(PDO::FETCH_ASSOC);
$ThisVar = unserialize($Checkout['ObjectSerialized']);
foreach($ThisVar as $Key => $Val)
$this->$Key = $Val;
$this->CheckoutId = $Checkout['Id'];
echo " -> $this->CheckoutId\n";
}
}catch(PDOException $e)
{ die("Error Getting checkout From Db: ".$e->getMessage()); }
}
public function __destruct()
{
echo "Destructor -> ".(is_null($this->CheckoutId)?'Null':$this->CheckoutId)."\n";
if(is_null($this->CheckoutId))
{// Insert Checkout In db
$InsertCheckout = Checkout::$dbCon->prepare("INSERT INTO checkouts (`SessionId`,`LastTouchTime`,`ObjectSerialized`) VALUES(:SessionId,:LastTouchTime,:ObjectSer);");
$InsertCheckout -> bindValue(':SessionId',session_id());
$InsertCheckout -> bindValue(':LastTouchTime',time());
$InsertCheckout -> bindValue(':ObjectSer',serialize($this));
try{
$InsertCheckout -> execute();
echo "Just Inserted Checkout\n";
}catch(PDOException $e)
{
die("Error SavingCart In Db: ".$e->getMessage());
}
}
else
{
//$UpdateCheckout = Checkout::$dbCon->prepare("");
}
}
}
我像以下
一样创建这个类Checkout::$dbCon = new $PDOObject; ( is valid )
$Checkout = new Checkout();
我得到的结果是奇怪的事情。
Contructor -> 142
Destructor -> Null
Just Inserted Checkout
Destructor -> 142
你看这里如果contruct给我一个数字,这意味着这个数字在$ this-> $ CheckoutId
但是然后析构函数运行并且$ CheckoutId中没有数字,所以它重新插入一条新记录。
然后析构函数再次运行并且ops这次他有一个数字,所以它会尝试更新记录。
是否有遗漏的东西?
修改
如果我评论该行$ThisVar = unserialize($Checkout['ObjectSerialized']);
它不会毫无理由地运行破坏。
为什么?