2013-02-02 75 views
0

我的功能在我的PostgreSQL服務器PDO和PostgreSQL功能

CREATE OR REPLACE FUNCTION edit_senti_meta_translation(_senti_id bigint, _meta_id bigint, _lang_code character, _meta_title character varying, _meta_note text) 
    RETURNS boolean AS 
$BODY$ 
BEGIN 
    PERFORM 
     senti.is_draft 
    FROM 
     senti, senti_meta 
    WHERE 
     senti.senti_id=_senti_id 
    AND senti_meta.senti_id=senti.senti_id 
    AND senti_meta.senti_id=_senti_id 
    AND senti_meta.meta_id=_meta_id; 
    IF FALSE THEN 
     RETURN FALSE; 
    END IF; 
    BEGIN 
     UPDATE senti_meta_translation 
     SET meta_title=_meta_title, meta_note=_meta_note 
     WHERE meta_id=_meta_id AND lang_code=_lang_code; 
     IF FOUND THEN 
      UPDATE senti_meta SET last_update=now() WHERE senti_id=_senti_id AND meta_id=_meta_id; 
      RETURN TRUE; 
     ELSE 
      RETURN FALSE; 
     END IF; 
    END; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

那麼,它的工作,如果我在pgadmin3嘗試,和我的紀錄被更新(工作100%如我所料),如果我調用這個函數

SELECT edit_senti_meta_translation(1, 41, 'eng', 'a', 'a'); 

但是當我嘗試調用函數使用PHP(PDO驅動程序)它給我的結果真或假,但UPDATE未運行,我的記錄沒有更新。

$stmt = Database::getInstance()->prepare('SELECT * FROM edit_senti_meta_translation(:senti_id, :meta_id, :lang_code, :meta_title, :meta_note);'); 
$stmt->bindParam(':senti_id', $senti_id, PDO::PARAM_INT); 
$stmt->bindParam(':meta_id', $meta_id, PDO::PARAM_INT); 
$stmt->bindParam(':lang_code', $lang_code, PDO::PARAM_STR); 
$stmt->bindParam(':meta_title', $meta_title, PDO::PARAM_STR); 
$stmt->bindParam(':meta_note', $meta_note, PDO::PARAM_STR); 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$stmt->execute(); 
return $stmt->fetchColumn(0); 

即使我改變第一線在我的PHP代碼

$stmt = Database::getInstance()->prepare("SELECT edit_senti_meta_translation(1, 41, 'eng', 'a', 'a');"); 

它給我的結果(真/假),但記錄不更新。 這讓我很困惑

有關信息,我使用PostgreSQL 8.4

那個讓我困惑的事情是,當我直接撥打電話pgadmin3的功能,它給我記錄正確的返回更新,但是從PHP(PDO)調用它時,它只會返回,但記錄不會更新。

+0

集應該'如果爲假THEN'是'IF NOT隨後發現'?此外,稍後的UPDATE語句不會設置FOUND的值。搜索「OUTPUTS」[在文檔中](http://www.postgresql.org/docs/8.4/static/sql-update.html)。 –

+0

也許你需要'SELECT senti.is_draft INTO v_is_draft FROM ...'和'IF NOT v_is_draft THEN RETURN FALSE'? –

+0

@Catcall:我想在is_draft返回FALSE時進行更新,因爲我已經做了一個關於ID是否被發現的驗證。所以我應該使用'IF FALSE THEN' – Ahmad

回答

1

那麼,在解決問題後,@dmirkitanov回答這個問題,爲什麼會發生這種情況。

這可能與交易有關,如果,例如,該代碼運行 在一個事務中,並沒有提交後

我注意到,在PDO Singleton類,有一個人在項目中增加一條新線。 *請參閱代碼的註釋行

<?php 

include('config.database.php'); 

class Database { 

    protected static $instance = null; 

    final private function __construct() {} 
    final private function __destruct() { 
     //self::$instance->commit(); 
     self::$instance = null; 
    } 

    final private function __clone() {} 

    public static function getInstance() { 
     if (self::$instance === null) { 
      try { 
       self::$instance = new PDO(
        'pgsql:host=' . DatabaseConfig::HOST . 
        ';port='  . DatabaseConfig::PORT . 
        ';dbname='  . DatabaseConfig::DBNAME . 
        ';user='  . DatabaseConfig::USER . 
        ';password=' . DatabaseConfig::PASSWORD 
       ); 
       self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       self::$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 
       //self::$instance->beginTransaction(); 
      } catch (PDOException $e) { 
       self::$instance->rollBack(); 
       die('Database connection could not be established.'); 
      } 
     } 

     return self::$instance; 
    } 
    public static function __callStatic($method, $args) { 
     return call_user_func_array(array(self::instance(), $method), $args); 
    } 
} 
?> 

因此,大家可以看到,beginTransaction()設置在getInstance(),但commit()__destruct()