แก้ไขปัญหา 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 แทบทั้งสิ้นครับ

Apple เดินแผนเก็บเงินส่วนแบ่งจากผู้ผลิตอุปกรณ์เสริมให้ iPod

Apple Computer เริ่มที่จะดำเนินการเก็บเงินค่าลิขสิทธิ์ จากบริษัทผู้ผลิตอุปกรณ์เสริมต่างๆที่ใช้เชื่อมต่อกับเครื่องเล่นเพลงดิจิตอล iPod แล้ว หลังจากที่ดูผู้ผลิตรายอื่นทำรายได้จากการผลิตอุปกรณ์เสริม ที่เชื่อมต่อกับเครื่องเล่นเพลง iPod มาเป็นระยะหนึ่งแล้ว Apple ก็ตัดสินใจที่จะทำการเก็บเงินค่าลิขสิทธิ์ จากบริษัทที่ผลิตอุปกรณ์เสริมสำหรับ iPod รุ่นต่างๆแล้ว โดยจะเก็บเงินจากผู้ผลิตอุปกรณ์เสริมที่จะต้องเชื่อมต่อเข้ากับ iPod ผ่านทางพอร์ทเชื่อมต่อเท่านั้น สำหรับเคสหรืออุปกรณ์เพิ่มความสวยงามต่างๆนั้นจะยังไม่ถูกเก็บค่าลิขสิทธิ์นี้ ซึ่งผู้ผลิตที่จ่ายเงินให้กับ Apple แล้วก็จะสามารถนำโลโก้ "Made for iPod" ไปติดที่สินค้าของตนได้ โดยบริษัทที่จ่ายเงินให้กับ Apple ก็จะได้รับการสนับสนุนทางเทคนิค รวมถึงข้อมูลใช้งานต่างๆของพอร์ทเชื่อมต่อที่ใช้ใน iPodด้วย แต่อย่างไรก็ตามยังไม่มีการเปิดเผยว่า Apple จะมีมาตรการอย่างใดต่อบริษัทที่ไม่ยอมจ่ายค่าลิขสิทธิ์นี้ ซึ่งขณะนี้ก็มีบริษัทหลายรายที่ตอบตกลงที่จะจ่ายเงินให้กับ Apple แล้วถึงแม้ว่าค่าลิขสิทธิ์ดังกล่าว จะค่อนข้างเป็นจำนวนเงินสูงมากก็ตาม โดยขณะนี้ทาง Apple เองก็ปฏิเสธที่จะเปิดเผยถึงรายละเอียดในการเก็บเงินดังกล่าว แต่ก็มีแหล่งข่าวใกล้ชิดของ Apple เปิดเผยว่าค่าลิขสิทธิ์ดังกล่าวนั้นจะเก็บเป็นส่วนแบ่งจำนวน 10เปอร์เซ็นต์จากยอดจำหน่ายของอุปกรณ์เสริมนั้นๆ http://www.pantip.com/tech/newscols/news/191005b.shtml —————–

จากการวิเคราะห์ของผมเองแล้วเนี่ย ราคาอุปกรณ์เสริม คงจะไม่สูงขึ้นมากไปกว่า 5% จากราคาเดิม ใน lot การผลิตต่อไปหลังจากที่ทำการเซ็นสัญญากับ Apple แล้ว

แล้วผลประโยชน์ที่ได้รับ น่าจะมากกว่า เพราะว่าได้รับข้อมูลด้านระบบเชื่อมต่อจาก Apple โดยตรงแทนการ Re-engineering แบบเก่า ทำให้น่าจะมีผลกับอุปกรณ์เสริมที่หลากหลายมากขึ้น เราอาจะได้เห็นอุปกรณ์เสริม สำหรับฟัง FM ได้ในอนาคต หรืออุปกรณ์อื่นๆ ที่เสริมการทำงาน พวก Bluetooth ที่ใส่กับ iPod ได้ด้วยครับ ซึ่งทั้งหมดทั้งปวงน่าจะก่อให้เกิดความน่าเชื่อถือในคุณภาพสินค้า ที่ผลิตออกมาได้ดีขึ้นครับ คล้ายๆ กับ Stricker ที่เป็นตรา Intel inside หรือพวก Design for Windows อะไรพวกนี้ครับ

