Think PHP-- 笔记3
field方法
$model->field('id','status','nickname')->select();
相当于搜索的时候直接指定columns, 搜索大表的时候, 可以考虑用这个方法提高效率.
写入的时候可以起到安全过滤的作用.
order方法
$model->order('xxx desc')->limit(x)->select();
排序.
data方法
写入的时候, 需要用这个方法来初始化数据
$model->data($data)->add();
卧槽, 它居然不能自动组合fields, 还要自己拼一个array出来, 这怎么反注入?
哦, 实验了一下. save方法可用于update数据, add方法新增数据, 可以直接$_POST数据丢进去, 如果有需要可以拿个局域变量中转一下, 加点儿create_time之类的时间戳进去.
分页是用得最多的功能了.
$model=M('User')
$model->limit('0,10')->select();
土鳖式做法就是直接拿limit做分页
相当于limit 0, 10 (废话)
也可以用高级功能page
$model->page(2,10)->select();
区别式limit要计算偏移量, page不用, 然则也没有什么乱用, 只是方便了愚蠢的前端人员...
fetchSql
可以输出mysql语句, 可能是用来debug用的.
$sql = M('User') -> fetchSql(true) -> find();
发现一个问题, join查询的时候, 之际输出, 会将所有的JOIN ON过来的表的所有colum都拿过来了, 如果user有个password键不方便暴露出来, 怎么办?
方法1. 用排除法是不行的, 也就是->field('password', true), 没用, 对左边的表有用, 但是右边的表, 就全不显示了.
方法2: 试了改输出, 先判断, 再用for挨个改
$article = M('Article'); $data = $article->alias('a')->join('INNER JOIN think_user u ON u.user_id=a.author_id')->where('a.author_id=' . I('post.id'))->page(0, 10)->select(); if ($data != null) { for ($i = 0; $i < sizeof($data); $i++) { $data[$i]['user_password'] = ""; } } $this->ajaxReturn($data);
方法3, 只有最后一个办法了, 直接用->field('a.article_id, a.article_tile,u.user_name')用这样的办法去将sql语句直接由select * 改成select a.article_id, a.article_tile,u.user_name, 要挨个定义field, 不过缺点是一个接口这么写, 后面所有接口都得这么写啊, 怎么复用?
结论是thinkphp还是需要很多地方需要自己琢磨跟改写的.
$_auto
public $_auto = array( //表示在插入数据的时候, 自动插入当前时间键值到create_time array('user_create_time', 'time', self::MODEL_INSERT, 'function'), //自动给密码加MD5摘要 array('user_password', 'md5', self::MODEL_BOTH, 'function'), //更新的时候, 自动加入update_time array('user_update_time', 'time', self::MODEL_BOTH, 'function'), //array('user_password', 'user_repassword', '两次输出的密码不一致', 0, 'confirm', 1), );
在controller里面
public function addUser() { $user = new UserModel(); $data = array( 'user_name' => I('post.username'), 'user_password' => I('post.password'), 'user_nickname' => I('post.user_nickname'), 'user_status' => I('post.user_status'), ); if (!$user->create($data)) { $this->ajaxReturn($user->getError()); exit; } else { $userID = $user->add(); $this->ajaxReturn($user->find($userID)); } echo 'ok'; }
这样就可以用auto来自动干些比如md5 password字段, 以及自动更新create_time, update_time之类的事儿了. 这样上面的问题是不是解决了一部分, 因为你哪怕看到user的password明文, 也是没用的.
在view中引入图片
<img src="__PUBLIC__/images/bookplate.jpg"/>
路由模式为2, 即rewrite模式:
'URL_MODEL' => 2,
获取一个remember_me的checkbox, 竟然费了我半个小时.
对了, 如果切换到vue.js 是不是完全没这个问题了?我操.
var el = $('input:checkbox[name=remember_me]:checked') //console.info(el.val()); if (el.val() == 'true') { console.info('remember me'); } else { console.info('forget me'); }
OK, 切到Vue了, 遇到一个小坑, vue-resource用$http.post提交param, 结果php拿不到传过来的值, 发现是因为默认传过来的方式是ajax方式, thinkphp的I('post.username')函数竟然接不到.
没办法google了一下, 发现要改改$http的post的方法:
login() { var vm = this console.info(this.username + ' ' + this.password); let reqParams = { username: this.username, password: this.password, } console.info(reqParams) vm.$http.post( //url '/api/BBSDemo/home/user/findUserByUsernameAndPassword', //param reqParams, { emulateJSON: true }, ).then((res) => { //console.info(res.data); var data = res.data console.info(data) }) }
加上一个emulateJSON:true, 看看firefox里面的审查, 会发现提交的数据变成了表单格式, 而不再是json.
Vue有点儿意思, created里面, 初始化一些东西, data里面都是全局变量, methods里面都是函数, computed里面相当于钩子或者回调, 很神奇啊..