2011-09-29 17 views
2

マルチコマンドスクリプト(例えば、CREATE TABLEコマンド、おそらくはINSERTコマンド)を実行する場合、特にPHP用MySQL PDOドライバスクリプトにエラー(構文またはロジック)が含まれていても、戻り値は常に0(エラー情報なし)です。PHP MySQL PDO :: execは、マルチコマンドスクリプトのエラーを発生させません。

これにより、長いビルドスクリプトを実行してからスクリプトが正常に実行されたかどうかを確認できなくなります。エラーが発生した場合、プロセスはスクリプトが失敗した時点で終了しますが、エラー情報は残さずに0が残っています。

私はこのサイトとネットを検索してこの質問への回答を得ました。一般的な回答は「あなたができることは何もありません」と思われます。私の現在の解決策は、いくつかのデータをチェックし、それに対する応答を評価する "ベリファイビルド"クエリを実行することです。これはひどく非効率的です。

誰もがこの問題に遭遇しましたか?もしそうなら、どのようにビルドスクリプトが正常に実行されたことを確認しましたか?

+0

はい、私はこの問題に遭遇しました。それは本当の痛みです。エラー情報がないので* if *と*何が間違っているかを知る方法がないからです。しかし、PDOは実際には0を返し、失敗した場合は1を返しますが、エラー情報は表示されません。私がこの質問に2回投票することができたら、私はそうするだろう。 –

答えて

1

おかげで - 私はこの解決策を見つけることができませんでしたが、その代わりとうまく結びつい教義を、使用して終了データベースの移行。

0

回避策として、スクリプトを含む文字列を分割することはできますか。個別に各ステートメントを実行しますか?

問題を特定のステートメントに分離することができます。

php.netでは、PDO :: execは失敗時にfalseを返すとは言いませんが、PDO :: queryは失敗します。

+0

あなたの答えをありがとう。私は最初にこのソリューションについて考えましたが、 ';'を含む文字列リテラルのためにbuild.sqlスクリプトをあらかじめ解析する必要があるため、破棄しました。キャラクター。確かにPDOはこれを処理する必要がありますか? – lshepstone

0

スクリプトを実行するストアド関数を作成するだけで、関数は成功した場合に値を返し、executeではなく選択肢を使用する必要があります。この方法で、スクリプトが成功したかどうかを知ることができます。コマンドが正常終了した場合、インストール機能を削除できます。

+0

これは面白い回避策のようです。ビルドスクリプトを単に "ラップする"ストアドファンクションをデータベースに作成できますか?結果に応じてビルド・スクリプト全体をトランザクションに入れ、コミットまたはロールバックすることは可能でしょうか? – lshepstone

0

あなたのような構文を使用して、各個別のコマンドについての情報を取得することができます。すべての人の回答を

do 
{ 
    // do something with your current rowset 
} 
while($pdo->nextRowSet()); 
関連する問題