2013-02-02 109 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()