ข้ามไปที่เนื้อหาหลัก

บทความ

กำลังแสดงโพสต์ที่มีป้ายกำกับ Code Optimization

Ajax Template Parser : เรียกใช้งานเทมเพลต CodeIgniter ด้วย Ajax

ช่วงนี้พอจะมีเวลาสำหรับทดสอบซอร์สโค๊ดที่เขียนขึ้นมาได้บ้าง หลังจากลองใช้งานดูก็คิดว่าน่าจะเป็นประโยชน์บ้าง เลยลองเอามาแปะไว้เผื่อใครสนใจทดลองเล่นดูบ้าง หลักการของซอร์สโค๊ดนี้ก็คือ การแยกข้อมูลดิบที่ PHP สร้างขึ้นมา หรือดึงจากฐานข้อมูล ออกจากโค๊ด HTML โดยการเขียนแยกเป็น 1) หน้าควบคุม หรือเรียกใช้งาน 2) ส่วนของการสร้างข้อมูล  3) ส่วนของการแสดงผล  หากใครได้ลองใช้งาน CodeIgniter มาบ้างแล้ว ก็คงพอจะเข้าใจในส่วนของการแยก HTML ออกจาก PHP ที่ผมชอบใช้คือ Template Parser Class เลยลองนำมาประยุกต์ใช้ดู สำหรับคราวหน้าอาจจะลองทดสอบใช้งานจริงกับ CodeIgniter ดูบ้าง ว่าจะใช้งานได้ดีหรือไม่

เขียน PHP + Ajax ให้ประหยัดแบนด์วิธด้วยการแยก ข้อมูลดิบ ออกจาก HTML

"การเขียนโปรแกรมไม่ใช่เรื่องยาก"  ถึงแม้จะบอกว่าการเขียนโปรแกรมไม่ใช่เรื่องยาก แต่มันก็ไม่ง่ายเหมือนปอกกล้วยเข้าปากซะทีเดียว ผมเองก็ไม่ได้จบสายซอร์ฟแวร์โดยตรงดังนั้นซอร์ฟแวร์ที่ผมคลุกคลีอยู่กับมันล้วนแล้วแต่เป็นเรื่องของการลองผิดลองถูก นำโค๊ด PHP ของชาวบ้านมาลองดัดแปลงดู และสั่งสมประสบการณ์ทีละเล็กทีละน้อย และแล้ววันหนึ่งก็มานั่งเขียนโปรแกรมเช้ายันเย็น จนกระทั่งดึกดื่นมืดค่ำ บางทีก็ย่ำเช้า ^^" บทความไหนที่ผมบอกว่าน่าใช้ก็คือ "มันแค่น่าใช้งานนะ >_< "  ให้ลองเอาไปปรับใช้ดู อาจใช้ได้บ้างไม่ได้บ้างเพราะมีปัจจัยหลายอย่างที่เป็นตัวแปรให้ผลลัพธ์ที่ได้ต่างกันไป

ออกแบบ Code เพื่อลดภาระของเซิร์ฟเวอร์

