แก้ปัญหาภาษาไทยของ MySQL Version 4.x ขึ้นไป

อย่างแรกที่เจอปัญหาใน MySQL 5.0 คือถึงแม้จะกำหนด default-character-set เป็น utf8 แล้วก็ตามที แต่ก็ยังคงมีปัญหากับการจัดการข้อมูลภาษาไทยครับ

ซึ่งเราต้องปรับเปลี่ยนพฤติกรรมของตนเองใหม่เล็กน้อย 3 อย่างใหญ่ ๆ ครับ

  1. กำหนด collation_connection หรือ collation (ถ้าคุณใช้ PHPMyAdmin ที่เป็น interface ภาษาไทยก็จะเรียกว่า "การเรียงลำดับ" ครับ) ของ Database และ Table ที่เราใช้ต้องเป็น utf8_thai_ci เพื่อบอกว่าเราต้องการใช้ภาษาไทยกับ Database และ Table นี้ครับ
  2. กำหนด DEFAULT CHARSET ของ Database และ Table ที่เราใช้ต้องเป็น utf8 เพื่อบอกว่าเราต้องการใช้ภาษาไทยกับ Database และ Table นี้ครับ
  3. กำหนด Storage Engine ให้กับ Table ด้วย เพื่อจะได้ใช้งานได้ดี และเหมาะสมกับการเข้าถึงข้อมูลครับ เช่นต้องการควบคุม Transaction ของข้อมูลก็ใช้ BDB หรือ InnoDB เป็นต้นครับ

ตัวอย่างเช่น

