Home > Backend Development > PHP Tutorial > php框架yii入门遇到的有关问题

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

WBOY
Release: 2016-06-13 12:05:46
Original
915 people have browsed it

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}}';	}
Copy after login

?但是在应用配置文件(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';	}
Copy after login

?

方法二:在应用配置文件(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'),		);	}
Copy after 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 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'),		);	}
Copy after login

?

?

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

有问题的代码:

?

原因:没有authenticate()方法

把30注释掉就好了.

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template