【问题标题】:mongodb connect using php使用php连接mongodb
【发布时间】:2012-07-06 06:18:59
【问题描述】:

如果密码在 mongodb connect 中有@ 怎么办? mongodb://[用户名:密码@]host1[:port1][,host2[:port2:],...]/db 假设username='abc'password='abc@123' 在 php 中我们创建 mongo db 实例,如

$m = new Mongo('mongodb://[abc:abc@123@]localhost/abc');

然后它会给出这样的错误

致命错误:未捕获的异常“MongoConnectionException”带有消息“无法获取 123@]localhost 的主机信息”

那么如何解决这类问题..

【问题讨论】:

  • 方括号只是指示连接字符串的哪一部分是可选的。您实际上不必在连接字符串中指定它们。但是,是的,密码中包含 @ 字符是一个问题,您需要遵循 Phil 的回答

标签: php mongodb


【解决方案1】:

选项 1

通过第二个参数将凭据传递给Mongo constructor

$db = new Mongo('mongodb://localhost', array(
    'username' => 'abc',
    'password' => 'abc@123',
    'db'       => 'abc'
));

选项 2

使用MongoDB::authenticate() 方法

$m = new Mongo();
$db = $m->abc;

$db->authenticate('abc', 'abc@123');

记住...

此方法有一个主要缺点:如果连接被断开然后重新连接,则新连接将无法通过身份验证。如果您使用 URI 格式,PHP 驱动程序将在建立新连接时自动对用户进行身份验证。

2014 年更新

现在不推荐直接实例化Mongo。建议使用 MongoClient 代替与上述相同的参数。例如

$m = new MongoClient('mongodb://localhost', [
    'username' => 'abc',
    'password' => 'abc@123',
    'db'       => 'abc'
]);

【讨论】:

  • 不能再使用了。它已被弃用。
  • @Pian0_M4n 谢谢。请注意,原来的答案现在已经有两年多了
【解决方案2】:

2019 年更新

我在 ubuntu 16.04 上使用了 php 7.0 版。这是解决连接问题的详细信息。 (跳过你已经完成的部分) 首先我手动安装了 mongodb,然后为它安装了 mongodb-php 驱动程序。

1) 安装 mongo 数据库。输入以下命令:

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

$ echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

$ sudo apt-get update

$ sudo apt-get install -y mongodb-org

为了正确启动Mongdb作为服务,即在系统启动时自动启动Mongodb,请按照以下步骤操作:

在/etc/systemd/system/中输入命令创建文件mongodb.service:

$ sudo nano /etc/systemd/system/mongodb.service

在其中粘贴以下内容:

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf

[Install]
WantedBy=multi-user.target

然后输入以下命令:

$ sudo systemctl start mongodb

$ sudo systemctl enable mongodb

2) 安装mongo-php驱动:

$ sudo pecl install mongodb

你也可能会收到错误:phpize not found。 Phpize 是一个用于创建构建环境的命令。此错误可能出现在安装任何 pecl 扩展时。为了解决找不到 phpize 命令的问题,用户必须安装 php5-dev 包。 要安装它,请输入命令:

 $ sudo apt-get install php7.0-dev

然后在 /etc/php/7.0/apache2 目录下的 php.ini 文件中,添加 mongo db 扩展名:

$ sudo nano /etc/php/7.0/apache2/php.ini 

在文件中添加以下行:

extension = mongodb.so;

(请注意,文件 mongodb.so 的确切位置在 /usr/lib/php/20151012/mongodb.so。)

所以 mongo db 连同它的驱动程序一起安装了。

3) 现在请记住,mongo-php 类已更改。网络中的大多数可用资源都使用已被取代的旧类提供解决方案。以下是您可以参考的链接:

http://php.net/manual/en/set.mongodb.php

http://zetcode.com/db/mongodbphp/

以下是一些基本数据库操作的命令:

$mng = new MongoDB\Driver\Manager(); // Driver Object created

将数据插入数据库:

$bulk = new MongoDB\Driver\BulkWrite;

$doc = ["_id" => new MongoDB\BSON\ObjectID, "data" => $someData, "info" => $someInfo];

$bulk->insert($doc);

$mng->executeBulkWrite('dbName.collectionName', $bulk);

用于获取数据:

$query = new MongoDB\Driver\Query([]); 

$rows = $mng->executeQuery("dbName.collectionName", $query);

foreach ($rows as $row) 
    {
         echo "$row->data - $row->info\n";
    }

【讨论】:

    【解决方案3】:

    使用 new Mongo(); 会产生问题

    “警告:实例化此类将发出 E_DEPRECATED 警告,并关闭已确认的写入。” - php.com

    使用 MongoClient() 安装

    $m = new MongoClient("mongodb://testUser:testPass@localhost:myportnumber");
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2020-01-10
      • 2018-02-23
      相关资源
      最近更新 更多