CREATE DATABASE TESTDB
    DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE TEST (
  name VARCHAR(150) NOT NULL,
  PRIMARY KEY(name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

โดยที่ ENGINE=InnoDB เป็น Storage Engine หนึ่งของ MySQL ส่วนใหญ่จะใช้ MySIAM กันจะเป็น ENGINE=MySIAM แทนครับ

ส่วน DEFAULT CHARSET=utf8 นี่ต้องตามนี้ครับ แต่ว่าเท่าที่เจอกันจะเป็น DEFAULT CHARSET=utf8 หรืออื่นๆ ซะมากกว่าครับ ลองดูนะครับ

หรือถ้า Database และ Table เก่าเรามีปัญหาไม่สามารถปรับเปลี่ยนได้ ก็ให้กำหนดตอนก่อนจะ Query ข้อมูลก็ทำได้ครับ โดยใช้คำสั่ง

SET CHARACTER SET utf8;

และตามด้วย

SET collation_connection = utf8_general_ci;

แล้วทำการ Query ข้อมูลครับ

ไม่มีหนังสือเล่นได้ดีที่สุด

วันนี้ผมเซ็ง ๆ เล็กน้อยกับเพื่อน ๆ หลาย ๆ คน ในเรื่องการเลือกหนังสือเอามาอ่านประกอบการเรียน หรือแม้แต่เอามาอ่านเพื่อเสริมความรู้ด้านที่ตนขาดหายไป ส่วนใหญ่แล้วจะถามในคำถามที่ไม่แตกต่างกันคือ “หนังสือเล่มไหนอ่านแล้วครอบคลุม เนื้อหา” หรือ “หนังสือเล่มไหน อ. ออกสอบในนั้น” รวมไปถึงบางครั้งก็ถามที่ตัวอาจารย์ท่านเองว่า “อ. ครับ เล่มไหน อ. เอาออกข้อสอบ” กลับกลายเป็นว่าหลาย ๆ คนยึดมั่นถือมั่นกับหนังสือที่จะทำให้ได้มาซึ่งคะแนน มากกว่าความรู้ที่ตนเองจะได้เสียอีก บางเล่มก็ห่วยแตกสิ้นดี บางเล่มก็ดี อธิบายละเอียดดีมาก แต่เล่มใหญ่ไปหน่อย อันนี้ก็พอทน

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

เหตุนั้น ไม่ใช่เพราะคนเขียนไม่อยากเขียน หรือไม่มีความสามารถ เพียงแต่ในด้านการประยุกต์ และปรับใช้นั้นเป็นงาน ที่เราต้องศึกษาและร่วมรวมเอามายำรวมกันเอง โดยใช้หลักประยุกต์ต่าง ๆ ที่ได้ร่ำเรียนมาในเรื่องแรก ๆ ของการเรียนด้านการเขียนโปรแกรม/ซอฟต์แวร์ คือพวก logic/algorithm นั้นเอง

นั้นหมายความว่า ถ้าเพิ่งเริ่มต้นจาก 0 แล้วแนะนำว่าให้อ่านหนังสือมาก ๆ ไม่ต้องเลือกว่าจะตรง หรือไม่ตรงกับที่สอน จะออกสอบหรือไม่ ไม่สำคัญ เพราะว่าทุกอย่างที่คุณอ่าน มันไม่ได้ใช้แน่นอน ไม่มากก็น้อยเลยหล่ะ

ผมยังจำได้ดีในวันที่ผมตัดสินใจซื้อหนังสือคอมฯ ในเดือนแรก เดือนนั้นผมหมดไปกับเรื่องนี้เกือบพันกว่า เพราะว่าผมซื้อทุก ๆ เล่ม ทุกยี่ห้อ ผมจำได้ ผมซื้อตั้งแต่ computer today ยังแถม computer mart ฉบับแรก ที่เป็นหนังสือพิมพ์ (ตอนหลังเปลี่ยนชื่อเป็น commart) แถมซื้อทุกยี่ห้อมานั่งอ่าน ศึกษามันดะไปหมด ทำอย่างนี้ไปสัก ปีกว่าๆ เริ่มรู้ เริ่มเข้าใจหลักการซื้อหนังสือคอมฯ มากขึ้น ก็เริ่มเลือกหนังสือว่าจะเอาเล่มไหน ไม่เอาเล่มไหน ก็เริ่ม ๆ ลดบาง เพิ่มบาง ไป ๆ มา ๆ ในตอนนี้ก็เหลือแค่ 2 เล่มคือ PCWorld และ PCMagazine ที่อ่านประจำ แต่ก็มีพ่วง ๆ บางเดือนที่อาจจะสนใจในบางเรื่องก็แนบๆ มาบาง 1 – 2 เล่ม แต่ก็ไม่ได้อ่านแต่หนังสือพวกคอมฯเท่านั้น ก็อ่านพวกแนว ๆ วิทยาศาสตร์, ปรัชญา, ธุรกิจ , ชีวประวัติ ต่าง ๆ เป็นต้น

ก็อ่านให้ได้ความรู้มากขึ้น ได้เข้าใจโลก เข้าใจอะไรมากมายมากขึ้น ซึ่งทุก ๆ อย่างที่เราอ่าน มันก็ยังคงอยู่ในหัวผม เอามาปรับใช้ในการทำงาน และรวมไปถึงการติดต่องานต่าง ๆ ได้เป็นอย่างดี

อีกทางหนึ่งคือการค้นหาข้อมูลจาก Google (ใช้บ่อยเพราะเร็วดี), MSN Search, Yahoo และ Copernic Search เพื่อหาข้อมูลในการแก้ปัญหา, หาความรู้ใหม่ ๆ , ทำรายงานต่าง ๆ โดยทำอยู่ทุกวัน ยิ่งถ้าเราทำงานที่ใหญ่ ๆ บางครั้งต้อง Optimize Code เราก็ต้องหาหลักการ หรือพวกรูปแบบที่ทำงานได้เร็ว ๆ ซึ่งบางครั้งเราก็ต้องมากนั่งแกะ Code ชาวบ้านเค้าว่าเค้าทำอะไรบ้าง ทำยังไง ถึงได้เร็ว ได้ทำงานได้ไม่มีปัญหา ซึ่งมันทำให้เรามีประสบการณ์มากขึ้น และเพิ่มพูนทักษะ ในการต่อยอดต่อไปด้วย

ยิ่งพวก Technology ต่าง ๆ มันไม่หยุดนิ่ง เช่น .NET 1.0 –> .NET 1.1 –> NET 2.0 หรือ MySQL 4.x –> MySQL 5.0 ยิ่งทำให้เราต้องยิ่งรู้ทัน ใน feature ใหม่ ๆ และเข้าใจว่าสมควรหรือไม่อย่างไรในการเอามาทำงาน ในการทำงานต่าง ๆ ของเราหรือไม่ด้วย ซึ่งสิ่งเหล่านี้ทำให้เราเอามาประยุกต์ใช้ได้ถูกทางมากขึ้น ซึ่งสิ่งที่ได้จากการประยุกต์นี้ นั่นคือประสบการณ์การที่ได้จากการรับข้อมูลข่าวสารจากหลาย ๆ แหล่ง เอามากรองเข้าด้วยกันจนได้สิ่งที่ดีกว่า

แก้ไขปัญหา Client does not support authentication protocol ใน MySQL

ใน MySQL 4.1 ขึ้นไปนั้น ได้ใช้ hashing algorithm ในการเก็บ password เพื่อใช้ในการ Authentication Protocol แบบใหม่ซึ่งทำให้ยังไม่สนับสนุนใน PHP หรือ software client ใน version เก่าๆ (หรือใหม่ๆ บางตัวก็ยังไม่สนับสนุน) ถ้าคุณ upgrade ไปเป็น MySQL 4.1 หรือสูงกว่า การติดต่อเพื่อเข้าไปใช้งานนั้น จะขึ้นข้อความว่า

Client does not support authentication protocol requested by server; consider upgrading MySQL client.

สาเหตุมาจากการที่ MySQL ได้ทำการปรับเปลี่ยนการเข้ารหัส password ใหม่อย่างที่ได้กล่าวไปแล้วโดย ถ้าใน MySQL version ก่อน 4.1 นั้นใช้การเข้ารหัสที่มีความยาว 16 bytes แต่ใน version ตั้งแต่ 4.1 ขึ้นมาถึงปัจจุบันนี้จะใช้การเข้ารหัสที่มีความยาว 41 bytes ซึ่ง client บางตัวยังไม่สนับสนุน password hashing algorithm แบบนี้ครับ ซึ่งการเข้ารหัส password ที่มีความยาว 41bytes นี้จะทำให้การถอดรหัสเพื่อทำการ hack ข้อมูลนั้นทำได้ยากขึ้นมากเลยทีเดียวครับ 

โดยถ้าเราเปรียบเทียบจากตัวก่อนหน้า version 4.1 จะได้

mysql> SELECT PASSWORD(‘mypass’);
+——————–+
| PASSWORD(‘mypass’) |
+——————–+
| 6f8c114b58f2ce9e |
+——————–+

แต่ถ้าเราใช้คำสั่งเดียวกันใน version หลังจาก 4.1 จะได้

mysql> SELECT PASSWORD(‘mypass’);
+———————————————–+
| PASSWORD(‘mypass’) |
+———————————————–+
| *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 |
+———————————————–+

จะเห็นความแตกต่างของการเข้ารหัส password ของ MySQL ครับ

การแก้ไขปัญหานี้ทำได้โดยการ

  • ทำการ upgrade ตัว client ที่ติดต่อกับ MySQL ให้เป็น version ที่สนับสนุน hashing algorithm ที่เก็บ password ใหม่ใน MySQL 4.1 ขึ้นไป (client ที่ว่านี้หมายถึง PHP MySQL Module, MySQL Front, PHPMyAdmin และตัวจัดการข้อมูลต่างๆ ที่เชื่อมต่อกับ MySQL ถือเป็น client ทั้งหมดครับ)

  • เมื่อทำการติดต่อกับ server โดยใช้ pre-4.1 client program ให้ใช้บัญชี username ที่ใช้ pre-4.1-style password แทนการใช้ username ที่ใช้ style password แบบเก่า

  • ทำการ Reset password ไปเป็น pre-4.1 style โดยใช้คำสั่ง SET PASSWORD และ OLD_PASSWORD() function โดยทำใน MySQL Command Line Client ซึ่งใช้คำสั่งดังนี้

mysql> SET PASSWORD FOR

-> ‘some_user‘@’some_host‘ = OLD_PASSWORD(‘newpwd‘);

  • some_host ให้เปลี่ยนเป็น hostname ที่ใช้เช่น localhost, 127.0.0.1, 192.168.0.1 หรือที่เป็น hostname นั้นๆ
  • some_user ให้เปลี่ยนเป็น username ที่ใช้เช่น root, admin หรือ username อื่นๆ ที่ต้องการ
  • newpwd ให้เป็นเป็น password ที่ใช้เช่น 1234, abcde หรือที่ต้องการ

ตัวอย่าง :

mysql> SET PASSWORD FOR

-> ‘root‘@’localhost‘ = OLD_PASSWORD(‘1234‘);

คือกำหนด password ใหม่ให้กับ root ที่ localhost โดยใช้ hashing algorithm password แบบเก่าโดยกำหนด password คือ 1234

แล้วทำการ UPDATE และ FLUSH PRIVILEGES โดยใช้สั่ง

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd‘)

-> WHERE Host = ‘some_host‘ AND User = ‘some_user‘;

mysql> FLUSH PRIVILEGES;

ตัวอย่าง :

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘1234‘)