แนวคิดนี้เกิดขึ้นในระหว่างที่ผมเรียนรู้การเขียนโปรแกรม PHP โดยเน้นใช้งาน Array เพื่อลดการใช้ทรัพยากรของ MySQL เพราะบางขั้นตอน เราสามารถเก็บข้อมูลไว้ในอาร์เรย์แล้วเรียกใช้งานจะเร็วกว่าการเรียกจากฐานข้อมูลเป็นครั้งๆ เมื่อใช้ Array มากๆ บางครั้งก็เปลืองหน่วยความจำ จึงเป็นเรื่องที่ต้องให้ความสำคัญทีเดียว การเขียนโค๊ด PHP เพื่อสั่ง MySQL คิวรี่หลายๆครั้งจะใช้ CPU มาก แต่การคิวรี่น้อยครั้งแล้วเก็บไว้ใน Array จะใช้หน่วยความจำมากเช่นกัน ดังนั้นคงต้องมองไปที่เซิร์ฟเวอร์ว่า ระหว่าง RAM กับ CPU อันไหนมีจำกัดกว่ากัน  ถ้าสามารถใช้ RAM ได้เหลือเฟือก็คงใช้ Array เก็บข้อมูลมากๆ ได้สบายๆ หรือถ้าไม่จำกัด CPU ปล่อยใช้เต็มที่แล้วล่ะก็จะเขียนโปรแกรมสั่งให้ MySQL คิวรี่กี่ครั้งก็ได้แล้วแต่คุณเลยละกัน แต่โดยส่วนใหญ่ถ้าใช้งานบนเว็บโฮสติ้ง เขาจะจำกัดการใช้งาน CPU ไว้ หากระบบของเราใช้สูงเกินไป ก็จะมีอีเมลมาแจ้งเตือน และถ้าระบบของเราใช้เกินขีดจำกัดก็อาจจะถูกบล็อคการใช้งานไปเลย ต้องเสียเวลาเจรจาต่อรองกันอีกยาว เริ่มจากแนวคิดเรื่อง  "แบ่งภาระงานให้กับสคริปต์แต่ละตัวอย่างไรดี" ...

โค๊ดตัวอย่างการทำ Autocomplete แบบลดจำนวนการคิวรี่ MySQL

จากบทความที่แล้ว  หลักการเขียน PHP Autocomplete ด้วย jQuery ในรูปแบบ JSON  วันนี้จะมานำเสนอวิธีการเขียนโค๊ด Autocomplete ด้วย jQuery เป็นตัวอย่างสำหรับการทำงานด้วยแนวคิดที่ว่านี้ แล้วลองประยุกต์กันดูนะครับ ในบทความนี้จะพูดถึงอะไรบ้าง ก็จะมีการเขียนโค๊ด PHP  เพื่อเรียกข้อมูลจากฐานข้อมูล MySQL แล้วเขียนเป็นไฟล์ JavaScript เพื่อเรียกใช้ด้วย Autocomplete ด้วย jQuery อีกที จากซอร์สโค๊ดจะเห็นว่า PHP จะสั่งคิวรี่เพียงครั้งเดียว และเมื่อพิมพ์รายชื่อ จะสามารถแสดง Autocomplete ขึ้นมาให้เลือกได้โดยไม่ต้องส่งค่าไปมาด้วย Ajax อีก ซึ่งประหยัดทั้งแบนวิธด์ และการทำงานของ MySQL ที่ใช้ CPU ที่เกินจำเป็นได้อีกด้วย แต่ถ้าจะให้ดีก็ไม่ต้องคิวรี่ครับ (ดึงไฟล์ที่ได้สร้างเป็น *.js ไว้แล้วมาใช้เลยจะดีที่สุด ^_^ )

หลักการเขียน PHP Autocomplete ด้วย jQuery ในรูปแบบ JSON

       จากที่เคยนำเสนอบทความเกี่ยวกับการคิวรี่ข้อมูลจากฐานข้อมูลมาเก็บไว้ในตัวแปรอาร์เรย์แบบสองมิติ และเรียกใช้โดยการอ้างอิงคีย์ของแต่ละตารางไปแล้ว วันนี้จะนำเสนอเทคนิคการคิวรี่แบบประหยัดอีกวิธีสำหรับใครที่ชอบใช้ Autocomplete เพื่อเรียกข้อมูลมาแสดงให้ผู้ใช้งานสะดวกในการคีย์ข้อมูล        แต่กรณีผู้ใช้งานในขณะนั้นมีหลายคนทำรายการพร้อมกัน การทำงานของแต่ละคนก็คิวรี่หลายครั้ง ในแต่ละวันลองคิดดูครับว่าเซิร์ฟเวอร์จะทำงานหนักขนาดไหน เช่น พอเราป้อนชื่อลูกค้ามากกว่าสองคำ ก็จะมีการดึงข้อมูลลูกค้าที่คล้ายกันมาแสดง พอพิมพ์ไปอีกเป็นสามคำก็จะเรียกอีกครั้ง พอเพิ่มหรือลบคำออกก็จะคิวรี่ทุกๆ ครั้ง ที่มีการเปลี่ยนแปลงตัวอักษร  

