2010-07-08 27 views
5

J'essaie d'utiliser fetchAll sur une requête qui a 2 variables. Je ne peux pas comprendre la syntaxe. Je peux gérer avec seulement 1 variable:[zend] [db] fetchAll avec plusieurs variables

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

Cependant, je vais avoir quelques problèmes lors de la requête a plusieurs 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 raison pour laquelle je veux utiliser? au lieu de placer les variables directement dans la requête, c'est que j'ai appris cela en utilisant? permet à la requête d'être compilée génériquement par le moteur db et améliore les performances.

Répondre

11

Il existe deux types de paramètres, nommés paramètres et paramètres de position. Vous mélangez les deux types et cela ne fonctionnera pas.

Les paramètres nommés correspondent à un espace réservé par son nom. Les noms commencent par le symbole :. Les noms des paramètres ne sont pas les mêmes que les noms des colonnes pour lesquelles vous les utilisez. Vous fournissez des valeurs de paramètre dans un tableau associatif, en utilisant le nom du paramètre (pas le nom de la colonne) comme clés de tableau. Par exemple:

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

Les paramètres positionnels utilisent le symbole ? pour l'espace réservé. Vous fournissez des valeurs de paramètre à l'aide d'un tableau simple (non associatif) et l'ordre des valeurs dans le tableau doit correspondre à l'ordre des espaces réservés de paramètres dans votre requête. Par exemple:

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

La plupart des marques de base de données SQL prennent en charge nativement un seul style ou l'autre, mais PDO tente de soutenir à la fois, en réécrivant le SQL si nécessaire avant de préparer la requête. Puisque Zend_Db est modélisé après PDO, Zend_Db supporte aussi les deux styles de paramètres.

+0

super qui fonctionne. merci – Max

2

Essayez ceci:

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

$ this -> _ db doit être une instance de l'adaptateur Db.

+0

qui ne fonctionne pas. – Max

5

Cette question est un peu vieux, mais je pensais que je voudrais juste ajouter à titre de référence.

Je recommande de commencer à utiliser Zend_Db_Select avec Zend_Db. J'ai beaucoup travaillé avec Zend_Db ces derniers temps. Plus de Zend_Db_Select reference guide.

Lets suppose que vous avez un adaptateur 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(); 

Ce sont les bases de votre exemple donné, mais le guide de référence Zend Framework sur l'objet select a beaucoup de bonnes informations sur la façon dont pour construire des requêtes encore plus complexes avec JOINS, UNIONS, GROUP BY, LIMIT, HAVING, etc.

Si vous voulez utiliser un nom d'alias pour une table ou paramètres, vous utilisez un tableau associatif avec le nom d'alias étant la valeur d'index:

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

Si vous voulez retourner les champs sélectionnés, vous ajoutez un tableau de noms de champ comme second paramètre:

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

en fait, ce qui précède pourrait devrait produire comme SQL complet:

SELECT 'products'.model FROM 'products' 

mais j'ai écrit ce qui précède pour la brièveté et la clarté dans l'exemple. Une chose que je viens de rencontrer est l'utilisation de AND et OR dans la condition WHERE. Notez que, quelle que soit la fonction "where" que vous utilisez, elle se combine avec l'instruction précédente en tant qu'opérande. Ok, cela semblait confus.

Si le second "où" est un "OU", il s'agira d'un "OU" conditionnel. Si le second "where" est un "AND", l'instruction sera "AND". En d'autres termes, la première fonction WHERE est ignorée en termes de condition qu'elle utilisera.

En fait, je viens de poser une question sur Stack Overflow hier concernant faire un complex WHERE using select.

Espérons que ça aide! À la votre!

0

Utilise la méthode Zend actuelle pour le codage.

$ sql = "SELECT * FROM ma table WHERE field1 =: param1 AND field2 =: param2"; $ this -> _ db-> fetchAll ($ sql, array ("param1" => $ valeur1, "param2" => $ valeur2));

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

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

Cela fonctionne très bien pour moi