-> WHERE Host = ‘localhost‘ AND User = ‘root‘;

mysql> FLUSH PRIVILEGES;

* ด้วยวิธีด้านบนนี้เหมาะสำหรับใช้ในกรณีที่มี user ที่อยู่ในฐานข้อมูลน้อยๆ เท่านั้น มิเช่นนั้นแล้วอาจจะต้องเปลี่ยนกันมืองึก -_-"

  • ถ้ามี user ในฐานข้อมูลมากๆ และการปรับเปลี่ยนวิธีด้านบนทั้งหมดเป็นการยากในการทำระบบฐานข้อมูลกลับมาใช้งานได้ปกติในเวลาอันสั้น เราสามารถบอกให้ MySQL ใช้ password hashing algorithm แบบเก่าตอน start-up service ได้เลย แต่แนะนำให้ใช้งานชั่วคราวเท่านั้นครับ และเมื่อมีเวลาให้ทำการปรับเปลี่ยนไปใช้ระบบ password hashing algorithm แบบใหม่แทน

    โดยเริ่มการทำงานของ mysqld ด้วย –old-passwords ที่เป็น option command

    ตัวอย่าง :

    c:\MySQL\bin\mysqld –old-passwords

อ้างอิงจาก A.2.3. Client does not support authentication protocol ใน MySQL 5.0 Reference Manual

