2010-07-08 15 views
5

Ich versuche, FetchAll für eine Abfrage mit 2 Variablen zu verwenden. Ich kann die Syntax nicht herausfinden. kann ich mit nur 1 Variable verwalten:[zend] [db] fetchAll mit mehreren Variablen

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

Jedoch habe ich einige Probleme mit bin, wenn Abfrage mehrere Variablen

$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 

Der Grund, warum ich verwenden möchte, hat? anstatt die Variablen direkt in die Abfrage zu platzieren, habe ich gelernt, dass mit? ermöglicht, dass die Abfrage generisch von der db-Engine kompiliert wird und die Leistung verbessert wird.

Antwort

11

Es gibt zwei Arten von Parametern: mit den Parametern und mit Parametern. Du mischst die beiden Typen und das wird nicht funktionieren.

Benannte Parameter entsprechen einem Platzhalter nach Namen. Namen werden mit dem Symbol : gestartet. Die Parameternamen stimmen nicht mit den Namen der Spalten überein, für die Sie sie verwenden. Sie geben Parameterwerte in einem assoziativen Array unter Verwendung des Parameternamens (nicht des Spaltennamens) als Array-Schlüssel an. Zum Beispiel:

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

Positionsparameter verwenden, um das ? Symbol für den Platzhalter. Sie geben Parameterwerte mit einem einfachen (nicht assoziativen) Array an, und die Reihenfolge der Werte im Array muss der Reihenfolge der Parameterplatzhalter in Ihrer Abfrage entsprechen. Zum Beispiel:

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

Die meisten Marken von SQL-Datenbank unterstützt nativ nur einen Stil oder das andere, aber PDO versucht beide zu unterstützen, indem die SQL-ggf. Umschreiben bevor die Abfrage vorbereitet. Da Zend_Db nach PDO modelliert ist, unterstützt Zend_Db auch beide Parameterstile.

+0

toll das funktioniert. Dankeschön – Max

2

Try this:

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

$ this -> _ db muss eine Instanz von Db-Adapter sein.

+0

, das nicht funktioniert. – Max

5

Diese Frage ist ein bisschen alt, aber ich dachte, ich würde nur zu Referenzzwecken hinzufügen.

Ich würde empfehlen, Zend_Db_Select mit Zend_Db zu verwenden. Ich habe in letzter Zeit viel mit Zend_Db gemacht. Mehr von Zend_Db_Select reference guide.

Hier können Sie einen Zend_Db Adapter übernehmen haben: $ 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(); 

, dass die Grundlagen von Ihrem gegebenen Beispiel ist, aber das Zend Framework Referenzhandbuch auf dem Objekt auswählen hat viele gute Informationen darüber, wie um noch komplexere Anfragen mit JOINS, UNIONS, GROUP BY, LIMIT, HAVING etc. zu erstellen.

Wenn Sie einen Aliasnamen für eine Tabelle oder Parameter verwenden wollte, verwenden Sie ein assoziatives Array mit dem Aliasnamen der Indexwert ist:

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

Wenn Sie nur ausgewählte Felder zurückkehren möchten, die Sie hinzufügen ein Array von Feldnamen als zweiten Parameter:

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

Eigentlich sollte die obigen produzieren könnte vollständig qualifizierte SQL als:

SELECT 'products'.model FROM 'products' 

aber ich schrieb das obige für die Kürze und Klarheit in dem Beispiel.

Eine Sache, auf die ich gerade gestoßen bin, ist die Verwendung von AND und OR in der WHERE-Bedingung.

# 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); 

Beachten Sie, dass die folgende "wo" -Funktion, die Sie verwenden, mit der vorherigen Anweisung als dieser Operand kombiniert wird. Ok, das klang verwirrend.

Wenn das zweite "where" ein "OR" ist, wird es eine ODER-Bedingung sein. Wenn das zweite "wo" ein "UND" ist, lautet die Aussage "AND".

Mit anderen Worten, die erste WHERE-Funktion wird in Bezug auf die Bedingung ignoriert, die es verwenden wird.

In der Tat habe ich gestern nur eine Frage zu Stack Overflow in Bezug auf eine complex WHERE using select gestellt.

Hoffe, dass hilft! Prost!

0

Heres der eigentliche Zend Weg, um dies zu kodieren.

$ sql = "SELECT * FROM Meine Tabelle WHERE field1 =: param1 UND field2 =: param2"; $ this -> _ db-> fetchAll ($ sql, array ("param1" => $ wert1, "param2" => $ value2));

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

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

Dies funktioniert gut für mich