0
<?php
    try{
     $conn = new PDO("mysql:host=$DB_SERVER;dbname=$DB_NAME",$DB_USER,$DB_PASS);
    }

class SessionManager {

        var $life_time;
        function SessionManager() {
            global $conn;
            $this->life_time = get_cfg_var("session.gc_maxlifetime");

            // Register this object as the session handler
            session_set_save_handler( 
                array( &$this, "open" ), 
                array( &$this, "close" ),
                array( &$this, "read" ),
                array( &$this, "write" ),
                array( &$this, "destroy"),
                array( &$this, "gc" )
            );
        }



        function read( $id ) {
            global $conn;
            $data = "";
            $time = time();
            $newid = $id;       
            $sql = "SELECT session_data FROM session_tmp WHERE session_id=? AND expired_date > ?";
            $q = $conn->prepare($sql);
            $result = $q->execute(array($newid, $time));
            while($r = $q->fetch(PDO::FETCH_ASSOC)){
                $data = $row['session_data'];
            }
            return $data;
        }


        function write( $id, $data ) {            
            $time = time() + $this->life_time;
            global $conn;
            $newid = $id;
            $newdata = $data;
            $sql = "SELECT session_id FROM session_tmp WHERE session_id = ?"; // error happen here!!!!
            $q = $conn->prepare($sql);
            $result = $q->execute(array($newid));
            return TRUE;
        }
}

に追加global $conn;するfunction read()と、エラーが修正されます。global $conn;でエラーを修正できない理由がわかりませんfunction write()。エラーを修正するには?

4

1 に答える 1

1

PHP では、変数 like$connは、関数内で定義されている場合にのみ関数内で使用できます。「の中で定義された」という言葉は、「の中で割り当てられた」という意味です。

あなたの場合、は関数$conn内では定義されていませんが、すべての関数の外にあります。したがって、グローバル変数 $conn を参照する必要があることを伝える必要があります。これは、write()write()

   global $conn;

globalの使用は非常に悪いコード スタイルであることに注意してください。を使用する必要はありませんglobal

グローバルの代わりに、次のようにすることもできます:

// This class should actually be a singleton class
// http://en.wikipedia.org/wiki/Singleton_pattern
//
class CDBSession {

  protected 
    $conn;

  public function __construct( $DB_SERVER, $DB_NAME, $DB_USER,$DB_PASS ) {

      $this->conn 
         = new PDO("mysql:host=$DB_SERVER;dbname=$DB_NAME",$DB_USER,$DB_PASS);

  } // __construct

  public function getPDO() {

      return $this->conn;

  }      

}

class SessionManager {

  protected 
    $_PDOSession;

  public function __construct( CDBSession $theDBSession ) {

      $this->_PDOSession = $theDBSession;

  } // __construct


  ... other methods need to access $this->_PDOSession->getPDO() too ...

} // class SessionManager

最後に、次のように SessionManager を使用する必要があります。

$mySessionManager 
  = new SessionManager(new CDBSession($DB_SERVER, $DB_NAME, $DB_USER,$DB_PASS));
于 2012-09-01T23:21:05.893 に答える