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)的方法。如果我对时间进行硬编码,一切正常,那么代码的另一部分必须是正确的。

我也试过:

$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

间隔可以乘以数字。因此,解决此问题的一种方法是准备语句,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。这意味着您需要生成一些看起来像 string 的东西'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 及其内部 Models 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 回答