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]
);
由md5产生的41982c47c3c84749552cd9808ad03422提供唯一的名称.问题似乎来自于ON CONFLICT.我该如何解决?
解决方法:
您没有检查pg_prepare的结果,并且可能存在语法错误.像VALUES($1,$2,$3,$4)应该再加上1个逗号.
另外,RETURNING LASTVAL()应该类似于RETURNING ID,或者您的串行列被调用.否则,您将在冲突情况下得到虚假结果.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。