วันศุกร์ที่ 29 ตุลาคม พ.ศ. 2553

ความรู้เรื่องการสอนทำ wordpress ครับ

LINK ที่น่าสนใจ สอนดีมาก

การติดตั้ง เกี่ยว PDF FILE
http://xirbit.com/lib/?p=43

วิธีการแก้ปัญหา การ upload file เข้าสู่ Server ครับ
http://www.wordthai.com/index.php?topic=114.0;prev_next=next

วันพฤหัสบดีที่ 28 ตุลาคม พ.ศ. 2553

วิธีแก้ไขปัญหา Appserver ไม่สามารถอ่านภาษาไทยได้ (tis-620)

เมื่ออักษรภาษาไทยกลายเป็น ??????
Categories

ปรับปรุง: 7 สิงหาคม 2551
ผมเคยติดตั้งและใช้งาน PHP และ MySQL มาหลายครั้งหลายหน ไม่ว่าจะเป็นการติดตั้งบน Linux หรือ Windows ทั้งที่ Compile เองและติดตั้งแบบ package ซึ่งการติดตั้งบน Windows ดูจะติดตั้งอย่างสะดวกและรวดเร็วมากขึ้น เพราะมีผู้ทำโปรแกรมช่วยติดตั้ง Apache PHP และ MySQL อัตโนมัติ เช่น AppServ (www.appservnetwork.com) และ XAMPP (http://www.apachefriends.org/en/index.html) เป็นต้น

แต่คราวนี้ผมเจอปัญหาหลังจากการติดตั้ง Apache PHP และ MySQL บนระบบปฏิบัติการ Windows เพราะเมื่อทดลอง query ข้อมูลที่เป็นภาษาไทยจาก MySQL กลับพบว่าได้ผลลัพธ์ในการแสดงผลภาษาไทยที่ไม่ถูกต้อง คือตัวอักษรภาษาไทยจะแสดงออกมาเป็นเครื่องหมายคำถาม (?) ทั้งหมด ในขณะที่ผมได้เพิ่ม option ที่เกี่ยวกับการ set character ให้เป็นภาษาไทยใน my.ini แล้ว ดังตัวอย่างต่อไปนี้
[mysqld]default-character-set=tis620
หลังจากที่ได้ทำการตรวจสอบแล้วในฐานข้อมูล MySQL โดยใช้โปรแกรม เช่น MySQL-Front (http://www.mysqlfront.de/) แล้วก็พบว่าข้อมูลที่เก็บอยู่ก็เป็นภาษาไทยถูกต้อง และเมื่อลองดูตัวแปรต่างๆ ที่เกี่ยวข้องกับ character ต่างๆ ก็พบค่าต่อไปนี้
- character_set_client = tis620- character_set_connection = tis620- character_set_database = tis620- character_set_results = tis620- character_set_server = tis620- character_set_system = utf8- collation_connection = tis620_thai_ci- collation_database = tis620_thai_ci- collation_server = tis620_thai_ci
เมื่อลองไปค้นในเว็บไซท์ของ MySQL ในส่วนที่เกี่ยวข้องกับกลุ่มอักขระ (character set) ก็พบส่วนที่เกี่ยวข้องกับกลุ่มอักขระ ใน Chapter 10. Character Set Support (http://dev.mysql.com/doc/mysql/en/charset.html) ซึ่งได้อธิบายความหมายของ Character set ไว้ว่าคือ กลุ่มของสัญลักษณ์และการ encode อักขระต่างๆ
ส่วน collation หมายถึง กลุ่มของกฎเกณฑ์ที่ใช้ในการเปรียบเทียบอักขระต่างๆ ใน กลุ่มอักขระหนึ่งๆ สำหรับภาษาไทยมีกลุ่มอักขระคือ tis620 และมี collation คือ tis620_thai_ci
ทั้งนี้ระดับการใช้งานของ charcter set และ collation มีอยู่ด้วยกันทั้งหมด 4 ระดับคือ server database table และ connection
สำหรับปัญหาที่ผมเจอนี้ ผมมุ่งประเด็นไปที่ connection โดยตั้งสมมติฐานว่าปัญหาของการแสดงผลภาษาไทยที่ผิดพลาดน่าจะเกิดระหว่างการติดต่อระหว่าง client (php script) กับ server (MySQL server)
สิ่งที่เกิดขึ้นระหว่างการติดต่อระหว่าง client และ server คือ client จะส่ง SQL statement เช่น query ต่างๆ ให้กับ server หลังจากนั้น server ก็จะตอบกลับ เช่น การส่งผลลัพธ์ของ SQL statement นั้นๆ กลับไปให้ client ในระหว่างที่มีการติดต่อกันนี้จะมีส่วนของ character set และ collation เข้ามาเกี่ยวข้อง คือ
Character set ของ client ในขณะที่ส่ง query ให้กับ server: มีตัวแปรที่เกี่ยวข้องคือ character_set_client
Character set ที่ server แปล query หลังจากที่ได้รับจาก client: ตัวแปรที่เกี่ยวข้องคือ character_set_connection และ collation_connection โดย server จะใช้ค่าของตัวแปร character_set_connection ในการแปล character set ของ query ที่ client ส่งมา ( character_set_client) ให้เป็นตามค่าที่กำหนดไว้ในตัวแปร character_set_connection
Character set ที่ server จะทำการแปลก่อนที่จะส่งผลลัพธ์กลับไปให้แก่ client: ตัวแปรที่เกี่ยวข้องคือ character_set_results
ดังนั้นตัวแปรที่ควรจะทำการตรวจสอบก่อนก็คือ character_set_results ว่าค่าของตัวแปรนั้นเป็นค่าอะไรหรือเป็นค่าที่เกี่ยวข้องกับปัญหานี้หรือไม่ ผมทดสอบโดยการกำหนดค่าให้ chacter_set_results มีค่าเป็น tis620 ก่อนจะทำการส่ง query จริงๆ ไปให้แก่ MySQL โดยการใช้คำสั่งต่อไปนี้
$charset = "SET character_set_results=tis620";mysql_query($charset) or die("Invalid query: " . mysql_error());
ผลปรากฎว่าการกำหนดค่าให้ตัวแปร character_set_results มีค่าเป็น tis620 ดังกล่าว สามารถช่วยแก้ปัญหาแสดงผลภาษาไทยให้ถูกต้องได้ นอกจากนี้สามารถใช้คำสั่งต่อไปนี้ในการแก้ปัญหาภาษาไทย คือ
SET NAMES 'tis620' ซึ่งมีค่าเทียบเท่ากับ
SET character_set_client='tis620'SET character_set_results='tis620'SET character_set_connection='tis620'
SET character_set_results=NULL ซึ่งมีความหมายคือ ไม่ต้องการให้ server ทำการแปลงข้อมูลก่อนที่จะทำการส่งให้กับ client
สรุปแล้วปัญหาที่เกิดขึ้นน่าจะเกิดจากค่าของตัวแปร character_set_results ซึ่งถูกกำหนดให้เป็น character set ที่ไม่ใช่ tis620 ทำให้อักขระภาษาไทยที่ส่งกลับมาให้ client นั้นแสดงผลไม่ถูกต้อง
ในกรณีที่ไม่สามารถแก้ไขค่า config ของ MySQL ได้ด้วยตัวเองนั้น สามารถแก้ปัญหาด้วยการต้องแทรกคำสั่งที่กำหนดให้ character_set_results เป็น tis620 ทันทีหลังจากเชื่อมต่อกับฐานข้อมูล MySQL เช่น
$link = mysql_connect($host, $username, $password);mysql_select_db($dbname);$charset = "SET NAMES 'tis620'";mysql_query($charset);
หากสามารถแก้ไขค่า config ของ MySQL ได้ ก็ให้เพิ่มข้อมูลในไฟล์ my.ini ดังนี้
[client]default-character-set=tis620
[mysqld]default-character-set=tis620character-set-server=tis620collation-server=tis620_thai_ciini_connect='SET collation_connection=tis620_thai_ci'ini_connect='SET NAMES tis620'
แล้วทำการ restart MySQL
แต่ทางที่ดีนั้นควรจะทำการสร้างเว็บและฐานข้อมูลโดยใช้ UTF-8 จะดีที่สุดครับ (อ่านเพิ่มเติมได้ที่นี่)
หวังว่าบทความนี้จะช่วยแก้ปัญหาให้กับบางท่านได้นะครับ :)

Posted by wachira on Tue, 15/02/2005 - 17:56

คลังบทความของบล็อก