<?php
require_once 'XML_Serializable.php';
abstract class DBElement extends XML_Serializable {
private $DBElementFields = array ('DBElementFields', 'table_name', 'primary_key_field', 'primary_key_value', 'className', 'connection' );
/**
* The table to which this class belongs
*
* @var String
*/
public $table_name;
/**
* The field of the primary key
*
* @var String
*/
public $primary_key_field;
/**
* The value of the primary key
*
* @var integer
*/
public $primary_key_value;
/**
* The connection to use when making a mysql_query call
*
* @var link_identifier MySQL connection identifier
*/
protected $connection;
/**
* Used for updating a field on this DBElement
*
* @param string $field_name
* @param unknown_type $field_value
*/
protected function update($field_name, $field_value) {
$field_name = mysql_real_escape_string ( $field_name );
if ($field_value == NULL || strtolower($field_value) == "null") {
//$field_value is null, set the value to NULL
$field_value = mysql_real_escape_string ( $field_value );
$sql = "UPDATE $this->table_name SET $field_name = NULL WHERE $this->primary_key_field='$this->primary_key_value';";
} else if($field_value == "NOW()"){
$field_value = mysql_real_escape_string ( $field_value );
$sql = "UPDATE $this->table_name SET $field_name = NOW() WHERE $this->primary_key_field='$this->primary_key_value';";
}
else {
$field_value = mysql_real_escape_string ( $field_value );
$sql = "UPDATE $this->table_name SET $field_name = '$field_value' WHERE $this->primary_key_field='$this->primary_key_value';";
}
mysql_query ( $sql, $this->connection );
}
/**
* Used for inserting a row as a subelement (foreign key object) of this element.
* Will only make use of the values that have been set.
*
* @param DBElement $classObject
* @return int The new id of the inserted object
*/
protected function insert(&$classObject) {
/* @var $classObject DBElement */
$table = $classObject->table_name;
//get the field for which this objects primary key is the classObject's foreign key
$foreign_primary_key_field = $this->primary_key_field;
//set the value of the foreign key to the value of this objects primary key
$classObject->$foreign_primary_key_field = $this->primary_key_value;
$fields = "";
$values = "";
foreach ( $classObject as $field => $value ) {
if (in_array ( $field, $this->DBElementFields )) {
continue;
}
//make sure the value has been set, it's not null, and it's not an empty string
if (isset ( $value ) && $value != NULL && $value != "") {
$fields .= $field . ", ";
$values .= "'" . mysql_real_escape_string ( $value ) . "', ";
}
}
//remove the trailing comma and space
$fields = mysql_real_escape_string ( substr ( $fields, 0, - 2 ) );
$values = substr ( $values, 0, - 2 );
//get each field from the class
$sql = "INSERT INTO $table ($fields) VALUES ($values);";
mysql_query ( $sql, $this->connection ); //insert the row
//set the primary_key_value
$classObject->primary_key_value = mysql_insert_id ();
//set the actual field value that is the primary key field
$pkf = $classObject->primary_key_field;
$classObject->$pkf = $classObject->primary_key_value;
return mysql_insert_id ();
}
/**
* Inserts this element in the database.
* Requires that the primary_key_field has not been set.
* Be sure to use the public fields during instantation, not the setters
* @return int The new primary_key_value
*/
public function insertMe() {
if (isset ( $this->primary_key_value )) {
throw new Exception ( "The primary_key_field cannot be set before inserting this element." );
} else {
$table = $this->table_name;
$fields = "";
$values = "";
foreach ( $this as $field => $value ) {
if (in_array ( $field, $this->DBElementFields )) {
continue;
}
//make sure the value has been set, it's not null, and it's not an empty string
if (isset ( $value ) && $value != NULL && $value != "") {
$fields .= $field . ", ";
$values .= "'" . mysql_real_escape_string ( $value ) . "', ";
}
}
//remove the trailing comma and space
$fields = mysql_real_escape_string ( substr ( $fields, 0, - 2 ) );
$values = substr ( $values, 0, - 2 );
//get each field from the class
$sql = "INSERT INTO $table ($fields) VALUES ($values);";
if(!mysql_query ( $sql, $this->connection )) {
return mysql_error(); //insert the row
}
$this->primary_key_value = mysql_insert_id ();
//set the actual field that is the primary key field
$pkf = $this->primary_key_field;
$this->$pkf = $this->primary_key_value;
return $this->primary_key_value;
}
}
/**
* Deletes this item from the database
* @return The primary key value of this object
*/
public function deleteMeFromDatabase() {
if(isset($this->primary_key_value)){
$sql = "DELETE FROM $this->table_name WHERE $this->primary_key_field = '$this->primary_key_value'";
if(!mysql_query ( $sql, $this->connection )) {
return mysql_error(); //insert the row
}
return $this->primary_key_value;
}
else{
return false;
}
}
}
?>