使用 thinkphp 3.2.3 连接 mongodb 数据库

来源:互联网 发布:希尔排序算法 java 编辑:程序博客网 时间:2024/06/05 06:01

一如既往的搜了超级多的教程,又一如既往的大同小异,终于被我连接上了发火

首先很多教程都只讲了两个文件,一个是控制器,一个是配置文件,就算有讲模型类的也是说不用修改太多的,其实模型类才是关键,首先先列出几个我遇到的问题

第一个:Call to a member function selectCollection() on null


第二个:无法加载数据库驱动:Think\Db\Driver\Mongodb


第三个:Failed to connect to:127.0.0.1:27017:SASL Authentication failed on database 'test':Authentication failed


第四个:127.0.0.1:27017:not authorized for query on system.users


第一个问题是由于没有传入集合名,即使你以为自己传入了,通过在对应的模型类下设置参数就行了 protected $tableName        =   'admin1';

第二个问题是由于配置时将 mongo 写成了 mongodb,

第三个是没有选择 admin 表进行登录,

第四个是你登录时操作的表超过了你登录所用帐号的权限

其次再来讲以下我失败的例子

我首先在模块下的 config.php 中配置了数据库的配置参数

    'DB_TYPE'               =>  'mongo',     // 数据库类型
    'DB_HOST'               =>  '127.0.0.1', // 服务器地址
    'DB_NAME'               =>  'admin',          // 数据库名
    'DB_USER'               =>  'trouble i am in',      // 用户名
    'DB_PWD'                =>  'trouble i am in',          // 密码
    'DB_PORT'               =>  '27017',        // 端口

(把  'DB_TYPE'               =>  'mongo',     设置成  'DB_TYPE'               =>  'mongodb',     就会出现上面的第二类问题)

但是这样配置完了之后问题就来了,我上面登录的是 admin 数据库,但是我实际上操作的又是 test 的表,如果上面修改成 test 的表,就会出现上面的第三类错误,而在成功登录 admin 数据库后,我再使用 thinkphp 的 db() 重新连接别的数据库快哭了多转几圈之后脑子就昏了,而且我也没有成功过。

所以为了解决上面的问题,直接抛弃配置文件,在模型类中设置相应数据库的信息

第一步,模型文件

<?php

namespace Home\Model\MongoDB;
use Think\Model\MongoModel;

class Admin1MongoModel extends MongoModel{

    //使用下面这句话进行数据库的连接,其中的各个位置的含义,查看我的这篇文章
    protected $connection       =   'mongo://admin1:admin1@127.0.0.1:27017/admin';  //这里跟前一篇使用 MongoClient 连接 MongoDB 的格式一样,注意后面一定要是 admin

    protected $tableName        =   'admin1'; //在这里指定要操作的表

    protected $dbName           =   'test';//这里指定数据库的名字
}

?>

在模型文件中定义好这些参量之后一定要配置文件里面的内容去掉,否则还是以配置文件为主的

第二步,在控制器中测试连接是否成功

<?php

namespace Home\Controller;

use Think\Controller;

use Home\Model\MongoDB\Admin1MongoModel;


class IndexController extends Controller {
    public function index() {
        $mondel = new Admin1MongoModel("admin1"); //这里传不传如表名都没关系
        $message = $mondel->find(); //简单的查询一个数据
        var_dump($message);
    }
}

如果你的用户名和密码正确,权限足够,那么就可以查询到你的数据


0 0
原创粉丝点击