最近、PHP という人気のフレームワーク Yii を学習していますが、学習の過程でいくつかの問題に遭遇しました。次のように要約します:
?
(1)アクティブ レコード クラス "User" のテーブル "{{tbl_user}}" がデータベース内に見つかりません.
詳細エラー:
? エラーの理由: エンティティ クラス User のメソッド tableName が "'{{tbl_user}}'" を返します
/** * @return string the associated database table name */ public function tableName() { return '{{tbl_user}}'; }
? しかし、アプリケーション設定ファイル (D:studyyiiyiidemosshop_goodsprotectedconfigmain.php) には、tablePrefix が指定されていません。
解決策:
方法 1: 両側の中括弧を削除し、次のように変更します:
/** * @return string the associated database table name */ public function tableName() { return 'tbl_user'; }
?
方法 2: アプリケーション内設定ファイル (D:studyyiiyiidemosshop_goodsprotectedconfigmain.php)
tablePrefix
を指定します (2) CPasswordHelper::verifyPassword($password,$this->password); を使用します。
return CPasswordHelper::verifyPassword($password,$this->password); 問題があります。
は false を返しますが、実際には $password,$ this->password は等しいです。
(3) PHP でメンバー変数を呼び出すときは、 の代わりに -> を使用します。
Java での実務経験のある開発者は、Yii フレームワークを使用する場合、PHP の構文ではなく Java の構文を使用することが非常に簡単です。
?
(4) 登録ページの場合、対応するコントローラーのアクションメソッドで、$_POST['RegisterForm'] を使用してフォームを取得します。項目の値を入力した場合、$_POST の属性名 (RegisterForm など) は何で決まるのでしょうか?
は、render メソッド
?
(5) の 2 番目のパラメーターによって決定されます。 シナリオの区別方法
たとえば、ユーザーは登録時に電子メールと再パスワードを入力する必要がありますが、ログイン時に電子メールと再パスワードを入力する必要はありません。これが、シナリオごとに検証要素が異なる理由です。これを達成するにはどうすればよいでしょうか?
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' は、検証が「登録」シナリオでのみ必要であることを意味します。
では、どのようにシーンを選択すればよいのでしょうか?
$model=new RegisterForm('register');
?
を指定します例
array('ユーザー名, パスワード', '必須', 'on'=>'ログイン, 登録'),
array('メールアドレス', '必須' , 'on'=>'register'),
上記のように、ログイン シナリオではユーザー名とパスワードの属性が必要です。ユーザー名、パスワード、電子メールの属性は登録フィールドに入力する必要があります。したがって、ログイン シナリオでブロック割り当てを実行すると、ユーザー名とパスワードのみがブロック割り当てされます。なぜなら、それら
だけがログイン検証ルールに現れるからです。一方、シーンがレジスターの場合は、3 つのプロパティすべてをブロックに割り当てることができます。
// ログイン シナリオ内
$model=new User('
login');if(isset($_POST['User']))
$model ->attributes=$_POST['User'];
// 登録シナリオでは
$model=new User('
register');if(isset($ _POST['User']))
$model->attributes=$_POST['User'];
方法フォームの入力値をバッチで取得します
$model->attributes=$_POST['RegisterForm']; のインスタンス後?クラスが作成されると、そのプロパティにエンド ユーザーが送信したデータを設定することが必要になることがよくあります。これは、次のような大規模な割り当てで簡単に実現できます:
$model=new LoginForm;
if(isset($_POST['LoginForm']))
$model-> _POST['LoginForm'];
最後の式は大規模代入と呼ばれ、$_POST['LoginForm'] 内の
の各項目を対応するものにコピーします。 モデルの特徴
の。これは、次の割り当てメソッドと同等です: foreach($_POST['LoginForm'] as $name=>$value)
{
if($name は安全な機能です)
$モデル ->$name=$value;
}
フォーム内の * はどのように生成されますか
は、$model の rules() メソッドによって決定されます。 には、
* がありません。これは、RegisterForm の rules() で電子メールが必須であることが制限されていないためです。
public function rules() { return array( // username and password are required array('username, password', 'required','on'=>'register,login'), array('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'), // 在注册场景中,密码repassword 必须和password 一致。 array('repassword', 'compare', 'compareAttribute'=>'password', 'on'=>'register'), ); }
(8)include(authenticate.php): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません
問題のあるコード:
?
原因:authenticate() メソッドがありません
30 をコメントアウトするだけです。