Zend_Db_Expr,zenddbtable
在zendframework中使用Db类时,框架会自动给sql语句添加引号以防止数据库攻击 ,这就导致了一个问题,用户无法使用zend db类使用mysql的内置函数(方法,存储过程等)。好在zend框架提供了一个类Zend_Db_Expr,此类的构造函数会告诉框架不要对它所转化的类型进行添加引号的操作。
public function setBatchDelete($orderIds) {
$flag = YCL_Order::FLAG_DELETED;
$updateTime = time();
$data = array(
'flag' => new Zend_Db_Expr("flag | $flag"),
'update_time' => $updateTime
);
$db = $this->getAdapter();
$where = $db->quoteInto('service_order_id IN (?)',$orderIds);
$this->update($data,$where);
}
上面的例子 左边的flag是数据库中的flag。
$select=$db->select();
$select->from("testtable","*");
$select->where($db->quotInto("date>=?",new Zend_Db_Expr("UNIX_TIMESTAMP()"));
$db->fetchAll($select);框架不会对UNIX_TIMESTAMP()添加引号,从而让用户能正常使用此函数。
You also can create an object of type
Zend_Db_Expr explicitly, to prevent a string from being treated as a column name.
亲,1.8.4很老了,最新的可能是1.12.x吧(不考虑zf2),建议你升级到1.11或者1.12,应该不需要改动你的源码。
对于你的问题,你这种用法是不需要输出sql的,因为这条sql是你手动定义的,所以你完全可以自己输出它。例如
$sql = "select count(*) from gs_user where username = '{$userName}' AND password = '{$password}'";echo $sql;print_r($this->db->fetchOne($sql));楼上的解答其实也是正确的,不过代码不大完整,给你个例子
$select = new Zend_Db_Table_Select()$select->from('gs_users', array(new Zend_Db_Expr('COUNT(*)');$select->where('username', $userName)->where('password', $password);try{$row = $select->query(PDO::FETCH_ASSOC)->fetch();} catch(Exception $e) { die($select);}关于Zend Framework,这里提供了一个可用的项目源码,也许你给你点帮助。www.941172.com/forum/view/baseproject源码下载与配置运行
如果你要更新的值,不是字符串,而是一个SQL语法的话,需要用Zend_Db_Expr声明下$data[\'val\'] = new Zend_Db_Expr(\'val + 1\'); 查看原帖>>
希望采纳