一点PHP分享关于如何在Yii模型操作sql中防止一部分sql被转义,在Yii框架DB底层可以通过这个new \yii\db\Expression(表达式) 这个对象来实现防止转义你的sql。
以下是博主在官方找的一些列子:
如果不用Expression条件里面有函数等表达式的话,会被当成字符串用'
号引住,因为框架要实现防注入当查询构造器遇到Expression它会将表达式原封不动地加入查询语句里,不会加任何引号。
1 2 3 4 |
$query1=new\yii\db\Query(); $command1=$query1->from('user')->where(['<=','add_time','NOW()'])->createCommand(); echo $command1->rawSql; // SELECT * FROM `user` WHERE `add_time` <= 'NOW()' 重点是这个NOW()被单引号包住了 |
//------用Expression类传入表达式------
1 2 3 4 5 |
$query2 = new \yii\db\Query(); $expression = new \yii\db\Expression('NOW()'); $command2=$query2->from('user')->where(['<=','add_time',$expression])->createCommand(); echo $command2->rawSql; // SELECT * FROM `user` WHERE `add_time` <= NOW() 没有引号包住NOW() |
通过Expression传入自由的SQL合法表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$query1 = new \yii\db\Query(); $command1 = $query1 ->from('user') ->where(['<=', 'age', new \yii\db\Expression('33 + 99')]) ->createCommand(); echo $command1->rawSql; // SELECT * FROM `user` WHERE `age` <= 33 + 99 $query2 = new \yii\db\Query(); $expression = new \yii\db\Expression('DATE_SUB(NOW(), INTERVAL 1 MONTH)'); $command2 = $query2 ->from('article') ->where(['date' => $expression]) ->createCommand(); echo $command2->rawSql; // SELECT * FROM `article` WHERE `date` = DATE_SUB(NOW(), INTERVAL 1 MONTH) |
一点PHP,一点技术分享。