【问题标题】:PDO and PostgreSQL FunctionPDO 和 PostgreSQL 函数
【发布时间】:2013-02-02 23:04:19
【问题描述】:

我的 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 驱动程序)调用该函数时,它给我的结果是 true 或 false,但是 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) 调用它时,它只给我返回,但是记录未更新。

【问题讨论】:

  • 应该IF FALSE THENIF NOT FOUND THEN 吗?此外,稍后的 UPDATE 语句不会设置 FOUND 的值。搜索“输出”in the docs
  • 也许你需要SELECT senti.is_draft INTO v_is_draft FROM ...IF NOT v_is_draft THEN RETURN FALSE
  • @Catcall :我想在 is_draft 返回 FALSE 时进行更新,因为我已经对是否找到了 id 进行了验证。所以我应该使用'IF FALSE THEN'
  • @Catcall UPDATE 语句确实设置了 FOUND 变量。请参阅this 手册。第 39.5.5 部分。
  • 可能和事务有关,比如这段代码运行在一个事务中,后面没有提交。

标签: php postgresql pdo


【解决方案1】:

好吧,在解决了这个问题之后,@dmirkitanov 回复了为什么会发生这种情况。

它可能与事务有关,例如,如果此代码运行 在事务中,并且在它之后没有提交

我注意到在 PDO 单例类上,项目中的某些人添加了新行。 *见注释的代码行

<?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()

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2015-10-22
    • 2013-06-19
    相关资源
    最近更新 更多