私はデータベースにセッションを保存する必要がある電子商取引のWebサイトを開発しています。私はを実装することでこれを行いました。SessionHandlerInterface PHPが提供するクラス。セッションをデータベース内に格納し、適切に読み込みます。設定されていないPHPの動作wierd
しかし、私はセッション変数を設定解除するためにunsetを使用しているときに問題に直面しています。時には動作しません。
For example:
名前がセッション変数である場合、ABC
unset
はデータベースから削除するか、変数を削除しない可能性があります。
<?php
//inc.session.php
require_once 'RemoteAddress.php';
class SysSession implements SessionHandlerInterface
{
private $remote_write;
private $remote_read;
private $link;
private $ip_address_write;
private $ip_address_read;
public function open($savePath, $sessionName)
{
$link = new mysqli("localhost","root","","cakenbake");
if($link){
$this->link = $link;
return true;
}else{
return false;
}
}
public function close()
{
mysqli_close($this->link);
return true;
}
public function read($id)
{
$this->remote_read=new RemoteAddress();
$this->ip_address_read=$this->remote_read->getIpAddress();
$stmt=$this->link->prepare("SELECT `Session_Data`,`ip_address` FROM Session WHERE `Session_Id` = ? AND `Session_Expires` > '".date('Y-m-d H:i:s')."'");
$stmt->bind_param("s",$id);
$stmt->execute();
//$result = mysqli_query($this->link,"SELECT Session_Data FROM Session WHERE Session_Id = '".$id."' AND Session_Expires > '".date('Y-m-d H:i:s')."'");
/*$result=$this->link->prepare("Some query inside")
* This shows up an error stating prepare method not found
*
*/
$res=$stmt->get_result();
if($row=$res->fetch_assoc()){
if($this->ip_address_read==$row['ip_address'])
return $row['Session_Data'];
else return "";
}else{
return "";
}
}
public function write($id, $data)
{
$this->remote_write=new RemoteAddress();
$this->ip_address_write=$this->remote_write->getIpAddress();
if(!empty($data))
{
$DateTime = date('Y-m-d H:i:s');
$NewDateTime = date('Y-m-d H:i:s',strtotime($DateTime.' + 1 hour'));
$stmt=$this->link->prepare("REPLACE INTO Session SET Session_Id = ?, Session_Expires = '".$NewDateTime."', Session_Data = '".$data."', ip_address = '".$this->ip_address_write."'");
$stmt->bind_param("s",$id);
// $result = mysqli_query($this->link,"REPLACE INTO Session SET Session_Id = '".$id."', Session_Expires = '".$NewDateTime."', Session_Data = '".$data."'");
if($stmt->execute()){
return true;
}else{
return false;
}
}
}
public function destroy($id)
{
$stmt = $this->link->prepare("DELETE FROM Session WHERE Session_Id =?");
$stmt->bind_param("s",$id);
if($stmt->execute()){
return true;
}else{
return false;
}
}
public function gc($maxlifetime)
{
$result = $this->link->query("DELETE FROM Session WHERE ((UNIX_TIMESTAMP(Session_Expires) + ".$maxlifetime.") < UNIX_TIMESTAMP(NOW()))");
if($result){
return true;
}else{
return false;
}
}
}
$handler = new SysSession();
session_set_save_handler($handler, true);
?>
上記のコードは、データベースからセッションを保存して読み込みます。この奇妙な行動のために考えられる理由かもしれない何
Structure of the session table.
。 unset
の機能も実装する必要がありますか?
この問題はどのように解決する必要がありますか?
データベースに格納するためのコードをすでに書いていることを私に示唆することができたら、それはうまくいくでしょうが、codeigniter
とYii2
のようなフレームワークは必要ありません。
この問題に関する詳細情報が必要な場合は、私の質問を更新します。
ありがとうございます!
'セッション変数を設定解除するために未設定を使用しているときに問題に直面しています。時には動作します。時にはそれがありません。'あなたのクラスでは表示されないので、 'unset()'コードを表示してください。現時点で問題を診断することは不可能です。 – MonkeyZeus
@MonkeyZeus未定義の関数は定義されていません。これはPHPで事前定義されており、 'SessionHandlerInterface'クラスでも実装する6つの関数しか含まれていません。 –
@Dilipchabariaあなたは 'unset()'は時々動作しませんが、あなたが 'unset()'をどこで使ったのかを示していないと言っています。エラーのMCVEを含めてください。 – light