สวัสดีปีใหม่ครับ และปีนี้สิ่งใหม่ในการพัฒนาโปรแกรมบน PHP กำลังเกิด (ย้อนหลังนานมาก T_T )

ในช่วงวันปีใหม่ที่ผ่านมา ก็ไม่ได้แตกต่างจากวันอื่น ๆ มากเท่าไหร่ เพราะว่าตัวเองไม่ได้ออกไปเที่ยวไหนเลย ทำงานปั่น PHP Framework อย่างเดียว จริง ๆ โครงการนี้ออกแบบและร่างแนวคิดมาได้สัก 1-2 เดือนแล้ว แต่ว่ากว่าจะลงตัวก็ในช่วงเกือบปีใหม่ และดันงานให้เสร็จในช่วงวันหยุดยาวปีใหม่ โดยเพิ่งจะเอาเข้า SVN ส่วนตัวเมื่อคืนนี้เอง ตอนนี้ขั้นตอนการ Alpha Test อยู่โดยในช่วงนี้การทดสอบระบบนั้นจะนำไปใช้งานจริงกับระบบร้านค้าบนอินเตอร์เน็ต (E-Commerce) โดยนี้คาดว่าจะออก Beta Test ตอนปลายเดือนนี้เป็นอย่างเร็วที่สุด

โดยหลักการของระบบ Framework นี้โดยรวมใช้หลักการ MVC (Model-View-Controller) ซึ่งการพัฒนาในครั้งนี้เข้าใกล้หลักการ MVC เกือบ 90% อาจจะมีบางส่วนที่ไม่เข้าหลักการด้วยเหตุผลด้านข้อจำกัดของภาษา PHP และระยะเวลาในการพัฒนาระบบโดยรวม

โดยระบบโดยรวมนั้นจะใส่ Module ต่าง ๆ เหล่านี้ลงไปนี้ Core ของระบบ ( Core = แกนหลักของระบบโดยรวม) 

  • Module จัดการเชื่อมต่อกับฐานข้อมูล MySQL รองรับ MySQL 5.0 และการทำ Transaction ด้วย โดยตัวมันเป็นเป็น Sub-Module กับ Object อีกที โดยเอาแนวคิดจาก Object ใน Java ที่ Class ทุกตัวจะสืบทอดจาก Class Object ทั้งหมด แต่ในความเป็นจริง แล้วมีเพียงไม่กี่ Module ที่เข้าข่ายนี้เนื่องจากบางส่วนเป็น OpenSource Module จากข้างนอกการปรับแต่งบางครั้งก็ลำบากในการพัฒนาต่อ
  • Module จัดการวันที่ทั้งไทย (พ.ศ.) และสากล (ค.ศ.) โดยได้เขียนส่วนเพิ่มเติมจาก Generic date handling class for PEAR v 1.41 2006/11/22 และเพิ่อลบข้อเสียของ function Date ใน PHP ที่ไม่สามารถรองรับวันที่ได้น้อยกว่าปี ค.ศ. 1970 และการใช้งานที่ยุ่งยาก รวมถึงไม่รองรับปี พ.ศ. ด้วย
  • Module อ่าน HTML และ XML (Parser) ซึ่งพัฒนาสืบทอดต่อจาก HTML/XML Parser Class 1.0 ของ Dennis Pallett โดยได้เขียนส่วนเพิ่มเติมสำหรับจัดการ Permission ของระบบโดยการกำหนด Permission ของระบบอ้างอิงจากไฟล์ XML แทนฐานข้อมูลแบบเดิม ๆ เพื่อลดการ Process Query ของ DBMS (ใช้การ Parse จาก XML เร็วกว่าเยอะ เพราะมันลด Transaction และ Process ใน DBMS ไปเยอะพอสมควรเมื่อเทียบกับการ Parse ข้อมูลจาก XML ) และคาดว่าจะเขียน Module สำหรับจัดการพวกนี้ด้วย ซึ่งยังมีการเอามาใช้ประโยชน์ในการอ่านไฟล์ XML เพื่อใส่ addon ใหม่ ๆ เข้าระบบด้วย (จะกล่าวต่อไป) โดยใช้หลักการแบบเดียวกับ Membo และ CMS อื่น ๆ ที่เมื่อมีการลง Component ใหม่ ๆ ลงไปนั้นเอง
  • Module ทำ Pagination (แบ่งหน้าข้อมูล) สำหรับการแสดงผลรายการข้อมูลยาว ๆ ให้แบ่งเป็นหน้า ๆ
  • Moduel HTML Form สำหรับสร้าง Form บน PHP แบบง่าย ๆ และสามารถกำหนด Option เสริมตามมาตรฐาน XHTML อื่นๆ เพิ่มเติมได้ โดยจุดเด่นของ HTML Form นี้คือตัว Form Set ชื่อ Select Datetime ซึ่งเป็นส่วนของการกรอกข้อมูลเกียวกับวันที่และเวลา ที่เราไม่ต้องมานั่งเขียน Selection Form ในแบบเดิม ๆ ให้เสียเวลาอีกต่อไป
  • Module จัดการระบบ upload โดยใน Module นี้ได้เพิ่มความสามารถดักจับคุณสมบัติไฟล์บนพื้นฐานแบบ MEME Type แทนนามสกุลไฟล์แบบเดิม ๆ ได้ด้วย (แต่ก็ยังใช้การดักจับนามสกุลไฟล์แบบเดิมได้ถ้าต้องการ) โดยภายในมี Form สำหรับ upload ให้เสร็จ จริง ๆ ตอนนี้กำลังเอาไปใส่ใน Module HTML Form แทน อาจมีการปรับเปลี่ยนในรุ่น Beta Test อีกที หรือไม่เจ้าตัว Upload นี้อาจจะเป็น Sub-Module ของ HTML Form ไป หรืออีกทางคือให้มันถูกกำหนด Prepackage ที่ต้องมีก่อนใช้งานแทนก็ได้ ซึ่งแบบหลังจะดีในแง่การการเข้ากันได้ในรุ่น Alpha Test 
  • Module จัดการ MVC ซึ่งผมใช้ชื่อว่า "Apps" ซึ่งเจ้า Apps นี้มันเป็น Sub-Module ของ MySQL  อีกทีหนึ่ง โดยตัวมันเองก็มี Sub-Module ของมันอีก 3 ตัวคือ Model, View และ Controller ซึ่งตัวที่ใช้แน่ ๆ คือ Model และ Controller แต่เจ้าตัว View นี่ดิ -_-‘ มันไม่มีบทบาทอะไรเลย เพราะบทบาทมันถูกใช้ไปแล้วใน Warpper Class ชื่อ Observer Data และ Theme (จะกล่าวต่อไปว่ามันคืออะไร) คาดว่าเจ้า View นี่จะถูกออกแบบใหม่อีกรอบให้ใช้ความสามารถจาก Observer Data และ Theme และจัดการอื่น ๆ ในส่วนที่ Observer Data และ Theme ไม่มีหน้าทีครอบคลุมถึงส่วน View (จริง ๆ ในตอนนี้ Alpha Test นี้มันทดแทนได้หมดแลย นะเนี่ย -_-‘)

