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里面相当于钩子或者回调, 很神奇啊..

 

posted @ 2018-12-18 22:48  Montauk  阅读(140)  评论(0编辑  收藏  举报