| Tôi lấy ví dụ bài menu 2 cấp để viết TUT cho bài này nhé: http://forum.congthuongit.net/viewthread.php?tid=453333
Với bài viết đó, tôi đã sử dụng lập trình hướng thủ tục để giải quyết bài toán menu 2 cấp! Như các bạn đã biết về lập trình hướng đối tượng, để viết 1 cách nhanh hơn, dễ chỉnh sửa hơn, tái tạo code nhanh và nhất là để người dùng sau này có thể tiếp tục phát triển người ta nghĩ đến "Lập trình hướng đối tượng", mọi thứ đều quy về "đối tượng" để dễ quản lý và sử dụng!
Vậy lập trình hướng đối tượng trong PHP như thế nào? Sử dụng ra sao? Các bạn hãy xem 1 số video training mà tôi đã sưu tầm được: http://fit-hitu.edu.vn/forum/thread-632.html
Với bài này tôi sẽ hướng dẫn cho các bạn viết lớp Database làm việc với CSDL, ngoài ra còn rất nhiều lớp khác như phân trang, template, mình sẽ cố gắng hướng dẫn sau!
Và đây là lớp Database đơn giản: Lớp gồm các thuộc tính: + private $db_connect : resource connect + private $queryResult : resource query Lớp này có các phương thức sau: + __construct: Phương thức khởi tạo kết nối + connect($config) : Phương thức kết nối với CSDL, với dữ liệu truyền vào là 1 mảng liên hợp gồm 4 thông tin kết nối: $config["hostname"] = 'localhost'; // Host name $config["userdb"] = 'root'; // Username database $config["passdb"] = 'vertrigo'; // Password database $config["dbname"] = 'fusuhotel'; // Name database + disconnect(): Phương thức đóng kết nối CSDL + query($sql) : Phương thức tạo truy vấn CSDL, trả về resource mysql_query() + fetch($result = NULL): Phương thức fetch() dữ liệu theo từng record, dữ liệu trả về là 1 mảng record tương ứng với mysql_fetch_assoc() Nếu ta không truyền tham số $result vào thì mặc định nó sẽ dùng property $queryResult, ngược lại nó sẽ sử dụng $result mà ta truyền vào. Cụ thể sử dụng thế nào mình sẽ ví dụ sau + fetch_array($result = NULL) : Phương thức fetch_array() sẽ trả về cho ta 1 mảng assoc. Tương tự như fetch(), nếu không truyền $result thì nó sẽ sử dụng property $queryResult và ngược lại nó sẽ sử dụng $result truyền vào. + exec_query($sql) : Phương thức exec_query() thực hiện các câu lệnh: INSERT, UPDATE, DELETE, với $sql truyền vào là chuỗi truy vấn và kết quả trả về là số dòng đã thực thi mysql_affected_rows() + num_rows($result = NULL) : Phương thức num_rows() đếm số dòng (records) của $result truyền vào, nếu ta không truyền thì mặc định nó sử dụng property $queryResult + __destruct: Là hàm hủy đối tượng, nó sẽ gọi phương thức disconnect() để đóng kết nối với CSDL
Sau đây, tôi sẽ VD các sử dụng lớp Database mà chúng ta vừa tạo: Đầu tiên bạn khởi tạo lớp Database, bạn có thể đặt đoạn mã này trong file config.php (file cấu hình)
- $config["hostname"] = 'localhost';
- $config["userdb"] = 'root';
- $config["passdb"] = 'vertrigo';
- $config["dbname"] = 'fusuhotel';
-
-
- $db = new Database($config);
Như vậy là ta đã kết nối xong với CSDL
Như vd bài menu 2 cấp lần trước tôi sử dụng trường menu sau: Menu(idMenu,nameMenu,linkMenu,titleMenu,newPageMenu,isParent,parentId,order,isPublished)
Bây giờ ta thử xuất ra tất cả menu trong CSDL nhé:
-
- $query = "SELECT idMenu,nameMenu,linkMenu,titleMenu FROM Menu";
Có 3 cách để các bạn truy vấn: Dùng phương thức fetch() không có đối số truyền vào như tôi nói ở trên
- $db->query($query);
- while($rows = $db->fetch()){
- echo '<li>
- <a title="'.$pr['titleMenu'].'" href="'.$pr['linkMenu'].'">'.$pr['nameMenu'].'</a>
- </li>';
- }
Dùng phương thức fetch() có đối số truyền vào
- $result = $db->query($query);
- while($rows = $db->fetch($result)){
- echo '<li>
- <a title="'.$pr['titleMenu'].'" href="'.$pr['linkMenu'].'">'.$pr['nameMenu'].'</a>
- </li>';
- }
Sử dụng phương thức fetch_array() và dữ liệu trả về cho ta là 1 mảng liên hợp gồm nhiều dòng (records) dữ liệu mà ta truy vấn + Sử dụng fetch_array() không có tham số truyền vào
- $db->query($query);
- $arrayMenu = $db->fetch_array();
-
-
-
-
-
-
-
-
- foreach($arrayMenu as $pr)
- {
- echo '<li>
- <a title="'.$pr['titleMenu'].'" href="'.$pr['linkMenu'].'">'.$pr['nameMenu'].'</a>
- </li>';
- }
+ Sử dụng fetch_array() có tham số truyền vào
- $result = $db->query($query);
- $arrayMenu = $db->fetch_array($result );
-
- foreach($arrayMenu as $pr)
- {
- echo '<li>
- <a title="'.$pr['titleMenu'].'" href="'.$pr['linkMenu'].'">'.$pr['nameMenu'].'</a>
- </li>';
- }
Tùy trường hợp mà ta sử dụng cho hợp lý. Do tôi sử dụng template Smarty nên sử dụng fetch_array() nhiều hơn: http://fit-hitu.edu.vn/forum/thread-647.html . Nếu các bạn quan tâm đến smarty tôi sẽ hướng dẫn thêm!
OK! Bây giờ ta thử viết lại bài toán menu 2 cấp:
- <?php
- $config["hostname"] = 'localhost';
- $config["userdb"] = 'root';
- $config["passdb"] = 'vertrigo';
- $config["dbname"] = 'fusuhotel';
-
- $db = new Database($config);
-
-
- [code]
- $queryParent = $db->query("SELECT idMenu,nameMenu,linkMenu,titleMenu,newPageMenu
- FROM menu WHERE isPublished = '1' and isParent = '1' order by 'order' ASC ");
- ?>
- <div class="content_menu">
- <ul>
- <?php
- while($pr = $db->fetch($queryParent))
- {
- ?>
- <li>
- <a target="<?php echo ($pr['newPageMenu'] == "1") ? "_blank" : "_self"; ?>" title="<?php echo $pr['titleMenu']; ?>" href="<?php echo $pr['linkMenu']; ?>"> <?php echo $pr['nameMenu']; ?></a>
- </li>
- <?php
-
- $queryChild = $db->query("SELECT idMenu,nameMenu,linkMenu,titleMenu,newPageMenu FROM menu
- WHERE isPublished = '1' and isParent = '0' and parentId = '".$pr['idMenu']."' order by 'order' ASC ");
- if($db->num_rows($queryChild) != 0)
- {
- echo "<ul>";
- while($ch = $db->fetch($queryChild))
- {
- ?>
- <li>
- <a target="<?php echo ($ch['newPageMenu'] == "1") ? "_blank" : "_self"; ?>"
- title="<?php echo $ch['titleMenu']; ?>" href="<?php echo $ch['linkMenu']; ?>"><?php echo $ch['nameMenu']; ?></a>
- </li>
- <?php
- }
- echo "</ul>";
- }
- }
- ?>
- </ul>
- </div>
Hoặc các bạn có thể viết như sau, nếu muốn dữ liệu menu cha và con đều quy về 1 mảng bằng cách ta thêm phần tử là 1 mảng menu con vào mảng menu cha.
VD: ta có 1 menu cha idMenu ="001" và có 2 menu con là "002" và "003" Menu(idMenu,nameMenu,linkMenu,titleMenu,isParent )
- $arrMenuCha = ("idMenu"=>"001","nameMenu"=>"Giới thiệu","linkMenu"=>"gioithieu.php","titleMenu"=>"Giới thiệu","isParent"=>1);
- $arrMenuCon1 = ("idMenu"=>"002","nameMenu"=>"Về công ti","linkMenu"=>"gioithieu.php?p=congti","titleMenu"=>"Giới thiệu về công ti","isParent"=>0);
- $arrMenuCon2 = ("idMenu"=>"003","nameMenu"=>"Về nhà hàng","linkMenu"=>"gioithieu.php?p=nhahang","titleMenu"=>"Giới thiệu về nhà hàng","isParent"=>0);
Ta thêm 2 menu con vào menu cha:
- $arraMenuCha["childMenu"][] = $arrMenuCon1;
- $arraMenuCha["childMenu"][] = $arrMenuCon2;
Sẽ cho ra:
- $arraMenuCha == ("idMenu"=>"001","nameMenu"=>"Giới thiệu","linkMenu"=>"gioithieu.php","titleMenu"=>"Giới thiệu","isParent"=>1,"childMenu"=>array(
-
- ("idMenu"=>"002","nameMenu"=>"Về công ti","linkMenu"=>"gioithieu.php?p=congti","titleMenu"=>"Giới thiệu về công ti","isParent"=>0) ,
-
- ("idMenu"=>"003","nameMenu"=>"Về nhà hàng","linkMenu"=>"gioithieu.php?p=nhahang","titleMenu"=>"Giới thiệu về nhà hàng","isParent"=>0)
- ))
Giải thích dài dòng cho các bạn hiểu thôi, chứ code bên dưới vô cùng đơn giản!
- $queryParent = $db->query("SELECT idMenu,nameMenu,linkMenu,titleMenu,newPageMenu FROM menu
-
- WHERE isPublished = '1' and isParent = '1' order by 'order' ASC");
-
-
- while($pr = $db->fetch($queryParent))
- {
- $queryChild = $db->query("SELECT idMenu,nameMenu,linkMenu,titleMenu,newPageMenu FROM menu
-
- WHERE isPublished = '1' and isParent = '0' and parentId = '".$pr['idMenu']."' order by 'order' ASC");
- if($db->num_rows($queryChild) != 0){
-
- while($cr = $db->fetch($queryChild))
-
- {
-
- $pr["childMenu"][] = $cr;
-
- }
- }
- $arrMenu[] = $pr;
- }
Như vậy sau đó ta chỉ cần lặp $arrMenu để xuất ra menu thôi!
- <div class="content_menu">
- <ul>
- <?php
- foreach ($arrMenu as $parent)
-
- {
-
- ?>
-
- <li><a title="<?php echo $parent['titleMenu']; ?>" href="<?php echo $parent['linkMenu']; ?>"><?php echo $parent['nameMenu']; ?></a></li>
- <?php
-
- if(count($parent['childMenu'] != 0)
-
- {
-
- ?>
-
- <ul>
- <?php
- foreach ($parent['childMenu'] as $child)
-
- {
-
- ?>
- <li><a title="<?php echo $child['titleMenu']; ?>" href="<?php echo $child['linkMenu']; ?>"><?php echo $child['nameMenu']; ?></a></li>
- <?php
-
-
- }
-
- ?>
- </ul>
- <?php
-
- }
-
- }
-
- ?>
- </ul>
- </div>
Như vậy là tôi đã giới thiệu xong lớp Database và cách sử dụng nó, các bạn có thể viết lại các phương thức tùy thích các bạn, làm sao để sử dụng nhanh chóng và hiểu quả là tốt! Chúc các bạn thành công! |
Không có nhận xét nào:
Đăng nhận xét