โดยด้านบนคือ Core ของระบบ ซึ่งในตอนนี้มี Module อยู่ 7 ตัว และคาดว่าจะมีเพิ่มในอนาคตเพื่อเพิ่มความสามารถ และปรับแก้ข้อผิดพลาดด้วย

ต่อมาในส่วนของ Add-on นั้นเป็นส่วนเพิ่มเติมในระบบทั้งหมด โดยเมื่อต่อการใส่ Add-on ลงใน Framework นั้นต้องมีการเขียนไฟล์ XML ตาม Schema ที่กำหนดไว้ (มีพร้อมใน Framework แล้ว) เพื่อให้ Core อ่านคุณสมบัติของ Add-on ได้ทั้งหมด โดยมี Add-on มาตรฐานอยู่ 4 ตัวคือ

  • HTML Form Validation ซึ่งได้เป็นเขียน PHP Class เพื่อใช้งานร่วมกับ JavaScript Form Validator Version 2.0.2 จาก JavaScript-coder.com และใน JavaScript ดังกล่าวได้เพิ่มส่วนของการตรวจสอบความถูกต้องของการกรอกวันที่ เช่นกรอกวันที่ 31 ในเดือนกุมพาพันธ์ และความเหมือนกันของข้อมูล ซึ่งมันถูกใช้ในการตรวจทานรหัสผ่านและอีเมล เป็นต้นด้วย
  • JavaScript ShowHide Link Area เป็นการนำข้อดีของ CSS และ XHTML มาใช้ร่วมกัน โดยเป็นการเขียน PHP Class เพื่อสร้าง JavaScript สำหรับสร้าง Link เพื่อบังคับการแสดงและซ่อนพื้นที่ที่เราต้อง
  • Lightbox v2.02  จาก Lokesh Dhakar เป็น JavaScript ที่ใช้ในการแสดงผลรูปภาพขนาดจริงที่มี Effect สวยงามมาก (ใน Blog ผมก็ใช้ Lightbox นี้เช่นกัน)
  • Mod Msg Digest เป็นการนำ Message-Digest Algorithm 5 (md5) มาใช้ประโยชน์ในการทำ Message-Digest Data อีกครั้งโดยใช้การซ่อนรหัสลงในชุดข้อมูลขยะอีกรอบหนึ่ง

