1. 程式人生 > >Think PHP-- 筆記3

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.