2016-05-31 75 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