Есть так много вопросов по 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, но я хотел бы знать, в чем причина проблемы.
Проблемы нужно понимать, а не уклоняться.
У тебя лишнее 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'))");
Других решений пока нет …