Heim > Backend-Entwicklung > PHP-Tutorial > php框架yii入门遇到的有关问题

php框架yii入门遇到的有关问题

WBOY
Freigeben: 2016-06-13 12:05:46
Original
913 Leute haben es durchsucht

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}}';	}
Nach dem Login kopieren

?但是在应用配置文件(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';	}
Nach dem Login kopieren

?

方法二:在应用配置文件(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 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'),		);	}
Nach dem Login kopieren

?'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 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'),		);	}
Nach dem Login kopieren

?

?

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

有问题的代码:

?

原因:没有authenticate()方法

把30注释掉就好了.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage