【发布时间】:2014-10-05 12:01:49
【问题描述】:
对于失败的准备好的语句,有很多关于 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:05: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 计算,但我想首先知道是什么导致了问题。
问题需要被理解,而不是回避。
【问题讨论】:
标签: php mysql mysqli prepared-statement