1. 程式人生 > >使用 thinkphp 3.2.3 連線 mongodb 資料庫

使用 thinkphp 3.2.3 連線 mongodb 資料庫

一如既往的搜了超級多的教程,又一如既往的大同小異,終於被我連線上了發火

首先很多教程都只講了兩個檔案,一個是控制器,一個是配置檔案,就算有講模型類的也是說不用修改太多的,其實模型類才是關鍵,首先先列出幾個我遇到的問題

第一個: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:[email protected]: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);
    }
}

如果你的使用者名稱和密碼正確,許可權足夠,那麼就可以查詢到你的資料