2015-10-09 9 views
5

私は最近、あなたがPDOにnull値をバインドできることを発見した:PDOで "not null"をバインドしますか?

$stmt = $db->prepare('SELECT * FROM foo WHERE bar = :bar'); 
$stmt->execute(array(':bar'=>null)); 
$foo = $stmt->fetchAll(PDO::FETCH_OBJ); 

はこれが正常bar列がnullのデータベースからすべてのfooをフェッチします。

しかし、私は今逆のことをしたいと思います。 bar列がでなく、でない列をすべて取得したいとします。

bar = :barbar IS NOT NULLに置き換えることができます。しかし、私はそれを避けたいのではなく、代わりに用意されたステートメントを使って行います。なぜなら、ときどきクエリ文字列を動的に作成しなければならないため、手動で行う必要があるからです。

これは可能ですか?

+0

[pixie](https://github.com/usmanhalalit/pixie)のようなクエリビルダライブラリを使用すると、簡単に動的クエリを作成したり独自のクエリビルダを作成することができます – Gal

+0

2つのステートメントを作成します。 'IS NOT NULL'を使う場所があります。 PDOはパラメータを**引用します**。 – Mjh

+0

@Mjh PDO/MySQLはパラメータを値*として扱います。関連する引用がある場合とない場合があります。理想的には、ネイティブのプリペアドステートメントを使用している場合は、引用符は必要ありません。これは単に構文の一部として、または値としてパラメータを扱う点で違います。 – deceze

答えて

7

"NOT NULL"をバインドすることはできません。 の値はのみです。 "IS NOT NULL"は値ではなく、全く異なるクエリ構文です。

$query = 'SELECT ... WHERE '; 
if (/* condition is NOT NULL */) { 
    $query .= 'foo IS NOT NULL'; 
    $stmt = $db->prepare($query); 
} else { 
    $query .= 'foo = :foo'; 
    $stmt = $db->prepare($query); 
    $stmt->bindValue('foo', $foo); 
} 
$stmt->execute(); 
+0

申し訳ありませんが、それはそれを解決すると思います。私はこれが実際よりも難しいと思った。助けてくれてありがとう。 –

2

は、私はあなたがあなたの前提と間違っている怖いです:あなたは、単に値はそれであなたを助けることができない結合、動的にクエリを構築する必要があります。一般的にNULL値をバインドすることはできますが、WHERE bar = NULLステートメントはローSQLやPDOを使用しても行を返しません。この文全体はNULLに評価され、どの行とも一致しません。

代わりにNULL演算子に等しいNULL安全な値<=>を使用して、NULLまたは値を持つフィールドを照合することができます。しかし、nullでない値を持つためには、別のクエリが必要です。

関連する問題