Version: 1.0
Type: Class
Category: Databases
License: GNU General Public License
Description: Object that map a table row in the object world.
– Create object from DB (using table and key).
– Create an HTML fragment for read only display of read-write (form).
– Re-create object from POST variables in the page called by the form.
– Save object to DB.
<?php /* ==================================================================== Pierre WARGNIER - [email protected] ==================================================================== entity.inc ==================================================================== ==================================================================== 2/7/2001 - version 1.0 Creation ==================================================================== ENTITY CLASS ==================================================================== The entity class is a base class. It is the mother of all these objects that have to be stored into the database. Read method headers to see what it can do! Database interface: ------------------ I used a file called db_mysql.inc (Session Management for PHP,(C) Copyright 1998 SH Online Dienst GmbH Boris Erdmann, Kristian Koehntopp) that provides me with a $db object 4 methods of this object are used here. The primary key of the table should be called "id". metadata(<X>): Returns an array of associative arrays, each associative array represents a column in the table called <X>. With the "name" key we have the name of the field. query(<X>): Execute a SQL statement <X>. next_record(): Put a pointer on the next (first if called first) row returned by a select query. f(<X>): Returns the value of the field named <X> in the selected row usage ----- Create the db object: require_once('db_mysql.php'); class MYDBASE extends DB_Sql { var $Host = '<host>'; var $Database = '<base>'; var $User = '<user>'; var $Password = '<password>'; } $db = new MYDBASE; This class can't be used directly, it has to be used in a derived class where you will define the table variable. class Object extends Entity { var $table = 'object'; function Object($source,$id=''){ $this->Entity($source,$id); } } If the page is a modification form: $obj = new Object('db','<a key>'); echo '<form ...>'; echo '<input type="hidden" name="id" value="<a key>"'; echo $obj->form(); echo '</form>'; If the page is a page called by the form: $obj = new Object('form', $id); $obj->save(); */ class Entity { var $id; // entity id = table key var $table; // the table were the entity is stored /* constructor method -------------------------------------------------------------------- This constructor create the object. There are tree kind of object creation, to choose one just use blank, db or form as the first parameter and the id as second (for blank id is not required): - creation of a new blanc object (blank) - recall of an object stored in base (db), - recall of an object transmited by a form (form) If a object cannot be recalled from a form or db, the table is set to '' (A way of saying that is a NULL entity). */ function Entity($source,$id=''){ if ($this->table == NULL) die('Can't instanciate virtual class Entity'); $this->id = $id; global $db, $PREFIX; $this->table = $PREFIX.$this->table; //query the name of the properties $fields = array(); $fields = $db->metadata($this->table); foreach ($fields as $field){ $name = $field["name"]; if ($name != 'id'){ $this->{$name}=''; } } //query values if we recall object from db if($source == 'db' and $id != NULL){ $query = 'SELECT '; foreach (get_object_vars($this) as $key => $val){ if($key != 'id' and $key != 'table'){ $query .= $key.','; } } $query = substr($query, 0, strlen($query) - 1); $query .= ' FROM '.$this->table; $query .= ' WHERE id=''.$this->id.'''; $db->query($query); if ($db->num_rows() == 1){ if($db->next_record()){ foreach (get_object_vars($this) as $key => $val){ if($key != 'id' and $key != 'table'){ $this->{$key} = $db->f($key); } } } }else{ $this->table =''; } //query values if we recall object from form }elseif($source == 'form' and $id != NULL){ if(!isset($GLOBALS[$this->table.'_'.$this->id])){ $this->table =''; }else{ foreach (get_object_vars($this) as $key => $val){ if($key != 'id' and $key != 'table'){ $temp = $GLOBALS[$this->table.'_'.$this->id.'_'.$key]; if (get_magic_quotes_gpc()){ $temp = stripslashes($temp); } $this->{$key} = $temp; } } } } } /* isNull method -------------------------------------------------------------------- This method should be called each time an object is created with the db or form method to check if the id was valid. */ function isNull(){ if($this->table == '') return TRUE; return FALSE; } /* dump method -------------------------------------------------------------------- This is a debug only method. This method returns all the values stored into an object in a HTML fragment. */ function dump(){ $ret = "<table>n"; $ret .= '<tr><th>id</th><td>'.htmlspecialchars($this->id,ENT_NOQUOTES)."</td></tr>n"; $ret .= '<tr><th>table</th><td>'.$this->table."</td></tr>n"; $ret .= '<tr><th>class</th><td>'.get_class($this)."</td></tr>n"; foreach(get_object_vars($this) as $key => $value){ if( $key != 'id' and $key != 'table'){ $ret .= '<tr><th>'.$key.'</th><td>'.htmlspecialchars($value,ENT_NOQUOTES)."</td></tr>n"; } } $ret .= "</table>n"; return $ret; } /* form method -------------------------------------------------------------------- This returns HTML code of a fragment of form that is used to modify the object. Variables we be called <table>_<id>_<field name>. There is a variable <table>_<id> that contains the name of the class. */ function form(){ $ret = "<table>n"; $ret .= '<tr><th>id</th><td>'.htmlspecialchars($this->id,ENT_NOQUOTES)."</td></tr>n"; $ret .= '<tr><th>class</th><td><input type="hidden" name="'.$this->table.'_'.htmlspecialchars($this->id,ENT_QUOTES).'" value="'.get_class($this).'">'.get_class($this)."</td></tr>n"; $ret .= '<tr><th>table</th><td>'.$this->table."</td></tr>n"; foreach(get_object_vars($this) as $key => $value){ if($key != 'id' and $key != 'table'){ $ret .= '<tr><th>'.$key.'</th><td><input type="text" name="'.$this->table.'_'.htmlspecialchars($this->id,ENT_QUOTES).'_'.$key.'" value="'.htmlspecialchars($value,ENT_QUOTES).'"></td></tr>'."n"; } } $ret .= "</table>n"; return $ret; } /* script method -------------------------------------------------------------------- This method returns the Javascripts statements that has to be inserted into a SCRIPT element. */ function script(){ return TRUE; } /* display method -------------------------------------------------------------------- This returns HTML code used to display the object to the user. Now it just call dump, but you can build a more fancy display. */ function display(){ return $this->dump(); } /* save method -------------------------------------------------------------------- This method store (create or update) the object into the database. If the object id property was not defined, the method put the key used to store the object into the table. Return TRUE in case of success. */ function save(){ global $db; $this->delete(); foreach (get_object_vars($this) as $key => $val){ if( $key != 'type' and $key != 'table'){ $keys .= $key.','; $vals .= '''.addslashes($val).'','; } } $keys = ' ('.substr($keys, 0, strlen($keys) - 1).') '; $vals = ' ('.substr($vals, 0, strlen($vals) - 1).') '; $query = 'INSERT INTO '.$this->table.$keys.'VALUES'.$vals; return($db->query($query)); } /* delete method -------------------------------------------------------------------- Delete object from the database. Return TRUE if success. */ function delete(){ global $db; if( $this->id != '' ){ return($db->query("DELETE FROM $this->table WHERE id='$this->id'")); } } } ?>