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/