我有这两个代码用来连接到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未定义或其他一些未定义的错误。
第二代码是这样的。我用来连接到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,并保持它打开,并直接在另一个类中使用。
请简单描述为什么第二段代码可以正常工作,而第一段代码不能正常工作。
在第一段代码中,当$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;
}
...