我已经编写了一些代码,可以像下面那样进行查询:
$handle->select()->from('user_id') ->where('first_name=?',$id) ->where('last_name=?',$lname)
假设Zend_Db将会完成此操作,而不会对输入进行消毒. Zend是否做到这一点?
另一个问题:
Zend_Db是否清理insert(‘table’,$data)和更新查询?
谢谢.
我尽可能地鼓励最佳做法,但是我必须平衡使用.
请注意,您可以随时检查Zend_Db_Select对象的字符串值,以查看它如何决定引用.
print $select; // invokes __toString() method
此外,您可以使用Zend_Db_Profiler检查由Zend_Db代表您运行的sql.
$db->getProfiler()->setEnabled(true); $db->update( ... ); print $db->getProfiler()->getLastQueryProfile()->getQuery(); print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); $db->getProfiler()->setEnabled(false);
以下是您的具体问题的一些答案:
> Zend_Db_Select :: where(‘last_name =?’,$lname)
值适当引用.虽然 ”?”看起来像一个参数占位符,在这个方法中,这个参数被实际引用并被内插.所以这不是一个真正的查询参数.事实上,以下两个语句产生与上述用法完全相同的查询:
$select->where( $db->quoteInto('last_name=?',$lname) ); $select->where( 'last_name=' . $db->quote($lname) );
但是,如果您传递一个类型为Zend_Db_Expr的对象的参数,那么它不会被引用.您负责sql注入风险,因为它被逐字插值,以支持表达式值:
$select->where('last_modified < ?',new Zend_Db_Expr('NOW()'))
该表达式中需要引用或分界的任何其他部分是您的责任.例如,如果您将任何PHP变量插入到表达式中,则安全是您的责任.如果列名称是sql关键字,则需要使用quoteIdentifier()将它们自己定界.例:
$select->where($db->quoteIdentifier('order').'=?',$myVariable)
> Zend_Db_Adapter_Abstract :: insert(array(‘colname’=>’value’))
表名和列名称是分隔的,除非您关闭AUTO_QUOTE_IDENTIFIERS.
值被参数化为真查询参数(不插值).除非这个值是Zend_Db_Expr对象,否则这个对象将被逐字插值,所以你可以插入表达式或者NULL或者其他任何东西.
> Zend_Db_Adapter_Abstract :: update(array(‘colname’=>’value’),$where)
表名和列名称是分隔的,除非您关闭AUTO_QUOTE_IDENTIFIERS.
值被参数化,除非是Zend_Db_Expr对象,如在insert()方法中.