zoukankan      html  css  js  c++  java
  • 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里面相当于钩子或者回调, 很神奇啊..

  • 相关阅读:
    vue ui 命令使用
    vue环境搭建
    简版的电商项目学习——第四步:从数据库获取数据,页面跳转以及跳转页面成功与否的提示信息设置
    简版的电商项目学习——第三步:数据库创建,注册功能实现以及用户密码加密
    简版的电商项目学习——第二步:页面布局,以及路由设置
    简版的电商项目学习——第一步:express后台搭建以及基本模块、插件配置
    sass 控制指令
    继承,混合器,占位符的用法 和 sass的数据类型
    ruby 安装 和 sass入门
    大数乘法,分治O(n^1.59)
  • 原文地址:https://www.cnblogs.com/Montauk/p/10129440.html
Copyright © 2011-2022 走看看