MySQL 5.0 (build 15) Full Release !!!

อาจจะเก่าไปนิดแต่ว่าไม่น่าจะนานมาก เมื่อวันที่ 24 ตุลาคม 2548 ที่ผ่านมา MySQL AB ได้เปิดตัว MySQL 5.0 ซึ่งเป็นการเปลี่ยนแปลงครั้งใหญ่ในรอบหลายๆ ปีของ MySQL AB เลยทีเดียว เพราะว่าตัว MySQL 5.0 นั้นมีคุณสมบัติในระดับองค์กร (Enterprise) ซึ่งต้องการความน่าเชื่อถือสูงมาก ตามมาตรฐาน SQL 2003 เลยทีเดียว โดยคุณสมบัติที่เพิ่มเติม มาก็ได้แก่ Stored Procedures, SQL Functions, Triggers, Views, Cursors, XA Distributed Transactions, ตัวเลือกระบบบีบอัดข้อมูล (federated and archive storage options), SQL Mode, ฯลฯ อ่านเพิ่มเติมที่นี่ครับ http://dev.mysql.com/doc/refman/5.0/en/mysql-5-0-nutshell.html

ซึ่งทำงานได้บน Linux, Windows, Solaris, Mac OS X, FreeBSD, HP-UX, IBM AIX 5L, ฯลฯ

MySQL 5.0 นี่อยู่บนข้อตกลง Open Source (GPL) หรือ Commercial MySQL Licenses ซึ่งทำงานตาม concept ของเค้าว่า high-performance, reliability และ ease-of-use ครับ

