发现了3.0版查询的一个问题,急!

#1 kanchaoyang

最近下载了一个3.0版,发现在使用查找的时候有问题:
 
$love= spClass("love_share");
$con="type='video' order by dateline desc limit 0,4" ;
$video=$love->findAll($con);


以上的语句会出现错误提示页面: 有两个order by 造成了错误。

根据找到了spModel.php的相应语句:
 
$where = "";
  $fields = empty($fields) ? "*" : $fields;
  if(is_array($conditions)){
   $join = array();
   foreach( $conditions as $key => $condition ){
    $condition = $this->__val_escape($condition);
    $join[] = "{$key} = '{$condition}'";
   }
   $where = "WHERE ".join(" AND ",$join);
  }else{
   if(null != $conditions)$where = "WHERE ".$conditions;
  }
  if(null != $sort){
   $sort = "ORDER BY {$sort}";
  }else{
   $sort = "ORDER BY {$this->pk}";
  }
  $sql = "SELECT {$this->tbl_name}.{$fields} FROM {$this->tbl_name} {$where} {$sort}";
  if(null != $limit)$sql = $this->_db->setlimit($sql, $limit);
  return $this->_db->getArray($sql);



把这段代码改成2.5版的如下:
 

$where = "";
  $fields = empty($fields) ? "*" : $fields;
  if(is_array($conditions)){
   $join = array();
   foreach( $conditions as $key => $condition ){
    $condition = $this->__val_escape($condition);
    $join[] = "{$key} = '{$condition}'";
   }
   $where = "WHERE ".join(" AND ",$join);
  }else{
   if(null != $conditions)$where = "WHERE ".$conditions;
  }
  if(null != $sort)$sort = "ORDER BY {$sort}";
  if(null != $limit)$limit = "LIMIT {$limit}";
  $sql = "SELECT {$this->tbl_name}.{$fields} FROM {$this->tbl_name} {$where} {$sort} {$limit}";
  return $this->_db->getArray($sql);
  




故障现象消失,不知道是不是我的配置有问题?还是什么原因,请高人指点!

2010-06-30 18:30:00

#2 jake

请仔细看看findAll的用法,

第一个参数是条件,楼主拿来当排序条件用了
第二个参数才是排序。

2010-06-30 18:31:34

#3 azwl

怎么说呢。$con 的内容只能出现在where子句,因为按find的参数是 where,sort,field,limit ,按你的写法最好用findSql

2010-06-30 18:37:47

#4 jake

findAll从SP2到SP3一直都是这几个规定的参数,你的做法是不规范的做法,只是碰巧不会出错而已。

而SP3根据这些规定的参数进行了内部的改进,而参数一直都没有任何的变化,所以可以说SP2和SP3是一样的,这也是系统向下兼容的规范。

http://speedphp.com/manual/spmodelfindAll

2010-06-30 18:48:12

#5 jake

PS: 楼主不好意思,误操作把你一个回帖删除了,SORRY!

2010-06-30 18:50:10

#6 kanchaoyang

老大,能不能把我写的代码,改写成一个规范的代码,我参考下,谢谢,给您添麻烦了!‘’
 
$con="type='video' order by dateline desc limit 0,4" ;
$video=$love->findAll($con);

2010-06-30 18:52:55

#7 jake

$con=" type='video' " ;
$video=$love->findAll($con, 'dateline desc ', '*', '0,4');

2010-06-30 18:55:37

#8 kanchaoyang

终于明白了,原来规范的写法是这样的,汗,2.5版的,我写的都是不规范的!真的很希望看到这种规范的具体的代码多些!

2010-06-30 19:02:13