Php zend framework查询中的where语句

Php zend framework查询中的where语句,php,mysql,zend-framework,where-clause,Php,Mysql,Zend Framework,Where Clause,如何使用php和zend framework在mysql查询中使用和/或。目前,我使用以下方法: $db=Zend_Db_Table::getDefaultAdapter(); $select=new Zend_Db_Select($db); $select->from('users','*'); $select->joinInner('rest', 'users.repository = rest.id',array('username'));

如何使用php和zend framework在mysql查询中使用和/或。目前,我使用以下方法:

    $db=Zend_Db_Table::getDefaultAdapter();
    $select=new Zend_Db_Select($db);
    $select->from('users','*');
    $select->joinInner('rest', 'users.repository = rest.id',array('username'));
    $select->where('username='.$rest.' and sold=0');
    return $db->fetchAll($select);

这是正确的方法吗?如果不是,正确的方法是什么?

您可以通过多次调用
where()
添加到查询中:

$select->where('this = ?', 'myValue')
       ->where('that = ?', 'myValue2');
这将转化为:

... WHERE this = 'myValue' AND that = 'myValue2'
... WHERE this = 'myValue' OR that = 'myValue2'
要向查询中添加一个或多个
,请使用
或where()

这将转化为:

... WHERE this = 'myValue' AND that = 'myValue2'
... WHERE this = 'myValue' OR that = 'myValue2'
注意


确保使用占位符语法,因为这是防止SQL注入的简单方法。

这是一种方法,但您应该使用?用于防止SQL注入的变量的占位符:

$select=new Zend_Db_Select($db);
$select->from('users','*');
$select->joinInner('rest', 'users.repository = rest.id', array('username'));
$select->where('username = ? and sold=0', $rest);
(如果“sell”有时也来自PHP变量,请对其执行相同的操作。)

您还可以将where子句与多个
where()
调用或
orWhere()
链接在一起,如果您想要或代替and:

$select=new Zend_Db_Select($db);
$select->from('users','*');
$select->joinInner('rest', 'users.repository = rest.id', array('username'));
$select->where('username = ?' $rest);
$select->where('sold = ?', 0);
由于Zend_Db_Select使用流畅的效果,您也可以这样编写:

$select=new Zend_Db_Select($db);
$select->from('users','*')
       ->joinInner('rest', 'users.repository = rest.id', array('username'))
       ->where('username = ?' $rest)
       ->where('sold = ?', 0);

下面将解决您的问题,有关where()和orWhere()如何工作的更完整的书面说明,请参阅

回答有关问号的问题(摘自手册):

fetchAll($select,$value)//大多数Zend_Db方法都遵循此API

fetchAll()方法: 此方法的第一个参数是包含SELECT的字符串 陈述或者,第一个参数可以是类的对象 Zend_Db_选择。适配器会自动将此对象转换为 SELECT语句的字符串表示形式

ie(?是$value的占位符):
$select->where('id=?',$id)
$select->orWhere('age>?',$age)


您当前使用的是旧语法,尽管它仍然可以工作,但已被弃用

谢谢大家,但是是关于还是?例如,我想要这个where(fname='ggg'和(post>5 | |感谢>30)和age=10)最简单的方法是
select->where('fname=?','ggg')->where('post>5或感谢>30)谢谢,但可能存在可变风险,感谢sql注入。正如您所看到的,当它们是变量时,它们像字符串一样被传递,使用
$select->where('fname=?','ggg')->where('post>?或thanky>?,array(5,30))用PHP变量替换ggg、5和30。