php架構yii入門遇到的有關問題

來源:互聯網
上載者:User
php架構yii入門遇到的問題

最近在學習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 string the associated database table name */public function tableName(){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中調用成員變數時使用->,而不是.

有java工作經驗的開發人員,在使用yii架構時非常容易使用. 來引用成員變數,這是java的文法,不是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 requiredarray('username, password', 'required'),array('email,repassword', 'required','on'=>'register'),// rememberMe needs to be a booleanarray('rememberMe', 'boolean','on'=>'login'),// password needs to be authenticatedarray('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');
if(isset($_POST['User']))
$model->attributes=$_POST['User'];

?

?(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 是必須的.

public function rules(){return array(// username and password are requiredarray('username, password', 'required','on'=>'register,login'),array('repassword', 'required','on'=>'register'),// rememberMe needs to be a booleanarray('rememberMe', 'boolean','on'=>'login'),// password needs to be authenticatedarray('password', 'authenticate','on'=>'login'),// 在註冊情境中,密碼repassword 必須和password 一致。array('repassword', 'compare', 'compareAttribute'=>'password', 'on'=>'register'),);}

?

?

(8)include(authenticate.php): failed to open stream: No such file or directory

有問題的代碼:

?

原因:沒有authenticate()方法

把30注釋掉就好了.

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.