exception ‘CDbException’ with message ‘The table “pms_goods” for active record class “PmsGoods” cannot be found in the database.’ in /data/work/admin/framework/db/ar/CActiveRecord.php:2385
上線之前,本地測試通過,把測試機代碼和Yii framework代碼一同下載下載,部署到本地Linux虛擬機中,也正常運行。
而測試服務器就遇到這個錯誤。
而我堅信 我用的只不過是Yii的 CActiveRecord 而已,代碼不會有問題,重寫了getDbConnection方法、和 tableName方法:
如下所示:Yii多數據庫 使用AR(ActiveRecord) ,
Stackoverflow 上說 把tableName下面的改成雙引號,但這並不是問題原因。
public function tableName()
{
return 'pms_goods';
}
public function getDbConnection()
{
return Yii::app()->pmsdb;
}
//調用方式,這還能錯?
PmsGoods::model()->findAll($criteria);
經過stackoverflow 和 Google一番之後依舊沒有找到原因。
花了兩天時間艱難的調試,終於找到原因。
過程:
通過vi 直接在測試服務器上改代碼,第二天我打算換種SQL調用寫法,當我改成:
Yii::app()->pmsdb->CreateCommand($sql)->queryAll();
報錯的信息不一樣了,
exception ‘CDbException’ with message ‘CDbConnection failed to open the DB connection: SQLSTATE[HY000] [2002] Connection timed out’ in /data/work/admin/framework/db/CDbConnection.php:399
瞬間明白什麼問題了,服務器是連不上這個數據庫啊!!!!!
SO,在SecureCRT上直接 mysql -h xxx.com -u xxx -p xxx
連接一下看看,果然連不上。
總結:
一條錯誤信息也許指出的問題跟明確,但也可能是誤導,如果有其他方式可以做,雖然這樣會證明自己懷疑了當前寫法,但也許會有新的發現找到其他的問題。這個例子的關鍵就是:不是數據庫裏沒有這張表,而是數據庫根本就連不上。
Yii這個框架,使用簡單,但說實話,出了問題真的很難調試。
ps:測試人員 改配置文件的時候,文件裏多了 i (囧),以及,測試機器的php,他的設置沒有錯誤輸出,這兩點讓我昨天耗了一天。
2016.09.27
後面跟運維反應了一下,是因爲阿里雲數據庫遷移,導致DNS的問題。
具體的我不是很懂,重新配置了一下就可以訪問了。
總結:自己的代碼能跑,到別的地方就不能跑,一定是因爲環境的問題。首先要想到的就是數據庫,之類的網絡是不是不能訪問,應用的權限是不是沒配置, JS是不是跨域之類的。