如何在PHP PDO查询中插入"now()-interval"2分钟"等内容?

yka*_*kat 8 php postgresql pdo

我有这样的查询:(在Postgresql 8.4,PHP-fpm 5.3.10(fpm-fcgi))

select * from users where now() - interval '2 minutes' < seenlast ORDER BY seenlast;
Run Code Online (Sandbox Code Playgroud)

我想使用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;
Run Code Online (Sandbox Code Playgroud)

这不起作用,我找不到以合适的方式传递分钟($ mymin)的方法.如果我硬编码时间工作,那么代码的其他部分必须是正确的.

我也尝试过:

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

我已经看过这个,没有帮助

ara*_*nid 15

间隔可以乘以数字.因此,一种方法是准备语句interval '1 minute' * :myminutes,然后将"myminutes"参数作为简单整数传递.


mu *_*ort 6

我不太了解PDO或PHP,但我想我知道这里出了什么问题.

当你这样说:

interval '3 minutes'
Run Code Online (Sandbox Code Playgroud)

你真的在执行一个与以下相同的强制转换操作:

'3 minutes'::interval
cast('3 minutes' as interval)
Run Code Online (Sandbox Code Playgroud)

所以你正在做的是将一个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)
Run Code Online (Sandbox Code Playgroud)

或者你应该能够在PHP中进行字符串争论:

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