CakePHP กับการติดต่อฐานข้อมูลด้วย Unicode

blog ช่วงหลังๆคงได้เขียนเกี่ยวกับ CakePHP กันเยอะหน่อย เพราะงานในช่วงนี้ต้องกลับมาใช้ PHP ถ้าใครเข้าใจ MVC ดีอยู่แล้วผมแนะนำตัวนี้เลย ไม่รู้จะพอๆกับ Rails หรือเปล่า แต่เท่าที่ลองใช้ก็พอใจครับ

มาเข้าเรื่องกัน ในฐานข้อมูลอย่าง MySQL นั้นเราสามารถกำหนด default character set ได้ ซึ่งถ้าเราไม่บอกมันว่าเราจะคุยกับฐานข้อมูลด้วย character encoding ตัวไหน มันก็จะใช้ค่า default นั้นล่ะ ปัญหามีอยู่ว่า MySQL ที่ลงมาให้ในแต่ละ Linux Distribution กำหนด default character encoding มาไม่เหมือนกัน อย่าง Gentoo 2008.0 นี่ใช้ UTF-8 ส่วน Debian Lenny ใช้ Latin

ใน CakePHP เราสามารถกำหนดค่า encoding ได้ว่าจะใช้แบบไหน ถ้าเราไม่กำหนดมันก็จะใช้ค่า default ของระบบ เดิมผมทดสอบระบบบน Gentoo ซึ่งไม่ได้กำหนดค่านี้ลงไป ข้อมูลภาษาไทยที่ query ก็ออกมาเรียบร้อยดี แต่พอ deploy ไปบน Debian เท่านั้นล่ะ กลายเป็นเครื่องหมาย ? หมดเลย มานั่งเปิด manual ดูอีกรอบเค้าให้ระบุลงไปใน config file app/config/database.php ด้วยครับ เพื่อความปลอดภัย

var $default = array(
    'driver' => 'mysql',
    'persistent' => false,
    'host' =>  'localhost',
    'login' => 'myuser',
    'password' => 'mypass',
    'database' => 'mydb',
    'prefix' => '',
    'encoding' => 'utf8',
);

<? or <?php

วันนี้นั่ง debug โปรแกรมที่เขียนด้วย PHP โดยใช้ CakePHP เป็น framework ผมไปเจอปัญหาว่าโปรแกรมที่เขียนมาหน้าขาววอก ไม่บอก error อะไรเลย ลองพยายามเปิด debug mode ให้เป็น debug แล้วก็ยังไม่เห็น error ทั้งจากหน้าจอและ log file ปัญหานี้เคยแก้มาแล้วทีนึงใช้เวลานานพอสมควร แต่คิดว่าคงไม่ต้องทำอะไรแล้วเลยไม่จดไว้ ผลก็เป็นแบบนี้ล่ะ เสียเวลาหลายชั่วโมงนั่งหา bug มี hint อยู่นิดนึงตรงที่ ในหน้าขาวๆนั้นเมื่อ view source  ดูจะมี code php ปรากฎอยู่ ดังนี้

<?=$content_for_layout?>

ไปนึกออกตรงที่ ใน code มีการเขียน code ภายใต้ tag แบบนี้เอาไว้ <? — codes — ?>   ซึ่ง default config ของ wamp ไม่ยอม แก้ไขได้โดยไปเปิด config ใน php.ini ตรง short_open_tag โดยจากเดิมเป็น Off ให้เป็น On แล้วก็สั่ง reload apache เป็นใช้ได้