เพราะว่าตอนนี้ MySQL ไม่เหมือนเมื่อก่อนแล้วครับ ในด้านการจัดการระบบต่างๆ นั้นแทบจะไม่ต้อง set ผ่าน text files แบบเดิมๆ ครับ ทำงานผ่าน wizard ได้เลย ส่วนถ้าต้องการละเอียดมากขึ้นก็ไปโหลด MySQL Administrator จากเว็บ MySQL มาเพื่มเพื่อทำงาน และปรับแต่งต่างๆ ได้ทั้งหมดครับ รวมไปถึงเครื่องมือในการทดสอบ Query ข้อมูล MySQL Query Browser เพื่อทดสอบ SQL ที่เราจะทำงานได้จากซอต์แวร์นี้ครับ ทำงานได้ง่ายมากๆ เลยครับ และส่วนใครจะทำการย้ายฐานข้อมูล MySQL ก็ใช้เครื่องมือ MySQL Migration Toolkit ได้อีกเช่นกันครับ อันนี้ยังไม่ได้ลองทดสอบแต่อย่างใด ถ้าใครใช้แล้วเป็นยังไง ก็ Comment ไว้ครับ

จากที่ได้ลองใช้ดูนั้น การทำงานถือว่าเสถียรดีมาก แต่ว่าผมยังไม่ได้ลองให้มันทำงาน load สุดๆ เลยยังไม่รู้ว่าจะเสถียรกว่าตัวเก่าหรือเปล่า แต่ด้วยระบบที่ใหม่กว่า ไม่น่าจะมีอะไรผิดพลาดแต่อย่างใด

ในการใช้งานตอนนี้ของผมนั้นทำงานบน Storage Engine แบบ InnoDB เพราะว่าผมต้องใช้งาน Transaction ของ DBMS ด้วย ซึ่งจากตัว MySQL 4.1.13 ที่ได้ใช้มาก่อนหน้านี้ก็ทำงานได้ไม่มีที่ติ


อันนี้แนะนำเพิ่มเติมครับ เป็นเครื่องมือในการออกแบบ Database ที่มีประสิทธิภาพมากๆ ตัวหนึ่งเลยทีเดียวครับ มันชื่อว่า fabFORCE DBDesigner 4 (http://www.fabforce.net/) ครับ เจ้า DBDesigner 4 มันเป็นระบบออกแบบฐานข้อมูลแบบเสมื่อนจริง (Visual Database Design System) ที่ดีมากๆ เลย ซึ่งเหมาะสำหรับการออกแบบและการสร้างฐานข้อมูลในรูปแบบ ER-Diagram ซึ่งสามารถทำการจัดการได้โดยตรงจาก Model ได้เลย แถมเชื่อโยงความสัมพันธ์ได้ง่ายมากๆ เลยครับ รวมไปถึง Export ให้ทำงานร่วมกับฐานข้อมูล MySQL, Oracle, MSSQL, SQLite และ ODBC

ซึ่งซอฟค์แวร์ตัวนี้อยู่บนข้อตกลงของ Open Source Project (GPL) สนับสนุนการทำงานบน Microsoft Windows 2k/XP และ Linux KDE/Gnome

โดยที่ความต้องการของระบบในการทำงานนั้นน้อยมาก ไม่ต้องใช้ระบบที่สูงมากนัก แถมทำงานได้เร็วอีกต่างหาก ไม่แฮงง่ายด้วยครับ


แต่ทั้งนี้ทั้งนั้น ถึงแม้จะมี Toosl มาช่วยให้เราบริหารระบบ DBMS มากมายแค่ไหน ถ้าเราไม่เข้าใจว่าเราจะเอามันมาใช้งานยังไงให้เกิดประโยชน์สูงสุดแล้ว ผมว่าก็น่าเสียดายความสามารถเหล่านั้น แถมความสามารถเหล่านี้ก็ไม่ต้องซื้อหาจากที่ไหน เพราะว่าทั้งหลายทั้งบวงที่ได้กล่าวมานั้นอยู่บนข้อกำหนด GPL แทบทั้งสิ้นครับ

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 protected]) *

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

      * 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 อีก แต่ว่าขอเวลารวบรวมรายละเอียดอีกสักพัก เพราะว่าละเอียดพอสมควรทีเดียว