กรณีศึกษา : การโหลดข่าวสารประชาสัมพันธ์ด้วย PHP

       เพื่อให้ได้ข่าวประชาสัมพันธ์ที่ใหม่ และเป็นปัจจุบัน จึงมีการใช้ Ajax ดึงข้อมูลมาแสดงเสมอๆ         แต่การดึงข้อมูลการแสดงนั้น เกิดขึ้นตลอดเวลา ทั้งที่การอัพเดตข่าวสาร อาจจะมีการเปลี่ยนแปลงเพียงสัปดาห์ละครั้ง เดือนละครั้ง         ซึ่งไม่ได้เกิดขึ้นตลอดเวลาเหมือน Facebook ดังนั้น จึงไม่มีความจำเป็นที่จะต้องส่ง Ajax ไปยังไฟล์ PHP เพื่อคิวรี่จากฐานข้อมูล MySQL ในทุกๆครั้งที่ครบรอบ        ดังนั้น การคิวรี่ทุกครั้งที่ครบกำหนดเวลา จะเป็นการดึงข้อมูลเดิมมาแสดงเท่านั้น        เพื่อลดภาระการดึงข้อมูลมาแสดงที่เกินความจำเป็น จะใช้วิธีการเพิ่มไฟล์สำหรับเช็กสถานะการอัพเดตข่าว โดยที่กำหนดเงื่อนไขสถานะไว้ในคอนฟิกไฟล์ แล้วก็ตรวจสอบโดยการอ่านไฟล์นั้นขึ้นมา หากพบว่ามีการอัพเดตใหม่ ถึงจะไปคิวรี่ข้อมูลมาแสดง แต่ถ้าไม่มีการอัพเดต ก็ใช้ ข้อมูลเดิมแสดงไปเรื่อยๆ โดยไม่ต้องไปเรียกมาจากฐานข้อมูล MySQL อีก

สร้างฟังก์ชั่น เพื่อลดความซ้ำซ้อนในการเขียนโปรแกรม

เขียนฟังก์ชั่นสำหรับ SELECT / INSERT / UPDATE / DELETE / CANCEL ข้อมูล เพื่อลดความซ้ำซ้อนในการเขียนโปรแกรมด้วยภาษา PHP ปกติแล้วเมื่อเริ่มฝึกเขียนโปรแกรม PHP การจัดการกับข้อมูลต่างๆในฐานข้อมูลนั้น เราจะต้องใช้คำสั่งเดียวกันซ้ำๆ อยู่หลายครั้ง ซึ่งแต่ละครั้งก็จะเปลี่ยนชื่อฟิลด์และตารางที่เก็บข้อมูลให้ตรงกับที่เราต้องการ วิธีการที่รวดเร็วที่สุดคือการคัดลอกซอร์สโค๊ดเดิม แล้วมาดัดแปลงแก้ไข ในบทความก่อนหน้านี้ได้แนะนำเครื่องมือสร้างเองสำหรับช่วยลดเวลาการเขียนโค๊ดให้น้อยลงด้วยวิธีการ  สร้างตัวแปร และโค๊ด SQL สำหรับ INSERT ลงฐานข้อมูล MySQL  จะช่วยให้เราไม่ต้องนั่งพิมพ์ชื่อฟิลด์ให้ยุ่งยากอีกต่อไป แค่คัดลอกมาจากหัวตารางของ phpMyAdmin แล้ววางลงในแบบฟอร์มกดสร้างคำสั่งได้ทันที

ใช้ฟังก์ชั่น implode() เพื่อลดการเขียนโปรแกรมวนลูปใช้เอง

