ON CONFLICT 使用 pg_prepare() 错误 'name' 不存在
ON CONFLICT using pg_prepare() errors 'name' does not exist
我有一个简单的数据库 class 使用此方法
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 (, , )
ON CONFLICT (userid, date, exerciseid)
DO UPDATE SET sets =
RETURNING LASTVAL()",
[$user->id, $exerciseid, $date, $sets]
);
由md5
产生的41982c47c3c84749552cd9808ad03422
给一个唯一的名字。该问题似乎来自 ON CONFLICT
。我该如何解决这个问题?
您没有检查 pg_prepare 的结果,可能存在语法错误。像 VALUES (, , )
应该多 1 个逗号。
此外,RETURNING LASTVAL()
可能应该类似于 RETURNING ID
,或者您的序列号专栏的任何名称。否则你会得到错误的冲突结果。
我有一个简单的数据库 class 使用此方法
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 (, , )
ON CONFLICT (userid, date, exerciseid)
DO UPDATE SET sets =
RETURNING LASTVAL()",
[$user->id, $exerciseid, $date, $sets]
);
由md5
产生的41982c47c3c84749552cd9808ad03422
给一个唯一的名字。该问题似乎来自 ON CONFLICT
。我该如何解决这个问题?
您没有检查 pg_prepare 的结果,可能存在语法错误。像 VALUES (, , )
应该多 1 个逗号。
此外,RETURNING LASTVAL()
可能应该类似于 RETURNING ID
,或者您的序列号专栏的任何名称。否则你会得到错误的冲突结果。