PHP ADO Transaction (BeginTrans,CommitTrans,RollbackTrans) |
PHP ADO Transaction (BeginTrans,CommitTrans,RollbackTrans) ตัวอย่างนี้จะเป็นการเขียนโปรแกรม PHP ADO กับ Microsoft Access ใช้งาน Transaction ในการตรวจสอบความถูกต้องก่อนการทำการบันทึกข้อมูลจริง หลักการคือ เมื่อมีการ BeginTrans แล้ว ภายใต้คำสั่งที่อยู่ในเงื่อนไนนี้จะมีการตรวจสอบว่ามีการทำงานถูกต้อง หรือมีข้อผิดพลาดหรือไม่ ถ้าไม่มีข้อผิดพลาดก็จะทำการ CommitTrans หรือถ้ามีข้อผิดพลาดโปรแกรมจะทำการ RollbackTrans คือยกเลิกข้อมูลที่ได้ทำการกระทำในแต่แรก
ทำความเข้าใจในฐานข้อมูล Ms Access และ SQL Server การเปิด BeginTrans แล้วการเปิด Object RecordSet สามารถเปิดได้เพียง 1 ตัวเท่านั้น
โดยถ้าจะมีการเปิด RecordSet อื่นจะต้องทำการ ปิด (Close) Object RecordSet แรกก่อน
ตัวอย่าง
ตัวอย่างนี้จะเป็นการเพิ่มข้อมูล โดยผมได้สมมุติการเพิ่มข้อมูลซ้ำ ซึ่งมี Primary Key ชื่อ CustomerID ซึ่งจะสามารถเพิ่มข้อมูลสำเร็จใน Statement แรก และ Statement ที่ 2 จะไม่สามารถเพิ่มข้อมูลได้ และเมื่อมีการ RollBack ข้อมูล Statement แรกที่ถูก Insert ไปแล้วก็จะถูกยกเลิกในทันที สำหรับการใช้ Transaction สามารถใช้ได้ทั้งการ Insert/Update Record
phpComAdoDBTransactionAddForm.php
<html>
<head>
<title>ThaiCreate.Com PHP & COM (ADO)</title>
</head>
<body>
<form action="phpComAdoDBTransactionAddSave.php" name="frmAdd" method="post">
<table width="600" border="1">
<tr>
<th width="91"> <div align="center">CustomerID </div></th>
<th width="160"> <div align="center">Name </div></th>
<th width="198"> <div align="center">Email </div></th>
<th width="97"> <div align="center">CountryCode </div></th>
<th width="70"> <div align="center">Budget </div></th>
<th width="70"> <div align="center">Used </div></th>
</tr>
<tr>
<td><div align="center"><input type="text" name="txtCustomerID" size="5"></div></td>
<td><input type="text" name="txtName" size="20"></td>
<td><input type="text" name="txtEmail" size="20"></td>
<td><div align="center"><input type="text" name="txtCountryCode" size="2"></div></td>
<td align="right"><input type="text" name="txtBudget" size="5"></td>
<td align="right"><input type="text" name="txtUsed" size="5"></td>
</tr>
</table>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
Screenshot
phpComAdoDBTransactionAddSave.php
<html>
<head>
<title>ThaiCreate.Com PHP & COM (ADO)</title>
</head>
<body>
<?php
$strConn = new COM("ADODB.Connection") or die("Cannot start ADO");
$strConn->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydatabase.mdb"));
$strConn->BeginTrans();
//*** Save Form ***//
$strSQL = "";
$strSQL .= "INSERT INTO customer ";
$strSQL .= "(CustomerID,Name,Email,CountryCode,Budget,Used) ";
$strSQL .= "VALUES ";
$strSQL .= "('".$_POST["txtCustomerID"]."','".$_POST["txtName"]."','".$_POST["txtEmail"]."' ";
$strSQL .= ",'".$_POST["txtCountryCode"]."','".$_POST["txtBudget"]."','".$_POST["txtUsed"]."') ";
$strConn->Execute($strSQL) or die ($strConn->RollbackTrans());
//*** Already Exist Save Form (CustomerID is PK)***//
$strSQL = "";
$strSQL .= "INSERT INTO customer ";
$strSQL .= "(CustomerID,Name,Email,CountryCode,Budget,Used) ";
$strSQL .= "VALUES ";
$strSQL .= "('".$_POST["txtCustomerID"]."','".$_POST["txtName"]."','".$_POST["txtEmail"]."' ";
$strSQL .= ",'".$_POST["txtCountryCode"]."','".$_POST["txtBudget"]."','".$_POST["txtUsed"]."') ";
$strConn->Execute($strSQL) or die ($strConn->RollbackTrans());
$strConn->CommitTrans();
$strConn->Close();
$strConn = null;
?>
</body>
</html>
Screenshot
Error MessageFatal error: Uncaught exception 'com_exception' with message '<b>Source:</b> Microsoft OLE DB Provider for ODBC Drivers<br/><b>
Description:</b> [Microsoft][ODBC Microsoft Access Driver] The changes you requested to the table were not successful
because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that
contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again
|