[zend] [db] fetchAll с несколькими переменными - PullRequest
5 голосов
/ 08 июля 2010

Я пытаюсь использовать fetchAll для запроса, который имеет 2 переменные.Я не могу понять синтаксис.Я могу управлять только одной переменной:

$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 и улучшает производительность.

Ответы [ 4 ]

12 голосов
/ 22 июля 2010

Существует два типа параметров: именованные параметры и позиционные параметры. Вы смешиваете два типа, и это не сработает.

Именованные параметры соответствуют заполнителю по имени. Имена начинаются с символа :. Имена параметров не совпадают с именами столбцов, для которых вы их используете. Вы задаете значения параметров в ассоциативном массиве, используя имя параметра (не имя столбца) в качестве ключей массива. Например:

$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 также поддерживает оба стиля параметров.

5 голосов
/ 08 декабря 2010

Этот вопрос устарел, но я подумал, что просто добавлю его для справки.

Я бы порекомендовал начать использовать Zend_Db_Select с Zend_Db.Я много делал с Zend_Db в последнее время.Дополнительная информация из справочника Zend_Db_Select .

Предположим, у вас есть адаптер 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 по объекту select содержит много полезной информации о том, как создавать еще более сложные запросы с помощью 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'

, но я написал выше для краткости и ясности в примере.

OneЯ только что натолкнулся на использование AND и OR в условии WHERE.

# 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 с использованием select .

Надеюсь, это поможет!Ура!

2 голосов
/ 08 июля 2010

Попробуйте это:

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

$ this -> _ db должен быть экземпляром адаптера Db.

0 голосов
/ 07 сентября 2012

Вот фактический 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);

Это прекрасно работает для меня

...