3

データベースにテーブルがあります。私のテーブルには、主キーとして設定された自動インクリメントIDフィールドと、一意として設定した「参照」と呼ばれるもう1つのフィールドを含むいくつかのフィールドがあります。そのテーブルにデータを入力するために、pdoを使用してそのテーブルにレコードを挿入するphpスクリプトがあります。挿入が正常に行われるたびに(つまり、「参照」がテーブルに存在しなかった場合)、$newOnesという変数をインクリメントします。値'reference'がすでにテーブルにある場合、コード23000の例外がトリガーされます。その場合、$doublonsという別の変数をインクリメントします。残念ながら、whileループがテーブルの最後のレコードを「処理」しているときに、例外23000を除いて、私のスクリプトが致命的なエラーをトリガーしています。そして、私はそれを取得しません。よろしくお願いします。乾杯。マーク

私のphpコード:

try {
  $connexion = connexion('localhost', 'user', 'user', 'mydb');
  $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $qry_bat = $connexion->query('SELECT...');
  $ins_db = $connexion->prepare('INSERT...');
}
catch (PDOException $e) {
  echo $e->getMessage();
}

while($row = $qry_bat->fetch(PDO::FETCH_ASSOC)) {
  try {
    $ins_db->execute(array(...));
    $newOnes++;
  }
  catch (PDOException $e) {
    if ($e->getCode() != 23000) {
      echo '<span class="msg-alert">'.$e->getMessage().'</span>';
    } else {
      $doublons++;
    }
  }
}

私が得ている致命的なエラー(22行目はwhile(...)行を参照していることに注意してください):

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]:  
Integrity constraint violation: 1062 Duplicate entry 'theFieldContentOfTheLastRecordOfTheTable' for key 'theFieldNameReference' in  
/myFilePath/file.php:22 Stack trace: #0 /myFilePath/file.php(22): PDOStatement->fetch(2)  
#1 {main} thrown in /myFilePath/file.php on line 22

編集 //////////

元のテーブル(言及するもの):
自動インクリメントID

挿入するテーブル(言及するもの):参照
時にIDフィールド
UNIQUEINDEX で自動インクリメント

4

3 に答える 3

6

回答へのアップグレード

このバグのように見えますが、ほぼ5年経ってもまだ開いています。代わりに試してください:

while (true) {
  try {
    $row = $qry_bat->fetch(PDO::FETCH_ASSOC);
    if (!$row) break;
    $ins_db->execute(array(...));
    $newOnes++;
  }
  catch (PDOException $e) {
    if ($e->getCode() != 23000) {
      echo '<span class="msg-alert">'.$e->getMessage().'</span>';
    } else {
      $doublons++;
    }
  }
}
于 2012-05-26T10:10:17.967 に答える
1

スタック トレースは、try/catch ブロックの外側にあるフェッチで例外が発生していることを示しています。

SELECT ステートメントがトリガーされます。

Integrity constraint violation: 1062 Duplicate entry 'theFieldContentOfTheLastRecordOfTheTable'

競合しているtheFieldContentOfTheLastRecordOfTheTableという名前の一意のキーがあります。

これが整合性にどのように影響するかを確認するためにスキーマを投稿できますか?

于 2012-05-26T10:16:25.563 に答える
0

その列ですでにダーティ/重複データを探します。一部のアプリでは、データが既にキャプチャされた後に「緩やかな」制約を適用できます。これはあなたの場合に起こったかもしれません。

于 2014-11-03T12:09:15.617 に答える