最近在學習php 一個流行的架構yii,聽說封裝得很好,但是在學習過程中也遇到了一些問題,先總結如下:
(1)the table "{{tbl_user}}" for active record class "user" cannot be found in the database.
詳細錯誤:

錯誤原因:實體類user 的方法tablename 傳回的是“'{{tbl_user}}'”
/**
* @return string the associated database table name
*/
public function tablename()
{
return '{{tbl_user}}';
}
但是在應用配置檔案(d:\study\yii\yii\demos\shop_goods\protected\config\main.php)中,沒有指定tableprefix 。
解決方法:
方法一:去掉兩邊的花括号,改為:
return 'tbl_user';
方法二:在應用配置檔案(d:\study\yii\yii\demos\shop_goods\protected\config\main.php)中指定
tableprefix
(2)使用cpasswordhelper::verifypassword($password,$this->password); 有問題
return cpasswordhelper::verifypassword($password,$this->password); 有問題,
傳回false,但是實際上$password,$this->password 是相等。
(3)php中調用成員變量時使用->,而不是.
(4)對于注冊頁面,在對應的controller的action方法中,會使用$_post['registerform'] 來擷取表單輸入項的值,那麼$_post中的屬性名(如registerform)是由什麼決定的呢?
是由render方法的第二個參數決定的
(5)如何區分場景
比如使用者注冊時需要輸入email和repassword,而使用者登入時不需要輸入email和repassword。這就是不同的場景校驗的要素不同。如何實作呢?
在registerform 的rules()方法中
public function rules()
return array(
// username and password are required
array('username, password', 'required'),
array('email,repassword', 'required','on'=>'register'),
// rememberme needs to be a boolean
array('rememberme', 'boolean','on'=>'login'),
// password needs to be authenticated
array('password', 'authenticate','on'=>'login'),
);
'on'=>'register' 表示在“register”場景中才需要校驗。
那麼如何選擇場景呢?
在controller 中new registerform 時指定
$model=new registerform('register');
例如
array('username, password', 'required', 'on'=>'login, register'),
array('email', 'required', 'on'=>'register'),
如上所示, username 和password 特性在login 場景中是必填項。而username, password 和email 特性在register 場
景中是必填項。于是,如果我們在login 場景中執行塊指派,就隻有username 和password 會被塊指派。因為隻有它
們出現在login 的驗證規則中。另一方面,如果場景是register ,這三個特性就都可以被塊指派。
// 在登入場景中
$model=new user('login');
if(isset($_post['user']))
$model->attributes=$_post['user'];
// 在注冊場景中
$model=new user('register');
(6)如何批量擷取表單的輸入值
$model->attributes=$_post['registerform'];
在一個類的執行個體被建立後,我們通常需要用最終使用者送出的資料填充它的特性。這可以通過如下塊指派( massive
assignment)方式輕松實作:
$model=new loginform;
if(isset($_post['loginform']))
$model->attributes=$_post['loginform'];
最後的表達式被稱作塊指派(massive assignment) ,它将$_post['loginform'] 中的每一項複制到相應的模型特性
中。這相當于如下指派方法:
foreach($_post['loginform'] as $name=>$value)
{
if($name 是一個安全的特性)
$model->$name=$value;
}
(7)表單中的* 是怎麼産生的
是$model 中的rules() 方法決定的.
我們看到郵箱沒有*,那是因為在registerform 的rules() 沒有限制email 是必須的.
array('username, password', 'required','on'=>'register,login'),
array('repassword', 'required','on'=>'register'),
// 在注冊場景中,密碼repassword 必須和password 一緻。
array('repassword', 'compare', 'compareattribute'=>'password', 'on'=>'register'),
(8)include(authenticate.php): failed to open stream: no such file or directory
有問題的代碼:
原因:沒有authenticate()方法
把30注釋掉就好了.