Zend Framework の「引用」が混乱する
-
19-09-2019 - |
質問
おそらく非常に単純な問題があり、Zend Framework マニュアルやその他の場所で満足のいく (主観的に見える) 答えが見つかりません...
PHP 変数を SQL クエリに渡す方法はたくさんあるため、概要を理解できなくなり、おそらく引用符一般についての理解が不足しています。
準備されたステートメント
$sql = "SELECT this, that
FROM table
WHERE id = ? AND restriction = ?";
$stmt = $this->_db->query($sql, array($myId, $myValue));
$result = $stmt->fetchAll();
このソリューションでは、データベースがこれを処理するため、何も引用する必要がないことを理解しています。
API を介した Zend_Db_Table および _Row オブジェクトのクエリ
$users = 新しいユーザー();
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'));
質問
a) はまったく引用されていないため、OK ではないことは理解しています。しかし、他のバージョンはどうですか? 何が最高ですか?c) はステートメントのように扱われ、自動的に引用符で囲まれますか、それとも、? を使用するときに d) を使用する必要がありますか?識別子?
解決
免責事項: この情報は、この回答の最初の投稿日の時点で有効です。ZF は頻繁に変更されるため、この情報は将来のリリースでは古くなる可能性がありますが、アーカイブの目的で変更されません。
に文字列を渡すと、 fetchRow()
のサブクラスのメソッド Zend_Db_Table_Abstract
(あなたがやっている)、それはとして扱われます where
の一部 Zend_Db_Table_Select
実例。
つまり、内部的には、 Zend_Db_Table
これを行います:
if (!($where instanceof Zend_Db_Table_Select)) {
$select = $this->select();
if ($where !== null) {
$this->_where($select, $where);
}
それで...:
a) $users->fetchRow('userID = ' . $userID);
全く引用されてない。
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));
整数として手動で引用されます。
c) $users->fetchRow('userID = ?', $userID);
によって自動的に引用されます Zend_Db_Adapter_*::quoteInto()
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));
実際には二重引用符で囲まれています。1 回はユーザーによって、もう 1 回は自動引用符によって行われます。
「最良」という点に関しては、オプション C をお勧めします。フレームワークが自動的に呼び出します quoteInto
パラメータ化された値について。
留意してください: いつでも次のインスタンスを渡すことができます Zend_Db_Table_Select
または Zend_Db_Select
に fetchRow()
代わりにメソッド...
繰り返しますが、のサブクラスでは、 Zend_Db_Table_Abstract
, 、それは次のようになります:
$this->fetchRow($this->select()->where('userID = ?', $userID));
これを行うことの利点は、単にクエリを制御できるだけではなく、より複雑なクエリを構築できることです。 WHERE
SQL クエリの句。理論的には、次のことが簡単にできます。
$select = $this->select()->where('userID = ?', $userID)
->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));
$this->fetchRow($select);
注記: のインスタンスが渡された場合 Zend_Db_Select
, 、 fetchRow()
メソッドはまったく同じように動作します fetchAll()
を除外する 内部的には limit()
パラメータを指定した選択オブジェクトのメソッド 1
.
他のヒント
私はに慣れ
$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);