【问题标题】:[zend][db] fetchAll with multiple variables[zend][db] fetchAll 有多个变量
【发布时间】:2010-07-08 09:11:12
【问题描述】:

我正在尝试对具有 2 个变量的查询使用 fetchAll。我无法弄清楚语法。 我只能用 1 个变量来管理:

$sql = "SELECT * FROM mytable WHERE field1 = ?";
$this->_db->fetchAll($sql,$value1);  # that works

但是当查询有多个变量时我遇到了一些问题

$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
$this->_db->fetchAll($sql,$value1,$value2); # doesn't work
$this->_db->fetchAll($sql,array("field1"=>$value1,"field2"=>$value2)); # doesn't work either

我要使用的原因是什么?而不是将变量直接放入查询中,我已经了解到使用 ?允许由 db 引擎对查询进行一般性编译并提高性能。

【问题讨论】:

    标签: zend-framework zend-db parameterized fetchall


    【解决方案1】:

    有两种类型的参数,命名参数和位置参数。您将这两种类型混合使用,这是行不通的。

    命名参数按名称匹配占位符。名称以: 符号开头。参数名称与您碰巧使用它们的列的名称不同。您在关联数组中提供参数值,使用参数名称(而不是列名称)作为数组键。例如:

    $sql = "SELECT * FROM mytable WHERE field1 = :param1 AND field2 = :param2";
    $this->_db->fetchAll($sql,array("param1"=>$value1,"param2"=>$value2));
    

    位置参数使用? 符号作为占位符。您使用简单(非关联)数组提供参数值,并且数组中值的顺序必须与查询中参数占位符的顺序相匹配。例如:

    $sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
    $this->_db->fetchAll($sql,array($value1,$value2));
    

    大多数品牌的 SQL 数据库本身只支持一种风格或另一种风格,但 PDO 试图同时支持这两种风格,必要时在准备查询之前重写 SQL。由于 Zend_Db 是根据 PDO 建模的,所以 Zend_Db 也支持这两种参数样式。

    【讨论】:

      【解决方案2】:

      这个问题有点老了,但我想我只是为了参考而添加它。

      我建议开始将 Zend_Db_Select 与 Zend_Db 一起使用。最近我一直在用 Zend_Db 做很多事情。更多来自Zend_Db_Select reference guide

      假设您有一个 Zend_Db 适配器:$this->_db

      # this will get the Zend_Db_Select object
      $select = $this->_db->select();
      
      # now you build up your query with Zend_Db_Select functions
      $select->from('mytable');
      $select->where('field1 = ?', $field1);
      $select->where('field2 = ?', $field2);
      [...]
      
      # echo to see the SQL (helps in debugging)
      # SELECT * FROM mytable WHERE field1 = ? AND field2 = ? [...]
      echo '<p>My SQL: ' . $select . '</p>';
      
      # Execute the SQL / Fetch results
      $results = $select->query()->fetchAll();
      

      这是您给定示例的基础知识,但是关于选择对象的 Zend Framework 参考指南有很多关于如何使用 JOINS、UNIONS、GROUP BY、LIMIT、HAVING 等构建更复杂查询的有用信息。

      如果您想为表或参数使用别名,请使用关联数组,别名为索引值:

      # SELECT p.* FROM products AS p
      $select->from('p' => 'products');
      

      如果您只想返回选定的字段,则添加一个字段名称数组作为第二个参数:

      # SELECT model FROM products
      $select->from(products, array(model));
      

      实际上,上面应该生成完全限定的 SQL:

      SELECT 'products'.model FROM 'products'
      

      但为了在示例中简洁明了,我写了上面的内容。

      我刚刚遇到的一件事是在 WHERE 条件中使用 AND 和 OR。

      # WHERE a = $a
      $select->where('a = ?', $a);
      
      # WHERE a = $a AND b = $b
      $select->where('a = ?', $a);
      $select->where('b = ?', $b);
      
      # WHERE a = $a OR b = $b
      $select->where('a = ?', $a);
      $select->orWhere('b = ?', $b);
      
      # WHERE a = $a AND b = $b
      $select->orWhere('a = ?', $a);
      $select->where('b = ?', $b);
      

      请注意,无论您使用以下“where”函数,都将与前面的语句组合为该操作数。好吧,这听起来令人困惑。

      如果第二个“where”是一个“OR”,它将是一个“OR”条件。如果第二个“where”是“AND”,则语句将是“AND”。

      换句话说,第一个 WHERE 函数在使用什么条件时会被忽略。

      事实上,我昨天刚刚在 Stack Overflow 上问了一个关于 complex WHERE using select 的问题。

      希望对您有所帮助! 干杯!

      【讨论】:

        【解决方案3】:

        试试这个:

        $sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
        $statement = $this->_db->query($sql,array("field1"=>$value1,"field2"=>$value2));
        $data = $statement->fetchAll();
        

        $this->_db 必须是 Db 适配器的实例。

        【讨论】:

          【解决方案4】:

          这是 Zend 的实际编码方式。

          $sql = "SELECT * FROM mytable WHERE field1 = :param1 AND field2 = :param2"; $this->_db->fetchAll($sql,array("param1"=>$value1,"param2"=>$value2));

          $where = $this->_db->select()
          ->from('mytable')
          ->where('field1 = ?',$value1)
          ->where('field2 = ?',$value2);
          
          $rowSet = $this->_db->fetchAll($where);
          

          这对我很有用

          【讨论】:

            猜你喜欢
            • 2011-01-18
            • 1970-01-01
            • 2012-01-08
            • 2012-05-02
            • 1970-01-01
            • 2016-12-11
            • 1970-01-01
            • 2011-07-08
            • 1970-01-01
            相关资源
            最近更新 更多