<?php
/*
Written by Aziz S. Hussain
@
www.AzizSaleh.com
Produced under LGPL license
@
http://www.gnu.org/licenses/lgpl.html
# Class structure
class database ()
{
protected databaseName, databaseHost, databaseUser, databasePassword
protected connectionLink, mysqlError
protected lastInsertID
resource query(sql as string, arrayReplace as array)
# Executes mysql_query and stores lastInsertID, if any
# If arrayReplace is set, it will search sql for any question marks
# and replace them with matching index of arrayReplace
array result(query as (string|object),isObject as boolean = false)
# Querys the (query string|query object) and returns array or object result
(array|string) cleanInput(array as (array|string)
# Executes mysql_real_escape_string on the (array|string)
# (array|string) also is escaped for inserting/adding using the ''
(number|string) escape(fieldValue as (number|string), isNumber as boolean = false)
# Execute mysql_real_escape_string if isNumber is true
# Runs preg_replace instead
void showError(string theError) # Outputs MySQL Error along with an end of line
string getPrimaryField(string tableName)
# Returns the primary field name of the specified table
resource delete(string tableName,(string|array) keyDelete,string keyField = NULL)
# This function is overloaded in three ways as:
resource delete(string tableName,string keyDelete)
# Will delete record value keyDelete using primary field
resource delete(string tableName,string keyDelete,string keyField)
# Will delete record value keyDelete using keyField field
resource delete(string tableName,array keyDelete)
# Will delete record based on multiple fieldname with associated fieldvalues
resource insert(string tableName,array ARRAY_VARS)
# This function will insert or update values of tableName from an array
# Like POST, GET, SESSION,...
# The way this works, is that it retrieves a lits of fields for that table and checks
# Them against the ARRAY_VARS. If the primary key exist in ARRAY_VARS, then it updates,
# Otherwise it does an insert to the table
string (mysql query) findMatches(string tableName,array ARRAY_VARS)
# Find relationship between tablename and ARRAY_VARS, create MySQL statement
array (resource,string tablename) createTable(array ARRAY_VARS, string tableName = NULL)
# Create a database table based on ARRAY_VARS, if tableName is NULL a random string is
# Generated to use for the table name
void close() # Closes the database connection
string generateRandom(integer strLen)
# Generate a random string of strLen length
}
*/
// Check if class already called
if(class_exists('database')){ return;}
class database
{
# Variables needed to connect
protected $databaseName, $databaseHost, $databaseUser, $databasePassword;
# Connection link and error holder
protected $connectionLink, $mysqlError;
# Last insert ID (primary keys)
protected $lastInsertID;
# Holds the current ? replace
protected $curReplace, $arrayReplace;
# Construct database with information
function __construct(&$theLink)
{
$this->connectionLink = $theLink;
}
# Regular query with ? replace style
function query($sql,$arrayReplace = NULL)
{
$this->curReplace = -1;
$arrayReplace = $this->cleanInput($arrayReplace);
$this->arrayReplace = $arrayReplace;
if(isset($arrayReplace))
{
if(is_array($arrayReplace))
{
$arrayReplaces = array_fill(0,count($arrayReplace),'?');
$query = preg_replace_callback('/\?/Uism','database::doSwitch',$sql);
} else {
$query = str_replace('?',$arrayReplace,$sql);
}
} else {
$query = $sql;
}
$queryLink = @mysql_query($query,$this->connectionLink) or $this->showError(mysql_error($this->connectionLink));
return $queryLink;
}
# This is a helper function to preg_replace all question marks
protected function doSwitch($result)
{
$this->curReplace++;
return $this->arrayReplace[$this->curReplace];
}
# Returns array or object result set assoc of an object or string query
function result($query,$isObject = false)
{
if(!is_resource($query)){ $query = $this->query($query);}
$records = array();
while($eachRecord = @mysql_fetch_assoc($query)){ $records[] = $eachRecord;}
if($isObject == true)
{
$records = (object) $records;
}
return $records;
}
# Sanitize an array & organize into mysql style ''
function cleanInput($array)
{
if(!isset($array)){ return;}
if(!is_array($array)){ return "'".$this->escape($array)."'";}
$newArray = array();
foreach($array as $item)
{
$newArray[] = "'".$this->escape($item)."'";
}
return $newArray;
}
# Sanitize input for Query
function escape($fieldValue,$isNumber = false)
{
if($isNumber == true)
{
return preg_replace('/[^0-9\.]/iUsm','',$fieldValue);
} else {
return mysql_real_escape_string($fieldValue,$this->connectionLink);
}
}
# Show error sent
function showError($theError)
{
echo $this->mysqlError = $theError;
echo PHP_EOL;
}
# Return the primary key of the specified table
function getPrimaryField($tableName)
{
$result = $this->query("SELECT k.column_name
FROM information_schema.key_column_usage as k
WHERE table_schema = schema()
AND constraint_name = 'PRIMARY'
AND table_name = '".$tableName."'");
list($theKeyField) = $this->result($result);
return $theKeyField['column_name'];
}
# Delete a record based on one keyfield (leave empty to do primary) that matches keyDelete
# To delete a record based on a number of fields, pass the array to keyDelete
function delete($tableName,$keyDelete,$keyField = NULL)
{
# if keyDelete in form of array = array('fieldname' => 'fieldvalue','fieldname' => 'fieldvalue'...)
if(is_array($keyDelete))
{
$queryAdd = 'WHERE ';
foreach($keyDelete as $field => $value)
{
$queryAdd .= "`$field` = '$value' AND";
}
$queryAdd = substr($queryAdd,0,strlen($queryAdd)-4);
$query = "DELETE FROM `$tableName` $queryAdd";
return $this->query($query);
}
if($keyField == NULL){ $keyField = $this->getPrimaryField($tableName);}
$query = "DELETE FROM `$tableName` WHERE `$keyField`='$keyDelete'";
return $this->query($query);
}
# Insert/update into table values from ARRAY
# variable names must match those found on table
# Primary must exist for an update
function insert($tableName,$ARRAY_VARS)
{
# Check if we are sending anything?
if($ARRAY_VARS == NULL){ return;}
# Return fields matches between array and table structure
$queryDo = $this->findMatches($tableName,$ARRAY_VARS,'INSERT');
# Do query
return $this->query($queryDo);
}
# Find matches
function findMatches($tableName,$ARRAY_VARS)
{
# We need two arrays to store fields/values
$arrayFields = array();
$arrayFieldValue = array();
$arrayUpdates = array();
# Primary field (will update if found, otherwise insert)
$primaryField = $this->getPrimaryField($tableName);
$primaryFound = false;
# Get list of fields for the table
$tableFields = $this->result("SHOW COLUMNS FROM `$tableName`",'assoc');
foreach($tableFields as $fieldInfo)
{
# Check if the field exist in ARRAY_VARS
if(array_key_exists($fieldInfo['Field'],$ARRAY_VARS))
{
$fieldNameFormatted = "`".$fieldInfo['Field']."`";
$fieldValueFormatted = "'".$this->escape($ARRAY_VARS[$fieldInfo['Field']])."'";
$arrayFields[] = $fieldNameFormatted;
$arrayFieldValue[] = $fieldValueFormatted;
if($fieldInfo['Field'] == $primaryField && $ARRAY_VARS[$primaryField] > 0){
# Insure parimary field is a number
settype($ARRAY_VARS[$primaryField],"integer");
$primaryFound = true;
}
$arrayUpdates[] = $fieldNameFormatted.' = '.$fieldValueFormatted;
}
}
# Are we doing insert or update
if($primaryFound == TRUE)
{
$finalQuery = "UPDATE `$tableName` SET ".implode(',',$arrayUpdates);
$finalQuery .= " WHERE `$primaryField`='".$ARRAY_VARS[$primaryField]."'";
} else {
$finalQuery = "INSERT INTO `$tableName` (".implode(',',$arrayFields).") VALUES (".implode(',',$arrayFieldValue).")";
}
return $finalQuery;
}
# Create table based on Array Schema
function createTable($ARRAY_VARS,$tableName = NULL)
{
# If no table name sent, generate one
if($tableName == NULL){ $tableName = $this->generateRandom(4);}
# Setup query
$createQuery = "CREATE TABLE `$tableName` (
`primaryKey` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,";
# Get fieldnames to add to creation query
foreach(array_keys($ARRAY_VARS) as $fieldName)
{
$createQuery .= "
`$fieldName` VARCHAR( 255 ) NOT NULL ,";
}
$createQuery = substr($createQuery,0,strlen($createQuery)-1);
$createQuery .= "
);";
$result = $this->query($createQuery);
return array($result,$tableName);
}
# Close database connection
function close()
{
@mysql_close($this->connectionLink) or $this->showError(mysql_error($this->connectionLink));
}
# Generate a random number at x length
function generateRandom($strLen)
{
return substr(md5(uniqid(rand(),1)),1,$strLen);
}
}
// End of file /AzizMVC/Plugins/Database.php
|