รายงาน Apple’s One More Thing…

รายงานสดจากเว็บ http://live.ilounge.com/ ในวันนที่ 13 ต.ค. 48 เวลา 0:45:00 ครับ

ร่วมรายงานพร้้อมกับคุณ Kangg แห่ง Siampod.com ครับ

13 ต.ค. 48 เวลา 0:48:01

  • เปิดตัว iMac ตัวใหม่
  • บางขึ้น (thinner)
  • มาพร้อมกับ กล้อง iSight camera
  • Application ใหม่ชื่อว่า Photo Booth และ Front Row
  • Front Row คือ การสร้างประสบการณ์ใหม่ของความบันเทิง ทั้งด้านเพลง, รูปถ่าย และวีดีโอ จากโซฟาของคุณเอง โดยใช้รีโมต Bluetooth ซึ่งสำหรับรีโมทที่มาพร้อมกับ New iMac มีหน้าตาคล้ายกับ iPod shuffle มีขนาดความยาว 6 cm.
  • Photo Booth คือโปรแกรมถ่ายภาพโดยใช้ iSight เป็นเหมือนกล้องถ่ายรูป (คล้ายๆ กล้องรูปสติ๊กเกอร์บ้านเรา) โดยมี Effect Flash หลังจากนับ 3 – 2 – 1 แล้วด้วย (คิดได้ไง!!!) แถมด้วย Real time effect อีกต่างหาก
  • การติดต่อเพลงจาก iTunes , DVD ผ่าน iDVD และ Video, Photo ผ่าน iPhoto ซึ่งจะติดต่อผ่านลักษณะ full screen display แทนการแยกตัวซอฟต์แวร์แบบเดิมๆ ได้ (คล้ายๆ กับ Windows Media Center)

—————————————– 13 ต.ค. 48 เวลา 0:50:36 ภายในเวลา 17 วัน iPod Nano ขายได้ 1 ล้านตัวไปแล้ว

New !!! iPod

  • หน้าจอแสดงผล 2.5 นิ้ว ขนาด resolution ที่ 320 x 240 pixel, สนับสนุน MPEG-4 video และ H.264 Streaming
  • Video out
  • New software features !!! เช่น World clock, stopwatch และ screen lock
  • 30GB model จะบางกว่าตัว 20GB เดิมอีก 31%
  • 60GB model จะบางกว่าตัว 20GB เดิมอีก 12%
  • ราคาเปิดตัวที่ 30GB = $299 และ 60GB = $399
  • มีสองสีตามคาด คือสีขาว และสีดำ
  • สั่งจอง และจัดส่งได้ภายในอาทิตย์หน้านี้ (วันที่เขียน Blog คือวันที่ 13 ตุลาคม 2548)

—————————————– 13 ต.ค. 48 เวลา 1:08:28 New !!! iTunes 6

  • iTunes ได้รับการ Download ไปแล้วกว่า 200 ล้านครั้งทั่วโลก
  • iTunes Music Store มี Market Share กว่า 84%
  • ซึ่งมี Music videos ในตอนนี้กว่า 2,000 รายการ ในราคา $1.99
  • เลือกรายการ TV Show ได้ในราคา $1.99 โดยสนับสนุนจาก ABC พวกรายการ Desperate Housewives, Lost, ฯลฯ
  • เริ่มต้นในวันต่อไป โดยให้ download ทดสอบฟรี 1 episode โดยให้ดู 10 – 20 นาที ต่อการ donwload ทั้งใน season นี้ และเมื่อ season ที่แล้วด้วย โดย download มาเป็น 320 x 240 resolution videos มีขนาดเท่ากับ เพลง 6 ไฟล์
  • ไม่สามารถ Burn ไฟล์ลง CD หรือ DVD ได้, สามารถเล่นบน Computer ได้ 5 เครื่อง,ไม่จำกัดจำนวน iPod, ไม่มีวันหมดอายุ และคุณสามารถส่ง video เป็นของขวัญได้ด้วย

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