ในการเขียนโปรแกรมแต่ละครั้ง เวลาที่เราต้องการเชื่อมอาร์เรย์ด้วยค่าบางอย่าง เช่นเครื่องหมายคอมม่า (,) เครื่องหมายขีดคั่น ( | ) หรือเว้นบรรทัด และอื่นๆ เราจะต้องทำการวนลูปโดยเริ่มจากอาร์เรย์ตัวแรก ไปจนถึงอาร์เรย์ตัวสุดท้าย เราก็จะได้ ข้อความที่เชื่อมกันมาใช้งาน เช่น <?php $delimiter = ''; $string = ''; $idArr = array(111, 222, 333, 444); foreach($idArr as $id){     $string .= $delimiter . $id;     $delimiter = '|'; } echo $string; ?> ผลลัพธ์ที่ได้คือ ข้อความที่เชื่อมกันด้วยขีดคั่นกลาง 111|222|333|444 จะเห็นว่าเราต้องเขียนโค๊ดถึง 6 บรรทัดด้วยกัน ซึ่งนับจำนวนตัวอักษรแล้วก็หลายตัวทีเดียว สำหรับการเขียนโปรแกรม php ได้มีฟังก์ชั่นที่พร้อมให้เราเรียกใช้แล้ว ถ้าจำกันได้ผมเคยเขียนบนความเกี่ยวกับสร้างแถวแต่ละแถวของตาราง  html อย่างง่ายด้วยฟังก์ชั่น implode() และครั้งนี้ก็จะนำมาใช้อีกครั้งโดย เปลี่ยนโค๊ด php ที่เราเขียนดังนี้ <?php $idArr = array(111, 222, 333, 444); $string = implode("|", $idArr); echo $string; ?> ด้วยฟังก์ชั่น impl...

SQL สำหรับตรวจสอบช่วงเวลาที่ว่าง สำหรับระบบจองห้อง ต่างๆ

นอกจากระบบจองห้องประชุมแล้ว น่าจะรวมถึงระบบจอง อื่นๆ ที่มีเรื่องวันที่ และเวลาเข้ามาเกี่ยวข้องด้วย ในรูปจะเป็นการค้นหาช่วงเวลาที่ทับซ้อนกัน สำหรับคำสั่งที่ใช้ตรวจสอบเวลาที่จองห้อง จะเป็นดังนี้ <?php $id = $_POST['room_id']; $bkDate = $_POST['booking_date']; $startTime = $_POST['start_time']; $endTime = $_POST['end_time']; //ค้นหาว่ามีการจอง หรือยัง $sql = "SELECT * FROM tb_booking WHERE bk_room_id = '".$id."' AND bk_date = '".$bkDate."' AND ( (bk_start_time BETWEEN '".$startTime."' AND '".$endTime."') OR (bk_end_time BETWEEN '".$startTime."' AND '".$endTime."') )"; $qry = mysql_query($sql) or die(mysql_error()); if($row = mysql_fetch_array($qry)) { echo "ห้องนี้มีผู้ใช้งาน ช่วงเวลา ". $row['bk_start_time'] ." - ". $row['bk_end_time'] ." กรุณาตรวจสอบอีกครั้ง!"; } ?>...

คำสั่ง SQL ค้นหารายชื่อลูกค้าที่ค้างชำระเงินในแต่ละเดือน

