好的,首先我很少知道如何使用php,而且对sql的理解稍微好一些。所以,如果我做的任何事情看起来非常非常愚蠢,请耐心等待。
如果用户输入了日期,时间和时间间隔,我需要获得两个没有时区的时间戳 - 开始时间和结束时间。 e.g。
function myfunction($startdate, $starttime, $numhours){
$start = $startdate.' '.$starttime;
//I know this works for a timestamp because I have used this value in other sql statements and have been returned the correct results
$handler = $connection->prepare("SELECT TIMESTAMP :start + INTERVAL :numhours ' HOURS'");
$handler->bindParam(':start', $start);
$handler->bindParam(':numhours', $numhours);
$handler->execute();
$end = $handler->fetchAll();
这只会给我带来以下错误:
Submitting booking.SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1" LINE 1: SELECT TIMESTAMP $1 + INTERVAL $2 ' HOURS'
我还没有找到任何真正告诉我我在这里做错的事情(这可能很多)。感谢帮助。
编辑:我使用postgreSQL
,通过`pgAdmin III
编辑:$ start应该有以下形式' YYYY-MM-DD HH:MM:SS'
答案 0 :(得分:2)
问题是,你使用literal notation的值(参数)而不是常量。
字面符号只接受内容,例如:
SELECT TIMESTAMP '2014-05-25 14:29:59' + INTERVAL 3 HOUR;
它不能接受常量以外的值(表达式)(并且绑定参数不是常量。):
-- this will throw a syntax error
SELECT TIMESTAMP CONCAT('2014-05-25', ' ', '14:29:59');
您可以在此处使用CAST
表单作为文字表示法:
$handler = $connection->prepare('SELECT CAST(:start AS TIMESTAMP) + ' .
'CAST(:numhours || \' hours\' AS INTERVAL)');
$handler->bindParam(':start', $start);
$handler->bindParam(':numhours', $numhours);
$handler->execute();
编辑:或者,您可以使用PDO::ATTR_EMULATE_PREPARES
在查询中使用真正的文字,但我相信postgres自己的准备功能是更好的选择。