1

PHPExcel を使用してスプレッドシートを読み取り、データを MySQL データベースにインポートする PHP コードがあります。(innoDB) インポートでデータベース内の重複レコードが検出された場合、インポートは失敗し、以前のすべての挿入がロールバックされるはずです。ロールバックが機能していません。同じように機能するこの小さなプログラムを書きました。

$conn = null;
try {

$conn=new mysqli("myServer","user","password", "moveforward");
$conn->autocommit(FALSE);

$sql="insert into series (seriesLocation,seriesName,seriesDate) values('1','2','2013-05-21')";
echo "Executing query 1<br>";
$conn->query($sql);
if($conn->error!="") {
    $sqlError=$conn->error;
    $conn->rollback();
    echo "Rollback complete<br>";
    throw new Exception($sqlError);
}

//This will throw a duplicate exception
echo "Exceuting query 2<br>";
$conn->query($sql);
if($conn->error!="") { 
    $sqlError=$conn->error;
    $conn->rollback();
    echo "Rollback complete<br>";
    throw new Exception($sqlError);
}
echo "You shouldn't be here<br>";

$conn->commit();
echo "Transactions comitted<br>";

} catch (Exception $e) {
    echo "Exception: " . $e->getMessage() . "<br>";
}
$conn->close();
echo "Done<br>";

PHPマニュアルを見て、ここの他の投稿をチェックすると、これはうまくいくように見えます。実行すると、次のようになります。

Executing query 1
Exceuting query 2
Rollback complete
Exception: Duplicate entry '2' for key 'seriesName'
Done

しかし、データベースをチェックすると、最初の挿入からのデータがそこにあります。

何か案は?

4

1 に答える 1

4

あなたのテーブルは適切なエンジンを使用していないと思います

http://php.net/mysqli.autocommit

この関数は、非トランザクション テーブル タイプ (MyISAM や ISAM など) では機能しません。

ただし、代わりに使用する方がはるかに簡単ですINSERT IGNORE(またはREPLACE、正しい動作が何であるかによって異なります)。この場合、重複した行は黙って無視されます (または既存の行を置き換えます ( REPLACE))。もちろん、どれが重複しているかを知りたい場合、これは機能しません。

于 2013-04-04T20:39:03.157 に答える