* Thus wrote Hardik Doshi:
> Hello Group,
>
> I would like to know which one is the most appropriate
> way to implement the following scenario.
>
> For example, I want to display a products catalogue of
> 100 products. I do have a base class of product which
> contains all the basic property of the product
> (Product title, product description, product price
> etc)and constructor basically pulls the information
> about the product from the DB based on the product
> identifier (Primary key).
>
> Now i have two ways to display catalogue.
>
> 1. I can write only one query to pull all 100 products
> information and store product information to each
> product object (With out passing product id to the
> constructor) into the collection and later i iterate
> that collection to display product catalogue.
> (Advantage: less communication with database server
> and disadvantage: memory consumption is higher)
>
> 2. I can initiate an individual product object by
> passing product id into the constructor and
> constructor will pull an individual product
> information from the DB and at the same time i can
> display it (Disadvantage: Lots of communication with
> database server and Advantage: memory consumption is
> less) If you think about inheritance then eventually
> this approach will have lots of database calls.
>
> Please guide me as i am stuck up which way to go.
With these two options I can see why it is a tough choice. There is
another option you can take. Store the result handle of the query
from #1 into an object, and retrieve a row from the database on
demand.
abstract class DbIterator implements Iterator {
/* for me only */
private $current = 0;
private $data = false;
private $handle = null;
/* Force extending object to define this function */
abstract protected function &getData($handle, $function);
public function __construct($handle) {
$this->handle = $handle;
}
/* Iterator Interface: */
public function rewind() {
$this->current = 0;
db_seek($this->result, $this->current);
}
public function current() {
return $this->data;
}
public function key() {
return $this->current;
}
public function next() {
$this->data = $this->getData($handle, 'db_fetch_assoc');
if($this->data) {
$this->current++;
}
return $this->data;
}
public function valid() {
return (this->data !== false);
}
}
class dbProductClass extends DbIterator {
public $id;
public $name;
public function __construct($handle) {
/* let the parent decide what to do with $handle */
parent::__construct($handle)
}
/* and define this required function */
protected function &getData($handle, $func) {
$row = $func($handle);
if ($row == false ) {
return $row;
}
$this->$id = $row['id']
if (empty($row['name']) {
$this->name = 'Default Name';
} else {
$this->name = $row['name'];
}
// do any special stuff here..
return &$this;
}
public function tableName {
return 'People';
}
/* this is a no no */
public function __set($name, $value) {
throw Execption("Attempt to write to readonly property");
}
}
// then..
$result = db_query($sql);
$product_rows = new dbProductClass($result);
// then some more..
foreach($product_rows as $row ) {
echo $row->field_name1;
echo $row->field_name2;
}
This will keep communication down to a minimum and memory down to a
minimum usage as well. I hope this wasn't to much, and it is
completely untested.
Curt
--
First, let me assure you that this is not one of those shady pyramid schemes
you've been hearing about. No, sir. Our model is the trapezoid!
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php