6

2 つの変数を持つクエリで fetchAll を使用しようとしています。構文がわかりません。1 つの変数だけで管理できます。

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

ただし、クエリに複数の変数がある場合、いくつかの問題があります

$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

使いたい理由は?変数をクエリに直接配置する代わりに、? クエリを db エンジンで一般的にコンパイルできるようにし、パフォーマンスを向上させます。

4

4 に答える 4

12

パラメータには、名前付きパラメータと定位置パラメータの 2 種類があります。あなたは2つのタイプを混在させていますが、それはうまくいきません。

名前付きパラメーターは、プレースホルダーの名前と一致します。名前は:記号で始まります。パラメータ名は、それらを使用する列の名前と同じではありません。パラメーター名 (列名ではない) を配列キーとして使用して、連想配列でパラメーター値を指定します。例えば:

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

定位置パラメーターは?、プレースホルダーの記号を使用します。単純な (非連想) 配列を使用してパラメーター値を指定します。配列内の値の順序は、クエリ内のパラメーター プレースホルダーの順序と一致する必要があります。例えば:

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

ほとんどのブランドの SQL データベースはネイティブでいずれか一方のスタイルのみをサポートしていますが、PDO はクエリを準備する前に必要に応じて SQL を書き直すことにより、両方をサポートしようとしています。Zend_Db は PDO をモデルにしているため、Zend_Db は両方のパラメーター スタイルもサポートしています。

于 2010-07-22T01:45:48.050 に答える
5

この質問は少し古いですが、参考のために追加したいと思いました。

Zend_Db_SelectをZend_Dbと一緒に使い始めることをお勧めします。私は最近Zend_Dbでたくさんやっています。Zend_Db_Selectリファレンスガイドの詳細。

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

これが特定の例の基本ですが、selectオブジェクトに関するZend Frameworkリファレンスガイドには、JOINS、UNIONS、GROUP BY、LIMIT、HAVINGなどを使用してさらに複雑なクエリを作成する方法に関する多くの優れた情報があります。

テーブルまたはパラメーターにエイリアス名を使用する場合は、エイリアス名がインデックス値である連想配列を使用します。

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

選択したフィールドのみを返す場合は、フィールド名の配列を2番目のパラメーターとして追加します。

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

実際には、上記は完全に修飾されたSQLを次のように生成するはずです。

SELECT 'products'.model FROM 'products'

しかし、例では簡潔さと明確さのために上記を書きました。

私が今遭遇したことの1つは、WHERE条件でANDとORを使用することです。

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

次の「where」関数を使用する場合は、そのオペランドとして前のステートメントと結合することに注意してください。わかりました、それは紛らわしいように聞こえました。

2番目の「where」が「OR」の場合、「OR」条件になります。2番目の「where」が「AND」の場合、ステートメントは「AND」になります。

つまり、最初のWHERE関数は、使用する条件に関して無視されます。

実際、昨日、 selectを使用して複雑なWHEREを実行することに関して、StackOverflowについて質問しました。

お役に立てば幸いです。乾杯!

于 2010-12-08T15:28:39.020 に答える
2

これを試して:

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

$ this-> _ dbは、Dbアダプターのインスタンスである必要があります。

于 2010-07-08T09:30:47.557 に答える
0

これをコード化する実際の Zend の方法を次に示します。

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

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

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

これは私にとってとてもうまくいきます

于 2012-09-06T23:01:49.623 に答える