準備済みステートメントを次のように作成します。
pg_prepare('stm_name', 'SELECT ...');
今日、同じ名前のプリペアド ステートメントを 2 回宣言すると、問題が発生しました (誤って関数を 2 回呼び出す)。
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();
}
しかし、毎回データベースにクエリを実行する必要があるため、これは良い解決策ではないと思います。
通常、準備済みステートメントはスクリプトの先頭で宣言され、再利用されますが、うまく接続されたクラスがあり、そのうちの 3 つだけを使用するときに 10 個の準備済みステートメントを宣言するのは好きではありません。
したがって、単純な 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();
}