406 lines
13 KiB
PHP
406 lines
13 KiB
PHP
|
<?php
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// Database Class
|
||
|
//============================================================================
|
||
|
// Dependencies:
|
||
|
//----------------------------------------------------------------------------
|
||
|
// None
|
||
|
//============================================================================
|
||
|
// Modification History:
|
||
|
//----------------------------------------------------------------------------
|
||
|
// 2006-11-04: Created
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
class Database extends Error
|
||
|
{
|
||
|
## CONSTANT VARIABLES
|
||
|
const DB_TYPES = 'mysql,mysqli'; // NO SPACES!
|
||
|
## END CONSTANT VARIABLES
|
||
|
|
||
|
## PUBLIC VARIABLES
|
||
|
## END PUBLIC VARIABLES
|
||
|
|
||
|
## PRIVATE VARIABLES
|
||
|
private static $host;
|
||
|
private static $port;
|
||
|
private static $database;
|
||
|
private static $username;
|
||
|
private static $password;
|
||
|
private static $type;
|
||
|
private static $connection;
|
||
|
private static $savedQueries;
|
||
|
private static $savedResults;
|
||
|
## END PRIVATE VARIABLES
|
||
|
|
||
|
## CONSTRUCTOR
|
||
|
## END CONSTRUCTOR
|
||
|
|
||
|
## DECONSTRUCTOR
|
||
|
## END DECONSTRUCTOR
|
||
|
|
||
|
## PUBLIC METHODS
|
||
|
// Initialize the Variables
|
||
|
// Does not return anything, but acts like a constructor for Static classes
|
||
|
public static function Initialize($varType, $varHost, $varPort, $varDatabase, $varUsername, $varPassword)
|
||
|
{
|
||
|
Error::Initialize();
|
||
|
|
||
|
if (!self::ValidDatabaseTypes($varType))
|
||
|
{
|
||
|
Error::LogError("Database Type Invalid", "Database Type must be one of: " . self::DB_TYPES);
|
||
|
}
|
||
|
|
||
|
self::$host = $varHost;
|
||
|
self::$port = $varPort;
|
||
|
self::$type = strtolower($varType);
|
||
|
self::$database = $varDatabase;
|
||
|
self::$password = $varPassword;
|
||
|
self::$username = $varUsername;
|
||
|
self::$savedQueries = array();
|
||
|
self::$savedResults = array();
|
||
|
self::$connection = self::ConnectToDatabase();
|
||
|
|
||
|
self::SelectTheDatabase();
|
||
|
}
|
||
|
|
||
|
// DeInitialize the Variables
|
||
|
// Does not return anything, but acts like a destructor for Static classes
|
||
|
public static function DeInitialize()
|
||
|
{
|
||
|
// Remove Saved Queries
|
||
|
for ($saved = 0; $saved < sizeof(self::$savedQueries); $saved++)
|
||
|
{
|
||
|
unset(self::$savedQueries[$saved]);
|
||
|
}
|
||
|
|
||
|
// Remove Saved Results
|
||
|
for ($saved = 0; $saved < sizeof(self::$savedResults); $saved++)
|
||
|
{
|
||
|
unset(self::$savedResults[$saved]);
|
||
|
}
|
||
|
|
||
|
// Close the Database Connection
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
@mysql_close(self::$connection) or Error::LogError("MySQL Failed to Close", mysql_error(self::$connection));
|
||
|
break;
|
||
|
case "mysqli":
|
||
|
@mysqli_close(self::$connection) or Error::LogError("MySQL Failed to Close", mysqli_error(self::$connection));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Destroy Variables
|
||
|
self::$host = null;
|
||
|
self::$port = null;
|
||
|
self::$type = null;
|
||
|
self::$database = null;
|
||
|
self::$password = null;
|
||
|
self::$username = null;
|
||
|
self::$connection = null;
|
||
|
self::$savedQueries = null;
|
||
|
self::$savedResults = null;
|
||
|
Error::DeInitialize();
|
||
|
}
|
||
|
|
||
|
// Database Types
|
||
|
// Returns an array of database types
|
||
|
public static function DatabaseTypes()
|
||
|
{
|
||
|
return split(",", self::DB_TYPES);
|
||
|
}
|
||
|
|
||
|
// Build Order By
|
||
|
// Returns the SQL Syntax for ORDER BY
|
||
|
public static function BuildOrderBy($varColumnName, $varDirection)
|
||
|
{
|
||
|
$orderby = "";
|
||
|
if (self::$connection)
|
||
|
{
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
case "mysqli":
|
||
|
$orderby = "ORDER BY `{$varColumnName}` {$varDirection}";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $orderby;
|
||
|
}
|
||
|
|
||
|
// Build Limit
|
||
|
// Returns the SQL Syntax for LIMIT
|
||
|
public static function BuildLimit($varStartingRow, $varNumberOfRows)
|
||
|
{
|
||
|
$limit = "";
|
||
|
if (self::$connection)
|
||
|
{
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
case "mysqli":
|
||
|
$limit = "LIMIT {$varStartingRow}, {$varNumberOfRows}";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $limit;
|
||
|
}
|
||
|
|
||
|
// Execute SQL Query
|
||
|
// Returns the result of the query, which is typically a resource id
|
||
|
public static function ExecuteQuery($sql, $name)
|
||
|
{
|
||
|
if (self::$connection)
|
||
|
{
|
||
|
if (strlen(trim($name)) != 0)
|
||
|
{
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
if (!array_key_exists($name, self::$savedQueries))
|
||
|
{
|
||
|
self::$savedQueries[$name] = @mysql_query($sql, self::$connection) or Error::LogError("Query Failed", mysql_error(self::$connection));
|
||
|
}
|
||
|
break;
|
||
|
case "mysqli":
|
||
|
if (!array_key_exists($name, self::$savedQueries))
|
||
|
{
|
||
|
self::$savedQueries[$name] = @mysqli_query(self::$connection, $sql) or Error::LogError("Query Failed", mysqli_error(self::$connection));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return self::$savedQueries[$name];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error::LogError("Execute Query Name Missing", "The name parameter was empty, please provide a name for the query.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
// Fetch Results
|
||
|
// Returns an array of the query results
|
||
|
public static function FetchResults($name)
|
||
|
{
|
||
|
$results = array();
|
||
|
if (self::$connection)
|
||
|
{
|
||
|
if (strlen(trim($name)) != 0 && (array_key_exists($name, self::$savedQueries) || array_key_exists($name, self::$savedResults)))
|
||
|
{
|
||
|
if (array_key_exists($name, self::$savedQueries))
|
||
|
{
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
$row = 0;
|
||
|
while ($currentResult = @mysql_fetch_assoc(self::$savedQueries[$name]))
|
||
|
{
|
||
|
$col = 0;
|
||
|
foreach ($currentResult as $key => $value)
|
||
|
{
|
||
|
$results[$row][$col] = $value;
|
||
|
$results[$row][$key] = $value;
|
||
|
$col++;
|
||
|
}
|
||
|
|
||
|
$row++;
|
||
|
}
|
||
|
break;
|
||
|
case "mysqli":
|
||
|
$row = 0;
|
||
|
while ($currentResult = @mysqli_fetch_assoc(self::$savedQueries[$name]))
|
||
|
{
|
||
|
$col = 0;
|
||
|
foreach ($currentResult as $key => $value)
|
||
|
{
|
||
|
$results[$row][$col] = $value;
|
||
|
$results[$row][$key] = $value;
|
||
|
$col++;
|
||
|
}
|
||
|
|
||
|
$row++;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
self::$savedResults[$name] = $results;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$results = self::$savedResults[$name];
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (strlen(trim($name)) == 0)
|
||
|
{
|
||
|
Error::LogError("Fetch Results Name Missing", "The name parameter was empty, the name is required so it knows which results to return.");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error::LogError("Fetch Results Name ('{$name}') Not Found", "The name provided did not have any query results associated with it.");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $results;
|
||
|
}
|
||
|
|
||
|
// Free SQL Query Results
|
||
|
// Returns nothing
|
||
|
public static function FreeResults($name)
|
||
|
{
|
||
|
if (self::$connection)
|
||
|
{
|
||
|
if (strlen(trim($name)) != 0 && array_key_exists($name, self::$savedQueries))
|
||
|
{
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
@mysql_free_result(self::$savedQueries[$name]) or Error::LogError("Free Results Error", mysql_error(self::$connection));
|
||
|
unset(self::$savedQueries[$name]);
|
||
|
break;
|
||
|
case "mysqli":
|
||
|
@mysqli_free_result(self::$savedQueries[$name]) or Error::LogError("Free Results Error", mysqli_error(self::$connection));
|
||
|
unset(self::$savedQueries[$name]);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (strlen(trim($name)) == 0)
|
||
|
{
|
||
|
Error::LogError("Free Results Name Missing", "The name parameter was empty, the name is required so it knows which results to free up from memory.");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error::LogWarning("Free Results Name ('{$name}') Not Found", "The name provided did not have any query results associated with it.");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Remove Saved Results
|
||
|
// Returns nothing
|
||
|
public static function RemoveSavedResults($name)
|
||
|
{
|
||
|
if (strlen(trim($name)) != 0 && array_key_exists($name, self::$savedResults))
|
||
|
{
|
||
|
unset(self::$savedResults[$name]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (strlen(trim($name)) == 0)
|
||
|
{
|
||
|
Error::LogError("Remove Saved Result Name Missing", "The name parameter was empty, the name is required so it knows which query to remove.");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error::LogWarning("Remove Saved Result Name ('{$name}') Not Found", "The name provided was not a saved query.");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Attempt Connect To Database
|
||
|
// Returns true or false depending on if the connection failed or succeeded
|
||
|
public static function AttemptConnectToDatabase($varType, $varHost, $varPort, $varDatabase, $varUsername, $varPassword)
|
||
|
{
|
||
|
self::$type = $varType;
|
||
|
self::$host = $varHost;
|
||
|
self::$port = $varPort;
|
||
|
self::$database = $varDatabase;
|
||
|
self::$username = $varUsername;
|
||
|
self::$password = $varPassword;
|
||
|
|
||
|
Error::ClearErrors();
|
||
|
self::$connection = self::ConnectToDatabase();
|
||
|
|
||
|
if (!Error::HasErrors())
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MySQL Version
|
||
|
// Returns the mysql version number
|
||
|
public static function MysqlVersion()
|
||
|
{
|
||
|
$version = "";
|
||
|
if (self::$connection)
|
||
|
{
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
$version = mysql_get_server_info(self::$connection);
|
||
|
break;
|
||
|
case "mysqli":
|
||
|
$version = mysqli_get_server_info(self::$connection);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $version;
|
||
|
}
|
||
|
## END PUBLIC METHODS
|
||
|
|
||
|
## PRIVATE METHODS
|
||
|
// Connect to Database
|
||
|
// Returns the database connection resource
|
||
|
private static function ConnectToDatabase()
|
||
|
{
|
||
|
$link = null;
|
||
|
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
if (strlen(trim(self::$port)) != 0)
|
||
|
{
|
||
|
$link = mysql_connect(self::$host . ":" . self::$port, self::$username, self::$password) or Error::LogError("Database Error", mysql_error());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$link = mysql_connect(self::$host, self::$username, self::$password) or Error::LogError("Database Error", mysql_error());
|
||
|
}
|
||
|
break;
|
||
|
case "mysqli":
|
||
|
$link = mysqli_connect(self::$host, self::$username, self::$password, self::$database, self::$port) or Error::LogError("Database Error", mysqli_connect_error());
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return $link;
|
||
|
}
|
||
|
|
||
|
// Select the Database
|
||
|
// Returns nothing
|
||
|
private static function SelectTheDatabase()
|
||
|
{
|
||
|
switch (self::$type)
|
||
|
{
|
||
|
case "mysql":
|
||
|
@mysql_select_db(self::$database, self::$connection) or Error::LogError("Database Selection", mysql_error(self::$connection));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Valid Database Types
|
||
|
// Returns true or false depending on if the database type is valid
|
||
|
private static function ValidDatabaseTypes($varType)
|
||
|
{
|
||
|
$types = split(',', str_replace(" ", "", self::DB_TYPES));
|
||
|
|
||
|
return in_array($varType, $types);
|
||
|
}
|
||
|
## END PRIVATE METHODS
|
||
|
|
||
|
## PROTECTED METHODS
|
||
|
## END PROTECTED METHODS
|
||
|
}
|
||
|
?>
|