Version: 1.0.0
Type: Class
Category: Databases
License: GNU General Public License
Description: This is a PHP Class that connect to MySQL, retrieve the tables and return it as dataset/recordset object. Examples provided at the end of the script
<?php
//+---------------------------------------------------------------------------------------------------------------------+
//| Module name: dataset.class.php |
//| Description: A PHP class that stores the database table(s) in MySQL database into |
// temporary database/tables as dataset in the 3D array form | |
//+---------------------------------------------------------------------------------------------------------------------+
//| Author: Theo Sumual (xhadows@netscape.net) |
//| Date written: 28/08/2003 |
//| Version: 1.0.0 |
//+---------------------------------------------------------------------------------------------------------------------+
/*
** Last Modified Modified By Description
** 30/08/2003 Theo add search functions
** 30/08/2003 Theo add get_queryset function
** 31/08/2003 Theo add indexing features for the dataset
**
**
*/
define("INDEX_NUM",0);
define("INDEX_KEY",1);
define("NO_QUERY",'');
define("ALL_TABLES",'All');
class Dataset
{
var $classname = "Dataset";
var $dataset = array(); //The array of arrays of arrays :)
var $db_tables = array();
var $dbuser;
var $dbpassword;
var $dbhost;
var $dbname;
var $dbconn;
var $error;
function Dataset($dbHost,$dbUser,$dbPassword,$dbName)
{
$this->dbhost = $dbHost;
$this->dbuser = $dbUser;
$this->dbpassword = $dbPassword;
$this->dbname = $dbName;
if(!isset($db_tables) || count($db_tables) < 1)
{
$this->open_db();
$this->get_database_tables();
$this->close_db();
}
$this->clear_dataset();
}
//open a database connection
function open_db()
{
$this->dbconn = mysql_connect($this->dbhost,$this->dbuser,$this->dbpassword) or $this->catch_error("Database Connection Error: ",mysql_error());
mysql_select_db($this->dbname,$this->dbconn);
}
//close database connecttion
function close_db()
{
if(!mysql_close($this->dbconn))
{
$this->catch_error("Close Database Connection Error: ",mysql_error());
}
}
//remove all elements in dataset array
function clear_dataset()
{
array_splice($this->dataset,0,count($this->dataset));
}
//get all the table names in the database and store in the db_tables array
function get_database_tables()
{
$tables = mysql_list_tables($this->dbname,$this->dbconn) or die("Database Retrieve Error: ".mysql_error());
for($i=0;$i<mysql_num_rows($tables);$i++)
{
$this->db_tables[$i] = strtoupper(mysql_tablename($tables,$i));
}
mysql_free_result($tables);
}
function get_dataset()
{
return $this->dataset;
}
//recreate the dataset array and return the dataset array
function set_dataset($dbTable=ALL_TABLE,$tableIndex=INDEX_KEY,$rowIndex=INDEX_KEY,$fieldIndex=INDEX_KEY)
{
//$this->clear_dataset();
$this->construct_dataset($dbTable,NO_QUERY,$tableIndex,$rowIndex,$fieldIndex);
if(is_array($this->dataset)) //check if the dataset constructed correctly
return true;
else
return false;
}
//recreate the dataset and only contains one table (dataset[tablename])
//as a result of the specified query
function set_queryset($dbTable,$dbQuery,$tableIndex=INDEX_KEY,$rowIndex=INDEX_KEY,$fieldIndex=INDEX_KEY)
{
//$this->clear_dataset();
$this->construct_dataset($dbTable,$dbQuery,$tableIndex,$rowIndex,$fieldIndex);
if(is_array($this->dataset)) //check if the dataset constructed correctly
return true;
else
return false;
}
//update the current table in data set
//separate the fields and value to update by ,
function update_record($tableName,$recordId,$recordFields,$recordValues)
{
$f_array = explode(',',$recordFields);
$v_array = explode(',',$recordValues);
if(count($f_array) != count($v_array))
$this->catch_error("Number of values doesn't match number of fields");
for($i=0;$i<count($f_array);$i++)
{
$fieldName = $f_array[$i];
$this->dataset[$tableName][$recordId][$fieldName] = $v_array[$i];
}
//return $this->dataset[$tableName][$recordId][$fieldName];
}
//construct the dataset as associative 3D array by default or numeric indexed if the $indexType is specified
//dataset[table][row][field]
//table = name of the retrieved tables in database or table index in dataset
//row = concatenated primary key for each row of table start with '_' or row number in the table
//field = column names of the table or column number in the row
//$foo = $dataset['FooTable']['_Foo01]['fooName']; ==> returns the value in the FooTable at row index _Foo01 in field fooName
//$foo = $dataset['FooTable']['_Foo01']; ==> returns associative 1D array where columns name in FooTable as index
//$foo = $dataset['FooTable']; ==> returns associative 2D array where concatenated primary key of the FooTable as index
//$foo = $dataset; ==> returns associative 3D array where tablename as index
function construct_dataset($dbTable=ALL_TABLE,$dbQuery=NO_QUERY,$tableIndex=INDEX_KEY,$rowIndex=INDEX_KEY,$fieldIndex=INDEX_KEY)
{
$this->open_db();
if($dbTable == ALL_TABLE)
{
$this->construct_all_table($tableIndex,$rowIndex,$fieldIndex);
$this->close_db();
return $this->dataset;
exit;
}
else if($dbTable != ALL_TABLE && strpos($dbTable,',') !== false)
{
$this->construct_multi_table($dbTable,$tableIndex,$rowIndex,$fieldIndex);
$this->close_db();
return $this->dataset;
exit;
}
else if(is_array($dbTable))
{
foreach($dbTable as $table_name => $table_query)
{
$data_table = $this->construct_table($table_name,$table_query,$rowIndex,$fieldIndex);
if(is_array($data_table))//check if the $data_table is an array
{
if($tableIndex == INDEX_KEY)
$this->dataset[$table_name] = $data_table;
else if($tableIndex == INDEX_NUM)
array_push($this->dataset,$data_table);
}
else
{
$this->close_db();
$this->catch_error("Construct Dataset ERROR $dbTable is not Exists",mysql_error());
exit;
}
}
$this->close_db();
return $this->dataset;
exit;
}
else if($dbTable != ALL_TABLE && $dbQuery != NO_QUERY)
{
$data_table = (strpos($dbQuery,"SELECT",0) !== false)? $this->construct_query_table($dbQuery,INDEX_NUM,$fieldIndex):
$this->construct_table($dbTable,$dbQuery,$rowIndex,$fieldIndex);
if(is_array($data_table))//check if the $data_table is an array
{
if($tableIndex == INDEX_KEY)
$this->dataset[$dbTable] = $data_table;
else if($tableIndex == INDEX_NUM)
array_push($this->dataset,$data_table);
$this->close_db();
return $this->dataset;
}
else
{
$this->catch_error("Construct Dataset ERROR $dbTable is not Exists",mysql_error());
}
exit;
}
else if($dbTable != ALL_TABLE)
{
$data_table = $this->construct_table($dbTable,NO_QUERY,$rowIndex,$fieldIndex);
if(is_array($data_table))//check if the $data_table is return an array
{
if($tableIndex == INDEX_KEY)
$this->dataset[$dbTable] = $data_table;
else if($tableIndex == INDEX_NUM)
array_push($this->dataset,$data_table);
$this->close_db();
return $this->dataset;
exit;
}
else
{
$this->catch_error("Construct Dataset ERROR: Table $dbTable doesn't exists",mysql_error());
}
}
else
{
$this->close_db();
$this->catch_error("Construct Dataset ERROR",mysql_error());
}
}
//construct all the tables in database into dataset array
function construct_all_table($tableIndex=INDEX_KEY,$rowIndex=INDEX_KEY,$fieldIndex=INDEX_KEY)
{
$tables = mysql_list_tables($this->dbname,$this->dbconn) or $this->catch_error("Tables Retrieve Error: ",mysql_error());
for($i=0;$i<mysql_num_rows($tables);$i++)
{
$table_name = mysql_tablename($tables,$i);
$data_table = $this->construct_table($table_name,NO_QUERY,$rowIndex,$fieldIndex);
if(is_array($data_table))
{
if($tableIndex == INDEX_KEY)
$this->dataset[$table_name] = $data_table;
else if($tableIndex == INDEX_NUM)
array_push($this->dataset,$data_table);
}
}
mysql_free_result($tables);
}
//construct specified tables ( >1 table) from database into dataset
function construct_multi_table($tableNames,$tableIndex=INDEX_KEY,$rowIndex=INDEX_KEY,$fieldIndex=INDEX_KEY)
{
$tables = explode(',',$tableNames);
for($i=0;$i<count($tables);$i++)
{
$table_name = $tables[$i];
$data_table = (array_key_exists($table_name,$this->dataset))? $this->dataset[$table_name] : $this->construct_table($table_name,NO_QUERY,$rowIndex,$fieldIndex);
if(is_array($data_table))
{
if($tableIndex == INDEX_KEY)
{
$this->dataset[$table_name] = $data_table;
}
else if($tableIndex == INDEX_NUM)
array_push($this->dataset,$data_table);
}
}
}
//construct 1 table only into dataset with specified query
//$tableName = table name
//$queryRecord = WHERE condition (eg. id=001, name='Foo', name='Foo' OR name='otherFoo')
function construct_table($tableName,$queryRecord=NO_QUERY,$rowIndex=INDEX_KEY,$fieldIndex=INDEX_KEY)
{
//check if the $tableName exists in the database
if(!in_array(strtoupper($tableName),$this->db_tables))
return -1;
$table = array();
$result = array();
$fields = mysql_list_fields($this->dbname,$tableName,$this->dbconn) or $this->catch_error("$tableName Table Retrieve Fields Error: ",mysql_error());
$query = ($queryRecord == NO_QUERY)? "SELECT * FROM `".$tableName."` ORDER BY ".mysql_field_name($fields,0):
"SELECT * FROM `".$tableName."` WHERE ".$queryRecord." ORDER BY ".mysql_field_name($fields,0);
$rows = mysql_query($query,$this->dbconn) or $this->catch_error("$tableName Table Retrieve Records Error: ",mysql_error());
while($record = mysql_fetch_array($rows,MYSQL_ASSOC))
{
//store each fields value in array, field name as array key
for($i=0;$i<mysql_num_fields($rows);$i++)
{
//check if the field is primary key
$field_info = mysql_fetch_field($rows,$i);
$primary_key = $field_info->primary_key;
if($primary_key)
{
$array_key .= '_'.$record[$field_info->name];
}
//echo('field name '.$field_info->name.' is primary key: '.$field_info->primary_key.'<br>');
if($fieldIndex == INDEX_KEY)
$result[$field_info->name] = $record[$field_info->name];
else if($fieldIndex == INDEX_NUM)
$result[$i] = $record[$field_info->name];
}
if($rowIndex == INDEX_KEY)
$table[$array_key] = $result;
else if($rowIndex == INDEX_NUM)
array_push($table,$result);
$array_key = '';
}
mysql_free_result($fields);
mysql_free_result($rows);
return $table;
}
//construct a numeric index table array for more advance query
//eg. query for more than one table in the database
function construct_query_table($queryRecord,$rowIndex=INDEX_NUM,$fieldIndex=INDEX_KEY)
{
$table = array();
$result = array();
$rows = mysql_query($queryRecord,$this->dbconn) or die("Table Query Error: $queryRecord ".mysql_error());
while($record = mysql_fetch_array($rows))
{
//store each fields value in array, field name as array key
for($i=0;$i<mysql_num_fields($rows);$i++)
{
//check if the field is primary key
$field_info = mysql_fetch_field($rows,$i);
$primary_key = $field_info->primary_key;
if($primary_key)
{
$array_key .= '_'.$record[$field_info->name];
}
if($fieldIndex == INDEX_KEY)
$result[mysql_field_name($rows,$i)] = $record[mysql_field_name($rows,$i)];
else if($fieldIndex == INDEX_NUM)
$result[$i] = $record[mysql_field_name($rows,$i)];
}
array_push($table,$result);
$array_key = '';
}
mysql_free_result($rows);
return $table;
}
//search in specified dataset table and return as numeric indexing 2D array
function search_record($dataSetTable,$keyWord,$fieldName='',$fieldJoins='')
{
return ($fieldName == '')? $this->search_all_field($dataSetTable,$keyWord) : $this->search_in_field($dataSetTable,$keyWord,$fieldName,$fieldJoins);
}
function search_all_field($dataSetTable,$keyWord)
{
$found = array();
$key_word_match = false;
$num_of_match = 0;
foreach($dataSetTable as $key => $record)
{
foreach($record as $field => $value)
{
if(strpos($value,$keyWord,0) !== false)
{
//$match++;
$key_word_match = true;
}
}
if($key_word_match == true)
{
$found[$num_of_match] = $record;
$num_of_match++;
}
$key_word_match = false;
}
if($num_of_match > 0)
{
return $found;
}
else
{
return -1;
}
}
function search_in_field($dataSetTable,$keyWord,$fieldName,$fieldJoins='')
{
$k_word_array = explode(',',$keyWord);
$f_name_array = explode(',',$fieldName);
if(count($k_word_array) != count($f_name_array))
$this->catch_error("Number of keywords doesn't match number of fields");
$found = array();
$key_word_match = false;
$num_of_match = 0;
for($i=0;$i<count($k_word_array);$i++)
{
foreach($dataSetTable as $key => $record)
{
//$value = $record[$f_name_array[$i]];
switch($fieldJoins)
{
default:
if(strpos($record[$f_name_array[$i]],$k_word_array[$i],0) !== false)
{
$key_word_match = true;
}
break;
case '':
if(strpos($record[$f_name_array[$i]],$k_word_array[$i],0) !== false)
{
$key_word_match = true;
}
break;
case 'OR':
if(strpos($record[$f_name_array[$i]],$k_word_array[$i],0) !== false ||
strpos($record[$f_name_array[$i+1]],$k_word_array[$i+1],0) !== false)
{
//$match++;
$key_word_match = true;
}
break;
case 'AND':
if(strpos($record[$f_name_array[$i]],$k_word_array[$i],0) !== false &&
strpos($record[$f_name_array[$i+1]],$k_word_array[$i+1],0) !== false)
{
//$match++;
$key_word_match = true;
}
break;
case 'NOT':
if(strpos($record[$f_name_array[$i]],$k_word_array[$i],0) !== false &&
strpos($record[$f_name_array[$i+1]],$k_word_array[$i+1],0) === false)
{
//$match++;
$key_word_match = true;
}
break;
}
if($key_word_match == true)
{
$found[$num_of_match] = $record;
$num_of_match++;
}
$key_word_match = false;
}
}
if($num_of_match > 0)
{
return $found;
}
else
{
return -1;
}
}
//search in current dataset and return as 2D array
function search($keyWord,$tableName=ALL_TABLES,$tableField='',$rowIndex=INDEX_NUM)
{
if($tableName == ALL_TABLES)
{
return $this->search_in_dataset($keyWord);
exit;
}
else if($tableName != ALL_TABLES)
{
if($tableField == '')
{
return $this->search_in_table($keyWord,$tableName);
exit;
}
else
{
return $this->search_in_table_field($keyWord,$tableName,$tableField);
exit;
}
}
else
{
$this->catch_error("Table $tableName doesn't exists in dataset");
}
}
function search_in_dataset($keyWord,$rowIndex)
{
$found = array();
$key_word_match = false;
$num_of_match = 0;
foreach($this->dataset as $table_name => $table)
{
foreach($table as $key => $record)
{
foreach($record as $field => $value)
{
if(strpos($value,$keyWord,0) !== false)
{
$key_word_match = true;
}
}
if($key_word_match == true)
{
if($rowIndex == INDEX_KEY)
$found[$key] = $this->dataset[$table_name][$key];
else if($rowIndex == INDEX_NUM)
$found[$num_of_match] = $this->dataset[$table_name][$key];
$num_of_match++;
}
//reset to matched key word to false
$key_word_match = false;
}
}
if($num_of_match > 0)
{
return $found;
}
else
{
return -1;
}
}
function search_in_table($keyWord,$tableName,$rowIndex)
{
$found = array();
$key_word_match = false;
$num_of_match = 0;
foreach($this->dataset[$tableName] as $key => $record)
{
foreach($record as $field => $value)
{
if(strpos($value,$keyWord,0) !== false)
{
$key_word_match = true;
}
}
if($key_word_match == true)
{
if($rowIndex == INDEX_KEY)
$found[$key] = $this->dataset[$table_name][$key];
else if($rowIndex == INDEX_NUM)
$found[$num_of_match] = $this->dataset[$table_name][$key];
$num_of_match++;
}
//reset to matched key word to false
$key_word_match = false;
}
if($num_of_match > 0)
{
return $found;
}
else
{
return -1;
}
}
function search_in_table_field($keyWord,$tableName,$tableField,$rowIndex)
{
$found = array();
$key_word_match = false;
$num_of_match = 0;
foreach($this->dataset[$tableName] as $key => $record)
{
if(strpos($record[$tableField],$keyWord,0) !== false)
{
$key_word_match = true;
}
if($key_word_match == true)
{
if($rowIndex == INDEX_KEY)
$found[$key] = $this->dataset[$table_name][$key];
else if($rowIndex == INDEX_NUM)
$found[$num_of_match] = $this->dataset[$table_name][$key];
$num_of_match++;
}
//reset to matched key word to false
$key_word_match = false;
}
if($num_of_match > 0)
{
return $found;
}
else
{
return -1;
}
}
function catch_error($errorMsg,$sqlError='')
{
$this->error = "$errorMsg $sqlError";
echo $this->error;
exit;
}
}
?>
<?php
//Some examples how to use the class :)
/*
$ds = new Dataset('your database host','database username','database password','database name');
$dataset = ($ds->set_dataset('Foo_Table',INDEX_NUM,INDEX_NUM,INDEX_NUM))? $ds->get_dataset() : null;
echo '$dataset[0][0][0]='.$dataset[0][0][0].'<br>';
$dataset= ($ds->set_dataset('Foo_Table',INDEX_NUM,INDEX_NUM,INDEX_KEY))? $ds->get_dataset() : null;
echo '$dataset[0][0][foo_name]='.$dataset[0][0]['foo_name'].'<br>';
$dataset= ($ds->set_dataset('Foo_Table',INDEX_NUM,INDEX_KEY,INDEX_NUM))? $ds->get_dataset() : null;
echo '$dataset[0][_foo01][0]='.$dataset[0]['_foo01'][0].'<br>';
$dataset= ($ds->set_dataset('Foo_Table',INDEX_NUM,INDEX_KEY,INDEX_KEY))? $ds->get_dataset() : null;
echo '$dataset[0][_foo01][foo_name]='.$dataset[0]['_foo01']['foo_name'].'<br>';
$dataset= ($ds->set_dataset('Foo_Table',INDEX_KEY,INDEX_NUM,INDEX_NUM))? $ds->get_dataset() : null;
echo '$indexset[Foo_Table][0][0]='.$dataset['Foo_Table'][0][0].'<br>';
$dataset= ($ds->set_dataset('Foo_Table',INDEX_KEY,INDEX_NUM,INDEX_KEY))? $ds->get_dataset() : null;
echo '$dataset[Foo_Table][0][mach_id]='.$dataset['Foo_Table'][0]['foo_name'].'<br>';
$dataset= ($ds->set_dataset('Foo_Table',INDEX_KEY,INDEX_KEY,INDEX_NUM))? $ds->get_dataset() : null;
echo '$dataset[Foo_Table][_foo01][0]='.$dataset['Foo_Table']['_foo01'][0].'<br>';
$dataset= ($ds->set_dataset('Foo_Table',INDEX_KEY,INDEX_KEY,INDEX_KEY))? $ds->get_dataset() : null;
echo '$dataset[Foo_Table][_foo01][mach_id]='.$dataset['Foo_Table']['_foo01']['foo_name'].'<br>';
$multitable1 = ($ds->set_dataset('Table1,Table2',INDEX_KEY,INDEX_NUM,INDEX_NUM))? $ds->get_dataset() : null;
$multitable2 = ($ds->set_dataset(array('Table1'=>'id=10','Table2'=>'id=10'),INDEX_KEY,INDEX_NUM,INDEX_NUM))? $ds->get_dataset() : null;
//Queries for one table
//the table name must exists in database
$queryset1 = ($ds->set_queryset('Table1',"id = 10"))? $ds->get_dataset() : null;
for($i=0;$i<count($queryset['Table1']);$i++)
{
foreach($queryset['Table1'][$i] as $field => $value)
{
echo $field.'='.$value.' ';
}
echo '<br>';
}
//Queries for multiple tables
$query = "SELECT * FROM Table1,Table2,Table3 WHERE Table2.id = Table1.id";
//set the query result anyname you like to store it in dataset array
$queryset2 = ($ds->set_queryset('QueryTable',$query,INDEX_KEY))? $ds->get_dataset() : null;
for($i=0;$i<count($queryset['QueryTable']);$i++)
{
foreach($queryset['QueryTable'][$i] as $field => $value)
{
echo $field.'='.$value.' ';
}
echo '<br>';
}
$ds2 = new Dataset('your database host','database username','database password','database name');
$dataset2 = ($ds->set_dataset(ALL_TABLES))? $ds->get_dataset() : null;
//Search in current dataset
$search_result1 = $ds2->search("Theo");
$search_result2 = $ds2->search("Theo","Table1");
$search_result3 = $ds2->search("Theo",'Table1',"name");
for($i=0;$i<count($search_result3);$i++)
{
foreach($search_result3[$i] as $field => $value)
{
echo $value;
}
}
//Search by giving the table array
$search_result4 = $ds2->search_record($dataset2['Table1'],"Theo");
$search_result5 = $ds2->search_record($dataset2['Table1'],"Theo","name");
$search_result6 = $ds2->search_record($dataset2['Table1'],"10,Theo","id,name",'AND');
$search_result7 = $ds2->search_record($dataset2['Table1'],"10,Theo","id,name",'OR');
for($i=0;$i<count($search_result5);$i++)
{
foreach($search_result5[$i] as $field => $value)
{
echo $value;
}
}
*/
?>