1

私はmongodbに接続するために使用するこれらの2つのコードを持っています。

最初にこのコードを使用しましたが、これは機能していないようです。理由はわかりません。

class DbConnection
{
    static $db = NULL;

    static function getMongoCon()
    {
        if (self::$db === null)
        {
            try {
                $m = new Mongo("mongodb://username:password@localhost:27017");


            } catch (MongoConnectionException $e) {
                die('Failed to connect to MongoDB '.$e->getMessage());
            }
            self::$db = $m;
        }
        else
        {
            return self::$db;
        }
    }
}

この後、私はこの方法を使用して別のクラスのmongoを接続しました

   $db=DbConnection::getMongoCon();
   $database=$db->databasename;
     $collection=$db->users;

しかし、これは常に機能するとは限りません。$dbが定義されていないエラーまたはその他の未定義のエラーが常に発生します。

2番目のコードはこれです。複数の接続を作成せずにmongodbに接続するために使用しました。これは問題なく正常に動作します。

class DbConnection{

    static protected $_instance;

    protected $db = null;

    final protected function __construct() {
        $m = new Mongo("mongodb://username:password@localhost:27017");
        $this->db = $m->selectDB( "databasename" );
    }

    static public function getInstance() {
        if (!(self::$_instance instanceof self)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function getConnection() {
        return $this->db;
    }

    final protected function __clone() { }
}

私が使用した別のクラスでこのコードを使用するには

  $db=DbConnection::getInstance()->getConnection();

         $collection=$db->users;

なぜ2番目のコードが機能したのかわかりませんが、最初のコードは機能しませんでした。mysqlで両方を使用すると、両方とも正常に機能します。また、これは、mongodatabaseへの接続を作成し、それを開いたままにして別のクラスで直接使用する2番目のコードよりも問題になる可能性があります。

2番目のコードが正常に機能し、最初のコードが機能しなかった理由を簡単に説明してください。

4

1 に答える 1

2

最初のコードでは、$db変数がnullであり、新しい接続を作成すると、getMongoCon関数は何も返さないため、例でそれを使用しようとすると、変数に$db=DbConnection::getMongoCon();割り当てられることになります。null$db

正しく機能させるには、次のようにする必要があります。

...
static function getMongoCon()
{
    if (self::$db === null)
    {
        try {
            $m = new Mongo("mongodb://username:password@localhost:27017");

        } catch (MongoConnectionException $e) {
            die('Failed to connect to MongoDB '.$e->getMessage());
        }
        self::$db = $m;
    }

    return self::$db;
}
...
于 2013-03-16T16:58:14.047 に答える