<?php /** * A simple class for querying MySQL */ class DataAccess { /** * Private * $db stores a database resource */ var $db; /** * Private * $query stores a query resource */ var $query; // Query resource
//! A constructor. /** * Constucts a new DataAccess object * @param $host string hostname for dbserver * @param $user string dbserver user * @param $pass string dbserver user password * @param $db string database name */ function DataAccess ($host,$user,$pass,$db) { $this->db=mysql_pconnect($host,$user,$pass); mysql_select_db($db,$this->db); }
//! An accessor /** * Fetches a query resources and stores it in a local member * @param $sql string the database query to run * @return void */ function fetch($sql) { $this->query=mysql_unbuffered_query($sql,$this->db)
; // Perform query here }
//! An accessor /** * Returns an associative array of a query row * @return mixed */ function getRow () { if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) ) return $row; else return false; } } ?>
在它上边放上模型。
<?php /** * Fetches "products" from the database */ class ProductModel { /** * Private * $dao an instance of the DataAccess class */ var $dao;
//! A constructor. /** * Constucts a new ProductModel object * @param $dbobject an instance of the DataAccess class */ function ProductModel (&$dao) { $this->dao=& $dao; }
//! A manipulator /** * Tells the $dboject to store this query as a resource * @param $start the row to start from * @param $rows the number of rows to fetch * @return void */ function listProducts($start=1,$rows=50) { $this->dao->fetch("SELECT * FROM products LIMIT ".$start.", ".$rows); }
//! A manipulator /** * Tells the $dboject to store this query as a resource * @param $id a primary key for a row * @return void */ function listProduct($id) { $this->dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'"); }
//! A manipulator /** * Fetches a product as an associative array from the $dbobject * @return mixed */ function getProduct() { if ( $product=$this->dao->getRow() ) return $product; else return false; } } ?>
<?php /** * Binds product data to HTML rendering */ class ProductView { /** * Private * $model an instance of the ProductModel class */ var $model;
/** * Private * $output rendered HTML is stored here for display */ var $output;
//! A constructor. /** * Constucts a new ProductView object * @param $model an instance of the ProductModel class */ function ProductView (&$model) { $this->model=& $model; }
//! A manipulator /** * Builds the top of an HTML page * @return void */ function header () {
}
//! A manipulator /** * Builds the bottom of an HTML page * @return void */ function footer () {
}
//! A manipulator /** * Displays a single product * @return void */ function productItem($id=1) { $this->model->listProduct($id); while ( $product=$this->model->getProduct() ) { // Bind data to HTML } }
//! A manipulator /** * Builds a product table * @return void */ function productTable($rownum=1) { $rowsperpage='20'; $this->model->listProducts($rownum,$rowsperpage); while ( $product=$this->model->getProduct() ) { // Bind data to HTML } }
//! An accessor /** * Returns the rendered HTML * @return string */ function display () { return $this->output; } } ?>
最后是控制器,我们将把视图实现为一个子类。
<?php /** * Controls the application */ class ProductController extends ProductView {
//! A constructor. /** * Constucts a new ProductController object * @param $model an instance of the ProductModel class * @param $getvars the incoming HTTP GET method variables */ function ProductController (&$model,$getvars=null) { ProductView::ProductView($model); $this->header(); switch ( $getvars['view'] ) { case "product": $this->productItem($getvars['id']); break; default: if ( empty ($getvars['rownum']) ) { $this->productTable(); } else { $this->productTable($getvars['rownum']); } break; } $this->footer(); } } ?>
$dao=& new DataAccess ('localhost','user','pass','dbname'); $productModel=& new ProductModel($dao); $productController=& new ProductController($productModel,$_GET); echo $productController->display(); ?>