2016-08-29 1 views
3

MYSQLのセッションハンドラについてthis online tutorialを見て、この部分については本当に混乱しました:MySQLのセッションハンドラの難し

table_XXX ==表XXX。 col_XXX ==列XXX。 sid ==セッションID

読む方法:

public function read($session_id) 
    { 
     $this->db->exec('SET TRANSACTION ISOLATION LEVEL READ COMMITTED'); 
     $this->db->beginTransaction(); 
     /** 
     * the data is selected and no other ppl can interfere 
     * the writing process until COMMIT is reached 
     */ 
     $sql = "SELECT $this->col_expiry, $this->col_data 
       FROM $this->table_sess 
       WHERE $this->col_sid = :sid FOR UPDATE"; 
     $selectStmt = $this->db->prepare($sql); 
     $selectStmt->bindParam(':sid', $session_id); 
     $selectStmt->execute(); 
     $results = $selectStmt->fetch(\PDO::FETCH_ASSOC); 
     if ($results) { 
      if ($results[$this->col_expiry] < time()) { 
       // return empty if data out of date 
       return ''; 
      } 
      return $results[$this->col_data]; 
     } 

     return $this->initializeRecord($selectStmt); 
    } 

プロテクトメソッド:

protected function initializeRecord(\PDOStatement $selectStmt) 
    { 
     try { 
      $sql = "INSERT INTO $this->table_sess 
        ($this->col_sid, $this->col_expiry, $this->col_data) 
        VALUES (:sid, :expiry, :data)"; 
      $insertStmt = $this->db->prepare($sql); 
      $insertStmt->bindParam(':sid', $session_id); 
      $insertStmt->bindParam(':expiry', $this->expiry); // expiry is defined 
      $insertStmt->bindValue(':data', ''); 
      $insertStmt->execute(); 
      return ''; 
     } catch(\PDOException $e) { 
      $this->db->rollBack(); 
      throw $e; 
     } 
    } 

Writeメソッド: 'プロテクトメソッド' で

public function write($session_id, $data) 
    { 
     try { 
      $sql = "INSERT INTO $this->table_sess ($this->col_sid, 
        $this->col_expiry, $this->col_data) 
        VALUES (:sid, :expiry, :data) 
        ON DUPLICATE KEY UPDATE 
        $this->col_expiry = :expiry, 
        $this->col_data = :data"; 
      $stmt = $this->db->prepare($sql); 
      $stmt->bindParam(':expiry', $this->expiry, \PDO::PARAM_INT); 
      $stmt->bindParam(':data', $data); 
      $stmt->bindParam(':sid', $session_id); 
      $stmt->execute(); 
      return true; 
     } catch (\PDOException $e) { 
      if ($this->db->inTransaction()) { 
       $this->db->rollback(); 
      } 
      throw $e; 
     } 
    } 

、そこにライン8、 $ session_idであり、明らかに$ session_idは保護されたmethに渡されませんod、その行のbindParam()は単純に何もバインドしていませんか? initializeRecord()は単に有効期限のある行を開始しただけですが、何もしませんでしたか?そして、writeメソッドが呼び出された後にsidとデータが挿入されますか?

+0

保護されたメソッドにsession_id引数を渡すのではなく、他のメソッドに渡します。だから私は空であると思う。 – Cagy79

+0

@ Cagy79だから、著者は一貫していると言っているのですか? –

+0

@ Cagy79また、最後の2つの質問については正しいですか? –

答えて

0

これは、SQL文を作成するので、WHERE $this->col_sid = :sidなどで多くの文字列作成トリッキーを行います。

->execute()を実行する直前に、これらのSQL文をエコーまたはダンプして、その内容を確認してみることもできます。それはトラブルシューティングに役立ちます。

保護されたメソッドには、$session_idがありません。そこには$this->sidの価値がありますか?

+0

これは最高の答えここにあると思います –

+0

このコードは実際には著者のコードであり、$ this-> sidはありません –

関連する問題