在使用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服务器的错误日志文件 –