2012-05-02 6 views
0

私は2つのテーブルを持つmysql dbを持っています。最初のテーブルは 'uniqueReferences'と呼ばれ、2番目のテーブルは 'duplicatedReferences'と呼ばれます。 2つのテーブルには、idフィールド(自動インクリメント)とReferenceというフィールドの2つのフィールドしかありません。私が望むのは以下の通りです。 'uniqueReferences'テーブルにrefを挿入しようとすると、参照がすでに存在する場合は、そのテーブルに挿入するのではなく、 'duplicatedReferences'テーブルに挿入してください。PHP MySQL PDO - >値がすでに別のクエリを実行している場合にINSERT ON

私が試したが動作しなかったのは以下のとおりです。
1->私の 'uniqueReferences'テーブルのフィールドリファレンスを '一意'に設定します。
2 - >これは、残念ながら動作していない、次の

try{ 
     $req = $prepared_insertQry_toUniqueRefTable -> execute(array(something)); 

     if($req == 0){ 
       $prepared_insertQry_toDuplicateRefTable->execute(array(something)); 
     } 
    } 
    catch(PDOException $e){echo $e->getMessage();} 

してください。私は次のエラーがありますSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry。誰かが助けることを願っています。乾杯。 Marc

+0

'$ prepared_insertQry_toDuplicateRefTable ...'を 'catch'ブロックに置くことはできませんでした(例外が '重複エントリ'エラーであることを確認した後)? – Travesty3

+0

こんにちはTravesty :)助けようと努力しています。私はかなりpdoに新しいとキャッチブロックは例外を得るためだと思った。だから私はあなたが示唆していることを実際には得ていません... – Marc

+0

このcatchは、例外が発生したときに取るアクションを定義します。これはエラーメッセージで何かをしている可能性があります。 – prodigitalson

答えて

1

コードとインライン私のノートを参照してください:

try{ 
     $req = $prepared_insertQry_toUniqueRefTable -> execute(array(something)); 

     // this never executes because an Exception halts it here 
     /*if($req == 0){ 
       $prepared_insertQry_toDuplicateRefTable->execute(array(something)); 
     }*/ 
    } 
    catch(PDOException $e){ 
     // this catch grabs the exception and executes the code within instead 
     // that code might log an error, echo the error message, or perform 
     // alternative logic. In your case you want to execute alterntative logic 
     // ie. your query 
     $prepared_insertQry_toDuplicateRefTable->execute(array(something)); 

    } 
+0

素晴らしい説明をありがとう – Marc

1

あなたが得ているメッセージに基づいて、メッセージが... 1062 Duplicate entryであるPDOExceptionをキャッチしているようです。これは、 'uniqueReferences'テーブルのテーブル制約が重複エントリを許可しないことを意味します。おそらく、そのテーブルに主キーがあるからです。これは良いことであり、この問題を解決しやすくします。

重複したエントリを挿入しようとするたびに例外がスローされると、それは 'duplicatedReferences'テーブルに挿入することがわかったときです。スローされた例外が重複エントリに起因するものであることを確認したいだけです。

これを試してみてください:

try 
{ 
    $prepared_insertQry_toUniqueRefTable->execute(array(something)); 
} 
catch (PDOException $e) 
{ 
    if ($e->getCode() == 1062) 
     $prepared_insertQry_toDuplicateRefTable->execute(array(something)); 
    else 
     echo $e->getMessage(); 
} 
+0

Thks。ちょうどそれを試してみてください...私に秒を与え、私は元に戻す – Marc

1

は重複行のためのテーブルに挿入し、それがすでに存在している、その後場合は、最初にデータを挿入しよう。行が存在する場合は、例外が発生したとして、あなたはこの例外をキャッチして、代わりに複製テーブルに行を挿入することができます。

try 
{ 
    $req = $prepared_insertQry_toUniqueRefTable -> execute(array(something)); 
} 
catch (PDOException $e) 
{ 
    // you can use the value of errorInfo[1] to check the actual generated error code 
    if ($e->errorInfo[1] == 1062) 
    { 
     $prepared_insertQry_toDuplicateRefTable->execute(array(something)); 
    } 
    else 
    { 
     // rethrow the exception as we're not handling it 
     throw $e; 
    } 
} 

は、あなたが望む結果を得るためにそれを少し調整する必要があるかもしれませんが、これはすべきそれの要点である。

関連する問題