2

phpとzendフレームワークを使用したmysqlクエリでAnd/またはを使用するにはどうすればよいですか。今のところ私はこれを使用しています:

    $db=Zend_Db_Table::getDefaultAdapter();
    $select=new Zend_Db_Select($db);
    $select->from('users','*');
    $select->joinInner('rest', 'users.repository = rest.id',array('username'));
    $select->where('username='.$rest.' and sold=0');
    return $db->fetchAll($select);

それは正しい方法ですか?そうでない場合、正しい方法は何ですか?

4

3 に答える 3

3

複数回AND呼び出すことで、クエリに 's を追加できます。where()

$select->where('this = ?', 'myValue')
       ->where('that = ?', 'myValue2');

これは次のように変換されます。

... WHERE this = 'myValue' AND that = 'myValue2'

ORクエリに1 つ以上の を追加するには、次を使用しorWhere()ます。

$select->where('this = ?', 'myValue')
       ->orWhere('that = ?', 'myValue2');

これは次のように変換されます。

... WHERE this = 'myValue' OR that = 'myValue2'

ノート

?SQL インジェクションを防ぐ簡単な方法であるため、必ずプレースホルダー構文を使用してください。

于 2012-06-30T11:10:11.037 に答える
2

それは 1 つの方法ですが、 ? を使用する必要があります。SQL インジェクションから保護するための変数のプレースホルダー:

$select=new Zend_Db_Select($db);
$select->from('users','*');
$select->joinInner('rest', 'users.repository = rest.id', array('username'));
$select->where('username = ? and sold=0', $rest);

(これが PHP 変数に由来することもある場合は、'sold' についても同じことを行います。)

where()複数の呼び出しを持つ where 句をチェーンすることもorWhere()、and の代わりに or が必要な場合:

$select=new Zend_Db_Select($db);
$select->from('users','*');
$select->joinInner('rest', 'users.repository = rest.id', array('username'));
$select->where('username = ?' $rest);
$select->where('sold = ?', 0);

Zend_Db_Select は流暢な影響を使用するため、次のように記述することもできます。

$select=new Zend_Db_Select($db);
$select->from('users','*')
       ->joinInner('rest', 'users.repository = rest.id', array('username'))
       ->where('username = ?' $rest)
       ->where('sold = ?', 0);
于 2012-06-30T11:11:12.673 に答える
0

以下はあなたの質問を修正します。where() と orWhere() がどのように機能するかについてのより完全な記事については、 PHP postgres Zend Framework Select query with WHERE 'AND' clauseを参照してください。

$db=Zend_Db_Table::getDefaultAdapter();
    $select=new Zend_Db_Select($db);
    $select->from('users','*');
    $select->joinInner('rest', 'users.repository = rest.id',array('username'));
    $select->where('username= ?',$rest);//multiple where() will use AND operator in query
    $select->where('sold = ?', 0);//if you need the OR operator use the orWhere() method
    return $db->fetchAll($select);

疑問符について回答するには (マニュアルからの抜粋):

fetchAll($select, $value)//most of the Zend_Db methods follow this API

fetchAll() メソッド: このメソッドの最初の引数は、SELECT ステートメントを含む文字列です。または、最初の引数を Zend_Db_Select クラスのオブジェクトにすることもできます。アダプタは、このオブジェクトを SELECT ステートメントの文字列表現に自動的に変換します。

つまり (? は $value のプレースホルダーです):
$select->where('id = ?', $id);
$select->orWhere('age > ?', $age);

現在、古い構文を使用していますが、引き続き機能しますが、廃止されました。

于 2012-07-01T06:24:47.977 に答える