ต่อมาในส่วนอขง Warpper Class (เอาแนวคิดมาจากภาษา Java อีกตามเคย) เป็น Class ที่ไม่จำเป็นต้อง Initialize Object แต่สามารถใช้งานได้ทันที โดยจริง ๆ แล้วมันก็ทำงานคล้าย ๆ กับ Function ทั่วไปนั้นแหละ เพียงแต่ว่าการใช้ Function มีผลต่อชื่อที่อาจซ้ำกับ Function พื้นฐานในอนาคตได้ (ตอนนี้ Function บางตัวที่ผมเขียนในอดีตก็ดันไปซ้ำกับ Function พื้นฐานใน PHP 5 เสียแล้ว) เลยจำเป็นต้องเขียนใน Warpper Class แทน และยังเป็นการจัดกลุ่ม Function ด้วย โดย Warpper Class นั้นในตอนนี้มีอยู่ 5 ตัวคือ

  • HTTP-Page เป็น Class ที่เอาไว้สร้าง URL, Redirect หน้าเว็บ และกรองข้อมูลจาก Request Variables พวก ENV, GET, POST, COOKIE, SERVER ต่าง ๆ ให้เป็นไปตามข้อมูลที่ควรจะเป็นเช่นการกรอง Injection Data จาก QueryString หรือการเปลี่ยน arg_separator ใน PHP จาก & เป็น ; เพื่อให้เป็นไปตามคำแนะนำของ XHTML 4.0 โดยใน Class นี้ยังรองรับการสร้าง URL ด้วยวิธี mod_rewrite ด้วย (โดยมาตรฐานแล้วจะเปิดการใช้งาน mod_rewrite เป็นค่าเริ่มต้น)
  • Observer Data เป็น Class ที่สร้างขึ้นเพื่อใช้ในการสื่อสารระหว่าง Model, View และ Controller
  • SuperGlobals เป็น Class ที่ใช้ในการเรียกใช้ข้อมูลชนิด Predefined Variables นั้นเอง โดยแทนที่จะทำงานผ่านตัวแปร Predefined Variables โดยตรงก็ใช้ Class นี้แทน โดยมี Method ที่่ช่วยในการจัดการข้อมูลใน Predefined Variables ได้ด้วย รวมถึง Method ในการสร้าง Temp Data ลง Sessionเพื่อใช้ประโยชน์ในบางกรณีที่ต้องการใช้ข้อมูลข้ามหน้ากัน 
  • Theme เป็น Class ที่ใช้ในการเพื่อ, ปรับแต่ง และสร้าง ส่วนขยายของ Theme ทั่วไปให้มีความสามารถมากขึ้นเช่นเพิ่ม JavaScript และ CSS ลงไปใน Theme หลักจาก Add-on และจะเพิ่มเองภายหลังก็ได้ โดยไม่จำเป็นต้อเข้าไปแก้ใน Theme หลักแต่อย่างใด 
  • Permission เป็น Class ที่สร้างขึ้นเพื่อตรวจสอบสิทธิ์ในการใช้งานเช่น Guest, User และ Admin โดยตัวมันเองนั้นจะอ่านไฟล์ XML ที่สร้างตาม Schema Permission ที่กำหนดไว้ โดย Permission นี้จะตรวจสอบการเข้าถึง Controller และ Controller Method ซึ่ง Controllre นั้นเป็นตัวดักจับ Event อยู่แล้ว การตั้ง Permission ที่อิงกับ Controller จึงถือว่าปลอดถัยต่อข้อมูลมากที่สุด เพราะ Controller นั้นจะเป็นตัวจับคู่ Model และ View เข้าด้วยกัน ถ้า Controller ถูกจำกัดการทำงาน ก็ไม่มีทางที่ View จะส่งข้อมูลให้กับ Model และ Model จะส่งข้อมูลกลับไปให้ View ได้

ทั้งนี้ทั้งนั้นระบบ Framework นี้ไม่ได้ถูกทำขึ้นเพื่อใช้แค่ MVC เท่านั้น เรายังสามารถสร้างหน้าทั่วไป ในที่นี้ขอเรียกว่า ‘Page’ ได้เหมือนการเขียน HTML ทั่วไป เพียงแต่ข้อมูลที่มีจะถูกนำไปใส่ใน Theme โดยอัตโนมัติ โดยการเรียกหน้านั้นทำผ่าน URL "page" ของระบบ

โดยอย่างที่บอกไปแล้วว่าใน Framework นี้รองรับการสร้าง URL แบบ Rewrite ซึ่งสามารถเลือกที่จะไม่ใช้ก็ได้ในกรณีที่ Server ไม่รองรับ โดยไม่ต้องแก้ไข URL ใน Link ต่าง ๆ ใหม่ ซึ่ง URL ใน Link ต่าง ๆ นั้นต้องสร้างจาก Metod "url" ใน HTTP-Page เท่านั้น

จริงรายละเอียดมีมากกว่านี้ครับ แต่ว่าขอเอาแค่นี้ก่อนแล้วกัน ส่วน Diagram ของระบบยังไม่ขอเอามาลงเพราะระบบยังไม่นิ่งพอครับ

เปิดตัว PodCastsGen WebBase Version 0.0.1 Alpha

Link@PodCastsGen WebBase Version 0.0.1 Alpha

เป็นโปรแกรมประยุกต์ ที่ทำงานบนได้บน Web Browser โดยใช้ความสามารถของภาษา PHP และ JavaScript แล้วทำการ Export หรือ Generate Code เป็น XML ซึ่งอยู่ใน specification ของ RSS Feed และตรงตาม specification ของ Podcasts ในระดับสากลด้วย

ขั้นตอนการทำงาน และการใช้งานไม่ยุ่งยากเนื่องจากในหลักการเอาข้อมูลที่ได้จาก form ในระบบ Input data dynamic หรือการใส่ข้อมูลเชิงยืดหยุ่นนั้นเอง กล่าวคือ ระบบจะมีข้อมูลพื้นฐานที่จำเป็นก่อน นั้นคือ รายละเอียดของ Podcasts ต่างๆ ไม่ว่าจะเป็น

  • ชื่อ
  • ใจความสำคัญ
  • ที่อยู่ของ Podcasts ที่จะเอาไปใส่
  • ชื่อผู้จัดทำ
  • อีเมล ของคนจัดทำ นั้นๆ
  • โดยที่จะเริ่มด้วย Episodes แรกเป็นขั้นเริ่มต้น ซึ่งคำว่า Episodes เป็นคำที่เรียกจำนวนตอน หรือจำนวนไฟล์ของมีเดีย นั้นๆ ครับ

การใส่ Episodes ในโปรแกรมประยุกต์นี้ จะเป็นไปในลักษณะของการใส่ที่อยู่ของไฟล์มีเดีย ซึ่งไฟล์มีเดียที่จะเอามาใส่นั้นควรมีลักษณ์สำคัญคือ

  • มีขนาดที่ไม่ใหญ่มาก (แนะนำไม่ควรเกิน 10MB ต่อความยาวในการออกอาหาศ 1ชม.)
  • ใช้นามสกุลไฟล์เป็น mp3, m4a, m4b, acc, aiff
  • ต้องมีที่อยู่จริงอยู่แล้วใน internet ซึ่งต้องทำการ upload จากเว็บใดเว็บหนึ่งก่อน ไม่ว่าจะใช้ที่ geocities หรือ thai.net ก็ได้

