繁体   English   中英

ON CONFLICT使用pg_prepare()错误'name'不存在

[英]ON CONFLICT using pg_prepare() errors 'name' does not exist

我有一个简单的DB类与此方法

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“不存在”

    $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 我怎么解决这个问题?

你没有检查pg_prepare的结果,可能是语法错误。 VALUES ($1, $2, $3 $4)应该再增加1个逗号。

此外, RETURNING LASTVAL()应该类似于RETURNING ID ,或者调用串行列。 否则你将得到冲突案件的虚假结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM