getError();
  *
  * Execute a query to the database:
  * 
  * $database->query("SELECT * FROM databaseName WHERE id = '1'";)
  * 
  * You can also get the inserted ID of the query you executed:
  * 
  * $insertedId = $database->insert("TABLE", "record1,record2,record3", "value1,value2,value3";)
  * Example: INSERT INTO USERS,firstname,lastname,VALUES('Amber','Heard') WHERE ADDRESS = 'Dark avenue 2';
  * Example: $insertedID = $database->insert("USERS","ADDRESS='Dark avenue 2','Amber',Heard'");
  *
  * Get the rowCount of an execute query
  *
  * echo $database->rowcount();
  *
  * Delete a row in the database
  *
  * $database->query("DELETE FROM USERS WHERE ID=1;"); 
  * 
  * Get the affected rows affected by the delete statement
  * 
  * $affectedRows = $database->delete("USERS", "ID=1");
  *
  * Update rows in the database
  *
  * Example:    $database->query("UPDATE USERS SET firstname='Joyce' WHERE ID=1;"); 
  * Example 2:  $affectedRows = $database->update("USERS", "FIRSTNAME='Joyce'", "ID=1"); 
  *
  * Get the ID that was inserted last in the database
  * 
  * $lastID = $database->getLatestId("Table","recordName"); 
  *
  * Example: $lastID = $database->getLatestId("USERS","Firstname");
  *
  * Create a Anti-SQL injection statement to the database
  *
  * $parameters = array(":id@0@INT", ":firstname@amber@STR"); 
  * $ID = $database->query_secure("INSERT INTO USERS (id,firstname) VALUES(:id,:firstname);", $parameters, false); 
  * (If the last false statement in the query above is set to true the class will return the resultset of the record)
  * (else if the last false statement in the query above is set to false you will get a true of false idenitifying if * the query was executed successfully to the database).
  *
  * The $ID variable will now hold the last inserted ID.
  * 
  * Show all the table that are in your database
  * 
  * $result = $database->ShowTables("databaseName");
  * Example: $result = $database->ShowTables("school"); 
  *
  * Output the result to the screen in a clean way:
  *
  * foreach($result as $row){ 
  * $i++;
  * echo "$row[$i]" . "
";
  *
  * Show all the databases this class holds (get all the databases you got permissions for)
  *
  * $result = $database->showDatabases();
  *
  * Output the result to the screen in a clean way:
  *
  * foreach($result as $row){ 
  * $i++;
  * echo "$row[$i]" . "
";
  *
  * close the database connection;
  *
  * $database->close();
 */
class Database
{
    // Create an array with all the database types this class can connect to
    private $database_types = array("databaselibrary",        // Database Library (used by PHP)
                                    "firebird",               // firebird
                                    "ibm",                    // IBM
                                    "informix",               // Informix
                                    "mssql",                  // Microsoft SQL (<= 2000)
                                    "mysql",                  // mysql
                                    "odbc",                   // Open database connectivity (Microsoft Access)
                                    "oracle",                 // Oracle
                                    "postgre",                // Postgre SQL
                                    "sqlite2",                // SQLite 2
                                    "sqlite3",                // SQLite 3
                                    "sql",                    // Microsoft SQL
                                    );
    private $server;        // This variable holds the host name of the server (serverName) used by the application
    private $database;      // This variable holds the databaseName of the database used by the application
    private $user;          // This variable holds the userName of the database used by the application
    private $password;      // This variable holds the password of the database used by the application
    private $port;          // This variable holds the port of the database used by the application
    private $database_type; // This variable holds the database type of the database used by the application
    private $root_mdb;      // This variable holds the root mdb of the database used by the application
    private $debug = false; // This variable holds the debugging state of the class
    
    private $sql;           // This variable holds all the sql connection parameters
    private $con;           // This variable holds the connection of the database used by the application
    private $err_msg = "";  // This variable holds the error message that was trown by the database (if exists)
    
    /**
    * Create the constructor
    * @param string $database_types (specify the database connection)
    * 
    * These are the database connection that are accepted by this class:
    * 
    * connection name   -   connection description
    * --------------------------------------------
    * databaselibrary       Database Library database (used by PHP)
    * firebird              firebird database
    * ibm                   IBM database
    * informix              Informix database
    * mssql                 Microsoft SQL Server  database (V. 2000 and lower)
    * mysql                 mysql database
    * odbc                  Open database connectivity (Microsoft Access)
    * oracle                Oracle database
    * postgre               postgre SQL database
    * sqlite2               SQLite 2 database
    * sqlite3               SQLite 3 database
    * sql                   Microsoft SQL
    * 
    * @param string $server     (The server where the database is located)
    * @param string $database   (The name of the database)
    * @param string $user       (The userName of the connection to the database)
    * @param string $password   (The password of the connection to the database)
    *
    */
    
    // Create the constructor and initialise the connection to the specified server
    public function __construct($database_type,$server,$database,$user,$password,$port)
    {
        $this->database_type = strtolower($database_type);
        $this->server = $server;
        $this->database = $database;
        $this->user = $user;
        $this->password = $password;
        $this->port = $port;
    }
    
    // initialise class and connects to the database
    public function open()
    {
        if(in_array($this->database_type, $this->database_types))
        {   
            try {
                switch ($this->database_type)
                {
                    // Database Library connection
                    case "databaselibrary":     // default port used by database => 10060
                            $this->con = new PDO("dblib:host=".$this->server.
                                                 ":".$this->port.";
                                                 dbname=".$this->database,$this->user,$this->password
                                                );
                            break;
                
                    // firebird connection
                    case "firebird":            // default port used by database => 3050
                            $this->con = new PDO("firebird:dbname=".$this->server.
                                                 ":".$this->database, $this->user, $this->password
                                                );
                            break;
                
                    // ibm connection
                    case "ibm":
                                $this->con = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=".$this->database.";  HOSTNAME=".$this->host.";
                                    PORT=".$this->port.";
                                    PROTOCOL=TCPIP;", 
                                    $this->user, $this->password
                                );
                            break;
                    
                    // informix connection
                    
                    case "informix":
                            $this->con = new PDO("informix:DSN=InformixDB", $this->user, $this->password);
                            break;
                    
                    // mssql connection
                    
                    case "mssql":
                            $this->con = new PDO("mssql:host=".$this->server.";
                                                 dbname=".$this->database, $this->user, $this->password
                                                );
                            break;
                    // mysql connection
                    
                    case "mysql":
                        if ($this->port != "") {
                            $this->con = new PDO("mysql:host=".$this->server.";
                                                  port=".$this->port.";
                                                  dbname=".$this->database, $this->user, $this->password
                                                );
                        }else{
                            $this->con = new PDO("mysql:host=".$this->server.";
                                                 dbname=".$this->database, $this->user, $this->password
                                                );
                        }
                        break;                   
                    // open database connectivity
                    
                    case "odbc":
                        $this->con = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};
                                             Dbq=C:\accounts.mdb;Uid=".$this->user
                                            );
                        break;
                    
                    // oracle connection
                    
                    case "oracle":
                        $this->con = new PDO("OCI:dbname=".$this->database.";
                                             charset=UTF-8", $this->user, $this->password
                                            );
                        break;
                    
                    // postgre connection
                    
                    case "postgre":
                        
                        if($this->port!="")
                        {
                            $this->con = new PDO("pgsql:dbname=".$this->database.";
                                                 port=".$this->port.";
                                                 host=".$this->server, $this->user, $this->password
                                                );
                        }
                        else
                        {
                            $this->con = new PDO("pgsql:dbname=".$this->database.";
                                                 host=".$this->server, $this->user, $this->password
                                                );
                        }
                    break;
                    // sqlite2 connection
                    
                    case "sqlite2":
                        $this->con = new PDO("sqlite:".$this->server);
                        break;
                    
                    // sqlite3 connection
                    
                    case "sqlite3":
                        $this->con = new PDO("sqlite::memory");
                        break;
                    
                    // sql connection
                    
                    case "sql":
                        $this->con = new PDO("sqlsrv:server=".$this->server.";
                                             database=".$this->database, $this->user, $this->password
                                            );
            }
                
                    if ($this->debug)
                    {
                       $this->showDebugInformation();
                    } 
                        else 
                        {
                                    // Create the exception that will be thrown by the PDO if there is an error
                                    $this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
                        }
                return $this->con;
            }
            catch(PDOException $e)
            {
                $this->log ("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("The parameters that are given are invalid. 
                        Possible reasons: 
                        1. The parameters that are given are invalid for the class. 
                        2. The database connection is not supported by the class.
                        Please contact the administrator of the application. => info@SuperSmash.nl"
                    );
            return false;
        }
    }
    
            private function log($message)
            {
                $this->err_msg = "SuperSmash Database Connection class:
                                  =====================================
                                  $message";
            }
            private function showDebugInformation(){
        
                // Create the exception that will be thrown by the PDO if there is an error
                $this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                // The following extra attributes will only be shown in debugging mode
                    // Create the exception that will be thrown by the PDO if there is a warning
                    $this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
                
                    // Create the exception that will be thrown by the PDO if there is an error  (silent mode)
                    $this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
                                
                // Log all database connection information (for debugging)     
                echo "SuperSmash Database debug information:
                                  ============================
";
                    echo "Status: " . $this->con->getAttribute(PDO::ATTR_CONNECTION_STATUS) . "
";
                    echo "Drivername: " . $this->con->getAttribute(PDO::ATTR_DRIVER_NAME) . "
";
                    echo "Serverversion: " . $this->con->getAttribute(PDO::ATTR_SERVER_VERSION) . "
";
                    echo "Clientversion: " . $this->con->getAttribute(PDO::ATTR_CLIENT_VERSION) . "
";
                    echo "Serverinfo: " . $this->con->getAttribute(PDO::ATTR_SERVER_INFO) . "
";
                    die();
            }
    // Print all the available drivers to the screen (for instant debugging off supported drivers)
    public function drivers()
    {
        print_r(PDO::getAvailableDrivers()); 
    }
    //Execute the query to the database
    public function query($sql_statement)
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            try 
            {
                $this->sql=$sql_statement;
                return $this->con->query($this->sql);
            } 
            catch(PDOException $e) 
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    //Execute queries with Anti SQL injection
    public function query_secure($sql_statement, $params, $fetch_rows=false)
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            $obj = $this->con->prepare($sql_statement);
            for($i=0;$ibindParam($params_split[0], $params_split[1], PDO::PARAM_INT);
                else
                    $obj->bindParam($params_split[0], $params_split[1], PDO::PARAM_STR);
            }
            try 
            {
                $obj->execute();
            }
            catch(PDOException $e)
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
            if($fetch_rows)
                return $obj->fetchAll();
            if(is_numeric($this->con->lastInsertId()))
                return $this->con->lastInsertId();
            return true;
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Get the first row of a query in the database
    public function query_first($sql_statement)
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            try 
            {
                $sttmnt = $this->con->prepare($sql_statement);
                $sttmnt->execute();
                return $sttmnt->fetch();
            } 
            catch(PDOException $e) 
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Get the first tableCell from a query in the database
    public function query_single($sql_statement)
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            try 
            {
                $sttmnt = $this->con->prepare($sql_statement);
                $sttmnt->execute();
                return $sttmnt->fetchColumn();
            } 
            catch(PDOException $e)
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Return the rowcount of a query in the database
    public function rowcount()
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            try 
            {
                $stmnt_tmp = $this->stmntCount($this->sql);
                if($stmnt_tmp!=false && $stmnt_tmp!="")
                {
                    return $this->query_single($stmnt_tmp);
                }
                else
                {
                    $this->log("Error: A few data required.");
                    return -1;
                }
            } 
            catch(PDOException $e)
            {
                $this->log("Error: ". $e->getMessage());
                return -1;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Return all the colum names in the database (as an array)
    public function columns($table)
    {
        $this->err_msg = "";
        $this->sql="Select * From $table";
        if($this->con!=null)
        {
            try 
            {
                $q = $this->con->query($this->sql);
                $column = array();
                foreach($q->fetch(PDO::FETCH_ASSOC) as $key=>$val)
                {
                     $column[] = $key;
                }
                return $column;
            } 
            catch(PDOException $e)
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Insert the query and get the new ID from the database
    public function insert($table, $data){
        $this->err_msg = "";
        if($this->con!=null)
        {
            try 
            {
                $texto = "Insert Into $table (";
                $texto_extra = ") Values (";
                $texto_close = ")";
                $data_column = explode(",", $data);
                for($x=0;$xcon->exec("$texto $texto_extra $texto_close");
                return $this->con->lastInsertId();
            } 
            catch(PDOException $e) 
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Update the tables in the database
    public function update($table, $data, $condition="")
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            try 
            {
                return (trim($condition)!="") ? $this->con->exec("update $table set $data where $condition") : $this->con->exec("update $table set $data");
            }
             catch(PDOException $e) 
             {
                $this->err_msg = "Error: ". $e->getMessage();
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Delete a record from the database
    public function delete($table, $condition="")
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            try
            {
                return (trim($condition)!="") ? $this->con->exec("delete from $table where $condition") : $this->con->exec("delete from $table");
            } 
            catch(PDOException $e)
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    //Execute Store Procedures
    public function execute($sp_query)
    {
        $this->err_msg = "";
        if($this->con!=null)
        {
            try 
            {
                $this->con->exec("$sp_query");
                return true;
            } 
            catch(PDOException $e)
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    // Get the latest ID from the specified table in the database
    public function getLatestId($db_table, $table_field)
    {
        $this->err_msg = "";
        $sql_statement = "";
        $dbtype = $this->database_type;
        
        if($dbtype=="sql" || $dbtype=="mssql" || $dbtype=="ibm" || $dbtype=="databaselibrary" || $dbtype=="odbc")
        {
            $sql_statement = "select top 1 $table_field from $db_table order by $table_field desc";
        }
        if($dbtype=="oracle")
        {
            $sql_statement = "select $table_field from $db_table where ROWNUM<=1 order by $table_field desc";
        }
        if($dbtype=="informix" || $dbtype=="firebird")
        {
            $sql_statement = "select first 1 $table_field from $db_table order by $table_field desc";
        }
        if($dbtype=="mysql" || $dbtype=="sqlite2" || $dbtype=="sqlite3")
        {
            $sql_statement = "select $table_field from $db_table order by $table_field desc limit 1";
        }
        if($dbtype=="postgre")
        {
            $sql_statement = "select $table_field from $db_table order by $table_field desc limit 1 offset 0";
        }
        
        if($this->con!=null)
        {
            try 
            {
                return $this->query_single($sql_statement);
            } 
            catch(PDOException $e) 
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    //Get all the tables from a specified database
    public function ShowTables($database)
    {
        $this->err_msg = "";
        $complete = "";     
        $sql_statement = "";        
        $dbtype = $this->database_type;
        
        if($dbtype=="sql" || $dbtype=="mssql" || $dbtype=="ibm" || $dbtype=="databaselibrary" || $dbtype=="odbc" || $dbtype=="sqlite2" || $dbtype=="sqlite3")
        {
            $sql_statement = "select name from sysobjects where xtype='U'";
        }
        if($dbtype=="oracle")
        {
            //If the query statement fail, try with uncomment the next line:
            //$sql_statement = "SELECT table_name FROM tabs";
            $sql_statement = "SELECT table_name FROM cat";
        }
        if($dbtype=="informix" || $dbtype=="firebird")
        {
            $sql_statement = "SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL ORDER BY RDB$RELATION_NAME";
        }
        if($dbtype=="mysql")
        {
            if($database!="")
              { 
                $complete = " from $database"; 
              }
            $sql_statement = "show tables $complete";
        }
        if($dbtype=="postgre")
        {
            $sql_statement = "select relname as name from pg_stat_user_tables order by relname";
        }
        
        if($this->con!=null)
        {
            try 
            {
                $this->sql=$sql_statement;
                return $this->con->query($this->sql);           
            } 
            catch(PDOException $e) 
            {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    //Get all databases that exists on the server (and where you got permission to use them)
    public function showDatabases()
    {
        $this->err_msg = "";
        $sql_statement = "";        
        $dbtype = $this->database_type;
        
        if($dbtype=="sql" || $dbtype=="mssql" || $dbtype=="ibm" || $dbtype=="databaselibrary" || $dbtype=="odbc" || $dbtype=="sqlite2" || $dbtype=="sqlite3")
        {
            $sql_statement = "SELECT name FROM sys.Databases";
        }
        if($dbtype=="oracle")
        {
            //If the query statement fail, try with uncomment the next line:
            //$sql_statement = "select * from user_tablespaces";
            $sql_statement = "select * from v$database";
        }
        if($dbtype=="informix" || $dbtype=="firebird")
        {
            $sql_statement = "";
        }
        if($dbtype=="mysql")
        {
            $sql_statement = "SHOW DATABASES";
        }
        if($dbtype=="postgre")
        {
            $sql_statement = "select datname as name from pg_database";
        }
        
        if($this->con!=null)
        {
            try 
            {
                $this->sql=$sql_statement;
                return $this->con->query($this->sql);           
            }
             catch(PDOException $e) 
             {
                $this->log("Error: ". $e->getMessage());
                return false;
            }
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }   
    }
    
    //Get the latest error ocurred in the connection
    public function getError()
    {
        return trim($this->err_msg)!="" ? "".$this->err_msg."
" : "";
    }
    
    //Disconnect from database
    public function close()
    {
        $this->err_msg = "";
        if($this->con)
        {
            $this->con = null;
            return true;
        }
        else
        {
            $this->log("Error: Connection to database lost.");
            return false;
        }
    }
    
    //Build the query neccesary for the count(*) in rowcount method
    private function stmntCount($query_stmnt)
    {
        if(trim($query_stmnt)!="")
        {
            $query_stmnt = trim($query_stmnt);
            $query_split = explode(" ",$query_stmnt);
            $query_flag = false;
            $query_final = "";      
            for($x=0;$x