有理解两个单独的Php代码连接到mongoDb的问题

时间:2013-03-16 16:39:50

标签: php oop mongodb

我有两个代码用于连接到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的连接并保持打开并直接在另一个类中使用。

请描述为什么第二个代码工作正常并且首先没有效果。

1 个答案:

答案 0 :(得分: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;
}
...