[PHP]自動取號(編碼)程式
使用php撰寫程式的人,最常使用的資料庫應該是MySQL,MySQL本身已經有提供自動取號的功能,不過在某些狀況上可能並不適用,而已也有些資料庫並沒有提供自動給號的功能的。
自動取號,主要用在key值的產生,可以得到唯一的編號,而這個編號是有一定規則的,像是(檔頭+年份+流水號)之類的,用來識別此筆資料,而產生這個編號有很多種方式,如:
- 資料庫本身提供此功能,ex:mysql的Auto Increment
- 利用一個Table存放目前編號,再使用stored procedure或是程資語言來取號
- 其它...
之前有寫過一個Oracle Store procedure的取號程式,而這次提供利用php程式來取得編號,取號的原則有幾個來確保取號不會錯誤:
- 取號後,不管有無使用,則此編號已不會再產生
- 要使用transaction功能來取號及存入取到號碼(此範例並未用到交易)
這個範列的結果

編碼用Table(autoencode)
CREATE TABLE `autoencode` ( `code_type` VARCHAR(50) NOT NULL, `code_head` VARCHAR(10) NOT NULL, `code_count` BIGINT(20) NOT NULL, `code_max` INT(11) NOT NULL DEFAULT '10', PRIMARY KEY (`code_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
編碼程式內容
define('DB_HOST', "localhost"); //資料庫主機位置 define('DB_LOGIN', "root"); //資料庫的使用帳號 define('DB_PASSWORD', "12345"); //資料庫的使用密碼 define('DB_NAME', "site"); //資料庫名稱 //資料庫連線 function getConnection() { $conn =new mysqli(DB_HOST, DB_LOGIN, DB_PASSWORD,DB_NAME); if(mysqli_connect_errno()!=0) { //echo 'MySQL Connection Error!!!'.mysqli_connect_error(); throw new Exception('MySQL Connection Error!!!'.mysqli_connect_error()); } else { $conn->set_charset("utf8"); $conn->query("SET NAMES 'utf8'"); } return $conn; } //編碼 function autoEnCode($type) { $conn = null; try { $conn = getConnection(); $rs = $conn->query("select * from autoencode where code_type = '{$type}'"); if($rs!=FALSE){ if(($row_count = @$rs->fetch_assoc())!==NULL){ $max = $row_count['code_max'];//最大長度 $count = $row_count['code_count']+1;//目前的流水號 $head = $row_count['code_head'];//檔頭 $value = str_pad($count,$max-strlen($head),'0',STR_PAD_LEFT);//補零 $value = $head.$value; //回存流水號 $stmt = $conn->prepare("update autoencode set code_count = {$count} where code_type = '{$type}'"); if(stmt!=null) $stmt->execute(); else throw new Exception("取碼錯誤!"); return $value; } } }catch(Exception $e) { throw $e; } if($conn!=NULL) $conn->close(); return ''; }
測試程式碼
$conn = NULL; try { $conn = getConnection(); echo autoEnCode("order_master"); }catch(Exception $e) { }



留下您想說的話: