1 <?php
2 /***
3 按以前的做法,把POST来的数据,拼接sql,然后查询
4 但是在thinkphp中的做法,是把收到的数据,赋值给了一个对象的属性
5 然后对象->add()方法,就写入到数据库类了,很方便
6
7 思考:
8 1:userModel()就有username属性供你赋值吗
9 2:如果$userModel->xyz属性是保护的,
10 而我的表,又有一个字段,恰好叫xxx,那么自然是$user->xyz = $_POST['xyz'];
11 这不就出错了吗?
12 3:userModel有一些属性,很正常,比如有5个属性a,b,c,d,e
13 在注册时,又动态设置了属性f,g,h,i,j
14 疑问:在拼接sql时,要把a,b,c,d,e忽略掉才行,又怎么忽略
15
16 答:用魔术方法解决
17
18
19 通过__set()魔术方法把属性的设置都放到数组里
20 处理时,专门处理这个属性就可以了
21 这样,就不会和其他属性相冲突
22
23
24 TP中的一段用户注册代码
25 $userModel->username = $_POST['username'];
26 $userModel->email = $_POST['email'];
27 if ($num = $userModel->table('user')->add()) {
28 echo '注册成功';
29 }else {
30 echo 'fail';
31 }
32 ***/
33
34 class UserModel{
35 protected $email = 'useremail@163.com';
36 protected $data = array();
37 public function __set($k,$v){
38 $this->data[$k] = $v;//当想设置一个属性时,触发__set(),把属性名和属性值两个参数放到一个数组中
39
40 }
41 public function __get($p){
42 return isset($this->data[$p]) ? $this->data[$p] : NUlL;
43 }
44 public function __unset($p){
45 unset($this->data[$p]);
46 }
47 public function __isset($p){
48 return isset($this->data[$p]);
49 }
50 public function add(){
51 $str1 = implode(',',array_keys($this->data));
52 $str2 = implode("','",array_values($this->data));
53 $sql = "insert into table ($str1) values ('$str2')";
54 return $sql;
55 }
56 }
57 echo '<pre>';
58 $userModel = new UserModel();
59 print_r($userModel);
60
61
62 $userModel->username = 'lisi';//设置的username是不存在的
63 $userModel->email = 'lisi@126.com';//设置的email是保护的
64 print_r($userModel);
65
66 unset($userModel->email);
67 print_r($userModel);
68 //echo $usermodel->add();
69 ?>