2017-03-19 2 views
0

私はPHPのPDOを使用してクエリするUnixのタイムスタンプ形式の日付を持つSQLiteテーブルを持っています。私は日付範囲に応じて行をマークしたいと思います。私の場合は、冬の学期か年の夏の学期かにかかわらずです。PDO:SQLite BETWEENでの結果が異なります

開始日と終了日は任意ですが、私の場合、私は9月14日(0914)3月1日(0301)など startendを選んだので、私は簡単にBETWEENでチェックすることができます。

私はPHPでこのクエリを実行すると、そのように、それは間違った結果(すべての行の"WS")を返します。

$statement = $db->prepare('SELECT CASE WHEN 
    (CAST(strftime("%m%d", class_date, "unixepoch") AS DECIMAL) 
    BETWEEN :start AND :end) 
    THEN "SS" 
    ELSE "WS" END 
    AS semester FROM dates'); 

$statement->execute(array(
    ':start' => 301, 
    ':end' => 915 
)); 

しかし、私は数字として開始日と終了日を埋め込むのではなく、それらを結合します、それは(一部の行"WS"、いくつかの"SS")が正しく動作します:

$statement = $db->prepare('SELECT CASE WHEN 
    (CAST(strftime("%m%d", class_date, "unixepoch") AS DECIMAL) 
    BETWEEN 301 AND 915) 
    THEN "SS" 
    ELSE "WS" END 
    AS semester FROM dates'); 
$statement->execute(); 

ここで起こっていると私はそれをどのように修正することができますか?どんな助けもありがとうございます。 PDOStatement::execute

答えて

1

ドキュメントは、SQL文が実行されているのパラメータがバインドされているとして、それは

など、多くの要素を持つ値の配列を受け入れることを言います。すべての値はPDO :: PARAM_STRとして扱われます。

これは、301を入力しても"301"として扱われることを意味します。 代わりにPDOStatement::bindValueを使用してください。このように:

$statement->bindValue(':start', 301, PDO::PARAM_INT); 
$statement->bindValue(':end', 915, PDO::PARAM_INT); 
$statement->execute(); 
+0

完璧に動作します!私はそれが型と何か関係があると思っていましたが、bindValueを考えたことはありませんでした。 – oelna

関連する問題