使用ADDTIME CURTIME的mysqli预处理语句失败

时间:2014-10-05 12:01:49

标签: php mysql mysqli prepared-statement

关于准备好的陈述失败的SO有很多问题,但我找不到解决我的确切问题的问题(或解释它,至少)。

我试图给我的用户一个有效期为5分钟的登录令牌。

当我通过PHPMyAdmin执行查询时,它的工作正常:

工作查询

INSERT INTO LOGGEDIN (userID, loggedInToken, loggedInRefresh) VALUES 
(1, "HJKFSJKFDSKLJFLS", ADDTIME(CURTIME(), '00:05:00'));

但是,当尝试使用预准备语句通过PHP执行查询时,它会失败。

$stmt = $this->conn->prepare("INSERT INTO LOGGEDIN VALUES (userID, loggedInToken, loggedInRefresh) VALUES (?, ?, ADDTIME(CURTIME(), '00:05:00'))");
$stmt->bind_param("is", $userID, $token);

我收到错误:

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 'VALUES (?, ?, ADDTIME(CURTIME(), '00:05:00'))' at line 1

这是完全相同的查询,所以我认为这是由于准备处理查询的方式。

我也试过进入00:00:00:00'作为一个变量,因为我认为'导致错误,但也失败了。

$five_minutes = '00:05:00';
$stmt->bind_param("iss", $userID, $token, $five_minutes);

当我删除准备并使用以下查询时:

$query = "INSERT INTO LOGGEDIN VALUES (userID, loggedInToken, loggedInRefresh) VALUES (" . $userID . ", '" . $token . "', ADDTIME(CURTIME(), '00:05:00'))";
if ($result = $mysqli->query($query)) {
  ...

它工作正常,但我想保持我的代码一致,并尽可能地使用准备好的声明。

如何使用预准备语句让此查询正确执行?如果所有其他方法都失败了,我想我可以在PHP中创建时间戳并将其传递给数据库,从而绕过整个ADDTIME计算,但我想知道导致问题的原因。

需要了解问题,而不是躲避。

1 个答案:

答案 0 :(得分:1)

您的查询中有一个多余的VALUES

$stmt = $this->conn->prepare("INSERT INTO LOGGEDIN VALUES (userID, loggedInToken, loggedInRefresh) VALUES (?, ?, ADDTIME(CURTIME(), '00:05:00'))");
                                                    ^^

删除:

$stmt = $this->conn->prepare("INSERT INTO LOGGEDIN (userID, loggedInToken, loggedInRefresh) VALUES (?, ?, ADDTIME(CURTIME(), '00:05:00'))");