5
Kết ni dliu trong Joomla 1.5.x April 7, 2009 Ngoc Giang – Quynh Thy’s Project Kết ni dliu trong Joomla 1.5.x 1. Cơ sở dli u và Joomla 1.5.x Nhân ca Joomla 1.5.x htr2 kiểu cơ sở dliu là MySQL và SQLite. Khi cài đặt cơ sở dliu, bn có thchn mt trong 2 kiểu cơ sở dliu này cho ng dng web ca mình. Sâu hơn một chút, trong l p giao tiếp dliệu, Joomla 1.5 đã cung cp 2 driver ti 2 kiểu cơ sở dliu này, phần cài đặt driver tương ứng được đặt trong thư mục libraries/joomla/database/database như hình sau: Hình 01 – Driver kết ni trong lp giao ti ếp CSDL ca Joomla 1.5.7 Vấn đề đây là nếu chúng ta không mun sdng 2 loại cơ sở dliu này mà mun ng dng sdng mt loại cơ sở dliu khác (vd: MSSQL, ocracle, acess) thì bản thân gói Joomla được cung cp chưa đáp ứng được. Khi cài đặt Joomla 1.5.x, mặc định chúng ta schsdng một cơ sở dliu cho ng dng. Sau khi trtới CSDL đã có, các bng sdng cho nhân Joomla 1.5 được to ra tđộng. Các bng này được thêm mt tin tphía trước tên, mặc đị nh là jos_. Hình 02 – Các bng ca Joomla 1.5.7. Tin t mặc định là “jos_”

Other Database Joomla 1.5

  • Upload
    nam5

  • View
    125

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Other Database Joomla 1.5

Kết nối dữ liệu trong Joomla 1.5.x April 7, 2009

Ngoc Giang – Quynh Thy’s Project

Kết nối dữ liệu trong Joomla 1.5.x

1. Cơ sở dữ liệu và Joomla 1.5.x Nhân của Joomla 1.5.x hỗ trợ 2 kiểu cơ sở dữ liệu là MySQL và SQLite. Khi cài đặt cơ sở dữ

liệu, bạn có thể chọn một trong 2 kiểu cơ sở dữ liệu này cho ứng dụng web của mình. Sâu hơn một chút, trong lớp giao tiếp dữ liệu, Joomla 1.5 đã cung cấp 2 driver tới 2 kiểu cơ sở dữ

liệu này, phần cài đặt driver tương ứng được đặt trong thư mục libraries/joomla/database/database như hình sau:

Hình 01 – Driver kết nối trong lớp giao tiếp CSDL của Joomla 1.5.7

Vấn đề ở đây là nếu chúng ta không muốn sử dụng 2 loại cơ sở dữ liệu này mà muốn ứng dụng sử dụng một loại cơ sở dữ liệu khác (vd: MSSQL, ocracle, acess) thì bản thân gói Joomla được cung cấp chưa đáp ứng được.

Khi cài đặt Joomla 1.5.x, mặc định chúng ta sẽ chỉ sử dụng một cơ sở dữ liệu cho ứng dụng. Sau khi trỏ tới CSDL đã có, các bảng sử dụng cho nhân Joomla 1.5 được tạo ra tự động. Các bảng này được thêm một tiền tố ở phía trước tên, mặc định là jos_.

Hình 02 – Các bảng của Joomla 1.5.7. Tiền tố mặc định là “jos_”

Page 2: Other Database Joomla 1.5

Kết nối dữ liệu trong Joomla 1.5.x April 7, 2009

Ngoc Giang – Quynh Thy’s Project

Việc có thêm 1 tiền tố phía trước tên bảng là một ý tưởng hay để sử dụng cùng một cơ sở dữ liệu cho nhiều ứng dụng Joomla. Ví dụ chúng ta có thể sử dụng 2 ứng dụng web với cùng một cơ sở dữ liệu. một ứng dụng sử dụng tiền tố “jos1_”, ứng dụng còn lại sử dụng tiền tố “jos2_” thì việc quản lý dữ liệu của mỗi ứng dụng vẫn rất thuận tiện.

