2010-07-08 11 views
5

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

$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 и улучшать характеристики.

ответ

11

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

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

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

+0

отлично работает. Thankx – Max

2

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

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

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

+0

, что не работает. – Max

5

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

Я бы рекомендовал начать использовать Zend_Db_Select с Zend_Db. В последнее время я много делаю с Zend_Db. Больше от Zend_Db_Select reference guide.

Давайте предположим, что у вас есть Zend_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' 

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

Одна вещь, с которой я только что столкнулся, использует 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); 

Обратите внимание: что бы ни использовалась следующая функция «где», она будет сочетаться с предыдущим оператором в качестве этого операнда. Хорошо, это звучит запутанно.

Если второе «где» является «ИЛИ», оно будет «ИЛИ» условным. Если вторым «где» является «AND», утверждение будет «AND».

Иными словами, первая функция WHERE игнорируется с точки зрения того, какое условие она будет использовать.

На самом деле, я только что задал вопрос о переполнении стека вчера о выполнении complex WHERE using select.

Надеюсь, что это поможет! Приветствия!

0

Heres - реальный способ 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); 

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