TP model where條件丟失

2022-07-07 09:24:14 字數 1466 閱讀 1883

最近我修復了乙個bug,這個bug是使用者能看到所有使用者的資料,經過排查發現是where條件丟失,導致查詢語句直接查了所有資料。

但是**並沒有問題,然後查到了 thinkphp/library/think/model.class.php 的 _parseoptions 方法:

/*

* * 分析表示式

* @access protected

* @param array $options 表示式引數

* @return array

*/protected

function _parseoptions($options=array

())

else

//資料表別名

if(!empty($options['alias']))

//記錄操作的模型名稱

$options['model'] = $this->name;

//字段型別驗證

if(isset($options['where']) && is_array($options['where']) && !empty($fields) && !isset($options['join']))

}elseif(!is_numeric($key) && '_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&'))

unset($options['where'][$key

]); }}}

//查詢過後清空sql表示式組裝 避免影響下次查詢

$this->options = array

();

//表示式過濾

$this->_options_filter($options

);

return

$options

; }

這是tp3封裝的方法,在呼叫這個方法時,如果where條件中的字段,在表中不存在的話,就會刪除這個條件,接著往下走,為什麼明明表裡有這個字段,卻被判斷為沒有?

因為開啟了字段快取(不了解的可以去搜一下tp3欄位快取)。

三種解決辦法:

1.重名model重新命名。

2.關閉字段快取(一般不會為了這種問題就關掉字段快取,基本不考慮)。

3.在model內定義好要用的字段,這樣這個model就不會再執行字段快取,也不會再從字段快取檔案取:

新發現,tp3中 m('a') 和 d('a') 也會共享快取檔案,因此請盡量注意model命名,最好用表全稱。

數學建模 一丟丟,主要是分享資源

1.1原型指的是現實生活中的物件,比如飛機,火箭等等,模型則是為了某個特定的目的將一部分資訊簡化,提煉構造原型的原型代替物,這裡強調是為了原型的某個或某些特徵,所以模型的基本特徵是由構造模型的目的決定的 模型分為物質模型,理想模型 抽象模型 物質模型分為直觀模型,物理模型 理想模型分為 思維模型,符...

網路傳輸一丟丟記錄 資料報大小限制

今早用udp傳乙個物件序列化位元組陣列,大小達到了7000 位元組,然後udp的send就報異常 乙個在資料報套接字上傳送的訊息大於內部訊息緩衝區或其他一些網路限制,或該使用者用於接收資料報的緩衝區比資料報小。網上查了一下,說是超過udp的單包容量 一般不超過1000位元組 所以報錯。如果用udp傳...

關於PRML Chap1的一丟丟附加證明

在第一章的1.2.6節,有公式 1.68 p t x,mathbf,mathbf int p t x,boldsymbol p boldsymbol mathbf,mathbf mathrm boldsymbol 這個公式實際上是在貝葉斯框架下對回歸 t y x,w 進行推斷,即給出了新的 x 注意...