使用pg_prepare()的ON CONFLICT出现错误:'name'不存在。

3

我有一个简单的数据库类,其中包含这个方法

function __construct($host, $user, $pass, $db) {
    $this->link = pg_connect("host=$host port=5432 dbname=$db user=$user password=$pass") or $this->error();
}

public function run($sql, $args = null) {
    if(!$args)
        $this->query = pg_query($sql);
    else {
        $v = md5(uniqid(mt_rand(), true));
        $this->query = pg_prepare($v, $sql);
        $this->query = pg_execute($v, $args);
    }
    return $this;
}

使用这个方法,我可以在不使用预处理语句的情况下执行以下查询,并且它能够完美地工作。

$db->run("
    INSERT INTO userExercise (userid, exerciseid, date, sets)
    VALUES ($user->id, $exerciseid, '$date', '$sets')

    ON CONFLICT (userid, date, exerciseid)
    DO UPDATE SET sets = '$sets'

    RETURNING LASTVAL()"
);

然而,当我执行预处理操作时,出现错误:“ERROR: prepared statement "41982c47c3c84749552cd9808ad03422" does not exist”。

    $db->run("
        INSERT INTO userExercise (userid, exerciseid, date, sets)
        VALUES ($1, $2, $3 $4)

        ON CONFLICT (userid, date, exerciseid)
        DO UPDATE SET sets = $4

        RETURNING LASTVAL()",
        [$user->id, $exerciseid, $date, $sets]
    );

使用md5生成41982c47c3c84749552cd9808ad03422作为唯一名称。问题似乎来自于ON CONFLICT。如何解决?


如果你设置 $v = "abc",它能工作吗? - Giacomo Scarpino
相同的错误。预处理语句“abc”不存在。 - ditto
1个回答

3

你没有检查从pg_prepare返回的结果,可能存在语法错误。例如VALUES ($1, $2, $3 $4)应该有一个逗号。

另外,RETURNING LASTVAL()应该改为像RETURNING ID或者您的序列列名。否则,在冲突情况下会得到虚假结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接