การเชื่อมต่อฐานข้อมูลภายนอกบน Joomla! 1.5
แก้ไขล่าสุด ใน วันศุกร์ที่ 31 กรกฏาคม 2552 เวลา 09:12 น. เขียนโดย Prasit Gebsaap วันพฤหัสบดีที่ 30 กรกฏาคม 2552 เวลา 22:33 น.
สวัสดีครับ วันนี้มีโอกาสได้เขียน Component สำหรับการดูรายงาน log ของการใช้ Instant Messenger เช่น MSN, Yahoo Messenger เป็นต้น อันนี้ก็เป็นการจัดเก็บตาม พรบ.ความปลอดภัยทางคอมพิวเตอร์ พ.ศ. 2550 โดยใช้ software ชื่อ imspector ซึ่งต้องทำการ compile และติดตั้งบน Linux Gateway ก็ต้องทำการ redirect port ต่างๆ ของ Instant Messenger มาให้ imspector จากนั้นก็ให้โปรแกรมเขียน log ลง mysql บน central log server โดยค่าที่จัดเก็บคือ IP address ของผู้ส่งใน network ของเรา (local ip address) เวลาที่ส่ง รวมทั้ง e-mail ของ local user และ remote user ทิศทางการส่ง (เข้าหรือออก) ประเภทของข้อมูล คือข้อความ ไฟล์ หรือ Webcam โดยไม่ต้องจัดเก็บตัวข้อความ เช่นเดียวกับการเก็บ log ของการรับส่ง e-mail ที่ต้องไม่เก็บข้อความใน e-mail เพราะว่าจะไปละเมิดความเป็นส่วนตัว ท่านสามารถดูรายละเอียดของโปรแกรมได้ที่นี่ คือ www.imspector.org อันนี้ำผู้เขียนไ้ด้มาจากเอกสารการอบรมของ SIPA อีกทีครับ ถ้าท่านใดต้องการความช่วยเหลือในการ การ compile การ config ทั้งตัวโปแกรม และ iptables ก็ถามได้ใน forum นะครับ
เอาละครับ นอกเรื่องมาซะนานแต่ก็เพื่อให้เห็นความจำเป็นในการใช้งานฐานข้อมูลภายนอกนะครับ ในที่นี้ก็คือตัว server ที่ทำหน้าที่ในการเก็บ log ครับ เนื่องจากปกติเวลาที่เราต้องการเข้าถึงฐานข้อมูลบน Joomla! เราจะทำการเรียกผ่าน JFactory ดังนี้
$dbo = JFactory::getDBO();
แต่ในที่นี้เราจะเข้าถึงได้เฉพาะฐานข้่อมูลของ Joomla นะครับ แต่ว่าถ้าจะเข้่าถึงฐานข้อมูลที่เป็น MySQL ตัวอื่นจะทำยังไงดีครับ ไม่ต้องกลับไปเขียนโดยใช้ฟังก์ชันของ mysql เช่น mysql_connect กันอีกหรือ ไม่ต้องครับ เรามาดูวิธีกันเลยดีกว่า วิธีที่จะทำให้ชีวิตคุณง่ายขึ้น
ที่ว่าจะทำให้ชีวิตง่ายขึ้นคือคุณจะได้ใช้ Database class ของ Joomla ในการ query ตัวฐานข้อมูลภายนอกนะครับ ถ้าคุนเคยกับ Joomla คุณจะรู้ว่าคุณสามารถใช้ methods ของ Database object ในการ query เช่น loadObject หรือ loadObjectList ซึ่งค่อนข้างง่ายเขียน code น้อยกว่า วิิธีการก็คือการใช้ JDatabase::getInstance() ครับ
<?php
$option = array(); //prevent problems
$option['driver'] = 'mysql'; // Database driver name
$option['host'] = 'db.myhost.com'; // Database host name
$option['user'] = 'fredbloggs'; // User for database authentication
$option['password'] = 's9(39s£h[%dkFd'; // Password for database authentication
$option['database'] = 'bigdatabase'; // Database name
$option['prefix'] = 'abc_'; // Database prefix (may be empty)
$db = & JDatabase::getInstance( $option );เ
?>
สำหรับ code ข้างบนก็ copy มาจาก docs.joomla.org แต่สิ่งที่ผู้เขียนจะนำนำเสนอในวันนี้มีมากกว่านี้แน่นอนครับ ถึงแม้ว่้าวิธีการนี้เราจะสามารถใช้งาน $db ในการเข้าถึงฐานข้อมูลภายนอกได้แล้ว แต่ว่าเราก็คงต้องมีการใช้งานตัว object $db ในหลายๆ จุด และเราก็ต้องใช้การประกาศ $option เป็นตังแปรแบบ global เช่น
<?php
function doSomthing ()
{
global $option;
$db = & JDatabase::getInstance( $option );
}
?>
แต่ผู้เขียนไม่อยากใช้วิธีการนี้ครับ ดังนั้นผู้เขียนจึงสร้าง class ขึ้นมาอีกสองตัว คือ JImspectorConfig เพื่อเก็บข้อมูล configuration ตามตัวอย่างด้านบน และ JImspectorDB เพื่อการเชื่อมต่อกับฐานข้อมูลภายนอกดังนี้ครับ