ซึ่งการใส่มีเดียในแต่ละส่วนนั้น จะใช้หลักการคล้ายๆ กับการใส่ Condition ใน SmartPlaylist ของ iTunes นั้นเอง ซึ่งจะสามารถใส่มีเดียได้ไม่เกิน 10 ไฟล์ และอนาคตจะพัฒนาให้สามารถใส่ได้ไม่จำกัด

เมื่อทำการ submit ตัว form ของโปรแกรมประยุกต์แล้ว ตัวระบบจะทำการสร้างโค็ด XML ออกมาโดยแสดงใน Web Browser ของท่าน โดยที่ทางผู้ใช้ต้องทำการ save โค็ดเหล่านั้นเอง ไม่ว่าจะด้วยวิธีใดก็ตาม ตัวอย่างเช่น

Internet Explorer

  • ใช้เมนู File ตามด้วยเมนู Save As
  • ที่ Dialog Save As ให้เลือก Save as type เป็น XML Files (*.xml)
  • ที่ File name ให้ใส่ของไฟล์ลงไป
  • เอาไฟล์ดังกล่าวไป upload ขึ้นที่เว็บที่เราต้องการ
  • ตัวอย่าง http://www.yourweb.com/podcasts/yournamepodcasts.xml

Firefox

  • ใช้เมนู File ตามด้วยเมนู Save Page As
  • ที่ Dialog Save As ให้เลือก Save as type เป็น XML Document
  • ที่ File name ให้ใส่ของไฟล์ลงไป
  • เอาไฟล์ดังกล่าวไป upload ขึ้นที่เว็บที่เราต้องการ
  • ตัวอย่าง http://www.yourweb.com/podcasts/yournamepodcasts.xml

ก็เป็นอันเสร็จสิ้นวิธีการทำงาน โดยในอนาคตในขั้นตอนการจัดการไฟล์ ที่ Export ออกมาจะปรับเปลี่ยนเป็นการทำ Archive เป็น ZIP Files แทน เพื่อให้ขึ้น Dialog ให้ Download ได้เลย

และโครงการต่อไปเป็น PodCasts->Hub ที่กำลังร่างระบบอยู่ ซึ่งไม่รู้จะทำได้หรือเปล่า -_-" แต่ระบบน่ะไม่ยาก

วิธีการทำ podcast เผยแพร่

ผมได้ทำ podcast ของผมเองอยู่ที่ http://www.thaicyberpoint.com/podcasts ตอนนี้ผมทำ podcast ตัวแรกให้ลองฟังแล้วนะครับ ถ้ามีอะไรติชมก็บอกกันได้ครับ

ส่วนใครต้องการเอา podcast ตัวนี้ไปลองทำเองก็ง่ายมากครับ

สิ่งที่ต้องการก็มีพื้นที่เว็บใน internet ที่สนับสนุนการใช้ script PHP และพื้นที่สัก 10 – 20 MB ในการเก็บไฟล์เสียงครับ

แล้วก็หา script podcast จำพวก PHP มาลงครับ อย่างของผมก็ ลองโหลดไปแกะได้ที่นี่ครับ http://www.thaicyberpoint.com/podcasts/dircaster_v_04_podcastPHPScript.zip ทำการแตกไฟล์ zip แล้วก็ทำการปรับแก้เพียงเล็กน้อยครับ

—————————————–

// ขนาดมาที่สุดของการแสดง podcast ใน 1 ครั้ง

$maxFeed = 5;

// Title ของ Podcast ครับ

$titleTAG=”ThaiCyberPoint.com – PodCasts beta”;

// ที่อยู่ของ Podcast ครับ

$linkTAG=”http://www.thaicyberpoint.com/podcasts”;
// รายละเอียดของ Podcast ครับ ใส่เป็นภาษาไทยได้ ตอนนี้ผมปรับแต่งให้ลองรับภาษาไทยแล้วครับ
$descriptionTAG=”Public PodCast from ThaiCyberPoint.com”;
// ภาษาของ Podcast ครับ แนะนำให้ใช้ en-US ครับ
$languageTAG=”en-us”;
// คำแจ้งลิขสิทธิ์ของ Podcast ครับ
$copyrightTAG=”Creative Commons License”;
// อีเมลของ podcast ครับ
$webMasterTAG=”admin@thaicyberpoint.com”;
// ชื่อโปรแกรมที่เอามาทำ Podcast ไม่แนะนำให้ปรับเปลี่ยนครับ ถือเป็นมารยาท
$generatorTAG=”dirCast 0.4″;
// เวลาในการเข้าถึง หรือ timeout ครับ
$ttlTAG=60;

————————————-

แล้วก็ทำการ upload เข้าสู่ server ครับ ซึ่งมันเป็นไฟล์ index.php ครับ ก็เวลาเราให้ URL ก็ http://www.mysite.com/podcast/index.php หรือ http://www.mysite.com/podcast/ ก็ได้ครับ

แล้วจะเอาไฟล์เสียงขึ้นก็ทำการแก้ไข ID3 Tag ครับ แนะนำ Version 2.3 ครับ แล้วทำการ Upload ขึ้นไปที่เดียวกับไฟล์ index.php เมื่อกี้นี้ครับ ตัว script มันจะ detect เองจากไฟล์ว่า title, artist, album, year, comment, genre ว่ามีอะไรบ้างก็แนะนำให้ edit เอานะครับในไฟล์ สะดวกดีครับ

