MySQL подготовленный оператор с ADDTIME CURTIME терпит неудачу

Есть так много вопросов по 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, но я хотел бы знать, в чем причина проблемы.

Проблемы нужно понимать, а не уклоняться.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]