PHP โค้ดตัวอย่างการหา UNIQUE KEY จากคำสั่ง SQL CREATE TABLE

โดย SONGCHAI SAETERN

หลังจากที่ได้ทดสอบโปรเจ็กต์ PHP CI MANIA 

มาสักระยะก็พบว่า จะเกิด error message เมื่อมีการบันทึกข้อมูลซ้ำกันในฟิลด์ที่เป็น UNIQUE KEY คือฟิลด์ที่จะไม่ให้ข้อมูลซ้ำกัน เช่น ฟิลด์รหัสสินค้า หรือบาร์โค้ดสินค้า ฟิลด์เก็บ Username ของผู้ใช้งานเป็นต้น

ทีนี้ถ้าเราไม่อยากให้เวลาใช้งานแล้วเด้ง Error Message จากฐานข้อมูลว่า Duplicate entry '' for key 'unique_id' เราก็ทำการตรวจสอบทุกครั้งก่อนบันทึกซะเลยว่าข้อมูลที่เป็น UNIQUE KEY ซ้ำกันไหม แล้วก็ส่ง Alert สวยๆอย่าง SweetAlert.JS.Org ขึ้นมาแสดงแทน


สำหรับวิธีเขียนโค้ดเพื่อตรวจสอบ UNIQUE KEY ของตารางแต่ละตารางนั้น มีตัวอย่างดังต่อไปนี้


PHP Code

<?php
    //string from => SHOW CREATE TABLE tb_members;
    $sql ="CREATE TABLE `tb_members` (
      `userid` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(30) DEFAULT NULL COMMENT 'ชื่อผู้ใช้งาน',
      `password` varchar(50) DEFAULT NULL COMMENT 'รหัสผ่าน',
      `level` int(1) DEFAULT '1' COMMENT 'สิทธิ์การใช้งาน 9=admin',
      `email` varchar(100) DEFAULT NULL COMMENT 'อีเมล',
      `tel_number` varchar(30) DEFAULT NULL COMMENT 'เบอร์โทรศัพท์',
      `line_id` varchar(50) DEFAULT NULL COMMENT 'ไอดี Line',
      `fullname` varchar(50) DEFAULT NULL COMMENT 'ชื่อ',
      `lastname` varchar(50) DEFAULT NULL COMMENT 'นามสกุล',
      `department` varchar(70) DEFAULT NULL COMMENT 'สังกัด',
      `create_date` datetime DEFAULT NULL,
      `modify_date` datetime DEFAULT NULL,
      `Column13` int(11) DEFAULT NULL,
      `Column14` int(11) DEFAULT NULL,
      PRIMARY KEY (`userid`),
      UNIQUE KEY `email` (`email`),
      UNIQUE KEY `username` (`username`),
      UNIQUE KEY `Column13_Column14` (`Column13`,`Column14`)
    ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8";
    preg_match_all('/UNIQUE KEY `(.*?)`\\)/', $sql, $matches );
    echo '<pre>', print_r($matches), '</pre>';
    echo '<hr/>';
    $field_key = array();
    $all_key = $matches[1];
    foreach($all_key as $string){
        $arr = explode('(', $string);
        $new_string = trim(str_replace("`", "", $arr[1]));
        $field_key[] = explode(',', $new_string);
    }
    echo '<pre>', print_r($field_key), '</pre>';
?>

คำอธิบาย

 SHOW CREATE TABLE tb_members;

เป็นคำสั่งสำหรับแสดง SQL สำหรับสร้างตาราง tb_members ซึ่งจะได้ข้อมูลของฟิลด์ที่เป็น UNIQUE KEY ทั้งหมดออกมาด้วย ซึ่งตัวอย่างนี้ได้คัดลองมาจากคิวรี่เก็บไว้ในตัวแปร $sql โดยตรงเพื่อทดสอบ


preg_match_all('/UNIQUE KEY `(.*?)`\\)/', $sql, $matches ); 
echo '<pre>', print_r($matches), '</pre>';

คำสั่งด้านบนนี้ จะช่วยแยกฟิลด์ที่เป็น UNIQUE KEY ออกมาจากคำสั่ง SQL CREATE
ผลลัพธ์เมื่อลอง print_r() ออกมาดู



foreach($all_key as $string){
$arr = explode('(', $string);
$new_string = trim(str_replace("`", "", $arr[1]));
$field_key[] = explode(',', $new_string);
}

หลังจะได้อาร์เรย์สองชุด คือ [0] กับ [1] เราจะนำอาร์เรย์ชุดที่ 2 นั่นก็คือ $matches[1] ไปทำการวนลูป foreach() เพื่อทำการแยก วงเล็บด้านท้ายออก และนำชื่อฟิลด์จากอาร์เรย์ส่วนท้ายไปใช้ โดยจะตัดเครื่องหมาย ` ออกไปจากชื่อฟิลด์ด้วย จะเหลือแค่เครื่องหมาย , คั่นกลางชื่อฟิลด์ ก็ทำการ explode() อีกครั้งก็จะได้อาร์เรย์ที่เป็นชื่อฟิลด์เก็บไว้ใน $field_key เพื่อใช้งานต่อไป

ใช้คำสั่ง print_r($field_key) เพื่อดูผลลัพธ์ที่ได้

แหล่งอ้างอิง


SQL keys, MUL vs PRI vs UNI
https://stackoverflow.com/questions/5317889/sql-keys-mul-vs-pri-vs-uni

Starts and Ends with PHP Regex
https://stackoverflow.com/questions/10895260/starts-and-ends-with-php-regex?rq=1

To match or not to match with regular expressions in PHP
https://phpenthusiast.com/blog/php-regular-expressions

Only get text within brackets?!?
https://www.sitepoint.com/community/t/only-get-text-within-brackets/59549



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/