欄位過濾
如果寫入了資料表中不存在的欄位數據,則會被直接過濾,例如:
$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裡面有兩處跑錯誤的,一處是條件錯誤,一個是插入操作字段錯誤!
具體什麼錯誤無解,對比了3.2.2,改成一樣的條件,問題不大。