diff options
Diffstat (limited to 'modules/database/classes/driver')
-rw-r--r-- | modules/database/classes/driver/mysql/db.php | 214 | ||||
-rw-r--r-- | modules/database/classes/driver/mysql/query.php | 5 | ||||
-rw-r--r-- | modules/database/classes/driver/mysql/result.php | 90 | ||||
-rw-r--r-- | modules/database/classes/driver/pdo/db.php | 228 | ||||
-rw-r--r-- | modules/database/classes/driver/pdo/query.php | 443 | ||||
-rw-r--r-- | modules/database/classes/driver/pdo/result.php | 90 |
6 files changed, 537 insertions, 533 deletions
diff --git a/modules/database/classes/driver/mysql/db.php b/modules/database/classes/driver/mysql/db.php index 88df9b8..1d49acf 100644 --- a/modules/database/classes/driver/mysql/db.php +++ b/modules/database/classes/driver/mysql/db.php @@ -7,120 +7,120 @@ class DB_Mysql_Driver extends DB
{
- /**
- * Mysqli database connection object
- * @var mysqli
- * @access public
- * @link http://php.net/manual/en/class.mysqli.php
- */
- public $conn;
+ /**
+ * Mysqli database connection object
+ * @var mysqli
+ * @access public
+ * @link http://php.net/manual/en/class.mysqli.php
+ */
+ public $conn;
- /**
- * Type of the database, mysql.
- * @var string
- * @access public
- */
- public $db_type = 'mysql';
+ /**
+ * Type of the database, mysql.
+ * @var string
+ * @access public
+ */
+ public $db_type = 'mysql';
- /**
- * Initializes database connection
- *
- * @param string $config Name of the connection to initialize
- * @return void
- * @access public
- */
- public function __construct($config)
- {
- $this->conn = mysqli_connect(
- Config::get("database.{$config}.host", 'localhost'), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", ''), Config::get("database.{$config}.db")
- );
- $this->conn->set_charset("utf8");
- }
+ /**
+ * Initializes database connection
+ *
+ * @param string $config Name of the connection to initialize
+ * @return void
+ * @access public
+ */
+ public function __construct($config)
+ {
+ $this->conn = mysqli_connect(
+ Config::get("database.{$config}.host", 'localhost'), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", ''), Config::get("database.{$config}.db")
+ );
+ $this->conn->set_charset("utf8");
+ }
- /**
- * Gets column names for the specified table
- *
- * @param string $table Name of the table to get columns from
- * @return array Array of column names
- * @throw Exception if table doesn't exist
- * @access public
- */
- public function list_columns($table)
- {
- $columns = array();
- $table_desc = $this->execute("DESCRIBE `$table`");
- Debug::log($table_desc);
- if (!$table_desc->valid())
- {
- throw new Exception("Table '{$table}' doesn't exist");
- }
- foreach ($table_desc as $column)
- {
- $columns[] = $column->Field;
- }
+ /**
+ * Gets column names for the specified table
+ *
+ * @param string $table Name of the table to get columns from
+ * @return array Array of column names
+ * @throw Exception if table doesn't exist
+ * @access public
+ */
+ public function list_columns($table)
+ {
+ $columns = array();
+ $table_desc = $this->execute("DESCRIBE `$table`");
+ Debug::log($table_desc);
+ if (!$table_desc->valid())
+ {
+ throw new Exception("Table '{$table}' doesn't exist");
+ }
+ foreach ($table_desc as $column)
+ {
+ $columns[] = $column->Field;
+ }
- return $columns;
- }
+ return $columns;
+ }
- /**
- * Builds a new Query implementation
- *
- * @param string $type Query type. Available types: select,update,insert,delete,count
- * @return Query_Mysql_Driver Returns a Mysqli implementation of a Query.
- * @access public
- * @see Query_Database
- */
- public function build_query($type)
- {
- return new Query_Mysql_Driver($this, $type);
- }
+ /**
+ * Builds a new Query implementation
+ *
+ * @param string $type Query type. Available types: select,update,insert,delete,count
+ * @return Query_Mysql_Driver Returns a Mysqli implementation of a Query.
+ * @access public
+ * @see Query_Database
+ */
+ public function build_query($type)
+ {
+ return new Query_Mysql_Driver($this, $type);
+ }
- /**
- * Gets the id of the last inserted row.
- *
- * @return mixed Row id
- * @access public
- */
- public function get_insert_id()
- {
- return $this->conn->insert_id;
- }
+ /**
+ * Gets the id of the last inserted row.
+ *
+ * @return mixed Row id
+ * @access public
+ */
+ public function get_insert_id()
+ {
+ return $this->conn->insert_id;
+ }
- /**
- * Executes a prepared statement query
- *
- * @param string $query A prepared statement query
- * @param array $params Parameters for the query
- * @return Result_Mysql_Driver Mysqli implementation of a database result
- * @access public
- * @throws Exception If the query resulted in an error
- * @see Database_Result
- */
- public function execute($query, $params = array())
- {
- $cursor = $this->conn->prepare($query);
- if (!$cursor)
- {
- throw new Exception("Database error: {$this->conn->error} \n in query:\n{$query}");
- }
- $types = '';
- $bind = array();
- $refs = array();
- if (!empty($params))
- {
- foreach ($params as $key => $param)
- {
- $refs[$key] = is_array($param) ? $param[0] : $param;
- $bind[] = &$refs[$key];
- $types .= is_array($param) ? $param[1] : 's';
- }
- array_unshift($bind, $types);
+ /**
+ * Executes a prepared statement query
+ *
+ * @param string $query A prepared statement query
+ * @param array $params Parameters for the query
+ * @return Result_Mysql_Driver Mysqli implementation of a database result
+ * @access public
+ * @throws Exception If the query resulted in an error
+ * @see Database_Result
+ */
+ public function execute($query, $params = array())
+ {
+ $cursor = $this->conn->prepare($query);
+ if (!$cursor)
+ {
+ throw new Exception("Database error: {$this->conn->error} \n in query:\n{$query}");
+ }
+ $types = '';
+ $bind = array();
+ $refs = array();
+ if (!empty($params))
+ {
+ foreach ($params as $key => $param)
+ {
+ $refs[$key] = is_array($param) ? $param[0] : $param;
+ $bind[] = &$refs[$key];
+ $types .= is_array($param) ? $param[1] : 's';
+ }
+ array_unshift($bind, $types);
- call_user_func_array(array($cursor, 'bind_param'), $bind);
- }
- $cursor->execute();
- $res = $cursor->get_result();
- return new Result_Mysql_Driver($res);
- }
+ call_user_func_array(array($cursor, 'bind_param'), $bind);
+ }
+ $cursor->execute();
+ $res = $cursor->get_result();
+ return new Result_Mysql_Driver($res);
+ }
}
\ No newline at end of file diff --git a/modules/database/classes/driver/mysql/query.php b/modules/database/classes/driver/mysql/query.php index 803f932..b880338 100644 --- a/modules/database/classes/driver/mysql/query.php +++ b/modules/database/classes/driver/mysql/query.php @@ -4,4 +4,7 @@ * Mysqli implementation of the database Query * @package Database */ -class Query_Mysql_Driver extends Query_PDO_Driver {}
\ No newline at end of file +class Query_Mysql_Driver extends Query_PDO_Driver +{ + +} diff --git a/modules/database/classes/driver/mysql/result.php b/modules/database/classes/driver/mysql/result.php index e9de4a5..2927192 100644 --- a/modules/database/classes/driver/mysql/result.php +++ b/modules/database/classes/driver/mysql/result.php @@ -7,52 +7,52 @@ class Result_Mysql_Driver extends Result_Database { - /** - * Initializes new result object - * - * @param mysqli_result $result Mysqli Result - * @return void - * @access public - * @link http://php.net/manual/en/class.mysqli-result.php - */ - public function __construct($result) - { - $this->_result = $result; - } + /** + * Initializes new result object + * + * @param mysqli_result $result Mysqli Result + * @return void + * @access public + * @link http://php.net/manual/en/class.mysqli-result.php + */ + public function __construct($result) + { + $this->_result = $result; + } - /** - * Throws exception if rewind is attempted. - * - * @return void - * @access public - * @throws Exception If rewind is attempted - */ - public function rewind() - { - if ($this->_position > 0) - { - throw new Exception('Mysqli result cannot be rewound for unbuffered queries.'); - } - } + /** + * Throws exception if rewind is attempted. + * + * @return void + * @access public + * @throws Exception If rewind is attempted + */ + public function rewind() + { + if ($this->_position > 0) + { + throw new Exception('Mysqli result cannot be rewound for unbuffered queries.'); + } + } - /** - * Iterates to the next row in the result set - * - * @return void - * @access public - */ - public function next() - { - $this->check_fetched(); - $this->_row = $this->_result->fetch_object(); - if ($this->_row) - { - $this->_position++; - } - else - { - $this->_result->free(); - } - } + /** + * Iterates to the next row in the result set + * + * @return void + * @access public + */ + public function next() + { + $this->check_fetched(); + $this->_row = $this->_result->fetch_object(); + if ($this->_row) + { + $this->_position++; + } + else + { + $this->_result->free(); + } + } }
\ No newline at end of file diff --git a/modules/database/classes/driver/pdo/db.php b/modules/database/classes/driver/pdo/db.php index 5b81d66..5a920ec 100644 --- a/modules/database/classes/driver/pdo/db.php +++ b/modules/database/classes/driver/pdo/db.php @@ -7,125 +7,125 @@ class DB_PDO_Driver extends DB { - /** - * Connection object - * @var PDO - * @access public - * @link http://php.net/manual/en/class.pdo.php - */ - public $conn; + /** + * Connection object + * @var PDO + * @access public + * @link http://php.net/manual/en/class.pdo.php + */ + public $conn; - /** - * Type of the database, e.g. mysql, pgsql etc. - * @var string - * @access public - */ - public $db_type; + /** + * Type of the database, e.g. mysql, pgsql etc. + * @var string + * @access public + */ + public $db_type; - /** - * Initializes database connection - * - * @param string $config Name of the connection to initialize - * @return void - * @access public - */ - public function __construct($config) - { - $this->conn = new PDO( - Config::get("database.{$config}.connection"), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", '') - ); - $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - $this->db_type = strtolower(str_replace('PDO_', '', $this->conn->getAttribute(PDO::ATTR_DRIVER_NAME))); - if ($this->db_type != 'sqlite') - { - $this->conn->exec("SET NAMES utf8"); - } - } + /** + * Initializes database connection + * + * @param string $config Name of the connection to initialize + * @return void + * @access public + */ + public function __construct($config) + { + $this->conn = new PDO( + Config::get("database.{$config}.connection"), Config::get("database.{$config}.user", ''), Config::get("database.{$config}.password", '') + ); + $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $this->db_type = strtolower(str_replace('PDO_', '', $this->conn->getAttribute(PDO::ATTR_DRIVER_NAME))); + if ($this->db_type != 'sqlite') + { + $this->conn->exec("SET NAMES utf8"); + } + } - /** - * Builds a new Query implementation - * - * @param string $type Query type. Available types: select,update,insert,delete,count - * @return Query_PDO_Driver Returns a PDO implementation of a Query. - * @access public - * @see Query_Database - */ - public function build_query($type) - { - return new Query_PDO_Driver($this, $type); - } + /** + * Builds a new Query implementation + * + * @param string $type Query type. Available types: select,update,insert,delete,count + * @return Query_PDO_Driver Returns a PDO implementation of a Query. + * @access public + * @see Query_Database + */ + public function build_query($type) + { + return new Query_PDO_Driver($this, $type); + } - /** - * Gets the id of the last inserted row. - * - * @return mixed Row id - * @access public - */ - public function get_insert_id() - { - if ($this->db_type == 'pgsql') - { - return $this->execute('SELECT lastval() as id')->current()->id; - } - return $this->conn->lastInsertId(); - } + /** + * Gets the id of the last inserted row. + * + * @return mixed Row id + * @access public + */ + public function get_insert_id() + { + if ($this->db_type == 'pgsql') + { + return $this->execute('SELECT lastval() as id')->current()->id; + } + return $this->conn->lastInsertId(); + } - /** - * Gets column names for the specified table - * - * @param string $table Name of the table to get columns from - * @return array Array of column names - * @access public - */ - public function list_columns($table) - { - $columns = array(); - if ($this->db_type == 'mysql') - { - $table_desc = $this->execute("DESCRIBE `$table`"); - foreach ($table_desc as $column) - { - $columns[] = $column->Field; - } - } - if ($this->db_type == 'pgsql') - { - $table_desc = $this->execute("select column_name from information_schema.columns where table_name = '{$table}' and table_catalog=current_database();"); - foreach ($table_desc as $column) - { - $columns[] = $column->column_name; - } - } - if ($this->db_type == 'sqlite') - { - $table_desc = $this->execute("PRAGMA table_info('$table')"); - foreach ($table_desc as $column) - { - $columns[] = $column->name; - } - } - return $columns; - } + /** + * Gets column names for the specified table + * + * @param string $table Name of the table to get columns from + * @return array Array of column names + * @access public + */ + public function list_columns($table) + { + $columns = array(); + if ($this->db_type == 'mysql') + { + $table_desc = $this->execute("DESCRIBE `$table`"); + foreach ($table_desc as $column) + { + $columns[] = $column->Field; + } + } + if ($this->db_type == 'pgsql') + { + $table_desc = $this->execute("select column_name from information_schema.columns where table_name = '{$table}' and table_catalog=current_database();"); + foreach ($table_desc as $column) + { + $columns[] = $column->column_name; + } + } + if ($this->db_type == 'sqlite') + { + $table_desc = $this->execute("PRAGMA table_info('$table')"); + foreach ($table_desc as $column) + { + $columns[] = $column->name; + } + } + return $columns; + } - /** - * Executes a prepared statement query - * - * @param string $query A prepared statement query - * @param array $params Parameters for the query - * @return Result_PDO_Driver PDO implementation of a database result - * @access public - * @throws Exception If the query resulted in an error - * @see Database_Result - */ - public function execute($query, $params = array()) - { - $cursor = $this->conn->prepare($query); - if (!$cursor->execute($params)) - { - $error = $cursor->errorInfo(); - throw new Exception("Database error:\n".$error[2]." \n in query:\n{$query}"); - } - return new Result_PDO_Driver($cursor); - } + /** + * Executes a prepared statement query + * + * @param string $query A prepared statement query + * @param array $params Parameters for the query + * @return Result_PDO_Driver PDO implementation of a database result + * @access public + * @throws Exception If the query resulted in an error + * @see Database_Result + */ + public function execute($query, $params = array()) + { + $cursor = $this->conn->prepare($query); + if (!$cursor->execute($params)) + { + $error = $cursor->errorInfo(); + throw new Exception("Database error:\n".$error[2]." \n in query:\n{$query}"); + } + return new Result_PDO_Driver($cursor); + } }
\ No newline at end of file diff --git a/modules/database/classes/driver/pdo/query.php b/modules/database/classes/driver/pdo/query.php index d78316d..5d82cbf 100644 --- a/modules/database/classes/driver/pdo/query.php +++ b/modules/database/classes/driver/pdo/query.php @@ -7,96 +7,96 @@ class Query_PDO_Driver extends Query_Database { - /** - * Type of the database, e.g. mysql, pgsql etc. - * @var string - * @access public - */ - protected $_db_type; + /** + * Type of the database, e.g. mysql, pgsql etc. + * @var string + * @access public + */ + protected $_db_type; - /** - * Character to use for quoting fields - * @var string - * @access public - */ - protected $_quote; + /** + * Character to use for quoting fields + * @var string + * @access public + */ + protected $_quote; - /** - * Creates a new query object, checks which driver we are using and set the character used for quoting - * - * @param DB $db Database connection - * @param string $type Query type. Available types: select, update, insert, delete, count - * @return void - * @access public - * @see Query_Database::__construct() - */ - public function __construct($db, $type) - { - parent::__construct($db, $type); - $this->_db_type = $this->_db->db_type; - $this->_quote = $this->_db_type == 'mysql' ? '`' : '"'; - } + /** + * Creates a new query object, checks which driver we are using and set the character used for quoting + * + * @param DB $db Database connection + * @param string $type Query type. Available types: select, update, insert, delete, count + * @return void + * @access public + * @see Query_Database::__construct() + */ + public function __construct($db, $type) + { + parent::__construct($db, $type); + $this->_db_type = $this->_db->db_type; + $this->_quote = $this->_db_type == 'mysql' ? '`' : '"'; + } - /** - * Puts quotes around a string - * - * @param string $str String to be enclosed in quotes - * @return string String surrounded with quotes - * @access protected - */ - protected function quote($str) - { - return $this->_quote.$str.$this->_quote; - } + /** + * Puts quotes around a string + * + * @param string $str String to be enclosed in quotes + * @return string String surrounded with quotes + * @access protected + */ + protected function quote($str) + { + return $this->_quote.$str.$this->_quote; + } - /** - * If a string is passed escapes a field by enclosing it in specified quotes. - * If you pass an Expression_Database object the value will be inserted into the query unescaped - * - * @param mixed $field Field to be escaped or an Expression_Database object - * if the field must not be escaped - * @return string Escaped field representation - * @access public - * @see Expression_Database - */ - public function escape_field($field) - { - if (is_object($field) && get_class($field) == 'Expression_Database') - { - return $field->value; - } - $field = explode('.', $field); - if (count($field) == 1) - { - array_unshift($field, $this->last_alias()); - } - $str = $this->quote($field[0]).'.'; - if (trim($field[1]) == '*') - { - return $str.'*'; - } - return $str.$this->quote($field[1]); - } + /** + * If a string is passed escapes a field by enclosing it in specified quotes. + * If you pass an Expression_Database object the value will be inserted into the query unescaped + * + * @param mixed $field Field to be escaped or an Expression_Database object + * if the field must not be escaped + * @return string Escaped field representation + * @access public + * @see Expression_Database + */ + public function escape_field($field) + { + if (is_object($field) && get_class($field) == 'Expression_Database') + { + return $field->value; + } + $field = explode('.', $field); + if (count($field) == 1) + { + array_unshift($field, $this->last_alias()); + } + $str = $this->quote($field[0]).'.'; + if (trim($field[1]) == '*') + { + return $str.'*'; + } + return $str.$this->quote($field[1]); + } - /** - * Replaces the value with ? and appends it to the parameters array - * If you pass an Expression_Database object the value will be inserted into the query unescaped - * @param mixed $val Value to be escaped or an Expression_Database object - * if the value must not be escaped - * @param array &$params Reference to parameters array - * @return string Escaped value representation - * @access public - */ - public function escape_value($val,&$params) - { + /** + * Replaces the value with ? and appends it to the parameters array + * If you pass an Expression_Database object the value will be inserted into the query unescaped + * @param mixed $val Value to be escaped or an Expression_Database object + * if the value must not be escaped + * @param array &$params Reference to parameters array + * @return string Escaped value representation + * @access public + */ + public function escape_value($val, &$params) + { if ($val instanceof Expression_Database) - { + { return $val->value; - } + } if ($val instanceof Query_Database) - { - return $this->subquery($val,$params); - } + { + return $this->subquery($val, $params); + } $params[] = $val; return '?'; } @@ -106,295 +106,296 @@ class Query_PDO_Driver extends Query_Database * * @param Query_Database $query Query builder for the subquery * @param array &$params Reference to parameters array - * @return string Subquery SQL - * @access public + * @return string Subquery SQL + * @access public */ - protected function subquery($query, &$params) { + protected function subquery($query, &$params) + { $query = $query->query(); $params = array_merge($params, $query[1]); return "({$query[0]}) "; } - + /** * Gets the SQL for a table to select from * * @param string|Expression_Database|Query_Database|array $table Table representation * @param array &$params Reference to parameters array * @param string &alias Alias for this table - * @return string Table SQL - * @access public + * @return string Table SQL + * @access public */ - public function escape_table($table, &$params) { - $alias=null; - if (is_array($table)) { + public function escape_table($table, &$params) + { + $alias = null; + if (is_array($table)) + { $alias = $table[1]; $table = $table[0]; } - - if (is_string($table)){ + + if (is_string($table)) + { $table = $this->quote($table); if ($alias != null) $table.= " AS {$alias}"; return $table; } - + if ($alias == null) $alias = $this->last_alias(); - - if($table instanceof Query_Database) - return "{$this->subquery($table,$params)} AS {$alias}"; - - if($table instanceof Expression_Database) + + if ($table instanceof Query_Database) + return "{$this->subquery($table, $params)} AS {$alias}"; + + if ($table instanceof Expression_Database) return "({$table->value}) AS {$alias}"; - + throw new Exception("Parameter type {get_class($table)} cannot be used as a table"); } - /** - * Builds a query and fills the $params array with parameter values - * - * @return array An array with a prepared query string and an array of parameters - * @access public - */ + /** + * Builds a query and fills the $params array with parameter values + * + * @return array An array with a prepared query string and an array of parameters + * @access public + */ public function query() - { - + { + $query = ''; $params = array(); - + if ($this->_type == 'insert') - { + { $query .= "INSERT INTO {$this->quote($this->_table)} "; if (empty($this->_data) && $this->_db_type == 'pgsql') - { + { $query.= "DEFAULT VALUES "; } - else - { + else + { $columns = ''; $values = ''; $first = true; - foreach($this->_data as $key => $val) - { + foreach ($this->_data as $key => $val) + { if (!$first) - { + { $values .= ', '; $columns .= ', '; } - else - { + else + { $first = false; } $columns .= $this->quote($key); - $values .= $this->escape_value($val,$params); + $values .= $this->escape_value($val, $params); } $query .= "({$columns}) VALUES({$values})"; } - } - else - { + } + else + { if ($this->_type == 'select') - { + { $query .= "SELECT "; - if ($this->_fields==null) - { + if ($this->_fields == null) + { $query .= "* "; } - else - { + else + { $first = true; foreach ($this->_fields as $f) - { + { if (!$first) - { + { $query .= ", "; } - else - { + else + { $first = false; } if (is_array($f)) - { + { $query .= "{$this->escape_field($f[0])} AS {$f[1]} "; } - else - { + else + { $query .= "{$this->escape_field($f)} "; } } } - $query .= "FROM {$this->escape_table($this->_table,$params)} "; + $query .= "FROM {$this->escape_table($this->_table, $params)} "; } if ($this->_type == 'count') - { - $query .= "SELECT COUNT(*) as {$this->quote('count')} FROM {$this->escape_table($this->_table,$params)} "; + { + $query .= "SELECT COUNT(*) as {$this->quote('count')} FROM {$this->escape_table($this->_table, $params)} "; } - + if ($this->_type == 'delete') - { - if ($this->_db_type!='sqlite') - { + { + if ($this->_db_type != 'sqlite') + { $query .= "DELETE {$this->last_alias()}.* FROM {$this->quote($this->_table)} "; } - else - { + else + { if (!empty($this->_joins)) - { + { throw new Exception("SQLite doesn't support deleting a table with JOIN in the query"); - } + } $query .= "DELETE FROM {$this->quote($this->_table)} "; } } - if ($this->_type=='update') - { + if ($this->_type == 'update') + { $query .= "UPDATE {$this->quote($this->_table)} SET "; $first = true; - foreach ($this->_data as $key=>$val){ + foreach ($this->_data as $key => $val) + { if (!$first) - { + { $query.=", "; } - else - { - $first=false; + else + { + $first = false; } - $query .= "{$this->quote($key)} = {$this->escape_value($val,$params)}"; + $query .= "{$this->quote($key)} = {$this->escape_value($val, $params)}"; } $query .= " "; } - + foreach ($this->_joins as $join) - { + { $table = $join[0]; - $table = $this->escape_table($table,$params); - $query .= strtoupper($join[1])." JOIN {$table} ON {$this->get_condition_query($join[2],$params,true,true)} "; + $table = $this->escape_table($table, $params); + $query .= strtoupper($join[1])." JOIN {$table} ON {$this->get_condition_query($join[2], $params, true, true)} "; } if (!empty($this->_conditions)) - { - $query .= "WHERE {$this->get_condition_query($this->_conditions,$params,true)} "; + { + $query .= "WHERE {$this->get_condition_query($this->_conditions, $params, true)} "; } - if (($this->_type == 'select' || $this->_type == 'count') && $this->_group_by!=null) - { + if (($this->_type == 'select' || $this->_type == 'count') && $this->_group_by != null) + { $query .= "GROUP BY {$this->escape_field($this->_group_by)} "; } - if (($this->_type == 'select' || $this->_type == 'count') && !empty($this->_having)) - { - $query .= "HAVING {$this->get_condition_query($this->_having,$params,true)} "; + if (($this->_type == 'select' || $this->_type == 'count') && !empty($this->_having)) + { + $query .= "HAVING {$this->get_condition_query($this->_having, $params, true)} "; } - + if ($this->_type == 'select' && !empty($this->_orderby)) - { + { $query .= "ORDER BY "; $first = true; foreach ($this->_orderby as $order) - { + { if (!$first) - { + { $query .= ','; } - else - { + else + { $first = false; } $query .= $this->escape_field($order[0])." "; if (isset($order[1])) - { + { $dir = strtoupper($order[1]); $query .= $dir." "; } } } - + if (count($this->_union) > 0 && ($this->_type == 'select')) - { + { $query = "({$query}) "; foreach ($this->_union as $union) - { - $query .= $union[1]?"UNION ALL ":"UNION "; + { + $query .= $union[1] ? "UNION ALL " : "UNION "; if (is_subclass_of($union[0], 'Query_Database')) - { - $query .= $this->subquery($union[0],$params); + { + $query .= $this->subquery($union[0], $params); } - elseif(is_subclass_of($union[0], 'Expression_Database')) - { + elseif (is_subclass_of($union[0], 'Expression_Database')) + { $query .= "({$union[0]->value}) "; } - else - { + else + { throw new Exception("You can only use query builder instances or DB::expr for unions"); } } } - + if ($this->_type != 'count') - { + { if ($this->_limit != null) - { + { $query .= "LIMIT {$this->_limit} "; - } + } if ($this->_offset != null) - { + { $query .= "OFFSET {$this->_offset} "; - } + } } - } - - return array($query,$params); - } + return array($query, $params); + } - /** - * Recursively parses conditions array into a query string - * - * @param array $p Element of the cobditions array - * @param array &$params Reference to parameters array - * @param boolean $skip_first_operator Flag to skip the first logical operator in a query - * to prevent AND or OR to be at the beginning of the query - * @param boolean $value_is_field Flag if the the value in the logical operations should - * be treated as a field. E.g. for joins where the fields are - * compared between themselves and not with actual values - * @return string String representation of the conditions - * @access public - * @throws Exception If condition cannot be parsed - */ - public function get_condition_query($p,&$params,$skip_first_operator,$value_is_field = false) - { + /** + * Recursively parses conditions array into a query string + * + * @param array $p Element of the cobditions array + * @param array &$params Reference to parameters array + * @param boolean $skip_first_operator Flag to skip the first logical operator in a query + * to prevent AND or OR to be at the beginning of the query + * @param boolean $value_is_field Flag if the the value in the logical operations should + * be treated as a field. E.g. for joins where the fields are + * compared between themselves and not with actual values + * @return string String representation of the conditions + * @access public + * @throws Exception If condition cannot be parsed + */ + public function get_condition_query($p, &$params, $skip_first_operator, $value_is_field = false) + { if (isset($p['field'])) - { + { if ($value_is_field) - { + { $param = $this->escape_field($p['value']); } - else - { + else + { $param = $this->escape_value($p['value'], $params); } return $this->escape_field($p['field']).' '.$p['operator'].' '.$param; } if (isset($p['logic'])) - { + { return ($skip_first_operator ? '' : strtoupper($p['logic']).' ') - .$this->get_condition_query($p['conditions'], $params, false, $value_is_field); + .$this->get_condition_query($p['conditions'], $params, false, $value_is_field); } - + $conds = ''; $skip = $skip_first_operator || (count($p) > 1); - foreach($p as $q) - { - $conds .= $this->get_condition_query($q,$params,$skip,$value_is_field).' '; + foreach ($p as $q) + { + $conds .= $this->get_condition_query($q, $params, $skip, $value_is_field).' '; $skip = false; } if (count($p) > 1 && !$skip_first_operator) - { + { return "( ".$conds.")"; - } + } return $conds; throw new Exception("Cannot parse condition:\n".var_export($p, true)); } - - }
\ No newline at end of file diff --git a/modules/database/classes/driver/pdo/result.php b/modules/database/classes/driver/pdo/result.php index d64c479..fda813c 100644 --- a/modules/database/classes/driver/pdo/result.php +++ b/modules/database/classes/driver/pdo/result.php @@ -7,52 +7,52 @@ class Result_PDO_Driver extends Result_Database { - /** - * Initializes new result object - * - * @param PDOStatement $stmt PDO Statement - * @return void - * @access public - * @link http://php.net/manual/en/class.pdostatement.php - */ - public function __construct($stmt) - { - $this->_result = $stmt; - } + /** + * Initializes new result object + * + * @param PDOStatement $stmt PDO Statement + * @return void + * @access public + * @link http://php.net/manual/en/class.pdostatement.php + */ + public function __construct($stmt) + { + $this->_result = $stmt; + } - /** - * Throws exception if rewind is attempted. - * - * @return void - * @access public - * @throws Exception If rewind is attempted - */ - public function rewind() - { - if ($this->_position > 0) - { - throw new Exception('PDO statement cannot be rewound for unbuffered queries'); - } - } + /** + * Throws exception if rewind is attempted. + * + * @return void + * @access public + * @throws Exception If rewind is attempted + */ + public function rewind() + { + if ($this->_position > 0) + { + throw new Exception('PDO statement cannot be rewound for unbuffered queries'); + } + } - /** - * Iterates to the next row in the result set - * - * @return void - * @access public - */ - public function next() - { - $this->check_fetched(); - $this->_row = $this->_result->fetchObject(); - if ($this->_row) - { - $this->_position++; - } - else - { - $this->_result->closeCursor(); - } - } + /** + * Iterates to the next row in the result set + * + * @return void + * @access public + */ + public function next() + { + $this->check_fetched(); + $this->_row = $this->_result->fetchObject(); + if ($this->_row) + { + $this->_position++; + } + else + { + $this->_result->closeCursor(); + } + } }
\ No newline at end of file |