关于准备好的陈述失败的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计算,但我想知道导致问题的原因。
需要了解问题,而不是躲避。
答案 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'))");