2014-10-05 80 views
1

对于没有准备好的语句,SO上有很多问题,但我找不到解决我确切问题(或解释它,至少)的问题。mysqli编写了ADDTIME CURTIME语句失败

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

当我执行通过phpmyadmin它工作得很好查询:

工作QUERY

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计算,但我想知道是什么导致了这个问题。

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

回答

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'))"); 
+0

那么,这是令人尴尬的。谢谢! – Rijstkoek 2014-10-05 12:20:22

+0

@Rijstkoek没有概率的人,我很高兴这个帮助 – Ghost 2014-10-05 12:31:32