【问题标题】:mysqli prepared statement with ADDTIME CURTIME fails带有 ADDTIME CURTIME 的 mysqli 准备语句失败
【发布时间】: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


    【解决方案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'))");
    

    【讨论】:

    • 嗯,这很尴尬。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2015-06-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多