使用 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';//這裡指定資料庫的名字
}
?>
在模型檔案中定義好這些參量之後一定要配置檔案裡面的內容去掉,否則還是以配置檔案為主的
第二步,在控制器中測試連線是否成功
<?phpnamespace 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);
}
}
如果你的使用者名稱和密碼正確,許可權足夠,那麼就可以查詢到你的資料