PDO执行语句挂起

时间:2016-05-31 09:49:48

标签: php oracle apache pdo

使用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-&gt;执行($ params); ,则会显示“之前”和“之后”。但是,如果我没有注释它,它们都不会显示出来。

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

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

任何帮助都会受到高度赞赏,我现在已经坚持了一段时间。

编辑:我在标题中提到过它,但忘了在这里提一下。当这段代码运行时,服务器无法挂起,我不得不重启apache。

Edit2:连接正常,我找出了问题的根源。 在故事表上,我对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和它们一样奇怪。 (它不只是告诉我正常的“标题已被采取”的消息,这是骗了我的。)

1 个答案:

答案 0 :(得分:0)

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

看一下这篇文章,检查你的连接是否稳定,并且你可以成功地对它进行查询。

PDO Connection Test