使用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)
{
}
目前因工作需求,正在開發一套會員分級系統,不知是否可以跟前輩,索取完整範例程式,感恩。