<?php /*** 按以前的做法,把POST来的数据,拼接sql,然后查询 但是在thinkphp中的做法,是把收到的数据,赋值给了一个对象的属性 然后对象->add()方法,就写入到数据库类了,很方便 思考: 1:userModel()就有username属性供你赋值吗 2:如果$userModel->xyz属性是保护的, 而我的表,又有一个字段,恰好叫xxx,那么自然是$user->xyz = $_POST['xyz']; 这不就出错了吗? 3:userModel有一些属性,很正常,比如有5个属性a,b,c,d,e 在注册时,又动态设置了属性f,g,h,i,j 疑问:在拼接sql时,要把a,b,c,d,e忽略掉才行,又怎么忽略 答:用魔术方法解决 通过__set()魔术方法把属性的设置都放到数组里 处理时,专门处理这个属性就可以了 这样,就不会和其他属性相冲突 TP中的一段用户注册代码 $userModel->username = $_POST['username']; $userModel->email = $_POST['email']; if ($num = $userModel->table('user')->add()) { echo '注册成功'; }else { echo 'fail'; } ***/ class UserModel{ protected $email = 'useremail@163.com'; protected $data = array(); public function __set($k,$v){ $this->data[$k] = $v;//当想设置一个属性时,触发__set(),把属性名和属性值两个参数放到一个数组中 } public function __get($p){ return isset($this->data[$p]) ? $this->data[$p] : NUlL; } public function __unset($p){ unset($this->data[$p]); } public function __isset($p){ return isset($this->data[$p]); } public function add(){ $str1 = implode(',',array_keys($this->data)); $str2 = implode("','",array_values($this->data)); $sql = "insert into table ($str1) values ('$str2')"; return $sql; } } echo '<pre>'; $userModel = new UserModel(); print_r($userModel); $userModel->username = 'lisi';//设置的username是不存在的 $userModel->email = 'lisi@126.com';//设置的email是保护的 print_r($userModel); unset($userModel->email); print_r($userModel); //echo $usermodel->add(); ?>

我的微信
这是我的微信扫一扫