Я создаю свой подготовленный оператор как:
pg_prepare('stm_name', 'SELECT ...');
Сегодня у меня возникла проблема (дважды вызывая функцию из-за ошибки) при двойном объявлении подготовленного оператора с тем же именем:
Warning: pg_prepare() [function.pg-prepare]: Query failed: ERROR: prepared statement "insert_av" already exists in xxx on line 221
Итак, судя по заголовку вопроса, есть способ проверить, существует ли уже оператор подготовки с такой же меткой, и в случае чего перезаписать его?
Я знаю, что эта ошибка возникла из-за моей ошибки и будет решена простым объявлением подготовленных операторов в начале моего кода, но мне интересно, есть ли решение для большего контроля над ними.
ИЗМЕНИТЬ:
После ответа Милен достаточно просто проверить, используется ли уже подготовленный оператор, просто запросив в базе данных таблицу 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();
}
error_reporting(E_ALL);
и сpg_last_error
, когда ваш результат отpg_prepare
илиpg_query
не работает (т.е. возвращает false) - person Strae   schedule 28.04.2013