2010-07-08 20 views
5

Sto provando a utilizzare fetchAll su una query che ha 2 variabili. Non riesco a capire la sintassi. posso gestire con solo 1 variabile:[zend] [db] fetchAll con più variabili

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

Tuttavia sto avendo alcuni problemi quando la query ha più variabili

$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 

Il motivo per cui voglio usare? invece di inserire le variabili direttamente nella query è che l'ho imparato usando? permette che la query venga compilata genericamente dal motore db e migliori le prestazioni.

risposta

11

Esistono due tipi di parametri, denominati parametri e parametri posizionali. Stai mescolando i due tipi e questo non funzionerà.

I parametri denominati corrispondono a un segnaposto per nome. I nomi iniziano con il simbolo :. I nomi dei parametri non sono gli stessi dei nomi delle colonne per cui li usi. Fornisci i valori dei parametri in un array associativo, utilizzando il nome del parametro (non il nome della colonna) come chiavi dell'array. Per esempio:

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

parametri posizionali utilizzano il simbolo ? per il segnaposto. I valori dei parametri vengono forniti utilizzando una matrice semplice (non associativa) e l'ordine dei valori nell'array deve corrispondere all'ordine dei segnaposti dei parametri nella query. Per esempio:

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

La maggior parte delle marche di database SQL nativo supportano solo uno stile o l'altro, ma DOP tentativi di supportare sia, riscrivendo il codice SQL, se necessario, prima di preparare la query. Poiché Zend_Db è modellato dopo PDO, Zend_Db supporta anche entrambi gli stili di parametro.

+0

grande che funziona. thankx – Max

2

Prova questo:

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

$ this -> _ db deve essere un'istanza dell'adattatore Db.

+0

che non funziona. – Max

5

Questa domanda è un po 'vecchia, ma ho pensato di aggiungerla per l'amor di riferimento.

Si consiglia di iniziare a utilizzare Zend_Db_Select con Zend_Db. Ultimamente ho lavorato molto con Zend_Db. Altro da Zend_Db_Select reference guide.

lascia supporre si dispone di un adattatore 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(); 

Ecco le basi della tua data esempio, ma la guida di riferimento Zend Framework per l'oggetto di selezione ha un sacco di buone informazioni su come per creare query ancora più complesse con JOINS, UNIONS, GROUP BY, LIMIT, HAVING, ecc.

Se si voleva utilizzare un nome alias per una tabella o parametri, è possibile utilizzare un array associativo con il nome alias è il valore dell'indice:

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

Se si desidera restituire solo i campi selezionati, si aggiunge un array di nomi di campo come secondo parametro:

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

realtà, quanto sopra potrebbe dovrebbe produrre SQL pienamente qualificato come:

SELECT 'products'.model FROM 'products' 

ma ho scritto quanto sopra per brevità e chiarezza nell'esempio.

Una cosa che ho appena visto è usare AND e OR nella condizione 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); 

Avviso, che qualunque sia il seguente "dove" la funzione che si utilizza, si combinano con la precedente affermazione di quella operando. Ok, suonava confuso.

Se il secondo "dove" è un "OR" sarà un "OR" condizionale. Se il secondo "dove" è un "AND", l'affermazione sarà "AND".

In altre parole, la prima funzione WHERE viene ignorata in base alle condizioni che utilizzerà.

In effetti, ho appena fatto una domanda su Stack Overflow ieri riguardo a fare un complex WHERE using select.

Spero che questo aiuti! Cheers!

0

Ecco il vero modo Zend di codificare per questo.

$ sql = "SELECT * FROM mytable WHERE field1 =: param1 AND field2 =: param2"; $ this -> _ db-> fetchAll ($ sql, array ("param1" => $ valore1, "parametro2" => $ valore2));

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

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

Questa grande opera per me

Problemi correlati