2014-10-05 68 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