0

mysqlデータベースを使用するカスタムセッションハンドラーに関して非常に具体的な問題があります。カスタムセッションハンドラーに関連するトピックがいくつかあるので、他のトピックを調べましたが、誰も私の質問に答えませんでした。「sessions」というクラスでカスタムセッションハンドラーを使用します。

require_once "mySQL.php";

class sessions {
private $db;
public function __construct(){
    $this->db=new mySQL('localhost', user, pw, database);
    session_set_save_handler(array(&$this,"open"),
                     array(&$this,"close"),
                     array(&$this,"read"),
                     array(&$this,"write"),
                     array(&$this,"destroy"),
                     array(&$this,"gc"));
    register_shutdown_function('session_write_close');
    session_start();
} 
public function read($sessionID){
    $abfrage="SELECT * FROM sessions WHERE id='".$sessionID."'";
    $result= $this->db->query($abfrage);
    if ($result == false){
        return '';
    }
    if (count($result) > 0){
        return $result[0]["value"];
    }
    else{ 
    return '';
    }
}

「mySQL.php」には、データベースへのmysqli接続を作成する「mySQL」クラスが記述されています。これは機能しており、問題ではありません。これが主要な問題であると思われるため、「読み取り」ルーチンに焦点を当てたいと思います。今私が経由してセッションを作成する場合

require_once "classes/sessions.php";
$SESSION=new sessions();
$token=hash("sha256",session_id().time());
$_SESSION['token']=$token;
$_SESSION['running']=1

そして、セッションに値を書き込み、適切なデータベース値が作成されます。

id (varchar 64) = 54ul84nhc3aimqc55efcs49js4
lastUpdated (int 11) = 1352226239
start (int 11) = 1352226233
value (varchar 20000) =     token|s:64:"2b92aa848a86741ef11d800c3dce527fdcee264f50de10381941241c3d9cc9ee";running|i:1;

ガベージコレクターでも問題なく動作しますが、ページをリロードしてエコーしようとすると

$_SESSION['running']

「通知:未定義のインデックス:実行中」というエラーが表示されます。デバッガーの実行は、上記の投稿された読み取りルーチンが値の代わりに1(ブール値の "true" ?!に等しい)を返すことを通知しました。その場合の読み取りルーチンの「sessionID」がセッションテーブルの「sessionID」であることを確認したので、基本的には失われます。これまでのところ、このようなカスタムセッションハンドラーによって提供される可能性にすでに感銘を受けているので、私を助けていただければ幸いです。

おそらく、ここで副次的な質問をすることも可能です。ページをリロードすると、セッションのコンストラクターが「$ SESSION = newsessions();」によって呼び出されるのは正しいですか。すでに実行中のセッションがある場合でも(ただし、この動作はsession_idを変更しません)?それとも、これは私の壊れたセッション読み取りルーチンが原因ですか?

ご協力ありがとうございました。

編集:データベースをセットアップするために、phpmyAdmin3.5.2とともにxamppディストリビューションでPHP/5.4.4とMySQL5.5.25aを使用しています。セッションテーブルは「MEMORY」形式のテーブルであるため、テキストフィールドの代わりにvarchar20000フィールドを使用しています。この記事を見たばかりですなぜmysql_query()がSELECTステートメントでTRUEを返すのですか? サーバーが突然接続を中断すると、mysql_queryが時々trueを返すことを示します。しかし、私はこれの理由が何であるかをいじることができません。私は今mySQLクラスを追加しています、おそらくそこのエラーがこの問題に関係しています:

<?php
class mySQL
{
public $mySQLiObj;
public $lastSQLQuery;
public $lastSQLStatus;
public $lastInsertID;
public function __construct($server,$user,$password,$db,$port="3306"){
    //erstelle db-objekt
    $this->mySQLiObj= new mysqli($server,$user,$password,$db,$port);
    if (mysqli_connect_errno()){
        echo "Keine Verbindung zum MySQL-Server möglich.";
        trigger_error("MYSQL-Connection-Error",E_USER_ERROR);           
        die();
    }
    //Zeichensatz auf utf8 setzen
    $this->query("SET NAMES utf8");
}
public function __destruct(){
    $this->mySQLiObj->close();
}
public function query($sqlQuery,$resultset=false){
    $this->lastSQLQuery=$sqlQuery;
    $result=$this->mySQLiObj->query($sqlQuery);
    if($resultset == true){
        if($result == false) {
            $this->lastSQLStatus=false;
        }
        else
        {
            $this->lastSQLStatus = true;
        }
        return $result;
    }
    if($resultset == false) {
        $return = $this->makeArrayResult($result);
        return $return;
    }
}
private function makeArrayResult($ResultObj){
    if ($ResultObj==false){
        //Fehler aufgetreten
        $this->lastSQLStatus=false;
        return false;
    }
    else if ($ResultObj == true) {
        //UPDATE,INSERT etc. statement es wird nur true zurückgegeben
        $this->lastSQLStatus = true;
        $this->lastInsertID = $this->mySQLiObj->insert_id;
        return true;
    }
    else if ($ResultObj->num_rows == 0){
        //Kein Ergebnis bei SELECT,SHOW,DESCRIBE oder EXPLAIN Statement
        $this->lastSQLStatus = true;
        return array();
    }
    else {
        $array = array();
        while($line = $ResultObj->fetch_array(MYSQLI_ASSOC)){
            array_push($array,$line);
        }
        $this->lastSQLStatus=true;
        return $array;
    }
}

}
4

1 に答える 1

0

試行錯誤を繰り返し、セッションハンドラーの基本的なレイアウトを入手した本を振り返った後、自分でこの質問に答えました。このように見える

$SESSION=new sessions();

重要なポイントでした。明示的な呼び出しによってセッションを作成する代わりに、呼び出す必要があります

session_set_save_handler(new sessions);

そして、sessionsクラスのコンストラクターから行を削除します。しかし、それによってそのような奇妙なエラーが発生するのは興味深いことです。

見てくれてありがとう、おそらくこれは誰かを助けます。

于 2012-11-12T19:08:56.243 に答える