我正在使用带Sqlsrv
扩展名的PDO连接到SQL Server数据库。当我在任何SQL Server数据库客户端中运行它时,此查询工作正常,但在PHP源代码中,它不会产生结果。
SELECT session
FROM t_php_session
WHERE php_session_id = 'p64aqbh15u6t35tq2h8n0bluq0'
AND user_ip = '127000000001'
AND DATEADD(MINUTE, 30, created) >= GETDATE()
调试时我观察到当我从DATEADD
子句中删除WHERE
条件时,它可以正常工作并返回结果。但我不确定这种情况有什么问题。
以下是我的示例源代码:
$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 Server数据库表结构:
我还尝试使用 bindParam 方法分配值,而不是在执行语句中传递数组,但这也无法正常工作。
解
从@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();