SELECT tb_customer.customer_id, tb_customer.customer_name, tb_payment.payment_date FROM tb_customer LEFT JOIN tb_payment ON tb_customer.customer_id = tb_payment.payment_customer_id AND tb_payment.payment_date LIKE '2013-04%' WHERE tb_payment.payment_date IS NULL การนำไปใช้งาน ให้ค้นหาตามค่าเดือนปีที่ส่งมาจากฟอร์มค้นหา <?php $sql = "SELECT tb_customer.customer_id, tb_customer.customer_name, tb_payment.payment_date "; $sql.= "FROM tb_customer "; $sql.= "LEFT JOIN tb_payment ON tb_customer.customer_id = tb_payment.payment_customer_id AND tb_payment.payment_date LIKE '". $_POST['year_month'] ."%'"; $sql.= "WHERE tb_payment.payment_date IS NULL"; $result = mysql_query($sql) or die(mysql_error()); while($rs = mysql_fetch_assoc($result)){ //CODE HERE... } ?>

จัดระเบียบซอร์สโค๊ด PHP ลดการ query ฐานข้อมูล MySQL ให้น้อยลง

การเขียนโปรแกรมด้วยภาษา php เป็นภาษาที่ยืดหยุ่น และผมถนัดที่สุด เพราะเราสามารถออกแบบการทำงานได้ง่ายกว่าภาษาอื่น ที่ผมเขียนเป็น เรื่องตัวแปรก็ยืดหยุ่น เรียกใช้ง่าย บทความนี้จะนำเสนอเทคนิคการเขียนโปรแกรม ที่ช่วยลดจำนวนครั้งในการคิวรี่ฐานข้อมูลน้อยลง เพื่อเป็นการลดภาระของฐานข้อมูล MySQL ให้ใช้ CPU น้อยลง แต่ก็ต้องแรก กับหน่วยความจำของโปรแกรมสักหน่อย เช่นถ้าใช้กับตารางที่เก็บข้อมูลหลักหมื่นเรคอร์ด ก็อาจจะเกิดอาการตัวแปรมีขนาดใหญ่เกินไป ซึ่งจะต้องใช้ memory_limit เพิ่มขึ้นไปอีก กรณีที่ต้องแสดงข้อมูลหลายเรคอร์ดเรามักจะเจอ fatal error “Allowed memory size exhausted” ข้อความนี้อยู่เป็นประจำ จึงเป็นเหตุผลให้เราต้องแบ่งหน้าการแสดงผล เพื่อให้แสดงผลเร็วขึ้น และไม่ใช้หน่วยความจำเกินขีดจำกัด ขั้นการเขียนโปรแกรมที่จะช่วยลดจำนวนการคิวรี่ MySQL คือ 1. ตัดส่วนที่ต้องคิวรี่เพื่อดึงข้อมูลในลูปออกมาไว้นอกลูป      วิธีนี้จะสามารถใช้ได้กับ ตารางข้อมูลที่ข้อมูลตายตัว หรือมีการเพิ่มข้อมูลไม่บ่อย และจะไม่เกินหลักพัน ประมาณนี้ 2. สร้างอาร์เรย์เก็บข้อมูลของตารางที่ต้องคิวรี่ใ...

คำสั่ง php implode นอกจาก รวมตัวอ้กษร ใช้ทำอะไรได้อีกบ้าง

การเขียนโปรแกรมทุกภาษา จะมีคำสั่งที่ให้เราเรียกใช้เพื่อช่วยงานบางอย่างที่เราต้องการโดยที่เราไม่ต้องเขียนเองทั้งหมด ซึ่งจะถูกเรียกว่า ฟังก์ชั่น (function) และในภาษา PHP จะมีฟังก์ชั่นมากมายให้เราเรียกใช้เช่นเดียวกันกับการเขียนโปรแกรมภาษาอื่นๆ ฟังก์ชั่นที่แนะนำในบทความนี้คือ implode() ซึ่งจะทำงานตรงข้ามกับ explode() ที่ใช้แยกข้อความออกจากกัน ตามอักษรที่กำหนด ซึ่ง implode() จะเรียกใช้กับข้อมูลที่อยู่ในรูปแบบ Array เท่านั้น $data = array("a", "b", "c", "d"); $strText = implode(":", $data); echo $strText; ผลลัพธ์ = a:b:c:d ตัวอย่างใช้สร้างข้อมูลแต่ละแถวในตาราง HTML <?php $arr = array( array( 'id' => 1, 'name' => 'ชัยวัฒน์', 'term' => '2', 'grade' => 'B'), array( 'id' => 2, 'name' => 'พิทักษ์', 'term' => '2', 'grade' => 'B+'), array( 'id' => 3, 'name' => ...