【发布时间】:2010-11-14 15:33:30
【问题描述】:
我将准备好的语句创建为:
pg_prepare('stm_name', 'SELECT ...');
今天,我在两次声明同名的prepared statement时遇到了一个问题(两次调用错误的函数):
Warning: pg_prepare() [function.pg-prepare]: Query failed: ERROR: prepared statement "insert_av" already exists in xxx on line 221
那么,作为问题的标题,有一种方法可以检查是否已经存在具有相同标签的prepare语句,以防万一,覆盖它?
我知道这个错误是我的错误造成的,只需在代码开头声明准备好的语句即可解决,但我想知道是否有解决方案可以更好地控制它们。
编辑:
在Milen回答之后,很简单地检查准备好的语句是否已经在使用,只需在数据库中查询表pg_prepared_statements:
try{
$qrParamExist = pg_query_params("SELECT name FROM pg_prepared_statements WHERE name = $1", array($prepared_statement_name));
if($qrParamExist){
if(pg_num_rows($qrParamExist) != 0){
echo 'parametized statement already created';
}else{
echo 'parametized statement not present';
}
}else{
throw new Exception('Unable to query the database.');
}
}catch(Exception $e){
echo $e->getMessage();
}
但是,我认为这不是一个好的解决方案,因为我每次都要查询数据库。
好的,通常准备好的语句在脚本的开头声明,然后就可以重用,但是,我有一个连接良好的类,我不喜欢声明 10 个准备好的语句,而我只使用其中的 3 个.
所以,我想我会使用一个简单的 PHP 数组来跟踪我创建的语句,然后使用 isset() 函数检查它是否存在或需要创建:
try{
$prepare = pg_prepare('my_stmt_name', "SELECT ...");
if($prepare){
$this->rayPrepared['my_stmt_name'] = true;
}else{
throw new Exception('Prepared statement failed.');
}
}catch(Exception $e){
echo $e->getMessage();
}
【问题讨论】:
-
有时需要使用 EXECUTE 来修复“与 OID ###### 的关系不存在”错误。
-
你能告诉我如何得到警告信息吗?当我没有收到此警告消息时,我花了将近一个小时来了解我的代码失败的原因。谢谢
-
@EnsomHodder 在
pg_prepare或pg_query的结果失败时尝试使用error_reporting(E_ALL);和pg_last_error(即返回 false)
标签: php postgresql prepared-statement