PDO execute语句挂起



在使用PDO对准备好的语句调用execute时遇到问题。

这是我的代码:

$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->execute($params),"之前"one_answers"之后"都出现。但是,如果我不加注释,它们都不会出现。

我也尝试过使用bindParam()而不是使用数组执行,但我得到了相同的结果。同样值得注意的是,使用完全相同的参数从sqlPlus插入数据库可以完美地工作。

我在本地运行一个oracle 11g数据库服务器。

如果有任何帮助,我们将不胜感激,我已经在这件事上呆了一段时间了。

编辑:我在标题中提到了它,但也忘了在这里提到它。当这段代码运行时,服务器会不稳定地挂起,我不得不重新启动apache。

Edit2:连接正常,我找到了问题的根源。在stories表中,我对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会用它们来处理奇怪的事情。(它不仅向我显示了正常的"标题已经被占用"信息,这就是愚弄我的原因)。

可能您的数据库连接设置不正确。

看看这篇文章,看看你的连接是否稳定,你是否可以成功地对它执行查询。

PDO连接测试

最新更新