Php 使用pg#u prepare()errors';名称';不存在
我有一个使用此方法的简单DB类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
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]
);