一如既往的搜了超級多的教程,又一如既往的大同小異,終於被我連接上了
首先很多教程都只講了兩個文件,一個是控制器,一個是配置文件,就算有講模型類的也是說不用修改太多的,其實模型類才是關鍵,首先先列出幾個我遇到的問題
第一個: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() 重新連接別的數據庫
多轉幾圈之后腦子就昏了,而且我也沒有成功過。
所以為了解決上面的問題,直接拋棄配置文件,在模型類中設置相應數據庫的信息
第一步,模型文件
namespace Home\Model\MongoDB;
use Think\Model\MongoModel;
class Admin1MongoModel extends MongoModel{
//使用下面這句話進行數據庫的連接,其中的各個位置的含義,注意后面一定要是 admin
protected $tableName = 'admin1'; //在這里指定要操作的表
protected $dbName = 'test';//這里指定數據庫的名字
}
?>
在模型文件中定義好這些參量之后一定要配置文件里面的內容去掉,否則還是以配置文件為主的
第二步,在控制器中測試連接是否成功
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);
}
}
如果你的用戶名和密碼正確,權限足夠,那么就可以查詢到你的數據