หลังจากที่ได้ทดสอบโปรเจ็กต์ 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
ความคิดเห็น
แสดงความคิดเห็น