[PHP]自動取號(編碼)程式

使用php撰寫程式的人,最常使用的資料庫應該是MySQL,MySQL本身已經有提供自動取號的功能,不過在某些狀況上可能並不適用,而已也有些資料庫並沒有提供自動給號的功能的。

自動取號,主要用在key值的產生,可以得到唯一的編號,而這個編號是有一定規則的,像是(檔頭+年份+流水號)之類的,用來識別此筆資料,而產生這個編號有很多種方式,如:

  • 資料庫本身提供此功能,ex:mysql的Auto Increment
  • 利用一個Table存放目前編號,再使用stored procedure或是程資語言來取號
  • 其它…

之前有寫過一個Oracle Store procedure的取號程式,而這次提供利用php程式來取得編號,取號的原則有幾個來確保取號不會錯誤:

  1. 取號後,不管有無使用,則此編號已不會再產生
  2. 要使用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)
{
        
}

One thought to “[PHP]自動取號(編碼)程式”

  1. 目前因工作需求,正在開發一套會員分級系統,不知是否可以跟前輩,索取完整範例程式,感恩。

發表迴響