3.2.3 - 严重 - 未处理
采用版本是3.2.3,大概在今年6月份下载的先说问题,首先:
M('User')->where('id=1')->select();这个查询返回id为1的user数据,是正常的然后根据手册里的说明,用下面的用法:
$map['id']=1;
M('User')->where($map)->select();结果返回了所有的user数据。查看系统的类文件:Model.class.php,发现函数 protected function _parseOptions($options=array()) 有一段下面的代码
foreach ($options['where'] as $key=>$val){
$key = trim($key);
if(in_array($key,$fields,true)){
if(is_scalar($val)) {
$this->_parseType($options['where'],$key);
}
}elseif(!is_numeric($key) && '_' != substr($key,0,1) && false === strpos($key,'.') && false === strpos($key,'(') && false === strpos($key,'|') && false === strpos($key,'&')){
if(!empty($this->options['strict'])){
E(L('_ERROR_QUERY_EXPRESS_').':['.$key.'=>'.$val.']');
}
unset($options['where'][$key]);
}
}里面主要是这句:unset($options['where'][$key]);如果注释掉,那么查询正常,我的理解:
如果
key不是数字
key不是以'_'开头
key不是以'.'开头
key不是以'('开头
key不是以'|'开头
key不是以'&'开头
同时符合上面的条件则unset这个where条件,不太明白为什么要这样
我认为应该是:如果key是数字或key以'_.(|&'这些字符开头,则unset($options['where'][$key]);比较合适
