2017-12-09 33 views
-1

EDITこれはmysqliの質問の重複した質問だとは思わないし、独自の質問に値すると思う。2つの挿入、2つのテーブル、1つのPDOトランザクション、2つのSQL結果

私はPDOトランザクションを使用して、フォームから正しいテーブルにデータを取得しようとしています(これは私にとって初めてのことです)。

SQLはテーブルに正しく挿入されますが、2重に挿入されます。だから私は各テーブルに二重の結果で終わる。

私はfaviconのためにページが2回リフレッシュされるという問題、またはこれがブラウザの問題であると読んでいます。しかし、サーバを再起動して複数のブラウザをテストした後でも、それは私のコードだと思う。

try { 
    //$mysqli->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $mysqli->begin_transaction(); 

    $stmt = $mysqli->prepare("INSERT $table1 (status, customer, product, ord_num, return_code, dop, sn, problem_descr, repair_descr, comments) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
    $stmt->bind_param("ssssssssss", $status, $customer, $product, $ord_num, $return_code, $dop, $sn, $problem_descr, $repair_descr, $comments); 
    $stmt->execute(); 
    if (!$stmt->execute()) { 
     echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
    } 
    $stmt->close(); 

    $stmt = $mysqli->prepare("INSERT $table2 (part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15, part16, part17, part18, part19, part20) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
    $stmt->bind_param("ssssssssssssssssssss", $part1, $part2, $part3, $part4, $part5, $part6, $part7, $part8, $part9, $part10, $part11, $part12, $part13, $part14, $part15, $part16, $part17, $part18, $part19, $part20); 
    $stmt->execute(); 
    if (!$stmt->execute()) { 
     echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
    } 
    $stmt->close(); 

    $mysqli->commit(); 
} catch(PDOException $ex) { 
    //Something went wrong, rolback! 
    $mysqli->rollBack(); 
    echo $ex-getMessage(); 
} 
+1

mysqli extを使用しているときにPDOExceptionをキャッチしようとしていますか? – frz3993

+0

あなたの例外の誤字は、ヒットした場合に発生します。これは起こりません^、 'echo $ ex-getMessage();' –

答えて

2

これは変更する必要があります:

$stmt->execute(); 
     if (!$stmt->execute()) { 

だけ

if (!$stmt->execute()) { 

で十分です。

$stmt->execute();を実行してから、再度if文の中に入れて、それがtrueを返すかどうかを確認します。あなたはダブルエントリーを見ています。

+0

ありがとう、これはトリックでした。 –

+0

あなたは大歓迎です! –

0

か、我々は一度だけ実行するステートメントを実行する必要があり、この

$run = $stmt->execute(); 
if (!$run) { 

のように行うことができます。

関連する問題