【问题标题】:SQL error 42601 when running query in postgreSQL在 postgreSQL 中运行查询时出现 SQL 错误 42601
【发布时间】:2017-10-16 11:35:39
【问题描述】:

我正在尝试使用 PHP PDO 库对 pgSQL 数据库表运行以下查询

SELECT COUNT(*) AS overall, COUNT(IF(username = ?, TRUE, NULL)) AS unames FROM login_attempt WHERE last_checked > NOW() - INTERVAL ? MICROSECOND

但出现以下错误

错误:SQLSTATE[42601]:语法错误:7 错误:“$2”处或附近的语法错误第 1 行:...gin_attempt WHERE last_checked > NOW() - INTERVAL $2 MICROSE... ^

这是我的完整功能代码

private function isQueueSizeExceeded()
{

    $sql = "SELECT COUNT(*) AS overall, COUNT(IF(username = :uname, TRUE, NULL)) AS unames FROM login_attempt WHERE last_checked > NOW() - INTERVAL :itime MICROSECOND";
    $stmt = $this->pdo->prepare($sql);

    $itime= 5000 * 1000;
    $stmt->bindParam(':uname', $this->username);
    $stmt->bindParam(':itime', $itime);
    $stmt->execute();

    $count = $stmt->fetch(PDO::FETCH_OBJ);
    if (!$count) {
        throw new Exception("Failed to query queue size", 500);
    }

    return ($count->overall >= self::MAX_OVERALL || $count->unames >= self::MAX_PER_USER);
}

此代码预计将使用 MySQL 运行,但我正在尝试使用 postgreSQL 运行

【问题讨论】:

  • Postgres 和 MySQL 有一些非常不同的语法。你为什么希望它运行没有错误?
  • postgres IF 是 plpgsql,使用 CASE WHEN 代替 sql

标签: php mysql sql postgresql pdo


【解决方案1】:

DATATYPE 'string' 语法仅适用于字符串文字,MICROSECONDS 必须是字符串的一部分。

您可以改用类型转换:

... current_timestamp - CAST((:itime || ' microseconds') AS interval)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多