天天看點

php架構yii入門遇到的問題

最近在學習php 一個流行的架構yii,聽說封裝得很好,但是在學習過程中也遇到了一些問題,先總結如下:

(1)the table "{{tbl_user}}" for active record class "user" cannot be found in the database.

詳細錯誤:

php架構yii入門遇到的問題

 錯誤原因:實體類user 的方法tablename 傳回的是“'{{tbl_user}}'”

php架構yii入門遇到的問題

/** 

     * @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 。

解決方法:

方法一:去掉兩邊的花括号,改為:

php架構yii入門遇到的問題

        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方法的第二個參數決定的

php架構yii入門遇到的問題

(5)如何區分場景

比如使用者注冊時需要輸入email和repassword,而使用者登入時不需要輸入email和repassword。這就是不同的場景校驗的要素不同。如何實作呢?

在registerform 的rules()方法中

php架構yii入門遇到的問題

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() 方法決定的.

php架構yii入門遇到的問題

 我們看到郵箱沒有*,那是因為在registerform 的rules() 沒有限制email 是必須的.

php架構yii入門遇到的問題

            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

有問題的代碼:

php架構yii入門遇到的問題

原因:沒有authenticate()方法

把30注釋掉就好了.