2. Kết nối đến cơ sở dữ liệu mặc định của Joomla 1.5 Khi viết một Extension cho Joomla, để thực hiện kết nối tới Cơ sở dữ liệu đơn giản là sử dụng

hàm thành viên getDBO() của lớp JFactory:

$db = & JFactory::getDBO(); Khi đó, $db là một con trỏ trỏ tới đối tượng JDatabasemysql hoặc JDatabasesqli tùy thuộc vào

việc ứng dụng của bạn đã được cài đặt với loại cơ sở dữ liệu MySQL hay SQLite. Đây là cách thực hiện kết nối thông thường của tất cả các Extension vì chúng được thiết kế ra để chạy trong ứng dụng của người dùng cuối.

Có một vấn đề, đó là nếu bạn là người phát triển và muốn ứng dụng web của mình kết nối tới một cơ sở dữ liệu khác để lấy dữ liệu thì sao (ở đây, mình nói “để lấy dữ liệu” vì Joomla cần có dữ liệu để thực thi chính bản thân nó – ví dụ như load các module, các template, để tạo các menu…). Ta thấy nếu sử dụng cách này thì không thể.

3. Kết nối tới một cơ sở dữ liệu khác Giải quyết vấn đề đặt ra trên cũng khá đơn giản. Chúng ta có thể sử dụng trực tiếp hàm thành viên

getInstance($option) của lớp JDatabase. Hàm này yêu cầu truyền vào tham số là mảng $option lưu trữ các thiết lập sau:

Để kết nối ta sử dụng câu lệnh sau:

$db = & JDatabase::getInstance($option);

$db là con trỏ trỏ tới đối tượng JDatabasemysql hoặc JDatabasesqli tương tự như trường hợp ở trên.

Chúng ta cùng xem xét mã cài đặt cho hàm thành viên này của Joomla1.5.7

