2011-11-11 19 views
1

PHPから、私はSQLストアドプロシージャを呼び出しています。ストアド・プロシージャはデータベースをチェックし、新規のデータを挿入するか、既存のデータを変更します。ストアドプロシージャでこのエラーを処理する適切な方法は何ですか?

私のパラメータの1つが間違ったデータ型であるというエラーが表示されます。私は実際にデータがどこから来ているのかでこれを制御することはできません。私はストアドプロシージャを何百、何千回もデータの配列をループして呼び出していますが、バッチの中から2つのレコードについてのみこのエラーが発生します。

ストアドプロシージャでこのエラーを処理する適切な方法は何ですか?いずれかのパラメータに不正なデータ型がある場合、そのレコードをスキップして次のレコードに移動したいだけです。各呼び出しはforeachループから発生します。

データベースはエラーを報告しており、PHPはそれを表示しています。エラー処理の経験はありません。

例PHPコード:私は ":SQLエラー:[ストアドプロシージャのparamaterが正しくないデータ型であった]警告" を取得するコードを実行

foreach($item_array as $item) { 
    $id = $item['id']; 
    $color = $item['color']; 

    $con = connect() 
    $query = 'EXECUTE PROCEDURE sp_update_db(:id, :color);' 
    $params = array(':id' => $id, ':color' => $color); 
    $stmt = prepare($con, $query); 

    $result = execute($stmt, $params); 

    close($con); 
} 

+0

アドバンテージデータベースサーバ – MikeJerome

答えて

0

間違ったパラメータが渡された結果、あなたのprocが実行されていないように見えます。例外をキャッチするだけでこれをあなたのPHPコードで処理できます。

procのは、実際に呼び出されて、単に起因するデータ型の不一致のいくつかの並べ替えにプロシージャ内faillingされている場合は、あなたが

BEGIN TRY 
    -- your proc statements here 
END TRY 
BEGIN CATCH 
END CATCH 

Documentation here.

UPDATE

を使用することができますあなたは処理する必要のあるレコードごとにprocを呼び出すと言っているので、PHP側でエラーをキャッチする必要があります。 PHPではtry/catchブロックを使用できます。 See here

基本的には、foreachループ内にtry/catchブロックを格納して、ストアドプロシージャを呼び出す部分のみを囲む必要があります。 の場合は、ストアドプロシージャコールの前にifステートメントがあるだけで、procに渡されるすべてのパラメータが予想される型と長さになっていることを確認できます。たとえば、ストアドプロシージャのパラメータ@aintであると想定された場合、渡されるパラメータが数値でも空の文字列でもない場合、procが呼び出されないようにします。

UPDATEは2サンプルPHP(警告:私はPHPコーダーないです)に基づいて

try{ 
    $result = execute($stmt, $params); 
} 
catch (Exception $e) { 
} 

しかしをもう一度、あなたが期待されるデータの種類を知っていれば、動作します。このように思えますprocによって、try/catchの代わりにifがないのはなぜですか?

+0

データベースはエラーを報告しており、PHPはそれを表示しています。 – MikeJerome

+0

@MikeJeromeので、エラーが発生したときに残りのアイテムをループする方法がわからないという問題がありますか? – Icarus

+0

私は一度もエラーを処理していないので、ストアドプロシージャでcatchするか、foreachループでcatchするか、ストアドプロシージャでcatchして何かをPHPに戻す必要があるかどうかはわかりません。 – MikeJerome

関連する問題