<?php
class MySQL
{
private $db_host = "localhost"; // server name
private $db_user = "root"; // user name
private $db_pass = ""; // password
private $db_dbname = ""; // database name
private $db_charset = ""; // optional character set (i.e. utf8)
private $db_pcon = false; // use persistent connection?
// constants for SQLValue function
const SQLVALUE_BIT = "bit";
const SQLVALUE_BOOLEAN = "boolean";
const SQLVALUE_DATE = "date";
const SQLVALUE_DATETIME = "datetime";
const SQLVALUE_NUMBER = "number";
const SQLVALUE_T_F = "t-f";
const SQLVALUE_TEXT = "text";
const SQLVALUE_TIME = "time";
const SQLVALUE_Y_N = "y-n";
// class-internal variables - do not change
private $active_row = -1; // current row
private $error_desc = ""; // last mysql error string
private $error_number = 0; // last mysql error number
private $in_transaction = false; // used for transactions
private $last_insert_id; // last id of record inserted
private $last_result; // last mysql query result
private $last_sql = ""; // last mysql query
private $mysql_link = 0; // mysql link resource
private $time_diff = 0; // holds the difference in time
private $time_start = 0; // start time for the timer
/**
* Determines if an error throws an exception
*
* @var boolean Set to true to throw error exceptions
*/
public $ThrowExceptions = false;
/**
* Constructor: Opens the connection to the database
*
* @param boolean $connect (Optional) Auto-connect when object is created
* @param string $database (Optional) Database name
* @param string $server (Optional) Host address
* @param string $username (Optional) User name
* @param string $password (Optional) Password
* @param string $charset (Optional) Character set
*/
public function __construct($connect=true, $database="", $server="", $username="", $password="", $charset="") {
if (strlen($database) > 0) $this->db_dbname = $database;
if (strlen($server) > 0) $this->db_host = $server;
if (strlen($username) > 0) $this->db_user = $username;
if (strlen($password) > 0) $this->db_pass = $password;
if (strlen($charset) > 0) $this->db_charset = $charset;
if (strlen($this->db_host) > 0 &&
strlen($this->db_user) > 0 &&
strlen($this->db_pass) > 0) {
if ($connect) $this->Open();
}
}
/**
* Destructor: Closes the connection to the database
*
*/
public function __destruct() {
$this->Close();
}
/**
* Automatically does an INSERT or UPDATE depending if an existing record
* exists in a table
*
* @param string $tableName The name of the table
* @param array $valuesArray An associative array containing the column
* names as keys and values as data. The values
* must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @param array $whereArray An associative array containing the column
* names as keys and values as data. The values
* must be SQL ready (i.e. quotes around strings,
* formatted dates, ect).
* @return boolean Returns TRUE on success or FALSE on error
*/
public function AutoInsertUpdate($tableName, $valuesArray, $whereArray) {
$this->ResetError();
$this->SelectRows($tableName, $whereArray);
if (! $this->Error()) {
if ($this->HasRecords()) {
return $this->UpdateRows($tableName, $valuesArray, $whereArray);
} else {
return $this->InsertRow($tableName, $valuesArray);
}
} else {
return false;
}
}
/**
* Returns true if the internal pointer is at the beginning of the records
*
* @return boolean TRUE if at the first row or FALSE if not
*/
public function BeginningOfSeek() {
$this->ResetError();
if ($this->IsConnected()) {
if ($this->active_row < 1) {
return true;
} else {
return false;
}
} else {
$this->SetError("No connection");
return false;
}
}
/**
* [STATIC] Builds a comma delimited list of columns for use with SQL
*
* @param array $valuesArray An array containing the column names.
* @param boolean $addQuotes (Optional) TRUE to add quotes
* @param boolean $showAlias (Optional) TRUE to show column alias
* @return string Returns the SQL column list
*/
static private function BuildSQLColumns($columns, $addQuotes = true, $showAlias = true) {
if ($addQuotes) {
$quote = "`";
} else {
$quote = "";
}
switch (gettype($columns)) {
case "array":
$sql = "";
foreach ($columns as $key => $value) {
// Build the columns
if (strlen($sql) == 0) {
$sql = $quote . $value . $quote;
} else {
$sql .= ", " . $quote . $value . $quote;
}
if ($showAlias && is_string($key) && (! empty($key))) {
$sql .= ' AS "' . $key . '"';
}
}
return $sql;
break;
case "string":
return $quote . $columns . $quote;
break;
default:
return false;
break;
}
}
/**
* [STATIC] Builds a SQL DELETE statement
*
* @param string $tableName The name of the table
* @param array $whereArray (Optional) An associative array containing the
* column names as keys and values as data. The
* values must be SQL ready (i.e. quotes around
* strings, formatted dates, ect). If not specified
* then all values in the table are deleted.
* @return string Returns the SQL DELETE statement
*/
static public function BuildSQLDelete($tableName, $whereArray = null) {
$sql = "DELETE FROM `" . $tableName . "`";
if (! is_null($whereArray)) {
$sql .= self::BuildSQLWhereClause($whereArray);
}
return $sql;
}
/**
* [STATIC] Builds a SQL INSERT statement
*
* @param string $tableName The name of the table
* @param array $valuesArray An associative array containing the column
* names as keys and values as data. The values
* must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @return string Returns a SQL INSERT statement
*/
static public function BuildSQLInsert($tableName, $valuesArray) {
$columns = self::BuildSQLColumns(array_keys($valuesArray));
$values = self::BuildSQLColumns($valuesArray, false, false);
$sql = "INSERT INTO `" . $tableName .
"` (" . $columns . ") VALUES (" . $values . ")";
return $sql;
}
/**
* Builds a simple SQL SELECT statement
*
* @param string $tableName The name of the table
* @param array $whereArray (Optional) An associative array containing the
* column names as keys and values as data. The
* values must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @param array/string $columns (Optional) The column or list of columns to select
* @param array/string $sortColumns (Optional) Column or list of columns to sort by
* @param boolean $sortAscending (Optional) TRUE for ascending; FALSE for descending
* This only works if $sortColumns are specified
* @param integer/string $limit (Optional) The limit of rows to return
* @return string Returns a SQL SELECT statement
*/
static public function BuildSQLSelect($tableName, $whereArray = null, $columns = null,
$sortColumns = null, $sortAscending = true, $limit = null) {
if (! is_null($columns)) {
$sql = self::BuildSQLColumns($columns);
} else {
$sql = "*";
}
$sql = "SELECT " . $sql . " FROM `" . $tableName . "`";
if (is_array($whereArray)) {
$sql .= self::BuildSQLWhereClause($whereArray);
}
if (! is_null($sortColumns)) {
$sql .= " ORDER BY " .
self::BuildSQLColumns($sortColumns, true, false) .
" " . ($sortAscending ? "ASC" : "DESC");
}
if (! is_null($limit)) {
$sql .= " LIMIT " . $limit;
}
return $sql;
}
/**
* [STATIC] Builds a SQL UPDATE statement
*
* @param string $tableName The name of the table
* @param array $valuesArray An associative array containing the column
* names as keys and values as data. The values
* must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @param array $whereArray (Optional) An associative array containing the
* column names as keys and values as data. The
* values must be SQL ready (i.e. quotes around
* strings, formatted dates, ect). If not specified
* then all values in the table are updated.
* @return string Returns a SQL UPDATE statement
*/
static public function BuildSQLUpdate($tableName, $valuesArray, $whereArray = null) {
$sql = "";
foreach ($valuesArray as $key => $value) {
if (strlen($sql) == 0) {
$sql = "`" . $key . "` = " . $value;
} else {
$sql .= ", `" . $key . "` = " . $value;
}
}
$sql = "UPDATE `" . $tableName . "` SET " . $sql;
if (is_array($whereArray)) {
$sql .= self::BuildSQLWhereClause($whereArray);
}
return $sql;
}
/**
* [STATIC] Builds a SQL WHERE clause from an array.
* If a key is specified, the key is used at the field name and the value
* as a comparison. If a key is not used, the value is used as the clause.
*
* @param array $whereArray An associative array containing the column
* names as keys and values as data. The values
* must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @return string Returns a string containing the SQL WHERE clause
*/
static public function BuildSQLWhereClause($whereArray) {
$where = "";
foreach ($whereArray as $key => $value) {
if (strlen($where) == 0) {
if (is_string($key)) {
$where = " WHERE `" . $key . "` = " . $value;
} else {
$where = " WHERE " . $value;
}
} else {
if (is_string($key)) {
$where .= " AND `" . $key . "` = " . $value;
} else {
$where .= " AND " . $value;
}
}
}
return $where;
}
/**
* Close current MySQL connection
*
* @return object Returns TRUE on success or FALSE on error
*/
public function Close() {
$this->ResetError();
$this->active_row = -1;
$success = $this->Release();
if ($success) {
$success = @mysql_close($this->mysql_link);
if (! $success) {
$this->SetError();
} else {
unset($this->last_sql);
unset($this->last_result);
unset($this->mysql_link);
}
}
return $success;
}
/**
* Deletes rows in a table based on a WHERE filter
* (can be just one or many rows based on the filter)
*
* @param string $tableName The name of the table
* @param array $whereArray (Optional) An associative array containing the
* column names as keys and values as data. The
* values must be SQL ready (i.e. quotes around
* strings, formatted dates, ect). If not specified
* then all values in the table are deleted.
* @return boolean Returns TRUE on success or FALSE on error
*/
public function DeleteRows($tableName, $whereArray = null) {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
$sql = self::BuildSQLDelete($tableName, $whereArray);
// Execute the UPDATE
if (! $this->Query($sql)) {
return false;
} else {
return true;
}
}
}
/**
* Returns true if the internal pointer is at the end of the records
*
* @return boolean TRUE if at the last row or FALSE if not
*/
public function EndOfSeek() {
$this->ResetError();
if ($this->IsConnected()) {
if ($this->active_row >= ($this->RowCount())) {
return true;
} else {
return false;
}
} else {
$this->SetError("No connection");
return false;
}
}
/**
* Returns the last MySQL error as text
*
* @return string Error text from last known error
*/
public function Error() {
$error = $this->error_desc;
if (empty($error)) {
if ($this->error_number <> 0) {
$error = "Unknown Error (#" . $this->error_number . ")";
} else {
$error = false;
}
} else {
if ($this->error_number > 0) {
$error .= " (#" . $this->error_number . ")";
}
}
return $error;
}
/**
* Returns the last MySQL error as a number
*
* @return integer Error number from last known error
*/
public function ErrorNumber() {
if (strlen($this->error_desc) > 0)
{
if ($this->error_number <> 0)
{
return $this->error_number;
} else {
return -1;
}
} else {
return $this->error_number;
}
}
/**
* [STATIC] Converts any value of any datatype into boolean (true or false)
*
* @param mixed $value Value to analyze for TRUE or FALSE
* @return boolean Returns TRUE or FALSE
*/
static public function GetBooleanValue($value) {
if (gettype($value) == "boolean") {
if ($value == true) {
return true;
} else {
return false;
}
} elseif (is_numeric($value)) {
if ($value > 0) {
return true;
} else {
return false;
}
} else {
$cleaned = strtoupper(trim($value));
if ($cleaned == "ON") {
return true;
} elseif ($cleaned == "SELECTED" || $cleaned == "CHECKED") {
return true;
} elseif ($cleaned == "YES" || $cleaned == "Y") {
return true;
} elseif ($cleaned == "TRUE" || $cleaned == "T") {
return true;
} else {
return false;
}
}
}
/**
* Returns the comments for fields in a table into an
* array or NULL if the table has not got any fields
*
* @param string $table Table name
* @return array An array that contains the column comments
*/
public function GetColumnComments($table) {
$this->ResetError();
$records = mysql_query("SHOW FULL COLUMNS FROM " . $table);
if (! $records) {
$this->SetError();
return false;
} else {
// Get the column names
$columnNames = $this->GetColumnNames($table);
if ($this->Error()) {
return false;
} else {
$index = 0;
// Fetchs the array to be returned (column 8 is field comment):
while ($array_data = mysql_fetch_array($records)) {
$columns[$index] = $array_data[8];
$columns[$columnNames[$index++]] = $array_data[8];
}
return $columns;
}
}
}
/**
* This function returns the number of columns or returns FALSE on error
*
* @param string $table (Optional) If a table name is not specified, the
* column count is returned from the last query
* @return integer The total count of columns
*/
public function GetColumnCount($table = "") {
$this->ResetError();
if (empty($table)) {
$result = mysql_num_fields($this->last_result);
if (! $result) $this->SetError();
} else {
$records = mysql_query("SELECT * FROM " . $table . " LIMIT 1");
if (! $records) {
$this->SetError();
$result = false;
} else {
$result = mysql_num_fields($records);
$success = @mysql_free_result($records);
if (! $success) {
$this->SetError();
$result = false;
}
}
}
return $result;
}
/**
* This function returns the data type for a specified column. If
* the column does not exists or no records exist, it returns FALSE
*
* @param string $column Column name or number (first column is 0)
* @param string $table (Optional) If a table name is not specified, the
* last returned records are used
* @return string MySQL data (field) type
*/
public function GetColumnDataType($column, $table = "") {
$this->ResetError();
if (empty($table)) {
if ($this->RowCount() > 0) {
if (is_numeric($column)) {
return mysql_field_type($this->last_result, $column);
} else {
return mysql_field_type($this->last_result, $this->GetColumnID($column));
}
} else {
return false;
}
} else {
if (is_numeric($column)) $column = $this->GetColumnName($column, $table);
$result = mysql_query("SELECT " . $column . " FROM " . $table . " LIMIT 1");
if (mysql_num_fields($result) > 0) {
return mysql_field_type($result, 0);
} else {
$this->SetError("The specified column or table does not exist, or no data was returned", -1);
return false;
}
}
}
/**
* This function returns the position of a column
*
* @param string $column Column name
* @param string $table (Optional) If a table name is not specified, the
* last returned records are used.
* @return integer Column ID
*/
public function GetColumnID($column, $table = "") {
$this->ResetError();
$columnNames = $this->GetColumnNames($table);
if (! $columnNames) {
return false;
} else {
$index = 0;
$found = false;
foreach ($columnNames as $columnName) {
if ($columnName == $column) {
$found = true;
break;
}
$index++;
}
if ($found) {
return $index;
} else {
$this->SetError("Column name not found", -1);
return false;
}
}
}
/**
* This function returns the field length or returns FALSE on error
*
* @param string $column Column name
* @param string $table (Optional) If a table name is not specified, the
* last returned records are used.
* @return integer Field length
*/
public function GetColumnLength($column, $table = "") {
$this->ResetError();
if (empty($table)) {
if (is_numeric($column)) {
$columnID = $column;
} else {
$columnID = $this->GetColumnID($column);
}
if (! $columnID) {
return false;
} else {
$result = mysql_field_len($this->last_result, $columnID);
if (! $result) {
$this->SetError();
return false;
} else {
return $result;
}
}
} else {
$records = mysql_query("SELECT " . $column . " FROM " . $table . " LIMIT 1");
if (! $records) {
$this->SetError();
return false;
}
$result = mysql_field_len($records, 0);
if (! $result) {
$this->SetError();
return false;
} else {
return $result;
}
}
}
/**
* This function returns the name for a specified column number. If
* the index does not exists or no records exist, it returns FALSE
*
* @param string $columnID Column position (0 is the first column)
* @param string $table (Optional) If a table name is not specified, the
* last returned records are used.
* @return integer Field Length
*/
public function GetColumnName($columnID, $table = "") {
$this->ResetError();
if (empty($table)) {
if ($this->RowCount() > 0) {
$result = mysql_field_name($this->last_result, $columnID);
if (! $result) $this->SetError();
} else {
$result = false;
}
} else {
$records = mysql_query("SELECT * FROM " . $table . " LIMIT 1");
if (! $records) {
$this->SetError();
$result = false;
} else {
if (mysql_num_fields($records) > 0) {
$result = mysql_field_name($records, $columnID);
if (! $result) $this->SetError();
} else {
$result = false;
}
}
}
return $result;
}
/**
* Returns the field names in a table or query in an array
*
* @param string $table (Optional) If a table name is not specified, the
* last returned records are used
* @return array An array that contains the column names
*/
public function GetColumnNames($table = "") {
$this->ResetError();
if (empty($table)) {
$columnCount = mysql_num_fields($this->last_result);
if (! $columnCount) {
$this->SetError();
$columns = false;
} else {
for ($column = 0; $column < $columnCount; $column++) {
$columns[] = mysql_field_name($this->last_result, $column);
}
}
} else {
$result = mysql_query("SHOW COLUMNS FROM " . $table);
if (! $result) {
$this->SetError();
$columns = false;
} else {
while ($array_data = mysql_fetch_array($result)) {
$columns[] = $array_data[0];
}
}
}
// Returns the array
return $columns;
}
/**
* This function returns the last query as an HTML table
*
* @param boolean $showCount (Optional) TRUE if you want to show the row count,
* FALSE if you do not want to show the count
* @param string $styleTable (Optional) Style information for the table
* @param string $styleHeader (Optional) Style information for the header row
* @param string $styleData (Optional) Style information for the cells
* @return string HTML containing a table with all records listed
*/
public function GetHTML($showCount = true, $styleTable = null, $styleHeader = null, $styleData = null) {
if ($styleTable === null) {
$tb = "border-collapse:collapse;empty-cells:show";
} else {
$tb = $styleTable;
}
if ($styleHeader === null) {
$th = "border-width:1px;border-style:solid;background-color:navy;color:white";
} else {
$th = $styleHeader;
}
if ($styleData === null) {
$td = "border-width:1px;border-style:solid";
} else {
$td = $styleData;
}
if ($this->last_result) {
if ($this->RowCount() > 0) {
$html = "";
if ($showCount) $html = "Record Count: " . $this->RowCount() . "<br />\n";
$html .= "<table style=\"$tb\" cellpadding=\"2\" cellspacing=\"2\">\n";
$this->MoveFirst();
$header = false;
while ($member = mysql_fetch_object($this->last_result)) {
if (!$header) {
$html .= "\t<tr>\n";
foreach ($member as $key => $value) {
$html .= "\t\t<td style=\"$th\"><strong>" . htmlspecialchars($key) . "</strong></td>\n";
}
$html .= "\t</tr>\n";
$header = true;
}
$html .= "\t<tr>\n";
foreach ($member as $key => $value) {
$html .= "\t\t<td style=\"$td\">" . htmlspecialchars($value) . "</td>\n";
}
$html .= "\t</tr>\n";
}
$this->MoveFirst();
$html .= "</table>";
} else {
$html = "No records were returned.";
}
} else {
$this->active_row = -1;
$html = false;
}
return $html;
}
/**
* Returns the last autonumber ID field from a previous INSERT query
*
* @return integer ID number from previous INSERT query
*/
public function GetLastInsertID() {
return $this->last_insert_id;
}
/**
* Returns the last SQL statement executed
*
* @return string Current SQL query string
*/
public function GetLastSQL() {
return $this->last_sql;
}
/**
* This function returns table names from the database
* into an array. If the database does not contains
* any tables, the returned value is FALSE
*
* @return array An array that contains the table names
*/
public function GetTables() {
$this->ResetError();
// Query to get the tables in the current database:
$records = mysql_query("SHOW TABLES");
if (! $records) {
$this->SetError();
return FALSE;
} else {
while ($array_data = mysql_fetch_array($records)) {
$tables[] = $array_data[0];
}
// Returns the array or NULL
if (count($tables) > 0) {
return $tables;
} else {
return FALSE;
}
}
}
/**
* Determines if a query contains any rows
*
* @param string $sql [Optional] If specified, the query is first executed
* Otherwise, the last query is used for comparison
* @return boolean TRUE if records exist, FALSE if not or query error
*/
public function HasRecords($sql = "") {
if (strlen($sql) > 0) {
$this->Query($sql);
if ($this->Error()) return false;
}
if ($this->RowCount() > 0) {
return true;
} else {
return false;
}
}
/**
* Inserts a row into a table in the connected database
*
* @param string $tableName The name of the table
* @param array $valuesArray An associative array containing the column
* names as keys and values as data. The values
* must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @return integer Returns last insert ID on success or FALSE on failure
*/
public function InsertRow($tableName, $valuesArray) {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
// Execute the query
$sql = self::BuildSQLInsert($tableName, $valuesArray);
if (! $this->Query($sql)) {
return false;
} else {
return $this->GetLastInsertID();
}
}
}
/**
* Determines if a valid connection to the database exists
*
* @return boolean TRUE idf connectect or FALSE if not connected
*/
public function IsConnected() {
if (gettype($this->mysql_link) == "resource") {
return true;
} else {
return false;
}
}
/**
* [STATIC] Determines if a value of any data type is a date PHP can convert
*
* @param date/string $value
* @return boolean Returns TRUE if value is date or FALSE if not date
*/
static public function IsDate($value) {
$date = date('Y', strtotime($value));
if ($date == "1969" || $date == '') {
return false;
} else {
return true;
}
}
/**
* Stop executing (die/exit) and show last MySQL error message
*
*/
public function Kill($message='') {
if (strlen($message) > 0) {
exit($message);
} else {
exit($this->Error());
}
}
/**
* Seeks to the beginning of the records
*
* @return boolean Returns TRUE on success or FALSE on error
*/
public function MoveFirst() {
$this->ResetError();
if (! $this->Seek(0)) {
$this->SetError();
return false;
} else {
$this->active_row = 0;
return true;
}
}
/**
* Seeks to the end of the records
*
* @return boolean Returns TRUE on success or FALSE on error
*/
public function MoveLast() {
$this->ResetError();
$this->active_row = $this->RowCount() - 1;
if (! $this->Error()) {
if (! $this->Seek($this->active_row)) {
return false;
} else {
return true;
}
} else {
return false;
}
}
/**
* Connect to specified MySQL server
*
* @param string $database (Optional) Database name
* @param string $server (Optional) Host address
* @param string $username (Optional) User name
* @param string $password (Optional) Password
* @param string $charset (Optional) Character set
* @param boolean $pcon (Optional) Persistant connection
* @return boolean Returns TRUE on success or FALSE on error
*/
public function Open($database="", $server="", $username="",
$password="", $charset="", $pcon=false) {
$this->ResetError();
// Use defaults?
if (strlen($database) == 0) $database = $this->db_dbname;
if (strlen($server) == 0) $server = $this->db_host;
if (strlen($username) == 0) $username = $this->db_user;
if (strlen($password) == 0) $password = $this->db_pass;
if (strlen($charset) == 0) $charset = $this->db_charset;
if (strlen($pcon) == 0) $pcon = $this->db_pcon;
$this->active_row = -1;
// Open persistent or normal connection
if ($pcon) {
$this->mysql_link = @mysql_pconnect($server, $username, $password);
} else {
$this->mysql_link = @mysql_connect ($server, $username, $password);
}
// Connect to mysql server failed?
if (! $this->IsConnected()) {
$this->SetError();
return false;
} else {
// Select a database (if specified)
if (strlen($database) > 0) {
if (strlen($charset) == 0) {
if (! $this->SelectDatabase($database)) {
return false;
} else {
return true;
}
} else {
if (! $this->SelectDatabase($database, $charset)) {
return false;
} else {
return true;
}
}
} else {
return true;
}
}
}
/**
* Executes the given SQL query and returns the records
*
* @param string $sql The query string should not end with a semicolon
* @return object PHP 'mysql result' resource object containing the records
* on SELECT, SHOW, DESCRIBE or EXPLAIN queries and returns;
* TRUE or FALSE for all others i.e. UPDATE, DELETE, DROP
* AND FALSE on all errors (setting the local Error message)
*/
public function Query($sql) {
$this->ResetError();
$this->last_sql = $sql;
$this->last_result = @mysql_query($sql, $this->mysql_link);
if(! $this->last_result) {
$this->active_row = -1;
$this->SetError();
return false;
} else {
if (ereg("^insert", strtolower($sql))) {
$this->last_insert_id = mysql_insert_id();
if ($this->last_insert_id === false) {
$this->SetError();
return false;
} else {
$numrows = 0;
$this->active_row = -1;
return $this->last_result;
}
} else if(ereg("^select", strtolower($sql))) {
$numrows = mysql_num_rows($this->last_result);
if ($numrows > 0) {
$this->active_row = 0;
} else {
$this->active_row = -1;
}
$this->last_insert_id = 0;
return $this->last_result;
} else {
return $this->last_result;
}
}
}
/**
* Executes the given SQL query and returns a multi-dimensional array
*
* @param string $sql The query string should not end with a semicolon
* @param integer $resultType (Optional) The type of array
* Values can be: MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
* @return array A multi-dimensional array containing all the data
* returned from the query or FALSE on all errors
*/
public function QueryArray($sql, $resultType = MYSQL_BOTH) {
$this->Query($sql);
if (! $this->Error()) {
return $this->RecordsArray($resultType);
} else {
return false;
}
}
/**
* Executes the given SQL query and returns only one (the first) row
*
* @param string $sql The query string should not end with a semicolon
* @return object PHP resource object containing the first row or
* FALSE if no row is returned from the query
*/
public function QuerySingleRow($sql) {
$this->Query($sql);
if ($this->RowCount() > 0) {
return $this->Row();
} else {
return false;
}
}
/**
* Executes the given SQL query and returns the first row as an array
*
* @param string $sql The query string should not end with a semicolon
* @param integer $resultType (Optional) The type of array
* Values can be: MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
* @return array An array containing the first row or FALSE if no row
* is returned from the query
*/
public function QuerySingleRowArray($sql, $resultType = MYSQL_BOTH) {
$this->Query($sql);
if ($this->RowCount() > 0) {
return $this->RowArray(null, $resultType);
} else {
return false;
}
}
/**
* Executes a query and returns a single value. If more than one row
* is returned, only the first value in the first column is returned.
*
* @param string $sql The query string should not end with a semicolon
* @return mixed The value returned or FALSE if no value
*/
public function QuerySingleValue($sql) {
$this->Query($sql);
if ($this->RowCount() > 0 && $this->GetColumnCount() > 0) {
$row = $this->RowArray(null, MYSQL_NUM);
return $row[0];
} else {
return false;
}
}
/**
* Executes the given SQL query, measures it, and saves the total duration
* in microseconds
*
* @param string $sql The query string should not end with a semicolon
* @return object PHP 'mysql result' resource object containing the records
* on SELECT, SHOW, DESCRIBE or EXPLAIN queries and returns
* TRUE or FALSE for all others i.e. UPDATE, DELETE, DROP
*/
public function QueryTimed($sql) {
$this->TimerStart();
$result = $this->Query($sql);
$this->TimerStop();
return $result;
}
/**
* Returns the records from the last query
*
* @return object PHP 'mysql result' resource object containing the records
* for the last query executed
*/
public function Records() {
return $this->last_result;
}
/**
* Returns all records from last query and returns contents as array
* or FALSE on error
*
* @param integer $resultType (Optional) The type of array
* Values can be: MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
* @return Records in array form
*/
public function RecordsArray($resultType=MYSQL_BOTH) {
$this->ResetError();
if ($this->last_result) {
if (! mysql_data_seek($this->last_result, 0)) {
$this->SetError();
return false;
} else {
//while($member = mysql_fetch_object($this->last_result)){
while($member = mysql_fetch_array($this->last_result, $resultType)){
$members[] = $member;
}
mysql_data_seek($this->last_result, 0);
$this->active_row = 0;
return $members;
}
} else {
$this->active_row = -1;
$this->SetError("No query results exist", -1);
return false;
}
}
/**
* Frees memory used by the query results and returns the function result
*
* @return boolean Returns TRUE on success or FALSE on failure
*/
public function Release() {
$this->ResetError();
if (! $this->last_result) {
$success = true;
} else {
$success = @mysql_free_result($this->last_result);
if (! $success) $this->SetError();
}
return $success;
}
/**
* Clears the internal variables from any error information
*
*/
private function ResetError() {
$this->error_desc = '';
$this->error_number = 0;
}
/**
* Reads the current row and returns contents as a
* PHP object or returns false on error
*
* @param integer $optional_row_number (Optional) Use to specify a row
* @return object PHP object or FALSE on error
*/
public function Row($optional_row_number = null) {
$this->ResetError();
if (! $this->last_result) {
$this->SetError("No query results exist", -1);
return false;
} elseif ($optional_row_number === null) {
if (($this->active_row) > $this->RowCount()) {
$this->SetError("Cannot read past the end of the records", -1);
return false;
} else {
$this->active_row++;
}
} else {
if ($optional_row_number >= $this->RowCount()) {
$this->SetError("Row number is greater than the total number of rows", -1);
return false;
} else {
$this->active_row = $optional_row_number;
$this->Seek($optional_row_number);
}
}
$row = mysql_fetch_object($this->last_result);
if (! $row) {
$this->SetError();
return false;
} else {
return $row;
}
}
/**
* Reads the current row and returns contents as an
* array or returns false on error
*
* @param integer $optional_row_number (Optional) Use to specify a row
* @param integer $resultType (Optional) The type of array
* Values can be: MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
* @return array Array that corresponds to fetched row or FALSE if no rows
*/
public function RowArray($optional_row_number = null, $resultType = MYSQL_BOTH) {
$this->ResetError();
if (! $this->last_result) {
$this->SetError("No query results exist", -1);
return false;
} elseif ($optional_row_number === null) {
if (($this->active_row) > $this->RowCount()) {
$this->SetError("Cannot read past the end of the records", -1);
return false;
} else {
$this->active_row++;
}
} else {
if ($optional_row_number >= $this->RowCount()) {
$this->SetError("Row number is greater than the total number of rows", -1);
return false;
} else {
$this->active_row = $optional_row_number;
$this->Seek($optional_row_number);
}
}
$row = mysql_fetch_array($this->last_result, $resultType);
if (! $row) {
$this->SetError();
return false;
} else {
return $row;
}
}
/**
* Returns the last query row count
*
* @return integer Row count or FALSE on error
*/
public function RowCount() {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection", -1);
return false;
} elseif (! $this->last_result) {
$this->SetError("No query results exist", -1);
return false;
} else {
$result = @mysql_num_rows($this->last_result);
if (! $result) {
$this->SetError();
return false;
} else {
return $result;
}
}
}
/**
* Sets the internal database pointer to the
* specified row number and returns the result
*
* @param integer $row_number Row number
* @return object Fetched row as PHP object
*/
public function Seek($row_number) {
$this->ResetError();
$row_count = $this->RowCount();
if (! $row_count) {
return false;
} elseif ($row_number >= $row_count) {
$this->SetError("Seek parameter is greater than the total number of rows", -1);
return false;
} else {
$this->active_row = $row_number;
$result = mysql_data_seek($this->last_result, $row_number);
if (! $result) {
$this->SetError();
return false;
} else {
$record = mysql_fetch_row($this->last_result);
if (! $record) {
$this->SetError();
return false;
} else {
// Go back to the record after grabbing it
mysql_data_seek($this->last_result, $row_number);
return $record;
}
}
}
}
/**
* Returns the current cursor row location
*
* @return integer Current row number
*/
public function SeekPosition() {
return $this->active_row;
}
/**
* Selects a different database and character set
*
* @param string $database Database name
* @param string $charset (Optional) Character set (i.e. utf8)
* @return boolean Returns TRUE on success or FALSE on error
*/
public function SelectDatabase($database, $charset = "") {
$return_value = true;
if (! $charset) $charset = $this->db_charset;
$this->ResetError();
if (! (mysql_select_db($database))) {
$this->SetError();
$return_value = false;
} else {
if ((strlen($charset) > 0)) {
if (! (mysql_query("SET CHARACTER SET '{$charset}'", $this->mysql_link))) {
$this->SetError();
$return_value = false;
}
}
}
return $return_value;
}
/**
* Gets rows in a table based on a WHERE filter
*
* @param string $tableName The name of the table
* @param array $whereArray (Optional) An associative array containing the
* column names as keys and values as data. The
* values must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @param array/string $columns (Optional) The column or list of columns to select
* @param array/string $sortColumns (Optional) Column or list of columns to sort by
* @param boolean $sortAscending (Optional) TRUE for ascending; FALSE for descending
* This only works if $sortColumns are specified
* @param integer/string $limit (Optional) The limit of rows to return
* @return boolean Returns records on success or FALSE on error
*/
public function SelectRows($tableName, $whereArray = null, $columns = null,
$sortColumns = null, $sortAscending = true,
$limit = null) {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
$sql = self::BuildSQLSelect($tableName, $whereArray,
$columns, $sortColumns, $sortAscending, $limit);
// Execute the UPDATE
if (! $this->Query($sql)) {
return $this->last_result;
} else {
return true;
}
}
}
/**
* Retrieves all rows in a specified table
*
* @param string $tableName The name of the table
* @return boolean Returns records on success or FALSE on error
*/
public function SelectTable($tableName) {
return $this->SelectRows($tableName);
}
/**
* Sets the local variables with the last error information
*
* @param string $errorMessage The error description
* @param integer $errorNumber The error number
*/
private function SetError($errorMessage = '', $errorNumber = 0) {
try {
if (strlen($errorMessage) > 0) {
$this->error_desc = $errorMessage;
} else {
if ($this->IsConnected()) {
$this->error_desc = mysql_error($this->mysql_link);
} else {
$this->error_desc = mysql_error();
}
}
if ($errorNumber <> 0) {
$this->error_number = $errorNumber;
} else {
if ($this->IsConnected()) {
$this->error_number = @mysql_errno($this->mysql_link);
} else {
$this->error_number = @mysql_errno();
}
}
} catch(Exception $e) {
$this->error_desc = $e->getMessage();
$this->error_number = -999;
}
if ($this->ThrowExceptions) {
throw new Exception($this->error_desc);
}
}
/**
* [STATIC] Converts a boolean into a formatted TRUE or FALSE value of choice
*
* @param mixed $value value to analyze for TRUE or FALSE
* @param mixed $trueValue value to use if TRUE
* @param mixed $falseValue value to use if FALSE
* @param string $datatype Use SQLVALUE constants or the strings:
* string, text, varchar, char, boolean, bool,
* Y-N, T-F, bit, date, datetime, time, integer,
* int, number, double, float
* @return string SQL formatted value of the specified data type
*/
static public function SQLBooleanValue($value, $trueValue, $falseValue, $datatype = self::SQLVALUE_TEXT) {
if (self::GetBooleanValue($value)) {
$return_value = self::SQLValue($trueValue, $datatype);
} else {
$return_value = self::SQLValue($falseValue, $datatype);
}
return $return_value;
}
/**
* [STATIC] Returns string suitable for SQL
*
* @param string $value
* @return string SQL formatted value
*/
static public function SQLFix($value) {
return @addslashes($value);
}
/**
* [STATIC] Returns MySQL string as normal string
*
* @param string $value
* @return string
*/
static public function SQLUnfix($value) {
return @stripslashes($value);
}
/**
* [STATIC] Formats any value into a string suitable for SQL statements
* (NOTE: Also supports data types returned from the gettype function)
*
* @param mixed $value Any value of any type to be formatted to SQL
* @param string $datatype Use SQLVALUE constants or the strings:
* string, text, varchar, char, boolean, bool,
* Y-N, T-F, bit, date, datetime, time, integer,
* int, number, double, float
* @return string
*/
static public function SQLValue($value, $datatype = self::SQLVALUE_TEXT) {
$return_value = "";
switch (strtolower(trim($datatype))) {
case "text":
case "string":
case "varchar":
case "char":
if (strlen($value) == 0) {
$return_value = "NULL";
} else {
$return_value = "'" . str_replace("'", "''", $value) . "'";
}
break;
case "number":
case "integer":
case "int":
case "double":
case "float":
if (is_numeric($value)) {
$return_value = $value;
} else {
$return_value = "NULL";
}
break;
case "boolean": //boolean to use this with a bit field
case "bool":
case "bit":
if (self::GetBooleanValue($value)) {
$return_value = "1";
} else {
$return_value = "0";
}
break;
case "y-n": //boolean to use this with a char(1) field
if (self::GetBooleanValue($value)) {
$return_value = "'Y'";
} else {
$return_value = "'N'";
}
break;
case "t-f": //boolean to use this with a char(1) field
if (self::GetBooleanValue($value)) {
$return_value = "'T'";
} else {
$return_value = "'F'";
}
break;
case "date":
if (self::IsDate($value)) {
$return_value = "'" . date('Y-m-d', strtotime($value)) . "'";
} else {
$return_value = "NULL";
}
break;
case "datetime":
if (self::IsDate($value)) {
$return_value = "'" . date('Y-m-d H:i:s', strtotime($value)) . "'";
} else {
$return_value = "NULL";
}
break;
case "time":
if (self::IsDate($value)) {
$return_value = "'" . date('H:i:s', strtotime($value)) . "'";
} else {
$return_value = "NULL";
}
break;
default:
exit("ERROR: Invalid data type specified in SQLValue method");
}
return $return_value;
}
/**
* Returns last measured duration (time between TimerStart and TimerStop)
*
* @param integer $decimals (Optional) The number of decimal places to show
* @return Float Microseconds elapsed
*/
public function TimerDuration($decimals = 4) {
return number_format($this->time_diff, $decimals);
}
/**
* Starts time measurement (in microseconds)
*
*/
public function TimerStart() {
$parts = explode(" ", microtime());
$this->time_diff = 0;
$this->time_start = $parts[1].substr($parts[0],1);
}
/**
* Stops time measurement (in microseconds)
*
*/
public function TimerStop() {
$parts = explode(" ", microtime());
$time_stop = $parts[1].substr($parts[0],1);
$this->time_diff = ($time_stop - $this->time_start);
$this->time_start = 0;
}
/**
* Starts a transaction
*
* @return boolean Returns TRUE on success or FALSE on error
*/
public function TransactionBegin() {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
if (! $this->in_transaction) {
if (! mysql_query("START TRANSACTION", $this->mysql_link)) {
$this->SetError();
return false;
} else {
$this->in_transaction = true;
return true;
}
} else {
$this->SetError("Already in transaction", -1);
return false;
}
}
}
/**
* Ends a transaction and commits the queries
*
* @return boolean Returns TRUE on success or FALSE on error
*/
public function TransactionEnd() {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
if ($this->in_transaction) {
if (! mysql_query("COMMIT", $this->mysql_link)) {
// $this->TransactionRollback();
$this->SetError();
return false;
} else {
$this->in_transaction = false;
return true;
}
} else {
$this->SetError("Not in a transaction", -1);
return false;
}
}
}
/**
* Rolls the transaction back
*
* @return boolean Returns TRUE on success or FALSE on failure
*/
public function TransactionRollback() {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
if(! mysql_query("ROLLBACK", $this->mysql_link)) {
$this->SetError("Could not rollback transaction");
return false;
} else {
$this->in_transaction = false;
return true;
}
}
}
/**
* Truncates a table removing all data
*
* @param string $tableName The name of the table
* @return boolean Returns TRUE on success or FALSE on error
*/
public function TruncateTable($tableName) {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
$sql = "TRUNCATE TABLE `" . $tableName . "`";
if (! $this->Query($sql)) {
return false;
} else {
return true;
}
}
}
/**
* Updates rows in a table based on a WHERE filter
* (can be just one or many rows based on the filter)
*
* @param string $tableName The name of the table
* @param array $valuesArray An associative array containing the column
* names as keys and values as data. The values
* must be SQL ready (i.e. quotes around
* strings, formatted dates, ect)
* @param array $whereArray (Optional) An associative array containing the
* column names as keys and values as data. The
* values must be SQL ready (i.e. quotes around
* strings, formatted dates, ect). If not specified
* then all values in the table are updated.
* @return boolean Returns TRUE on success or FALSE on error
*/
public function UpdateRows($tableName, $valuesArray, $whereArray = null) {
$this->ResetError();
if (! $this->IsConnected()) {
$this->SetError("No connection");
return false;
} else {
$sql = self::BuildSQLUpdate($tableName, $valuesArray, $whereArray);
// Execute the UPDATE
if (! $this->Query($sql)) {
return false;
} else {
return true;
}
}
}
}
?>
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717:
718:
719:
720:
721:
722:
723:
724:
725:
726:
727:
728:
729:
730:
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755:
756:
757:
758:
759:
760:
761:
762:
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816:
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
847:
848:
849:
850:
851:
852:
853:
854:
855:
856:
857:
858:
859:
860:
861:
862:
863:
864:
865:
866:
867:
868:
869:
870:
871:
872:
873:
874:
875:
876:
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907:
908:
909:
910:
911:
912:
913:
914:
915:
916:
917:
918:
919:
920:
921:
922:
923:
924:
925:
926:
927:
928:
929:
930:
931:
932:
933:
934:
935:
936:
937:
938:
939:
940:
941:
942:
943:
944:
945:
946:
947:
948:
949:
950:
951:
952:
953:
954:
955:
956:
957:
958:
959:
960:
961:
962:
963:
964:
965:
966:
967:
968:
969:
970:
971:
972:
973:
974:
975:
976:
977:
978:
979:
980:
981:
982:
983:
984:
985:
986:
987:
988:
989:
990:
991:
992:
993:
994:
995:
996:
997:
998:
999:
1000:
1001:
1002:
1003:
1004:
1005:
1006:
1007:
1008:
1009:
1010:
1011:
1012:
1013:
1014:
1015:
1016:
1017:
1018:
1019:
1020:
1021:
1022:
1023:
1024:
1025:
1026:
1027:
1028:
1029:
1030:
1031:
1032:
1033:
1034:
1035:
1036:
1037:
1038:
1039:
1040:
1041:
1042:
1043:
1044:
1045:
1046:
1047:
1048:
1049:
1050:
1051:
1052:
1053:
1054:
1055:
1056:
1057:
1058:
1059:
1060:
1061:
1062:
1063:
1064:
1065:
1066:
1067:
1068:
1069:
1070:
1071:
1072:
1073:
1074:
1075:
1076:
1077:
1078:
1079:
1080:
1081:
1082:
1083:
1084:
1085:
1086:
1087:
1088:
1089:
1090:
1091:
1092:
1093:
1094:
1095:
1096:
1097:
1098:
1099:
1100:
1101:
1102:
1103:
1104:
1105:
1106:
1107:
1108:
1109:
1110:
1111:
1112:
1113:
1114:
1115:
1116:
1117:
1118:
1119:
1120:
1121:
1122:
1123:
1124:
1125:
1126:
1127:
1128:
1129:
1130:
1131:
1132:
1133:
1134:
1135:
1136:
1137:
1138:
1139:
1140:
1141:
1142:
1143:
1144:
1145:
1146:
1147:
1148:
1149:
1150:
1151:
1152:
1153:
1154:
1155:
1156:
1157:
1158:
1159:
1160:
1161:
1162:
1163:
1164:
1165:
1166:
1167:
1168:
1169:
1170:
1171:
1172:
1173:
1174:
1175:
1176:
1177:
1178:
1179:
1180:
1181:
1182:
1183:
1184:
1185:
1186:
1187:
1188:
1189:
1190:
1191:
1192:
1193:
1194:
1195:
1196:
1197:
1198:
1199:
1200:
1201:
1202:
1203:
1204:
1205:
1206:
1207:
1208:
1209:
1210:
1211:
1212:
1213:
1214:
1215:
1216:
1217:
1218:
1219:
1220:
1221:
1222:
1223:
1224:
1225:
1226:
1227:
1228:
1229:
1230:
1231:
1232:
1233:
1234:
1235:
1236:
1237:
1238:
1239:
1240:
1241:
1242:
1243:
1244:
1245:
1246:
1247:
1248:
1249:
1250:
1251:
1252:
1253:
1254:
1255:
1256:
1257:
1258:
1259:
1260:
1261:
1262:
1263:
1264:
1265:
1266:
1267:
1268:
1269:
1270:
1271:
1272:
1273:
1274:
1275:
1276:
1277:
1278:
1279:
1280:
1281:
1282:
1283:
1284:
1285:
1286:
1287:
1288:
1289:
1290:
1291:
1292:
1293:
1294:
1295:
1296:
1297:
1298:
1299:
1300:
1301:
1302:
1303:
1304:
1305:
1306:
1307:
1308:
1309:
1310:
1311:
1312:
1313:
1314:
1315:
1316:
1317:
1318:
1319:
1320:
1321:
1322:
1323:
1324:
1325:
1326:
1327:
1328:
1329:
1330:
1331:
1332:
1333:
1334:
1335:
1336:
1337:
1338:
1339:
1340:
1341:
1342:
1343:
1344:
1345:
1346:
1347:
1348:
1349:
1350:
1351:
1352:
1353:
1354:
1355:
1356:
1357:
1358:
1359:
1360:
1361:
1362:
1363:
1364:
1365:
1366:
1367:
1368:
1369:
1370:
1371:
1372:
1373:
1374:
1375:
1376:
1377:
1378:
1379:
1380:
1381:
1382:
1383:
1384:
1385:
1386:
1387:
1388:
1389:
1390:
1391:
1392:
1393:
1394:
1395:
1396:
1397:
1398:
1399:
1400:
1401:
1402:
1403:
1404:
1405:
1406:
1407:
1408:
1409:
1410:
1411:
1412:
1413:
1414:
1415:
1416:
1417:
1418:
1419:
1420:
1421:
1422:
1423:
1424:
1425:
1426:
1427:
1428:
1429:
1430:
1431:
1432:
1433:
1434:
1435:
1436:
1437:
1438:
1439:
1440:
1441:
1442:
1443:
1444:
1445:
1446:
1447:
1448:
1449:
1450:
1451:
1452:
1453:
1454:
1455:
1456:
1457:
1458:
1459:
1460:
1461:
1462:
1463:
1464:
1465:
1466:
1467:
1468:
1469:
1470:
1471:
1472:
1473:
1474:
1475:
1476:
1477:
1478:
1479:
1480:
1481:
1482:
1483:
1484:
1485:
1486:
1487:
1488:
1489:
1490:
1491:
1492:
1493:
1494:
1495:
1496:
1497:
1498:
1499:
1500:
1501:
1502:
1503:
1504:
1505:
1506:
1507:
1508:
1509:
1510:
1511:
1512:
1513:
1514:
1515:
1516:
1517:
1518:
1519:
1520:
1521:
1522:
1523:
1524:
1525:
1526:
1527:
1528:
1529:
1530:
1531:
1532:
1533:
1534:
1535:
1536:
1537:
1538:
1539:
1540:
1541:
1542:
1543:
1544:
1545:
1546:
1547:
1548:
1549:
1550:
1551:
1552:
1553:
1554:
1555:
1556:
1557:
1558:
1559:
1560:
1561:
1562:
1563:
1564:
1565:
1566:
1567:
1568:
1569:
1570:
1571:
1572:
1573:
1574:
1575:
1576:
1577:
1578:
1579:
1580:
1581:
1582:
1583:
1584:
1585:
1586:
1587:
1588:
1589:
1590:
1591:
1592:
1593:
1594:
1595:
1596:
1597:
1598:
1599:
1600:
1601:
1602:
1603:
1604:
1605:
1606:
1607:
1608:
1609:
1610:
1611:
1612:
1613:
1614:
1615:
1616:
1617:
1618:
1619:
1620:
1621:
1622:
1623:
1624:
1625:
1626:
1627:
1628:
1629:
1630:
1631:
1632:
1633:
1634:
1635:
1636:
1637:
1638:
1639:
1640:
1641:
1642:
1643:
1644:
1645:
1646:
1647:
1648:
1649:
1650:
1651:
1652:
1653:
1654:
1655:
1656:
1657:
1658:
1659:
1660:
1661:
1662:
1663:
1664:
1665:
1666:
1667:
1668:
1669:
1670:
1671:
1672:
1673:
1674:
1675:
1676:
1677:
1678:
1679:
1680:
1681:
1682:
1683:
1684:
1685:
1686:
1687:
1688:
by: mr_egyptianPosted on 2008-01-14 at 21:10:12ID: 20660291
I received no error calling this script stand alone, or including it and creating an instance.