2016-03-24 5 views
0

私はデータベースにセッションを保存する必要がある電子商取引のWebサイトを開発しています。私はを実装することでこれを行いました。SessionHandlerInterface PHPが提供するクラス。セッションをデータベース内に格納し、適切に読み込みます。設定されていないPHPの動作wierd

しかし、私はセッション変数を設定解除するためにunsetを使用しているときに問題に直面しています。時には動作しません。

For example:名前がセッション変数である場合、ABCunsetはデータベースから削除するか、変数を削除しない可能性があります。

<?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の機能も実装する必要がありますか?

この問題はどのように解決する必要がありますか?

データベースに格納するためのコードをすでに書いていることを私に示唆することができたら、それはうまくいくでしょうが、codeigniterYii2のようなフレームワークは必要ありません。

この問題に関する詳細情報が必要な場合は、私の質問を更新します。

ありがとうございます!

+1

'セッション変数を設定解除するために未設定を使用しているときに問題に直面しています。時には動作します。時にはそれがありません。'あなたのクラスでは表示されないので、 'unset()'コードを表示してください。現時点で問題を診断することは不可能です。 – MonkeyZeus

+0

@MonkeyZeus未定義の関数は定義されていません。これはPHPで事前定義されており、 'SessionHandlerInterface'クラスでも実装する6つの関数しか含まれていません。 –

+0

@Dilipchabariaあなたは 'unset()'は時々動作しませんが、あなたが 'unset()'をどこで使ったのかを示していないと言っています。エラーのMCVEを含めてください。 – light

答えて

0

この問題はunset機能ではなく、write機能で発生します。write機能は、特定のセッションIDに対して行われたすべての更新を担当します。

wierdの動作は未設定ではありませんが、実装した書き込み機能があります。

あなたのデータが空であるかどうかをチェックする制約があるかどうかを確認してください。特定の変数の削除後にその特定のIDのデータベースが空である必要があります。書き込みが行を更新しようとします。空の値ですが、その制約はありません。

!emptyタグを削除すると、チャームのように機能します。

関連する問題