1

少し前にこの質問を投稿しました。私はその質問を約1週間機能したAJAXスクリプトで更新しました。基本的にsession_start()はAJAXスクリプトから使用でき、必要なセッション変数にアクセスできます。

本当に不思議ですが、週末を過ぎて入ってきたので、今朝はこのスクリプトが機能しなくなりました。ここでは非常に簡単です。

<?php

session_start();

$ajax_connection = mysql_connect('10.X.X.X',$_SESSION['username'],$_SESSION['password']);

$result_set = array();

while ($result_set[] = mysql_fetch_assoc($results)){
    // do nothing
}

echo json_encode($results);

?>

先週、これは問題なく機能しましたが、エラーログUndefined index: usernameUndefined index: password警告が表示されます。そしてもちろん、MySQL接続は確立されていません。したがって、このスクリプトは元の接続と同じセッションを実行していません。以前error_log(session_id())は親ページとAJAXスクリプトのIDをチェックしていましたが、それらが十分に異なっていることを確認しました。ページをリロードして再試行すると、ページとAJAXスクリプトのIDはそれぞれ同じままですが、2つの異なるIDではなく、同じIDである必要があります。

とにかく、1週間以上うまく機能した後、なぜこれが機能しなくなるのか、誰かが知っていますか?

4

2 に答える 2

4

使用できるクラスの種類は次のとおりです。一度だけインスタンス化することを確認するのはシングルトンです。それをインスタンス化する

$db = Db::getInstance();

それから

$db->connect();

これは、Dbase接続を使用するためのはるかに安全な方法です(私はPDOを使用しましたが、本当にmysql_関数を使用し続ける必要がある場合は、それを変更できます)。

class Db {

    private static $instance = null;
    private $db = null;
    private $host = '';
    private $name = '';
    private $username = '';
    private $password = '';

    private function __construct() {
        $this->host = 'yourHost';
        $this->name = 'yourDbName';
        $this->username = 'yourUserName';
        $this->password = 'youPassword';
    }

    public static function getInstance() {
        if(is_null(self::$instance)) {
            self::$instance = new Db();
        }
        return self::$instance;
     }

     public function connect() {
        try {
            $this->db = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name, $this->username, $this->password);
        } catch(Exception $e) {
            throw new Exception('Connection error: either the database is unavailable or connection infos are not valid. Please contact the webmaster.');
        }
    }
}
于 2012-03-26T13:30:48.887 に答える
0

これで問題が解決するかどうかはわかりませんが、Ajaxで呼び出されるphpスクリプトの先頭に次のように追加する必要があります。

header('Cache-control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

それは私がセッションとAjaxで持っていたいくつかの問題を解決しました。

于 2012-03-26T12:35:31.753 に答える