อนาคตเดี่ยวผมว่าจะ Podcast Portal ครับ ยังไงจะมาบอกอีกทีนะครับ สำหรับคนที่ไม่อยากทำ script เองครับ เพียงแต่หาพื้นที่เก็บไฟล์ก็พอน่ะครับ กำลังคิดโปรแกรมอยู่ครับ

ตัว script PHP ไม่สนับสนุนภาษาไทยในส่วนของ title, artist, album, year, comment, genre ใน ID3 Tag 2.3 นะครับ กำลังแก้ไขอยู่ครับ ตอนนี้ใช้แบบนี้ไปก่อนนะครับ

เขียน รับ get / post ใน form method ระวังโดน hack หรือเป็นรูโหว่

นี่เป็นปัญหามาก ในเป็นการสร้างนิสัยเสียในการเขียนโปรแกรมในภาษา PHP ในเรื่องการที่คนเขียน นิสัยเสีย หรือติดจากหนังสือบางเล่ม ที่ไม่ค่อยใช้ GET หรือ POST ในการรับค่าจาก form ต่างๆ ใน method ต่างๆ มันยังผลไปสู่การ Hack หรือการเจาะได้ เช่น เมื่อเร็วๆ นี้ ทำ script PHP สำหรับการ vote freshy boys/girls ที่ ม. ที่ผมเรียนอยู่ ผมหล่ะปวดกับการหล่ะหลวม ของตัวผมเองในการเขียน script ระบบ vote อย่างแรง ตัว form คือ
[HTML]





[/HTML]
ตัวอย่างด้านล่าง มีช่องโหว่ครับ เพราะว่าในระบบ จะรับ แค่ poll_id เท่านั้นส่วน vote_for และ action ไม่ได้ทำการกรอง อ่าน POST หรือ GET แต่ประการใด จากด้านล่าง
[PHP]
$poll_id = $_POST[“poll_id”];
require (“poll/poll_cookie.php”);
include(“poll/booth_inc.php”);
[/PHP]
ทำให้เกิด !!!!
[CODE]


<body> </body>
[/CODE]
เห็นไหมคืออะไร เค้ายิงผ่าน GET Method แทนครับ อ่านหมด 3 ตัวแปรเลย เพราะอะไร ? อย่างแรกครับ $poll_id = $_POST[“poll_id”]; ไม่พอต่อการดัก method จาก GET แต่อย่างใด เพราะว่ายังไง ตัวแปรใน poll_id ที่อยู่ใน form มันก็ยังมาใส่ใน $poll_id ได้จาก GET Method ที่ไม่ได้ lock ซึ่งเช่นเดียวกับ vote_for เช่นกัน ที่มันก็ไปใส่ใน $vote_for ใน script ด้วยเช่นกัน ทำให้เกิดการตั้งเวลาการ vote ได้โดยที่คน vote ไม่ต้องอยู่ที่เครื่อง แค่เปิด browser page นี้ไว้ เท่านั้นเอง แถมถ้าเปิดไว้สัก 100 เครื่องนี่มหาศาลมากทีเดียว ผมเลยต้องกลับลำ และแ้ก้ระบบ script ใหม่หมดอีกครั้งโดยดัก 2 ตัวพอ เพราะว่า action อันนี้ไม่ค่อยสำคัญเท่า vote_for กับ poll_id ที่เป็นตัวจักรสำคัญ แก้คือ ดักทั้ง GET และ POST เราต้องการให้ Method ไหนเข้ามาก็ให้มันผ่านไปเท่าที่เราต้องการเท่านั้น
[PHP]
if(empty($_POST[“poll_id”])) {
$poll_id = $_GET[“poll_id”];
}
else {
$poll_id = $_POST[“poll_id”];
}
if(!empty($_GET[“vote_for”]) or !empty($vote_for)) {
header(“Location: index.php”);
exit;
}
else {
$vote_for = $_POST[“vote_for”];
}
require (“poll/poll_cookie.php”);
include(“poll/booth_inc.php”);
[/PHP]

ผมเลยดักด้วยการรับค่า poll_id จากทั้ง GET และ POST Method ทั้งหมดด้วยการดักไว้ก่อน ตามด้วย Condition ตรวจสอบ ว่าต้องไม่มีการใส่ vote_for ใน GET Method หรือ มีการลักลอบใส่ผ่าน $vote_for มาแต่อย่างใดถ้ามีก็เด้งไป index.php ทันที แต่ถ้าไม่มีก็รับค่าจาก POST มาเลย แล้วทำการ run ตัว script ต่อไปครับ นี่เป็นสิ่งที่รูโหว่ของคนที่ไม่ชอบใช้ POST / GET Method ใน PHP ครับ หรือตั้งชื่อตัวแปรที่มารับ POST / GET Method ที่เหมือนกัน ทางแก้คือ

  1. ใช้ GET / POST Method เสมอๆ ในการรับค่าผ่าน form ต่าง script กัน
  2. ตั้งตัวแปรใน script ที่แตกต่างจาก GET /POST Method เข้าไว้ครับ
  3. ถ้าจำเป็นต้องตั้ง ก็ต้องมี function ในการเช็คตัวแปรที่ส่งผ่านเข้าออก script ให้มากครับ
  4. ใช้ function / class มาแก้ปัญหานี้ครับ ช่วยได้มาก สำหรับคนที่มีเวลาเขียนโปรแกรม หรือ optimize / debug เยอะๆ ครับ (อันนี้เร่งๆ พอสมควรครับ) อันนี้เป็นสิ่งเตือนในการเขียน script ที่เป็น public ได้มากเลยหล่ะครับ

