在Zend_db_select中更改表名

时间:2014-06-23 15:17:28

标签: php mysql sql zend-framework

SELECT SUM(Table.ColumnThatChanges) AS 'Count', Table.B as 'Param'
FROM Table
WHERE Table.C = 4
    AND Table.B = 'Something'
    AND Table.Date BETWEEN '2014-01-01 00:00:00' AND '2014-06-30 00:00:00'

我有这个我在php中生成的SQL查询。我想通过稍微的改动来调用这个查询很多次;我正在更改每个请求的ColumnThatChanges。

最好/最快的方法是什么?使用str_replace?每次调用整个字符串?使用某种类型的类生成我的SQL语句?

我目前正在使用Zend生成它:

$somequery = $this->db->select();
$somequery->from(Table, array('SUM(Table.ColumnThatChanges) AS Count', 'Table.B as Param'))
->where('C = ?', $Variable)
->where('B = ?', $Variable2)
->where('Date > ?', $start_date)
->where('Date < ?', $end_date);

我没有成功更改查询的ColumnThatChanges部分,也许我做错了?

3 个答案:

答案 0 :(得分:2)

如果您可以使用PDO扩展程序,则此{/ p>有prepared statements

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();

在Zend Framework中,可以使用Zend_Db_Statement

来实现

<强> UPD 如果您要按照here所述更改列,则可以使用columns方法或第二个参数来from方法;

$select = $db->select()
         ->from(array('p' => 'products'), 'product_id')
         ->columns('product_name');

然后,如果您想要更改任何内容,您只需要保留$select对象。

UPD-2 Bill Karwin为问题的最后一个版本提供了更好的答案。请看一下。

答案 1 :(得分:1)

如果您正在使用PDO,则可以绑定参数。因此,遍历您的条目,并使用不同的数据执行。我不确定这是否清楚......哦等等,光头就有一个例子。但是,您也可以传递一个数组来执行:

$stuff = array(':name' => 'one', ':value' => 1);
$stmt->execute($stuff);

答案 2 :(得分:1)

我为Zend Framework 1.0编写了Zend_Db_Select。没有方法可以替换选择列表中的列,只能附加或插入列。

但是,创建一个自定义类来添加此功能并不难。

class My_Db_Select extends Zend_Db_Select
{
  public function clearColumns() {
    $this->_parts[self::COLUMNS] = array();
  }
}

测试清除列并添加不同的列:

$sel = new My_Db_Select($db);
$sel->from("foo", array());

$sel->columns(array("SUM(foo.red)", "id"), "foo");
echo $sel . "\n";

$sel->clearColumns();

$sel->columns(array("SUM(foo.blue)", "id"), "foo");
echo $sel . "\n";

输出:

SELECT SUM(foo.red), `foo`.`id` FROM `foo`
SELECT SUM(foo.blue), `foo`.`id` FROM `foo`