Frage

Ich habe eine wahrscheinlich sehr einfache Frage bekommt, auf die ich keine befriedigende (subjektiv gesehen) Antwort im Zend Framework manuell oder anderswo finden kann ...

Es gibt so viele Möglichkeiten, wie kann ich meine PHP-Variablen in meine SQL-Abfragen übergeben, dass ich die Übersicht verloren und wahrscheinlich fehlt mir ein gewisses Verständnis über im Allgemeinen zitiert.

Prepared Statements

$sql =  "SELECT this, that
        FROM table
        WHERE id = ? AND restriction = ?";

$stmt = $this->_db->query($sql, array($myId, $myValue)); 
$result = $stmt->fetchAll();

Ich verstehe, dass mit dieser Lösung, die ich brauche nichts zu zitieren, weil der db dies für mich behandelt.

Querying Zend_Db_Table und _Row Objekte über die API

$ users = new User ();

a) $users->fetchRow('userID = ' . $userID);  
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  
c) $users->fetchRow('userID = ?', $userID);  
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));  

Fragen

Ich verstehe, dass a) nicht in Ordnung ist, weil es überhaupt nicht zitiert wird. Aber was ist mit den anderen Versionen, was ist das Beste? Ist c) wie eine Anweisung behandelt werden und automatisch zitiert oder muss ich d) verwenden, wenn ich das verwenden? Kennung?

War es hilfreich?

Lösung

Hinweis: Diese Information ist als der ursprünglichen Buchungsdatum dieser Antwort gültig. ZF ändert sich häufig, können diese Informationen mit zukünftigen Versionen überholt, jedoch wird dies für Archivierungszwecke unverändert bleiben.

Wenn Sie eine Zeichenfolge an die fetchRow() Methode einer Unterklasse von Zend_Db_Table_Abstract passieren (was Sie tun), wird es als where Teil einer Zend_Db_Table_Select Instanz behandelt werden.

Mit anderen Worten, intern, Zend_Db_Table tut dies:

if (!($where instanceof Zend_Db_Table_Select)) {
    $select = $this->select();

    if ($where !== null) {
        $this->_where($select, $where);
    }

So ...:

a) $users->fetchRow('userID = ' . $userID);  

Ist das nicht überhaupt zitiert.

b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  

Ist manuell als eine ganze Zahl angegeben.

c) $users->fetchRow('userID = ?', $userID);  

Wird automatisch durch Zend_Db_Adapter_*::quoteInto() zitiert

d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));

Ist eigentlich in doppelten Anführungszeichen, einmal von Ihnen, und einmal über die automatische zitiert.

Was „beste“ betrifft, so würde ich empfehlen Option C. Der Rahmen wird quoteInto auf den parametrierten Wert automatisch aufrufen.

Beachten Sie: Sie können immer eine Instanz von Zend_Db_Table_Select oder Zend_Db_Select zum fetchRow()-Methode übergeben, statt ...

Auch in einer Unterklasse von Zend_Db_Table_Abstract, die wie folgt aussehen:

$this->fetchRow($this->select()->where('userID = ?', $userID));

Das Plus, dies zu tun, ist, dass Sie viel komplexere Abfragen erstellen können, wie Sie die Kontrolle über viel haben, viel mehr als nur die WHERE-Klausel der SQL-Abfrage. Theoretisch könnte man leicht tun:

$select = $this->select()->where('userID = ?', $userID)
                         ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));

$this->fetchRow($select);

Hinweis: Wenn Sie eine Instanz von Zend_Db_Select geben, wirkt die fetchRow() Methode genau wie fetchAll() außer es ruft intern die limit() Methode des Objekts auswählen, mit einem Parameter von 1 .

Andere Tipps

Ich habe verwendet, um

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top