ซึ่งปัญหานี้เกิดจากการใช้ register_global ใน php ที่ตั้ง enable ไว้นั้นเอง ถ้าปิดไปการใช้ตัวแปรภายใน php script ปลอดภัยมากขึ้น

PHP Programming’s Style Guidelines

         พอดีว่าทำเอกสารสำหรับ Team Developer เมื่อนานมาแล้ว เพื่อให้ Style ในการเขียน Software ต่าง ๆ นั้นไปในทิศทางเดียวกัน เลยต้องมีการกำหนด Style ขึ้นมา เวลาทำงาน และอ่าน code จะได้ไม่ไปคนละทิศทาง มากนัก การกำหนด Style ในการเขียน นั้นไม่ได้ขึ้นอยู่กับตัวภาษาเพียงอย่างเดียว แต่ขึ้นอยู่กับ Team ของเราด้วยว่าจะกำหนดไปในทิศทางใด และง่ายต่อ Team ของเราว่าจะถนัดแนวไหนมากกว่ากัน เรามาเริ่มกันเลยแล้วกัน อาจจะขาด หรือเกินไปบ้างนั้นสุดแล้วแต่หัวหน้าของเราเองว่าจะกำหนดอะไรบ้าง และสิ่งที่ผมได้รวบรวมมานี้ เป็นการเขียนที่ได้ผ่านการขัดเกามามากพอสมควร และผ่านการใช้งานโดยส่วนตัวมามาก ว่าทำงานได้เร็วและเข้าใจได้ง่ายต่อตนเอง และคาดว่าน่าจะทำให้คนอื่นๆ ที่เข้ามาอ่าน Code ของเราเข้าใจได้ง่ายด้วยเช่นกัน


PHP Programming’s Style Guidelines