จากรูปด้านบน Class JImspectorConfig จะทำการการเก็บข้อมูลในฐานข้อมูลของ Joomla! โดยประกอบด้วย 3 fields คือ id, name, value ใน Constructor เราก็ทำการ load ข้อมูลมาจากฐานข้อมูลแล้วก็กำหนดค่าให้กับ property ของ class ในส่วนของ getInstance ผู้เขียนใช้การ implement หลักการของ Singleton pattern เพื่อให้เพิ่มประสิทธิภาพในการใช้งานโดยตอนเรียกใช้เราจะเรียกใช้ที่ getInstance โดยถ้ามีกาีรเรียกใช้มันจะทำการตรวจสอบค่าตัวแปร $_instance ก่อนถ้ามีค่าแล้วก็ส่งตัวแปร $_instance กลับ ถ้ายังไม่มีค่าก็ทำการสร้าง object และให้ค่า $_instance แล้วจึงส่งค่าตัวแปรนี้ให้แก่ Caller

จากรูปด้านบน JImspectorDB เป็น class ที่ทำการสร้างการเชื่่อมต่อกับฐานข้อมูลภายนอก โดยใช้ function getInstance ในการสร้าง Object ซึ่งเป็นการส่งต่อให้กับ JDatabase พร้อมกับค่า config ซึ่งเราต้องทำการแปลง property ของ object เป็น array เนื่องจาก function getInstance ของ JDatabase จะรับ parameter เป็นแบบ array นั่นเอง สำหรับในรูปด้านล่างเป็นการนำ class ทั้งสองไปใช้งานครับ ตัวอย่างข้่างล่างเป็นไฟล์หลักของ com_imspector คือ imspector.php ซึ่งส่วนที่เพิ่มเข้ามาคือ บรรทัดที่ 6 และ 7 ซึ่งทำการ include ไฟล์ที่บรรจุ class ทั้งสองเพื่อที่จะได้มั่นใจว่าเราสามารถเรียกใช้ class ได้ทันที นอกจากวิธีการนี้แล้วเรายังสามารถใส่ require_once ไว้ใน class ด้านบนก็ได้นะครับ

ส่วนในรูปด้านล่าง เป็นการนำเอา class JImspectorDB ไปใช้ครับ ซึ่งเป็นการนำไปใช้ใน ImspectorModelReportdates ซึ่งเป็น model สำหรับการดึงสรุปการใช้งานประจำวันของผู้ใช้ออกมา ซึ่งทำให้เราสามารถ query จากฐานข้อมูลภายนอกได้ืทันที โดยใน class จะมี function ชื่อ getData() ซึ่งใช้ในการอ่านข้อมูลจากฐานข้อมูลภายนอก และเราสามารถใช้ class เป็น template หรือ ต้นแบบสำหรับ class อื่นๆได้โดยการ copy แล้วเปลี่ยนชื่อ class และเปลี่ยน query ที่ต้องการใช้ใน function _buildQuery จะเห็นว่าเราสามารถลดงานลงได้เยอะจริงๆ ครับ แล้วก็ยังได้ความสามารถของ Joomla Database มาใช้งานได้อย่างสะดวกสบายครับ

ครับในบทความนี้ ผู้เขียนได้แสดงให้เห็นถึงการนำ Joomla Database class มาใช้ในการเชื่อมต่อฐานข้อมูลภายนอก โดยที่เราไม่ต้องกลับไปเขียน function ในกลุ่มของ MySQL อีก ซึ่งทำให้เราลดงานลงไปได้เยอะทีเดียว Joomla! 1.5 ยังมี Features ที่น่าสนใจรอให้เราค้นหาและนำไปใช้อีกมาก แล้วคุณจะหลงรัก Joomla! เข้าซักวัน
| < ย้อนกลับ | ถัดไป > |
|---|

