1

我有这两个代码用于连接到 mongodb。

首先我使用了这段代码,但这似乎不起作用。我不知道为什么。

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 not defined 或其他一些未定义的错误。

第二个密码是这样的。我曾经连接到 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;

我不知道为什么第二个有效但第一个代码无效。如果我在 mysql 中同时使用两者都可以正常工作。这也可能是问题,而不是在第二个代码中我创建了到 mongodatabase 的连接并保持它打开并直接在另一个类中使用。

请简单描述为什么第二个代码工作正常而第一个代码没有工作。

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 回答