A modest collection of PHP libraries used at SparkFun.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

203 lines
5.0 KiB

<?php
namespace SparkLib;
use \SparkLib\Fail;
/**
* A singleton to wrap up database connections for PDO.
* May also be a place to hang some utility methods and
* shortcuts.
*
* http://php.net/manual/en/book.pdo.php
*
* Sample usage:
*
* <code>
* $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));
* </code>
*/
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();
}
}