function &getInstance( $options = array() ) { static $instances; if (!isset( $instances )) { $instances = array(); } $signature = serialize( $options ); if (empty($instances[$signature])) {

Phần tử Ý nghĩa

$option['driver'] Kiểu cơ sở dữ liệu, mang giá trị ‘mysql’ nếu sử dụng cơ sở dữ liệu MySQL, là ‘mysqli’ nếu sử dụng cơ sở dữ liệu SQLite

$option['select'] Mang giá trị mặc định là true $option['database'] Tên của cơ sở dữ liệu sẽ được kết nối tới $option['host'] Tên host $option['user'] Tên người dùng $option['password'] Mật khẩu người dùng $option['prefix'] Tiền tố của các bảng trong cơ sở dữ liệu được kết nối tới.

Page 3: Other Database Joomla 1.5

Kết nối dữ liệu trong Joomla 1.5.x April 7, 2009

Ngoc Giang – Quynh Thy’s Project

$driver = array_key_exists('driver', $options) ? $options['driver']: 'mysql'; $select = array_key_exists('select', $options) ? $options['select']: true; $database = array_key_exists('database', $options) ? $options['database']: null; $driver = preg_replace('/[^A-Z0-9_\.-]/i', '', $driver); $path = dirname(__FILE__).DS.'database'.DS.$driver.'.php'; if (file_exists($path)) { require_once($path); } else { JError::setErrorHandling(E_ERROR, 'die'); //force error type to die $error = JError::raiseError( 500, JTEXT::_('Unable to load Database Driver:') .$driver); return $error; } $adapter = 'JDatabase'.$driver;//if database is Mysql, $adapter is a object of JDatabaseMysql class. $instance = new $adapter($options);//call the contractor of JDatabase.$driver class if ( $error = $instance->getErrorMsg() ) { JError::setErrorHandling(E_ERROR, 'ignore'); //force error type to die $error = JError::raiseError( 500, JTEXT::_('Unable to connect to the database:') .$error); return $error; } $instances[$signature] = & $instance; } return $instances[$signature];//$instances[$signature] is a object of JDatabase.$driver class. }

Chúng ta thấy hàm thành viên này chỉ có chức năng thiết lập để lựa chọn driver cho kết nối và bắt lỗi. Rồi sau đó nó gọi hàm khởi tạo của lớp ứng với driver được chọn. Ở đây, mặc định kết nối tới cơ sở dữ liệu MySQL thì hàm khởi tạo của lớp JDatabasemysql như sau:

function __construct( $options ) { $host = array_key_exists('host', $options) ? $options['host'] : 'localhost'; $user = array_key_exists('user', $options) ? $options['user'] : ''; $password = array_key_exists('password',$options) ? $options['password'] : ''; $database = array_key_exists('database',$options) ? $options['database'] : ''; $prefix = array_key_exists('prefix', $options) ? $options['prefix'] : 'jos_'; $select = array_key_exists('select', $options) ? $options['select'] : true; // perform a number of fatality checks, then return gracefully if (!function_exists( 'mysql_connect' )) { $this->_errorNum = 1; $this->_errorMsg = 'The MySQL adapter "mysql" is not available.'; return; } // connect to the server if (!($this->_resource = @mysql_connect( $host, $user, $password, true ))) { $this->_errorNum = 2; $this->_errorMsg = 'Could not connect to MySQL'; return; } // finalize initialization parent::__construct($options); // select the database

Page 4: Other Database Joomla 1.5

Kết nối dữ liệu trong Joomla 1.5.x April 7, 2009

Ngoc Giang – Quynh Thy’s Project

if ( $select ) { $this->select($database); } } Bằng cách này ta có thể kết nối tới một cơ sở dữ liệu khác ngoài cơ sở dữ liệu mặc định của

Joomla để lấy dữ liệu. Việc kết nối tới cơ sở dữ liệu nào được chính bạn quyết định khi thiết lập giá trị cho mảng $option.

Mình đã thực hiện cách này bằng cách làm thử 1 component như ví dụ sau: - Tạo csdl giaovu với table hoc_sinh gồm các field HO, TEN - Tạo thư mục com_database trong thư mục components/ - Cài đặt file database.php và lưu vào thư mục vừa tạo trên.

<?php defined('_JEXEC') or die ('Restricted acess'); $option = array(); $option['driver'] = 'mysql'; $option['select'] = true; $option['database'] = 'giaovu'; $option['host'] = 'localhost'; $option['user'] = 'root'; $option['password'] = ''; $option['prefix'] = ''; $db = & JDatabase::getInstance($option); $query = "SELECT * FROM hoc_sinh"; $db->setQuery( $query,5,10 ); $rows = $db->loadObjectList(); echo "Connect to Database <strong>".$option['database']."</strong>"; foreach ($rows as $row) { echo '<br />'.$row->HO.' '.$row->TEN; } ?>

Sau đó, mở trình duyệt gói Joomla và gõ vào thanh địa chỉ http://localhost/mysite/index.php?option=com_database để thực thi component vừa tạo, ta được kết quả như sau:

Hình 03 – Kết quả thực thi component com_database

Page 5: Other Database Joomla 1.5

Kết nối dữ liệu trong Joomla 1.5.x April 7, 2009

Ngoc Giang – Quynh Thy’s Project

4. Kết nối tới kiểu cơ sở dữ liệu khác Tiếp tục, giả sử bạn là người rất thông thạo hệ quản trị cơ sở dữ liệu MsSQL nhưng lại không

rành lắm về MySQL. Thêm nữa bạn cho rằng sử dụng MsSQL thì mạnh mẽ và bảo mật hơn, bạn muốn kết hợp Joomla 1.5.x với MsSQL. Điều này hoàn toàn có thể thực hiện được vì Joomla 1.5.x được thiết kế theo mô hình 3 lớp một cách triệt để.

Công việc bạn phải làm là viết một driver mssql cho lớp giao tiếp dữ liệu. Để thực hiện điều này bạn sẽ phải cài đặt file mssql.php trong thư mục libraries/joomla/database/database. File này khai báo lớp JDatabasemssql kế thừa lớp JDatabase gồm tất cả các thuộc tính và phương thức như lớp JDatabasemysql và JDatabasemysqli có sẵn của Joomla.