首頁  >  文章  >  後端開發  >  thinkphp問題諮詢

thinkphp問題諮詢

WBOY
WBOY原創
2016-09-08 08:43:501215瀏覽

欄位過濾
如果寫入了資料表中不存在的欄位數據,則會被直接過濾,例如:
$data['name'] = 'thinkphp';
$data['email'] = 'thinkphp@ gmail.com';
$data['test'] = 'test';
$User = M('User');
$User->data($data)->add();
複製程式碼
其中test欄位是不存在的,所以寫入資料的時候會自動過濾掉。
在3.2.2版本以上,如果開啟偵錯模式的話,則會拋出異常,提示:非法資料物件:[test=>test]

上面是手冊裡面的話,開啟了debug,可是就是沒報錯。之前別的項目會報的。自己重新載了官網最新的源碼,就是不報錯。特別是update的時候,條件欄位寫錯了,自己過濾了,把所有資料都update了,很蛋痛

回覆內容:

欄位過濾
如果寫入了資料表中不存在的欄位數據,則會被直接過濾,例如:
$data['name'] = 'thinkphp';
$data['email'] = 'thinkphp@ gmail.com';
$data['test'] = 'test';
$User = M('User');
$User->data($data)->add();
複製程式碼
其中test欄位是不存在的,所以寫入資料的時候會自動過濾掉。
在3.2.2版本以上,如果開啟偵錯模式的話,則會拋出異常,提示:非法資料物件:[test=>test]

上面是手冊裡面的話,開啟了debug,可是就是沒報錯。之前別的項目會報的。自己重新載了官網最新的源碼,就是不報錯。特別是update的時候,條件欄位寫錯了,自己過濾了,把所有資料都update了,很蛋痛

翻了下TP3.2.3的源碼,只有在$this->options['strict']不為空的時候才會報錯,至於在哪裡操作這個options['strict'],沒找到。

感覺是bug吧。
你可以去試著找下。

thinkphp_3.2.3_full/ThinkPHP/Library/Think/Model.class.php
第267-277行:

<code>foreach ($data as $key=>$val){
    if(!in_array($key,$fields,true)){
        // 如果字段不存在
        if(!empty($this->options['strict'])){
            // 只有在这个$this->options['strict']不为空的时候才抛异常。
            E(L('_DATA_TYPE_INVALID_').':['.$key.'=>'.$val.']');
        }
        // unset掉这个没用的字段
        unset($data[$key]);
    }elseif(is_scalar($val)) {
        $this->_parseType($data,$key);
    }
}</code>

條件的話,你可以另外再加一個where()的連貫操作

ThinkPHPLibraryThinkModel.class.php裡面有兩處跑錯誤的,一處是條件錯誤,一個是插入操作字段錯誤!
thinkphp問題諮詢
具體什麼錯誤無解,對比了3.2.2,改成一樣的條件,問題不大。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn