在使用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和他們分開了奇怪的事情。 (它並不只是告訴我正常的「標題已被採納」信息,這正是我所迷惑的)。
你是100%的$ db連接嗎? (http://stackoverflow.com/a/6263868/1063823) – Duikboot
嘗試[errorInfo](http://php.net/manual/en/pdo.errorinfo.php)在不同的階段,並返回結果。另請閱讀[Oracle錯誤監視](https://docs.oracle.com/cd/B28359_01/server.111/b28310/monitoring001.htm) –
「之前和之後[...]他們都沒有出現「 - 另請參見http://php.net/manual/en/function.flush.php顯示您的PHP/Web服務器的錯誤日誌文件 –