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)調用它時,它只會返回,但記錄不會更新。
集應該'如果爲假THEN'是'IF NOT隨後發現'?此外,稍後的UPDATE語句不會設置FOUND的值。搜索「OUTPUTS」[在文檔中](http://www.postgresql.org/docs/8.4/static/sql-update.html)。 –
也許你需要'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' – Ahmad