* $dbh = \Spark\db::pdo(); * $sth = $dbh->prepare('SELECT * FROM customers WHERE customers_id = :id'); * $sth->execute(array('id' => 81000)); * // FETCH_ASSOC gives us name => value * print_r($sth->fetch(PDO::FETCH_ASSOC)); * */ class DB { /** * Getters for DB\Literal implementations for various types/values. */ public static function True () { return new \SparkLib\DB\True; } public static function False () { return new \SparkLib\DB\False; } public static function Null () { return new \SparkLib\DB\Null; } public static function Now () { return new \SparkLib\DB\Now; } public static function CurrentDate () { return new \SparkLib\DB\CurrentDate; } public static function Random () { return new \SparkLib\DB\Random(\DB_SERVER_TYPE); } // FUCK YOU, PHP public static function DefaultValue () { return new \SparkLib\DB\DefaultValue; } public static function Field ($field) { return new \SparkLib\DB\Field($field); } protected static $_instance = null; /** * PDO TODO: this should be called something else and handle selecting * different servers based on queries and and and... * * Get a PDO object. */ public static function pdo () { if (! self::$_instance) { // No instance. Get a new one. self::$_instance = new \PDO( \DB_SERVER_TYPE . ':host=' . \DB_SERVER . ';dbname=' . \DB_DATABASE, \DB_SERVER_USERNAME, \DB_SERVER_PASSWORD, [\PDO::ATTR_PERSISTENT => \USE_PCONNECT ] ); // We want exceptions on failures. self::$_instance->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); self::$_instance->setAttribute(\PDO::ATTR_ORACLE_NULLS, \PDO::NULL_TO_STRING); if (\DB_SERVER_TYPE === 'mysql') self::$_instance->query("SET sql_mode='ANSI';"); } return self::$_instance; } /** * place_holders * * gets the supplied number of PDO place holders * as a string to use with prepared queries * * @param int number of place holders to create * @access public * @return string * */ public static function place_holders ($number = 1) { $arguments = array(); for($i=0; $i<$number; $i++) { $arguments[] = '?'; } return implode(',', $arguments); } public static function getInstance () { return static::pdo(); } /** * Convenience method to execute a query and return the results * * @param string $sql: sql statement. Can contain parameter placeholders * @param array $params: optional array of parameters that match the * placeholders in $sql * @return array of query results */ public static function fetchAll ($sql, $params = [], $style = \PDO::FETCH_ASSOC) { $dbh = self::pdo(); $sth = $dbh->prepare($sql); $sth->execute($params); return $sth->fetchAll($style); } /** * Convenience method to execute a query and return the results * * @param string $sql: sql statement. Can contain parameter placeholders * @param array $params: optional array of parameters that match the * placeholders in $sql * @param string $style: optional fetch mode. In the form of PDO::FETCH_* * @return array of query results */ public static function fetch ($sql, $params = [], $style = \PDO::FETCH_ASSOC) { $dbh = self::pdo(); $sth = $dbh->prepare($sql); $sth->execute($params); return $sth->fetch($style); } /** * Executes an array of statements * * Will catch and throw PDO errors * * All statments are executed with the same database connection. * * @param $sql_array Array of sql statements. */ public static function exec_statements ($sql_array) { $dbh = self::pdo(); $dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); foreach ($sql_array as $stmt) { try { $dbh->exec($stmt); } catch (PDOException $e) { Fail::log($e); } } } /** * Convenience method for PDO::inTransaction(). * * Indicates whether or not there is an active transaction. * * @return true if there is a transaction, false otherwise. */ public static function inTransaction () { return self::pdo()->inTransaction(); } /** * Convenience method for PDO::beginTransaction(). * * Starts a database transaction. * * @returns nothing */ public static function begin () { self::pdo()->beginTransaction(); } /** * Convenience method for PDO::commit(). * * Commit a database transaction. * * @returns nothing */ public static function commit () { self::pdo()->commit(); } /** * Convenience method for PDO::rollBack(). * * Rollback a database transaction. * * @returns nothing */ public static function rollback () { self::pdo()->rollBack(); } }