2010-07-08 14 views
5

Estoy tratando de usar fetchAll en una consulta que tiene 2 variables. No puedo entender la sintaxis. puedo manejar con sólo 1 variables:[zend] [db] fetchAll con múltiples variables

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

Sin embargo estoy teniendo algunos problemas cuando consulta tiene múltiples variables

$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 

La razón por la que quiero usar? en lugar de colocar las variables directamente en la consulta es que he aprendido que usar? permite que la consulta sea compilada genéricamente por el motor db y mejora el rendimiento.

Respuesta

11

Hay dos tipos de parámetros, denominados parámetros posicionales y parámetros. Estás mezclando los dos tipos y eso no funcionará.

Los parámetros con nombre coinciden con un marcador de posición por su nombre. Los nombres se inician con el símbolo :. Los nombres de los parámetros no son los mismos que los nombres de las columnas donde los usa. Proporciona valores de parámetros en una matriz asociativa, utilizando el nombre del parámetro (no el nombre de la columna) como las teclas de la matriz. Por ejemplo:

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

parámetros posicionales utilizan el símbolo ? para el marcador de posición. Usted suministra valores de parámetros usando una matriz simple (no asociativa), y el orden de los valores en la matriz debe coincidir con el orden de los marcadores de posición de los parámetros en su consulta. Por ejemplo:

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

mayoría de las marcas de base de datos SQL de forma nativa sólo son compatibles con un estilo u otro, pero DOP intentos para apoyar tanto, volviendo a escribir el código SQL si es necesario antes de preparar la consulta. Como Zend_Db se modela después de PDO, Zend_Db también admite ambos estilos de parámetros.

+0

genial que funciona. gracias – Max

2

Prueba esto:

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

$ this -> _ db debe ser una instancia de adaptador Db.

+0

que no funciona. – Max

5

Esta pregunta es un poco antigua, pero pensé que solo la agregaría como referencia.

Recomendaría comenzar a usar Zend_Db_Select con Zend_Db. He estado haciendo mucho con Zend_Db últimamente. Más de Zend_Db_Select reference guide.

supongamos que tiene un adaptador de 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(); 

Eso es lo básico de su ejemplo dado, pero la guía de referencia de Zend Framework en el objeto de selección tiene un montón de buena información sobre cómo para construir consultas aún más complejas con UNIONES, SINDICATOS, AGRUPAR POR, LIMITAR, TENER, etc.

Si desea utilizar un nombre de alias para una tabla o parámetros, se utiliza una matriz asociativa con el nombre de alias siendo el valor del índice:

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

Si desea devolver sólo los campos seleccionados, se agrega una serie de nombres de campos como un segundo parámetro:

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

en realidad, lo anterior se debe producir SQL completamente calificado como:

SELECT 'products'.model FROM 'products' 

pero escribí lo anterior para mayor brevedad y claridad en el ejemplo.

Una cosa que acabo de encontrar es usar AND y OR en la condición 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); 

Tenga en cuenta que cualquiera que sea la siguiente función "where" que utilice, se combinará con la declaración anterior como ese operando. Ok, eso sonaba confuso.

Si el segundo "donde" es una "O", será un "O" condicional. Si el segundo "donde" es un "Y" la declaración será "AND".

En otras palabras, la primera función WHERE se ignora en términos de qué condición usará.

De hecho, acabo de hacer una pregunta sobre el desbordamiento de la pila ayer con respecto a hacer un complex WHERE using select.

Espero que ayude! ¡Salud!

0

Aquí está la forma real de Zend para codificar esto.

$ sql = "SELECCIONAR * FROM mytable DONDE field1 =: param1 AND field2 =: param2"; $ this -> _ db-> fetchAll ($ sql, array ("param1" => $ valor1, "param2" => $ valor2));

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

$rowSet = $this->_db->fetchAll($where); 

Esto funciona muy bien para mí

Cuestiones relacionadas