虽然yii提供了ar模型,但是当有很复杂的sql时,我们大多数还是写原始sql,那样会遇到打印sql问题
修改CDbCommand.php
增加如下代码
public $inputParams = array();
在public function bindValue($name, $value, $dataType=null) 方法中增加如下代码
$this->inputParams[] = array($name, $value, $dataType=null);
注意是在return 以前加
增加如下代码
添加showQuery函数
public function showQuery($query) { $keys = array(); $values = array(); # build a regular expression for each parameter foreach ($this->inputParams as $param) { if (is_string($param[0])) { $keys[] = '/'.$param[0].'/'; } else { $keys[] = '/[?]/'; } if (!ini_get('magic_quotes_gpc')) { $param[1] = addslashes($param[1]); } if(is_numeric($param[1])) { $values[] = intval($param[1]); } else { $values[] = "'".$param[1] ."'"; } } $query = preg_replace($keys, $values, $query, 1, $count); return $query; }
echo $command->showQuery($sql); //打印sql
yii sql的in 过滤问题
public function bindIn($prefix,$array,$fieldType = PDO::PARAM_INT) { for($i=0;$i<count($array);$i++) { $this->bindValue(":$prefix$i",$array[$i], $fieldType); } }
调用
$sql='SELECT * FROM account where accountId '; Yii::import('application.extensions.GeneralStr'); $gereralStr = new GeneralStr(); $sql.= $gereralStr->inSql("a",$array); $command = Yii::app()->db->createCommand($sql); $command->bindIn("a",$array); $result = $command->queryAll(); echo $command->showQuery($sql);
拼接
public function inSql($prefix,$array) { $sql=' in ('; for($i=0;$i<count($array);$i++) { if($i!=count($array)-1) { $sql.=":$prefix$i,"; }else{ $sql.=":$prefix$i"; } } $sql.=')'; return $sql; }