SQL 服务器 DATEADD 函数不适用于 PDO Sqlsrv 扩展

SQL Server DATEADD function not working with PDO Sqlsrv extension

我正在使用带有 Sqlsrv 扩展名的 PDO 连接到 SQL 服务器数据库。当我在任何 SQL 服务器数据库客户端中 运行 它时,此查询工作正常,但在 PHP 源代码中它不会产生结果。

SELECT session 
FROM t_php_session 
WHERE php_session_id = 'p64aqbh15u6t35tq2h8n0bluq0' 
  AND user_ip = '127000000001' 
  AND DATEADD(MINUTE, 30, created) >= GETDATE()

调试时我观察到,当我从 WHERE 子句中删除 DATEADD 条件时,它工作正常,结果是 return。但我不确定这种情况有什么问题。

这是我的示例源代码:

$session_id = 'p64aqbh15u6t35tq2h8n0bluq0';
$interval = 30;
$ip = '127000000001';
$query = "SELECT session FROM t_php_session WHERE php_session_id = ? AND user_ip = ? AND DATEADD(MINUTE, ?, created) >= GETDATE()";
$stmt = $conn->prepare($query);
$stmt->execute(array($session_id, $ip, $interval));
$result = $stmt->fetchAll();
echo "<pre>";
print_r($result);

这是我的SQL服务器数据库table结构:

我也尝试使用 bindParam 方法来赋值,而不是在 execute 语句中传递数组,但这也行不通。

解决方案

从@Your Common Sense 获得解决方案后,我进行了以下更改并且有效。

$query = "SELECT session FROM t_php_session WHERE php_session_id = ? AND user_ip = ? AND DATEADD(MINUTE, ?, created) >= GETDATE()";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $session_id, PDO::PARAM_STR);
$stmt->bindParam(3, $interval, PDO::PARAM_INT);
$stmt->bindParam(2, $ip, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();

另一个答案显然破坏了 准备语句的整个概念。

如果您使用 PDO::PARAM_INT.
绑定号码,您的代码应该可以正常工作 至少在 emulation mode 这行得通。