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

时间:2017-06-24 13:54:57

标签: php postgresql postgres-9.6

我有一个使用此方法的简单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()"
);

然而,当我做好准备时,我得到了错误"错误:准备好的声明" 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]
    );

41982c47c3c84749552cd9808ad03422生成md5以提供唯一名称。该问题似乎来自ON CONFLICT。我怎么解决这个问题?

1 个答案:

答案 0 :(得分:3)

您没有检查pg_prepare的结果,可能存在语法错误。与VALUES ($1, $2, $3 $4)一样,还应该有1个逗号。

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