get_last_error(); trigger_error("Database does not exist", E_USER_ERROR); die(); } // Sqlite doesn't use dbname param $dsn = (stripos($type, "sqlite") === FALSE) ? "{$type}:dbname={$db}" : "{$type}:{$db}"; // Set hostname if applicable if(isset($host)) { $dsn .= ($host !== "") ? ";host={$host}" : ""; } // Set port if applicable if(isset($port)) { $dsn .= ($port !== "") ? ";port={$port}" : ""; } $user = ( ! empty($user)) ? $user : null; $pass = ( ! empty($pass)) ? $pass : null; // Pre-set the error mode $opts = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ); $options = $opts + $options; return new db($dsn, $user, $pass, $options); } // -------------------------------------------------------------------------- /** * Constructor to override PDO constructor - Quercus doesn't seem to override * the parent constructor unless the arguments match. * * @param string $dsn * @param string $user * @param string $pass * @param array $options */ function __construct($dsn, $user, $pass, $options) { // Let's try connecting now! parent::__construct($dsn, $user, $pass, $options); } // -------------------------------------------------------------------------- /** * Magic function called when cloning an object */ public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } // -------------------------------------------------------------------------- /** * PHP magic method to facilitate dynamic methods * * @param string $name * @param array $args */ function __call($name, $args) { if(is_callable($this->$name)) { //Add $this to the beginning of the args array array_unshift($args, $this); //Call the dynamic function return call_user_func_array($this->$name, $args); } } // -------------------------------------------------------------------------- /** * PHP magic methods to call non-static methods statically * * @param string $name * @param array $args */ public static function __callStatic($name, $args) { if(is_callable(parent::$name)) { return call_user_func_array(parent::$name, $args); } } // -------------------------------------------------------------------------- /** * Prints out the contents of the object when used as a string * * @return string */ function __toString() { if(ENVIRONMENT == 'DEVELOPMENT') { $args = func_get_args(); $method = ( ! empty($args)) ? $args[0] : "print_r"; $data = (isset($args[1])) ? $args[1] : array(); if(empty($data)) { $data =& $this; } $output = '
'; if($method == "var_dump") { ob_start(); var_dump($data); $output .= ob_get_contents(); ob_end_clean(); } else if($method == "var_export") { ob_start(); var_export($data); $output .= ob_get_contents(); ob_end_clean(); } else { $output .= print_r($data, TRUE); } return $output . ''; } else { return ''; } } // -------------------------------------------------------------------------- /** * Simplifies prepared statements for database queries * * @param string $sql * @param array $data * @return mixed PDOStatement / FALSE */ function prepare_query($sql, $data) { // Prepare the sql $query = $this->prepare($sql); if( ! is_like_array($query)) { $this->get_last_error(); return FALSE; } // Set the statement in the class variable for easy later access $this->statement =& $query; if( ! is_like_array($data)) { trigger_error("Invalid data argument"); return FALSE; } // Bind the parameters foreach($data as $k => $value) { $res = $query->bindValue($k, $value); if( ! $res) { trigger_error("Parameter not successfully bound"); return FALSE; } } return $query; } // -------------------------------------------------------------------------- /** * Returns the last error from the database * * @return string */ function get_last_error() { $error = array(); if(isset($this->statement)) { $error = $this->statement->errorInfo(); } else { $error = $this->errorInfo(); } $code = $error[0]; $driver_code = $error[1]; $message = $error[2]; // Contain the content for buffering ob_start(); include(APP_PATH.'/errors/error_db.php'); $buffer = ob_get_contents(); ob_end_clean(); echo $buffer; } } // End of db.php