Php: deyimi hazırlanan bir pg_prepare zaten var olmadığını kontrol edin

3 Cevap php

: i olarak benim hazır deyimi oluşturmak

pg_prepare('stm_name', 'SELECT ...');

Iki kez aynı adla hazırlanan açıklama bildirirken Bugün, i (yanlışlıkla iki kez bir işlevi çağırarak) bir sorun vardı:

Warning: pg_prepare() [function.pg-prepare]: Query failed: ERROR: prepared statement "insert_av" already exists in xxx on line 221

Yani, soru başlık olarak, bir yol var to check if a prepare statement with the same label already exists, and in case, overwrite it?

Ben bu hata benim hata için gelmek olduğunu ve sadece benim kod başındaki hazırlanmış deyimleri ilan çözülmüş olacak biliyorum, ama bunların üzerinde daha fazla kontrole sahip bir çözüm olup olmadığını merak im.

EDIT:

Milen cevap sonra, hazırlanmış deyimi zaten kullanımda olup olmadığını kontrol etmek için oldukça basit, sadece tablo pg_prepared_statements için db queryin:

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

I veritabanı her şey sorgulamak zorunda becose ama, ben, bu iyi bir çözüm olduğunu sanmıyorum.

Tamam, genellikle hazırlanmış deyimleri script başlar ve sonra sadece yeniden kullanılmakta de yardımıyla bildirilmektedir ama, ben bir sınıf güzel kablolu var ve ben sadece 3 tanesi kullanacağınız zaman 10 hazır deyimi bildirmek istiyorum dont.

So, i think i'll use a simple php array to keep track the statements i create, and then with isset() function check if it exist or need to be created:

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

3 Cevap

Tek yönlü (Birisi basit bir işaret umuyoruz):

<?
$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);
}

Bazen gerekli kullanım hatası "# # # # # # yok OID'deki ilişki" düzeltmek için gerçekleştirir.

Neden hiç hazırlanmış deyimleri kullanıyorsunuz? Eğer üzerinde aynı deyimini birçok kez kullanmak Onlar sadece eğer bir performans avantajı sunuyoruz.