From a5e004d6b4c8715e8b29b1c81818b652aee13578 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Fri, 27 Jan 2012 12:12:22 -0500 Subject: [PATCH] Removed do_curl() function, various improvements --- src/sys/common.php | 44 +--- src/sys/db.php | 53 +++-- src/sys/miniMVC.php | 531 ++++++++++++++++---------------------------- 3 files changed, 220 insertions(+), 408 deletions(-) diff --git a/src/sys/common.php b/src/sys/common.php index c31e34a..37e6eed 100644 --- a/src/sys/common.php +++ b/src/sys/common.php @@ -354,49 +354,7 @@ function site_url($segment) // -------------------------------------------------------------------------- -/** - * Wrapper function to simplify using curl - * - * @param string $url - * @param array $options - * @return mixed - */ -function do_curl($url, $options=array()) -{ - $cookie = tempnam ("/tmp", "CURLCOOKIE"); - $ch = curl_init($url); - - //Use the user's User Agent and Cookies - $opts= array( - CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'], - CURLOPT_COOKIEJAR => $cookie, - CURLOPT_FOLLOWLOCATION => TRUE, - CURLOPT_ENCODING => "", - CURLOPT_RETURNTRANSFER => TRUE, - CURLOPT_AUTOREFERER => TRUE, - CURLOPT_SSL_VERIFYPEER => FALSE, - CURLOPT_CONNECTTIMEOUT => 10, - CURLOPT_TIMEOUT => 10, - CURLOPT_MAXREDIRS => 10, - CURLOPT_PROTOCOLS => array(CURLPROTO_HTTP,CURLPROTO_HTTPS) - ); - - //Set default options - curl_setopt_array($ch, $opts); - - //Set additional options - curl_setopt_array($ch, $options); - - return curl_exec($ch); -} - -// -------------------------------------------------------------------------- - // Load Most Common libraries -require_once('miniMVC.php'); -require_once('output.php'); -require_once('page.php'); -require_once('db.php'); -require_once('r.php'); +array_map('require_once', glob(SYS_PATH.'*.php')); // End of common.php \ No newline at end of file diff --git a/src/sys/db.php b/src/sys/db.php index d4603a3..d6b8466 100644 --- a/src/sys/db.php +++ b/src/sys/db.php @@ -152,31 +152,44 @@ class db extends PDO { */ function __toString() { - $args = func_get_args(); - $method = ( ! empty($args)) ? $args[0] : "print_r"; + if(ENVIRONMENT == 'DEVELOPMENT') + { + $args = func_get_args(); + $method = ( ! empty($args)) ? $args[0] : "print_r"; + $data = (isset($args[1])) ? $args[1] : array(); - $output = '
';
-	
-		if($method == "var_dump")
-		{
-			ob_start();
-			var_dump($this);
-			$output .= ob_get_contents();
-			ob_end_clean();
+			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 if($method == "var_export") - { - ob_start(); - var_export($this); - $output .= ob_get_contents(); - ob_end_clean(); - } else { - $output .= print_r($this, TRUE); + return ''; } - - return $output . '
'; } // -------------------------------------------------------------------------- diff --git a/src/sys/miniMVC.php b/src/sys/miniMVC.php index 21d6617..cf7815e 100644 --- a/src/sys/miniMVC.php +++ b/src/sys/miniMVC.php @@ -9,62 +9,151 @@ * @link https://github.com/timw4mail/miniMVC * @license http://philsturgeon.co.uk/code/dbad-license */ - + // -------------------------------------------------------------------------- - + /** - * There should be a generic "Object" class, stdClass is dumb + * Extend PHP's PDO class to add some more functionality + * + * @extends PDO */ -class Object extends stdClass {} +class db extends PDO { -/** - * Parent class of base class, contains much of the magic - */ -class JSObject extends Object{ + private $statement; + private static $instance = array(); + + public static function &get_instance($dbname="default", $options=array()) + { + if ( ! isset(self::$instance[$dbname])) + { + //echo 'Creating new instance of db class.'; + self::$instance[$dbname] = self::_get_conf($dbname, $options); + } + return self::$instance[$dbname]; + } + + // -------------------------------------------------------------------------- + /** - * Constructor for creating the objects + * Makes DSN from config file, and creates database object + * + * @param string $dbname + * @param array $options + * @return db object + */ + private static function _get_conf($dbname="default", $options=array()) + { + // Include the database config file + require(APP_PATH.'config/db.php'); + + // Get the correct database in the config file + if(is_like_array($db_conf[$dbname])) + { + // Array manipulation is too verbose + extract($db_conf[$dbname]); + } + else + { + // Apparently the database doesn't exist + $this->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 __construct($members = array()) + function __call($name, $args) { - // Add the passed parameters to the object - foreach($members as $name => $value) + if(is_callable($this->$name)) { - $this->$name = $value; + //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 method to facilitate dynamic methods - * - * @param string $name - * @param array $args - */ - function __call($name, $args) - { - if(is_callable($this->$name)) - { - //Add $this object to args - array_push($args, $this); - - //Call the dynamic function - return call_user_func_array($this->$name, $args); - } - } - - /** - * PHP magic method to facilitate dynamically set static methods - * - * @param string $name - * @param array $args - */ - public static function __callStatic($name, $args) - { - if(is_callable(self::$name)) - { - return call_user_func_array(self::$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 @@ -113,333 +202,85 @@ class JSObject extends Object{ } } + // -------------------------------------------------------------------------- + /** - * PHP magic method to facilitate dynamic class loading + * Simplifies prepared statements for database queries * - * @param string $name + * @param string $sql + * @param array $data + * @return mixed PDOStatement / FALSE */ - function __get($name) - { - $path = SYS_PATH."{$name}.php"; - $class = "{$name}"; - - if(class_exists($class, FALSE)) + function prepare_query($sql, $data) + { + // Prepare the sql + $query = $this->prepare($sql); + + if( ! is_like_array($query)) { - if( ! isset($this->$name)) - { - $this->$name = new $class; - return; - } + $this->get_last_error(); + return FALSE; } - - load_file($name, 'sys'); + + // 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(class_exists($class, FALSE)) - { - $this->$name = new $class; - } - } - - /** - * PHP magic method that is called when an object is treated as a function - */ - public static function __invoke() - { - $class = __CLASS__; - return new $class; - } -} - -// -------------------------------------------------------------------------- - -/** - * Base class for the framework - * - * @extends JSObject - */ -class miniMVC extends JSObject{ - - private static $instance; - private static $count; - - /** - * Constructor - Any classes loaded here become subclasses of miniMVC - */ - function __construct() - { - self::$instance =& $this; - } - - /** - * PHP magic method to facilitate dynamic methods - * - * @param string $name - * @param array $args - */ - function __call($name, $args) - { - if(is_callable(self::$instance->$name)) - { - //Add $this object to args - array_push($args, $this); - - //Call the dynamic function - return call_user_func_array(self::$instance->$name, $args); - } - } - - /** - * Magic function called when cloning an object - */ - public function __clone() - { - trigger_error('Clone is not allowed.', E_USER_ERROR); - } - - /** - * PHP magic method that is called when an object is treated as a function - */ - public static function __invoke() - { - return self::get_instance(); - } - - /** - * Singleton getter function - * - * @return miniMVC object - */ - public static function &get_instance() - { - if( ! isset(self::$count)) - { - self::$count = 0; - } - - if ( ! isset(self::$instance)) - { - self::$count++; - self::$instance = new miniMVC; - } - - $self =& self::$instance; - - return $self; - } - - /** - * Method to load classes into the singleton - * - * @param string $name - */ - function load_class($name, $type='class') - { - switch($type) - { - default: - $path = APP_PATH . "classes/{$name}.php"; - break; - - case "sys": - $path = SYS_PATH . "{$name}.php"; - break; - } - - // In a subdirectory? No problem - if(strpos("/", $name) !== FALSE) - { - $n = explode("/", $name); - $name = $n[count($n) -1]; - } - - $class = "{$name}"; - - if(class_exists($class, FALSE)) - { - if ( ! isset($this->$name)) + if( ! $res) { - $this->$name = new $class; - return; + trigger_error("Parameter not successfully bound"); + return FALSE; } } - if(is_file($path)) - { - require_once($path); - - if(class_exists($class, FALSE)) - { - if ( ! isset($this->$name)) - { - $this->$name = new $class; - return; - } - } - } + return $query; + } + // -------------------------------------------------------------------------- + /** - * Convenience function to remove an object from the singleton + * Returns the last error from the database * - * @param string $name + * @return string */ - function unload($name) + function get_last_error() { - if(isset($this->$name)) - { - unset($this->$name); - } - } - - /** - * Convenience function to load config files - * - * @param string $name - */ - function load_config($name) - { - $path = APP_PATH . "config/{$name}.php"; - - if(is_file($path)) - { - require_once($path); - } - } -} + $error = array(); -// -------------------------------------------------------------------------- - -/** - * Base Controller Class - * - * @extends miniMVC - */ -class MM_Controller extends miniMVC { - - public $output, $page; - - function __construct() - { - parent::__construct(); - - $this->output = new Output(); - $this->page = new Page(); - } - - /** - * Function for loading a model into the current controller - * - * @param string $file - */ - function load_model($file, $args=array()) - { - $path = ""; - - // The module is the lower of the class name - // need to figure out a way to allow multiple controllers - // in one module - $module = strtolower(get_class($this)); - - $not_modules = array('miniMVC', 'page', 'db', 'output'); - - // If it's a module, look in the module view folder - if( ! in_array($module, $not_modules)) + if(isset($this->statement)) { - $path = MOD_PATH . "{$module}/models/{$file}.php"; - } - - if(is_file($path)) - { - require_once($path); - } - - if( ! empty($args)) - { - - $this->$file = new $file($args); + $error = $this->statement->errorInfo(); } else { - $this->$file = new $file; + $error = $this->errorInfo(); } - } - - /** - * Function for loading a view - * - * @param string $file - * @param array $data - * @return mixed - */ - function load_view($file, $data, $return=FALSE) - { - $path = ""; - - // The module is the lower of the class name - // need to figure out a way to allow multiple controllers - // in one module - $module = strtolower(get_class($this)); - - $not_modules = array('miniMVC', 'page', 'db', 'output'); - - // If it's a module, look in the module view folder - if( ! in_array($module, $not_modules)) - { - $path = MOD_PATH . "{$module}/views/{$file}.php"; - } - - // If it's not a module, or doesn't exist in the module view folder - // look in the app view folder - if( ! is_file($path)) - { - $path = APP_PATH . "views/{$file}.php"; - } - + + $code = $error[0]; + $driver_code = $error[1]; + $message = $error[2]; + // Contain the content for buffering ob_start(); - - // Extract the data array - extract($data); - - // Include the file - include($path); - + + include(APP_PATH.'/errors/error_db.php'); + $buffer = ob_get_contents(); ob_end_clean(); - - if($return == TRUE) - { - return $buffer; - } - else - { - $this->output->append_output($buffer); - } - + echo $buffer; } } -// -------------------------------------------------------------------------- - -/** - * Base Model Class - * - * @extends miniMVC - */ -class MM_Model extends miniMVC { - - function __construct() - { - parent::__construct(); - } - - /** - * Adds the database class to the current model class - */ - function load_db($name="default") - { - $this->db = db::get_instance($name); - } - -} -// End of miniMVC.php \ No newline at end of file +// End of db.php \ No newline at end of file