9

私はこのようなクエリを持っています:(Postgresql 8.4、PHP-fpm 5.3.10(fpm-fcgi))

select * from users where now() - interval '2 minutes' < seenlast ORDER BY seenlast;

PHP / PDOクエリを使用したいので、次のようにします。

$mymin=5; //this is a variable can be changed by $_GET
$query = $db_conn->prepare("select * from users where now() - interval ':myminute minutes' < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute",$mymin)
$query->execute;

これは機能しません。適切な方法で議事録( $ mymin )を渡す方法を見つけることができません。私がtimestuffeverithingが機能するようにハードコーディングする場合、コードの他の部分は正しくなければなりません。

私も試しました:

$temp=$mymin." minutes";
$query = $db_conn->prepare("select * from users where now() - interval :myminute < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute",$temp)

私はすでにこれを見ました、助けませんでした

4

4 に答える 4

15

間隔は数値で乗算できます。したがって、これに対する1つのアプローチは、interval '1 minute' * :myminutes代わりに「myminutes」パラメーターを単純な整数として渡すというステートメントを準備することです。

于 2013-01-22T19:37:33.790 に答える
6

PDOやPHPについてはよくわかりませんが、ここで何が問題になっているのかはわかっていると思います。

あなたがこれを言うとき:

interval '3 minutes'

実際には、次と同じキャスト操作を実行しています。

'3 minutes'::interval
cast('3 minutes' as interval)

つまり、あなたがしているのは、TEXT値をINTERVALにキャストすることです。つまり、文字列のようなものを作成する必要があります'3 minutes'。文字列の連結を使用して、文字列の断片を一緒に貼り付けることができます。

# Use cast to make the precedence cleaner.
$query = $db_conn->prepare("select * from users where now() - cast(:myminute || ' minutes' as interval) < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute", $mymin)

または、PHPで文字列ラングリングを実行できるはずです。

$query = $db_conn->prepare("select * from users where now() - interval :myminute < seenlast ORDER BY seenlast"); 
$query->bindParm(":myminute", $mymin . ' minutes')
于 2013-01-22T19:42:02.230 に答える
0

私は同じ問題で何時間もPhalconとその内部モデルPDOパーサーと格闘してきました。

私はこの解決策を見つけました:

public static function getTimedoutRequests($secsThreshold) {
    return self::find(
        array(
            // PDO is buggy here, can't use INTERVAL
            "DATE_PART('epoch', create_time) < DATE_PART('epoch', NOW()) - ?0",
            "bind" => array(
                $secsThreshold
            )
        )
    );
}
于 2014-05-15T02:08:24.633 に答える
-2
... - INTERVAL :myminute MINUTES ...

引用符なしが適切な方法です。それが役立つ場合は、プレースホルダーを、昔ながらの変数ベースのクエリ構築方法を使用するのと同等であると考えてください

... - INTERVAL $myminute MINUTES

ただし、プレースホルダーは変数が処理しないインジェクションの脆弱性を処理します。プレースホルダーを使用しているからといって、SQL構文を変更できるわけではありません。

... - INTERVAL '2 minutes'
... - INTERVAL ':myminute minute'

有効なSQLではありません。


muのフォローアップ:

mysql> select now() + interval '2 minute';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> select now() + interval 2 minute;
+---------------------------+
| now() + interval 2 minute |
+---------------------------+
| 2013-01-22 13:38:24       |
+---------------------------+
1 row in set (0.02 sec)
于 2013-01-22T18:46:36.997 に答える