|
ปัญหาของผู้เริ่มต้นศึกษาการเขียนหรือการพัฒนาเว็บไซต์ด้วย ภาษา php อีกอย่างนึง ที่ยังไง ๆ ก็ต้องได้พบ ได้เจออย่างหลีกเลี่ยงไม่ได้ ตัวผมเองก็เช่นกัน กว่าจะผ่านจุดนั้นมาได้ ก็ต้องใช้ความพยายามในการค้นหา และทดลองทำตามตัวอย่างที่รุ่นพี่ ๆ โปรแกรมเมอร์เขาได้ บอกไว้
ซึ่งหากเราเข้าใจระบบ หรือกระบวนการทำงานของมันแล้ว มันก็ไม่ใช่เรื่องใหญ่ หรือ เรื่องยากอะไรเลย ขออธิบายแบบตัวอักษรเช่นเคย เพื่อจะได้จินตนาการไปพร้อม ๆ กันครับ
เพื่อไม่เป็นการเสียเวลา เข้าเรื่องเลยละกันนะ...
บางคน (โดยเฉพาะมือใหม่) ที่ยังออกแบบดาต้าเบส หรือ ฐานข้อมูลไม่ค่อยเก่งนั้น ส่วนมากจะสร้างรหัส (ไพมารี่คีย์) ให้เป็นแบบ auto_number โดย เลือกประเภทของฟิล์เป็นแบบตัวเลข INT และกำหนดค่าเป็น auto_increment เพื่อให้ฟิลด์หลักนั้น เป็นแบบ autoid นั่นเอง
ซึ่งมันก็ไม่ได้ผิดอะไร เวลาเพิ่มข้อมูลก็ไม่ต้องไปยุ่งยากกำหนดค่าให้มัน เช่น Insert into std Set std_name='code father' จากโค้ดจะสังเกตุได้ว่า ไม่ได้มีการกำหนดค่าหรืออ้างถึง std_id แต่อย่างใด เนื่องจากฟิลด์ std_id นั้น ได้กำหนดค่าให้เป็นแบบ auto number แล้ว เวลาเพิ่มข้อมูลใหม่ จึงไม่จำเป็นต้องกำหนดค่า หรือ เอามาเกี่ยวข้องแต่อย่างใด ก็สามารถเพิ่มข้อมูลใหม่เข้าสู่ database ได้เช่นกัน
แต่ปัญหาที่ตามมาก็คือ ในฐานข้อมูล ค่าในฟิลด์ std_id นั้นจะเป็นค่าของตัวเลขจำนวนเต็ม (INT) ซึ่งเวลาแสดงผลให้ผู้ใช้งานดูจะไม่สวยงามเท่าใดนัก ทำให้บางครั้งต้องใช้ฟังก์ชั้นสำหรับจัดการรูปแบบให้กับตัวเลขนั้นอีกที เช่น
1 ต้องการแสดงผลเป็น 00001 12 ต้องการแสดงผลเป็น 00012
ฟังก์ชั่นที่ใช้เปลี่ยนค่าตัวเลขให้เป็นรูปแบบตามที่ต้องการข้างบนก็ ตามนี้ครับ
sprintf("%05d",$std_id) // หากต้องการ 3 ตำแหน่งก็เปลี่ยน จากเลข 5 เป็นเลขที่ต้องการได้เลย
************ จบแบบเบสิค **************
มาต่อกันกับการสร้างเลขที่ auto id แบบที่ผมตั้งใจจะนำเสนอกันดีกว่า มันก็คือการไปเลือกเอาค่า id ที่มากที่สุดที่อยู่ในฐานข้อมูลมา จากนั้นก็บวกเพิ่มเพื่อสร้างเป็นรหัสใหม่ โดยมีโค้ดง่าย ๆ ตามนี้ครับ
$new_id =mysql_result(mysql_query("Select Max(std_id)+1 as MaxID from std"),0,"MaxID");//เลือกเอาค่า id ที่มากที่สุดในฐานข้อมูลและบวก 1 เข้าไปด้วยเลย if($new_id==''){ // ถ้าได้เป็นค่าว่าง หรือ null ก็แสดงว่ายังไม่มีข้อมูลในฐานข้อมูล $std_id="00001"; }else{ $std_id=sprintf("%05d",$new_id);//ถ้าไม่ใช่ค่าว่าง }
หลังจากนี้ ก็เอาค่าตัวแปร std_id ไปใช้งานได้แล้วครับ จากโค้ดจะเห็นว่า ไม่ได้มีอะไรยุ่งยากอะไรเลย สามารถเอาไปใช้งานได้จริง (ผมเองก็ใช้แบบนี้อยู่ประจำ) ที่ต้องเปลี่ยนก็มีเพียงแค่ 2 จุดคือ ที่ทำสีน้ำเงินไว้ แค่นั้นเอง
*** ตัวอย่างโค้ดข้างบนนี้ สำหรับ กรณีที่ฟิลด์ std_id เก็บไว้แบบตัวเลข เช่น 1, 2 หรือ 00001, 00002 ฯลฯ เป็นต้น เท่านั้นนะครับ ใช้ไม่ได้สำหรับฟิล์ดที่เก็บแบบตัวเลขผสมกับตัวอักษร เช่น S0001, ID0001 ฯลฯ เป็นต้น
****************************************** คำถามต่อมาก็คือ แล้วถ้าฟิลด์ std_id เก็บค่าแบบ ตัวเลขผสมตัวอักษรหล่ะ จะทำไงดี ปัญหานี้ก็ไม่ใช่เรื่องใหญ่ครับ เราก็ต้องเพิ่มคำสั่งเล็ก ๆ น้อย ๆ อีก ดังนี้
สมมุติว่าฟิลด์ std_id มีข้อมูลอยู่ 10 รายการ คือ S0001 , S0002 ...........S0010 เราก็เพิ่มคำสั่งตัดคำ คือ ตัดตัวอักษรออกก่อน ในที่นี้คือ ตัว S นั่นเอง
$new_id =mysql_result(mysql_query("Select Max(substr(std_id,-4))+1 as MaxID from std"),0,"MaxID");//เลือกเอาค่า id ที่มากที่สุดในฐานข้อมูลและบวก 1 เข้าไปด้วยเลย
if($new_id==''){ // ถ้าได้เป็นค่าว่าง หรือ null ก็แสดงว่ายังไม่มีข้อมูลในฐานข้อมูล
$std_id="S0001";
}else{
$std_id="S".sprintf("%04d",$new_id);//ถ้าไม่ใช่ค่าว่าง
}
จะสังเกตุว่าส่วนที่เพิ่มเข้ามาก็คือ คำสั่ง substr(std_id,-4) ที่เดียวเท่านั้นเอง
เป็นอย่างไรกันบ้างครับ พอที่จะเห็นภาพไหมว่าที่จริงแล้วมันไม่ได้มีอะไรเลยจริง ๆ ง่ายนิดเดียวเอง ใคร ๆ ก็ทำได้... |