เป็นการกำหนดรูปแบบการเขียน ของโปรแกรมเพื่อให้โปรแกรมอ่านง่าย และพัฒนาต่อได้โดยที่ไม่จำเป็นต้องมาปรับแต่งหรืออ่านทำความเข้าใจใหม่ ประกอบด้วย

  1. Version, Changelog, Readme และ License
  1. การตั้ง version ไม่มีกฎตายตัวในการตั้ง แต่ที่จะแนะนำในเอกสารฉบับนี้ก็คือ version ของโปรแกรมจะใช้ทศนิยมจำนวน 2 จุดเพื่อบ่งบอกการพัฒนาของโปรแกรม ให้ไล่จาก ทศนิยมจุดที่ 2 เช่น 0.0.1 โดยทศนิยมจุดที่ 2 คือการแก้ไขข้อผิดพลาด อันเกิดจากการ coding หรือการ flow โปรแกรมที่ผิดพลาดไป และเป็นการประกาศเริ่มต้นการพัฒนาไปในตัวด้วย หรืออาจจะใช้ a – z ต่อท้ายตัวเลขก่อนเพื่อบ่งบอกการใส่ฟังค์ชั่น หรือการแก้ไขในการเริ่มต้นพัฒนาก็ได้ ส่วนทศนิยมจุดที่ 1 นั้นเป็นการเพิ่มฟังค์ชั่น, เพิ่มคลาสต่าง ๆ เข้าไปใหม่ เพื่อเพิ่มความสามารถของโปรแกรม ส่วนตำแหน่งหน่วยนั้นเป็นการประกาศ version release เพื่อบ่งบอกว่าโปรแกรมพร้อมใช้งานในทุก ๆ ด้านโดยไม่ขาดตกบกพร่องในขั้นตอนการใช้งานจริงจากกลุ่มทดสอบแล้ว แต่อาจมีข้อผิดพลาดตามมาได้เช่นกันหลังจากประกาศ version release ไปแล้ว เพราะไม่มีโปรแกรมใดสมบูรณ์แบบที่สุด แต่ถือความสำเร็จจากผลของการใช้งานในช่วงของการทดสอบของกลุ่มทดสอบเป็นสำคัญ แต่โดยส่วนใหญ่แล้ว version แรกที่ส่งออกสู่ผู้ใช้มักจะเป็น version ที่ลงท้ายตัว alpha และต่อมาก็ตามด้วย beta ขึ้นอยู่กับผู้พัฒนาจะเลือกตัวไหนมาใช้ หรือใช้ตามลำดับทั้งสองตัวก็ได้ แต่หมายเลข version ในครั้งแรกจะเริ่มที่ 0.0.1 alpha เป็นส่วนใหญ่
  2. การทำChangelog เพื่อเป็นการสร้างเอกสารเพื่อแสดงถึงความคืบหน้า และรวมถึงการแก้ไขข้อผิดพลาดต่าง ๆ โดยทุก ๆ ครั้งที่ มีรูปแบบดังนี้

    Software version August 10, 2004

    =========================================================

    August 2004:

    ——————————————————————————–

    ! fixs bug in function xxx in fileName.php

    + add new function to program.

    =========================================================

  3. การทำไฟล์ Readme จะทำก็ต่อเมื่อโปรแกรมนั้นพร้อมใช้งานได้แล้วในระดับหนึ่ง โดยในไฟล์นี้จะระบุรูปแบบคือ การติดตั้ง, ทีมงาน หรือผู้จัดทำ, ประวัติงานต่าง ๆ
    การทำไฟล์ License
  4. เป็นการบ่งบอกว่าโปรแกรมนี้ยึดหลักการลิขสิทธิ์แบบใดในการคุ้มครองตัวโปรแกรมนี้ เช่น GNU/GPL ของ Free Software Foundation เป็นต้น
  • Comment
    1. ทุก ๆ ไฟล์ของโปรแกรมให้เขียน Copyright statement comment ทุกครั้งบนหัวของโปรแกรมทุก ๆ ไฟล์ไม่ว่าจะเป็นไฟล์ใดก็ตาม โดยในนั้นจะมีระบุชื่อไฟล์นั้น ๆ ก่อน ตามด้วยชื่อของโปรแกรมต่าง ๆ ตามตัวอย่างนี้

      Copyright statement comment

      /*******************************************************************************

      * fileName.php *

      ********************************************************************************

      * Software name with short name : Software name with long name *

      * Project Inspired by Your Name (email@email.com) *

      * ======================================================= *

      * Software Version: Software 0.0.1 *

      * Software by: Software *

      * Copyright 2005-2006 by: Software *

      * Support, News, Updates at: http://www.website.org *

      ********************************************************************************

      * This program is free software; you may redistribute it and/or modify it *

      * under the terms of the provided license as published by Open-Source. *

      * *

      ******************************************************************************/

    2. การแก้ไขไฟล์โดยต้องใส่ comment คือการแก้ไขไฟล์เพื่อแก้ไขบัก หรือข้อผิดพลาดของโปรแกรมนั้น ๆ เพื่อง่ายต่อการไล่การพัฒนาการของโปรแกรมนั้น ๆ เช่น

      # This function is casting Date and Time from MySQL DateTime.

      หรือถ้าต้องการหลายบรรทัดก็ให้ใช้

      # I imagine this file will eventually become a backwards

      # compatibility wrapper around a load balancer object, and

      # the load balancer will finally call Database, which will

      # represent a single connection


    3. เพื่อง่ายต่อการอ่านก็ได้ และในทุกคลาส, ฟังค์ชั่น และตัวแปรที่ประกาศครั้งแรก ให้ทำการเขียน comment ตลอดทุกครั้งเพื่อง่ายต่อการนำไปใช้งาน และการแก้ไขตัวโปรแกรมในอนาคต
  • Indentation Style (Code Layout, Tabs และ Spaces)
    1. Tab character สำหรับแทรกระหว่างกั้นหน้าซ้ายกับอักษรแรกของแต่ละบรรทัด ได้จากปุ่ม Tab
    1. ควรตั้งความกว้าง tab ไว้ที่ 4 ตัวอักษร น้อยกว่านี้จะอ่านยาก มากกว่านี้จะกินที่ อีกเหตุผลคือนี่เป็นตัวเลขที่โปรแกรมเมอร์ส่วนใหญ่เขาใช้กัน ฝึกสายตาให้คุ้นกับค่ามาตรฐานย่อมได้เปรียบ
    2. สำหรับบรรทัดแรกให้เริ่มพิมพ์อักษรแรกที่คอลัมน์ 0 ชิดกับกั้นหน้าซ้ายเสมอ
    3. เมื่อขึ้นบรรทัดใหม่ หากไม่มีเหตุผลอะไรเป็นพิเศษให้จัดย่อหน้าให้ตรงกับบรรทัดก่อนหน้า เพื่อสื่อว่าสองบรรทัดนี้ความสำคัญอยู่ในระดับเดียวกัน
    4. เมื่อเปิดบล็อกใหม่ด้วยปีกกาเปิด (‘{‘) ต้องเพิ่ม tab ให้บรรทัดถัดไปหนึ่งขั้น เพื่อสื่อว่าบรรทัดหลังเป็น subordinate ของบรรทัดก่อนหน้า
    5. เมื่อจะปิดบล็อกด้วยปีกกาปิด (‘}’) ให้ขึ้นบรรทัดใหม่ ลด tab ลงหนึ่งขั้นแล้วจึงพิมพ์ปีกกาปิด เพื่อสื่อว่าบรรทัดถัดไปจะไม่เป็น subordinate อย่างบรรทัดก่อนหน้าอีกแล้ว หากบรรทัดที่พิมพ์ปีกกาปิดนั้นไม่มีปีกกาเปิดต่อท้าย ให้เริ่มบรรทัดใหม่ที่ tab ตรงกับปีกกาปิดได้ทันที
  • Space characterสำหรับแทรกระหว่างอะไรก็ตามที่ควรแทรกในระหว่างบรรทัด ได้จาก Space Bar
    1. เคาะ space เพียงครั้งเดียวสำหรับตำแหน่งที่ต้องการ space เพื่อประหยัดเนื้อที่และคีย์สโตรก
    2. เคาะ space กั้นชื่อคลาส, เมธอด, ตัวแปร, ค่าป้อน, คีย์เวิร์ดโอเปอเรเตอร์, ปีกกาปิด/เปิด ฯลฯ
    3. เคาะ space ตามหลังจุลภาค (‘,’) ที่กั้นระหว่างไอเทมในลิสต์
    4. อย่าแทรก space ระหว่าง dot operator (‘.’) กับ identifiers (ชื่อคลาส ชื่ออินสแตนซ์ ชื่อเมธอดและชื่อฟิลด์) เพราะ dot operator มีไว้เพื่อเชื่อมสองสิ่งให้กลายเป็นสิ่งใหม่ที่มีความหมายต่างจากเดิม
  • Newline character ได้จากปุ่ม Enter
    1. ขึ้นบรรทัดใหม่เมื่อจบสเตทเมนท์ปกติ
    2. แต่ละตำแหน่งที่ต้องการบรรทัดว่างให้แทรกบรรทัดว่างเพียงบรรทัดเดียวเท่านั้น เพื่อประหยัดเนื้อที่และคีย์สโตรก
    3. จัดกลุ่มของสเตทเมนท์ที่เกี่ยวข้องกันเป็นหนึ่งหน่วยความคิด อย่าแทรกบรรทัดว่างลงไปแยกหนึ่งหน่วยความคิดนี้ออกจากกันเด็ดขาด
    4. แทรกบรรทัดว่างลงไปตรงกลางแยกสองหน่วยความคิดออกจากกัน
    5. แทรกบรรทัดว่างระหว่างบล็อกหลักของคลาส เช่น บล็อกของการประกาศชื่อฟิลด์ บล็อกของคอนสตรักเตอร์ บล็อกของเมธอด ฯลฯ
    6. ข้อแนะนำ tab และ space
    1. อย่าใช้ space ในตำแหน่งที่ควรจะใช้ tab ด้วยเหตุผลหลักสองข้อ
    1. ประหยัดคีย์สโตรก คุณต้องเคาะ space สี่ครั้งจึงจะได้ช่องว่างเท่ากับ tab หนึ่งครั้ง
    2. โปรแกรมเมอร์ a อาจจะตั้งความกว้าง tab ไว้ที่ 4 ตัวอักษร ขณะที่โปรแกรมเมอร์ b ตั้งไว้ที่ 6 ตัวอักษร เมื่อมีการส่งไฟล์ให้กันจะไม่เกิดปัญหา"ความกว้าง tab ที่ไม่คุ้นตา"
  • แต่คุณอาจจะใช้ tab แทน space ก็ได้ เมื่อต้องจัดคอลัมน์ของเทกซ์ให้ตรงกัน เช่น เมื่อคุณต้องป้อนค่าเริ่มต้นให้ตัวแปรในลักษณะตาราง หากคอลัมน์ตรงกัน การอ่านหรือแก้ไขข้อมูลในตารางก็ง่ายขึ้น
  • ข้อแนะนำ tab และ newline
    1. หากหนึ่งสเตทเมนท์ยาวเกินกว่าหนึ่งบรรทัด ให้ปัดส่วนเกินของสเตทเมนท์มาไว้ในบรรทัดถัดไป และเพิ่ม tab จากต้นสเตทเมนท์ขึ้นหนึ่งหรือสองขั้น เพื่อเป็นจุดสังเกตว่าสเตทเมนท์นี้มีความยาวมากกว่าปกติ
  • ข้อแนะนำ space และ newline
    1. อาจวางสเตทเมนท์สั้นๆที่มีความเกี่ยวข้องกันหลายอันไว้บนบรรทัดเดียวกัน โดยใช้ space กั้นระหว่างสเตทเมนท์
  • ตัวอย่างต่าง ๆ
    <?php
        …………
    ?>


    <?php echo($XXX);?>
    ห้ามใช้ <?=$XXX?>


    if(condition) {
        …………
    } elseif(condition) {
        …………
    } else {
        …………
    }


    for($i=0; $i< $x ; $i++) {
        …………
    }
    do  {
        …………
    } while (condition)


    while(condition) {
        …………
    }


    function functionName () {
        …………
    }


    class className {
        …………
    }

  • Variable Names, Function Names และ Function Arguments
    1. การตั้งชื่อตัวแปรควรตั้งให้สื่อความหมายต่อการใช้งาน และตั้งชื่อตัวแปร, ชื่อฟังค์ชั่น และชื่อตัวแปรนำเข้าค่าของฟังค์ชั่น ด้วยตัวอักษรตัวเล็กเท่านั้น และช่องว่างระหว่างคำให้ใช้ Underscore ในการเว้นช่องว่าง ระหว่างคำ เช่น $current_user, print_login_status(), do_stuff($value_name) ห้ามใช้ $currentuser และ $currentUser
    2. ในภาษา PHP นั้นไม่มีการกำหนด Type ที่แน่นอน จึงไม่ต้องระบุ Type ด้านหน้าตัวแปร เช่น intMember แบบในภาษาอื่น ๆ แต่มีข้อยกเว้นในส่วนของ array และ object ควรใส่เพื่อบ่งบอกว่าเป็น array หรือ object ด้วย เช่น array แทนด้วย arr_var_name และ object แทนด้วย obj_var_name เปนต้น
    3. ตัวแปรนับรอบ Loop, Loop counter หรือ Loop Indices ให้ใช้ตัวแปรที่มีขนาดตัวอักษรที่สื่อความหมายเท่านั้น โดยใช้คำว่า index_counter ขึ้นต้นเสมอ เช่น $index_counter_member เป็นต้น

    ทั้งหมดทั้งปวงนี้เป็นเพียงแค่ส่วนหนึ่งของ Style ที่ทำการรวบรวมมาไว้ อาจจะยังไม่ครบทั้งหมดในกระบวนการ แต่ว่าก็เพียงพอต่อการทำงานเป็น Team ได้บ้างแล้ว

    ปรับแต่งเนื้อหาให้ใช้งานได้ดีขึ้นจาก indentation style in Java programming ( http://www.intellectworld.com/thai/indentation.html )

    จริงๆ ยังเหลือ Tags Manual อีก แต่ว่าขอเวลารวบรวมรายละเอียดอีกสักพัก เพราะว่าละเอียดพอสมควรทีเดียว