4

我将准备好的声明创建为:

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

那么,作为问题的标题,有一种方法可以检查是否已经存在具有相同标签的准备语句,如果存在,则覆盖它?

我知道这个错误来自我的错误,只需在代码开头声明准备好的语句即可解决,但我想知道是否有解决方案可以更好地控制它们。

编辑:

在 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();
}
4

3 回答 3

7

一种方法(我希望有人会指出一种更简单的方法):

<?
$prepared_statement_name = 'activity1';
$mydbname = '...';

$conn = pg_connect("host=... port=... dbname=... user=... password=...");

$result = pg_query_params($conn, 'SELECT name FROM pg_prepared_statements WHERE name = $1', array($prepared_statement_name));

if (pg_num_rows($result) == 0) {
    $result = pg_prepare($conn, $prepared_statement_name, 'SELECT * FROM pg_stat_activity WHERE datname =  $1');
}

$result = pg_execute($conn, $prepared_statement_name, array($mydbname));
while($row = pg_fetch_row($result)) {
    var_dump($row);
}
于 2009-07-28T11:39:52.980 回答
0

还没有在 php 中尝试过,但如果这在您的应用程序中是可行的(如果您只需要在一个地方使用该语句并且不必通过名称再次“获取”它),您可以尝试准备一个未命名的语句。 http://www.postgresql.org/docs/8.4/interactive/libpq-exec.html说:

PQprepare
...
stmtName may be "" to create an unnamed statement, in which case any pre-existing unnamed statement is automatically replaced; otherwise it is an error if the statement name is already defined in the current session.
php_pg uses PQprepare, so this might work for you.

于 2009-07-28T11:52:25.467 回答
-4

Why are you using prepared statements at all ? They only offer a performance advantage if you use the same statement many times over.

于 2009-07-28T16:51:58.557 回答