2016-05-31 11 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を再起動する必要があります。

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はそれらと奇妙なことをします。 (それは単に私に欺かれている普通の "タイトルが既に取られている"というメッセージを私に示すだけではありませんでした)。

+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

関連する問題