PHP Microsoft Access Transaction (TRANSACTION,COMMIT,ROLLBACK) |
PHP Access Transaction (odbc_autocommit(),odbc_commit(),odbc_rollback()) ในฟังก์ชั่นของ odbc สามารถทำการการเรียกใช้งาน Transaction ของ Microsoft Access ได้เช่นเดียวกับในรูปแบบของการเชื่อต่อแบบอื่น ๆ ครับ หลักการทำงานก็เป็นไปตาม Transaction คือ เมื่อต้องการใช้งาน Transaction จะต้องทำการเปิด odbc_autocommit() หลังจากเปิดแล้ว Event ที่เกิดหลังจากนี้จะถูกทำงานภายใต้ Transaction ซึ่งจะยังไม่มีการ Update ข้อมูลจริง แต่ในขณะเดียวกันข้อมูลที่ถูกกระทำภายใต้ Transaction จะสามารถเรียกใช้งานได้ภานใน Process เหมือนกับว่ามีการเกิด Event จริง ๆ แต่ถ้าเมื่อมีการ odbc_commit() ข้อมูลถูกอย่างก็จะถูกบันทึกตามเหตุการณ์ หรือ odbc_rollback() เพื่อยกเลิกการกระทำทั้งหมด
Transaction Syntax
- odbc_autocommit($Connection,false); // Start Transaction
- odbc_commit($Connection); // Commit Transaction
- odbc_rollback($Connection); // RollBackTransaction
ตัวอย่าง
phpMsAccessTransactionAddForm.php
<html>
<head>
<title>ThaiCreate.Com PHP & Access Tutorial</title>
</head>
<body>
<form action="phpMsAccessTransactionAddSave.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
phpMsAccessTransactionAddSave.php
<html>
<head>
<title>ThaiCreate.Com PHP & Access Tutorial</title>
</head>
<body>
<?php
$objConnect = odbc_connect("mydatabase","","") or die("Error Connect to Database");
//*** Start Transaction ***//
odbc_autocommit($objConnect,false);
$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"]."') ";
$objExec = odbc_exec($objConnect, $strSQL);
if($objExec)
{
//*** Commit Transaction ***//
odbc_commit($objConnect);
echo "Save Done.";
}
else
{
//*** RollBack Transaction ***//
odbc_rollback($objConnect);
echo "Error Save [".$strSQL."]";
}
odbc_close($objConnect);
?>
</body>
</html>
คำอธิบาย
จากตัวอย่างผมได้ยกเพียงการ Insert ข้อมูลเท่านั้นครับ คือถ้าการ Insert ข้อมูลผ่านก็ให้ทำการ odbc_commit() หรือถ้ามีข้อผิดพลาดให้ทำการยกเลิกข้อมูลโดย odbc_rollback() ในการใช้งาน Transaction นั้นนิยมใช้ในต่อเมื่อมี Process ที่มากกว่า 1 Process ครับ เช่น การเพิ่มข้อมูล Table 1 และ Table 2 หรือ 3 โดยเมื่อ Process ใด Process หนึ่งทำงานผิดพลาด ก็ให้ทำการยกเลิกข้อมูลทั้งหมด
Transaction Flow
odbc_autocommit()
Process 1
.
.
.
Error -> odbc_rollback()
Process 2
.
.
.
Error -> odbc_rollback()
Process 3
.
.
.
Error -> odbc_rollback()
.
.
No Error -> odbc_commit()
ถ้า Apply กับตัวอย่างที่ผมได้ยกขึ้นมาก็จะเขียนได้เป็น
<html>
<head>
<title>ThaiCreate.Com PHP & Access Tutorial</title>
</head>
<body>
<?php
$objConnect = odbc_connect("mydatabase","","") or die("Error Connect to Database");
//*** Start Transaction ***//
odbc_autocommit($objConnect,false);
//*** Query 1 ***//
$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"]."') ";
$objExec1 = odbc_exec($objConnect, $strSQL);
if(!$objExec1)
{
//*** RollBack Transaction ***//
odbc_rollback($objConnect);
echo "Error Save [".$strSQL."]";
exit();
}
//*** Query 2 ***//
$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"]."') ";
$objExec2 = odbc_exec($objConnect, $strSQL);
if(!$objExec2)
{
//*** RollBack Transaction ***//
odbc_rollback($objConnect);
echo "Error Save [".$strSQL."]";
exit();
}
//*** Query 3 ***//
$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"]."') ";
$objExec3 = odbc_exec($objConnect, $strSQL);
if(!$objExec3)
{
//*** RollBack Transaction ***//
odbc_rollback($objConnect);
echo "Error Save [".$strSQL."]";
exit();
}
//**** Commit Transaction ****//
if(($objExec1) and ($objExec2) and ($objExec3))
{
//*** Commit Transaction ***//
odbc_commit($objConnect);
echo "Save Done.";
}
odbc_close($objConnect);
?>
</body>
</html>
Screenshot
.
|