Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用pg#u prepare()errors';名称';不存在_Php_Postgresql_Postgres 9.6 - Fatal编程技术网

Php 使用pg#u prepare()errors';名称';不存在

Php 使用pg#u prepare()errors';名称';不存在,php,postgresql,postgres-9.6,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) $t

我有一个使用此方法的简单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“不存在”


md5
生成的
41982c47c3c84749552cd9808ad03422
提供唯一名称。问题似乎来自冲突的
。如何修复此问题?

您没有检查pg_prepare的结果,可能是语法错误。像
值($1,$2,$3$4)
应该多加一个逗号


另外,
RETURNING LASTVAL()
可能类似于
RETURNING ID
,或者调用任何序列列。否则,您将获得冲突案例的虚假结果。

如果设置了
$v=“abc”
,它是否有效?相同的错误。准备好的报表“abc”不存在
    $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]
    );