2016-05-31 102 views
1

在使用PDO的預處理語句中調用execute時遇到問題。PDO執行語句掛起

這裏是我的代碼:

 $db = Connection::getConnection(); 

     $query = 'INSERT INTO stories (st_title, st_authors, st_content, st_cover) VALUES (?,?,?,?)'; 

     $params = ['title', 'Authors', 'content', 'cover']; 

     $stmt = $db->prepare($query); 

     echo "before <br>"; 
     $stmt->execute($params); 
     echo "after <br>"; 

如果我註釋掉線 $ stmt->執行($ params)方法;,「之前」和「之後」出現。但是,如果我不留下評論,他們都沒有出現。

我也嘗試使用 bindParam()而不是執行一個數組,但我得到了相同的結果。 值得注意的是,從sqlPlus插入數據庫中完全相同的參數完美地工作。

我在本地運行oracle 11g數據庫服務器。

任何幫助將不勝感激,我一直堅持這一段時間了。

編輯:我在標題中提到它,但忘了在這裏提到它。當這段代碼運行時,服務器會不停地掛起,我不得不重新啓動apache。

編輯2:連接沒問題,我找出問題的根源。 在故事表上,我對st_title有一個唯一的約束。 當我嘗試插入與前一個相同標題的故事時,會出現問題,此前一個已刪除。 如果我刪除了唯一約束,問題就消失了。

但是我想保持這個約束。任何想法可能會導致這種情況?

EDIT3:我對故事表中的觸發器:

--auto-increment on st_id-- 
DROP SEQUENCE stories_id_seq; 
CREATE SEQUENCE stories_id_seq; 

CREATE OR REPLACE TRIGGER stories_id_auto_inc 
BEFORE INSERT ON stories 
FOR EACH ROW 
BEGIN 
    SELECT stories_id_seq.NEXTVAL 
    INTO :new.st_id 
    FROM dual; 
END; 
/

--auto-completion for st_date_added-- 
CREATE OR REPLACE TRIGGER stories_date_added 
BEFORE INSERT ON stories 
FOR EACH ROW 
BEGIN 
    SELECT sysdate 
    INTO :new.st_date_added 
    FROM dual; 
END; 
/

CREATE OR REPLACE TRIGGER stories_delete 
BEFORE DELETE 
    ON stories 
    FOR EACH ROW 
DECLARE 
BEGIN 
    DELETE FROM st_cat 
    WHERE st_id = :old.st_id; 

    -- DELETE FROM characters 
    -- WHERE st_id = :old.st_id; 

    DELETE FROM favourites 
    WHERE st_id = :old.st_id; 

    DELETE FROM bookmarks 
    WHERE st_id = :old.st_id; 

    DELETE FROM comments 
    WHERE st_id = :old.st_id; 

    DELETE FROM ratings 
    WHERE st_id = :old.st_id; 
END; 
/

最後一個也是唯一一個相關的,我想,但我貼出來所有的,以防萬一。

值得注意的是,問題只發生在PDO上。如果我從sqlplus執行相同的操作,它工作正常。

解決方案:事實證明,這不是我的代碼的問題,它只是一個事實,我沒有提交;在刪除行之後在sqlplus中,PDO和他們分開了奇怪的事情。 (它並不只是告訴我正常的「標題已被採納」信息,這正是我所迷惑的)。

+0

你是100%的$ db連接嗎? (http://stackoverflow.com/a/6263868/1063823) – Duikboot

+0

嘗試[errorInfo](http://php.net/manual/en/pdo.errorinfo.php)在不同的階段,並返回結果。另請閱讀[Oracle錯誤監視](https://docs.oracle.com/cd/B28359_01/server.111/b28310/monitoring001.htm) –

+0

「之前和之後[...]他們都沒有出現「 - 另請參見http://php.net/manual/en/function.flush.php顯示您的PHP/Web服務器的錯誤日誌文件 –

回答

0

可能是您的數據庫連接設置不正確。

看看這篇文章,檢查你的連接是否穩定,你可以成功執行查詢。

PDO Connection Test