diff --git a/db.class.php b/db.class.php index 7ffaf23..a03f6a3 100644 --- a/db.class.php +++ b/db.class.php @@ -34,10 +34,14 @@ class DB public static $port = null; public static $encoding = 'latin1'; public static $queryMode = 'queryAllRows'; + public static $param_char = '%'; + public static $success_handler = false; public static $error_handler = true; public static $throw_exception_on_error = false; - public static $param_char = '%'; + public static $nonsql_error_handler = null; + public static $throw_exception_on_nonsql_error = false; + public static function get() { $mysql = DB::$internal_mysql; @@ -46,6 +50,11 @@ class DB if (! DB::$port) DB::$port = ini_get('mysqli.default_port'); DB::$current_db = DB::$dbName; $mysql = new mysqli(DB::$host, DB::$user, DB::$password, DB::$dbName, DB::$port); + + if ($mysql->connect_error) { + DB::nonSQLError('Unable to connect to MySQL server! Error: ' . $mysql->connect_error); + } + $mysql->set_charset(DB::$encoding); DB::$internal_mysql = $mysql; } @@ -53,6 +62,20 @@ class DB return $mysql; } + protected static function nonSQLError($message) { + if (DB::$throw_exception_on_nonsql_error) { + $e = new MeekroDBException($message); + throw $e; + } + + $error_handler = is_callable(DB::$nonsql_error_handler) ? DB::$nonsql_error_handler : 'meekrodb_error_handler'; + + call_user_func($error_handler, array( + 'type' => 'nonsql', + 'error' => $message + )); + } + public static function debugMode($handler = true) { DB::$success_handler = $handler; } @@ -66,7 +89,7 @@ class DB public static function setDB($dbName) { $db = DB::get(); DB::$old_db = DB::$current_db; - if (! $db->select_db($dbName)) die("unable to set db to $dbName"); + if (! $db->select_db($dbName)) DB::nonSQLError("Unable to set database to $dbName"); DB::$current_db = $dbName; } @@ -176,7 +199,7 @@ class DB $insert_values = array(); foreach ($keys as $key) { - if ($many && !isset($data[$key])) die("insert/replace many: each assoc array must have the same keys!"); + if ($many && !isset($data[$key])) DB::nonSQLError('insert/replace many: each assoc array must have the same keys!'); $datum = $data[$key]; $datum = DB::sanitize($datum); $insert_values[] = $datum; @@ -236,11 +259,11 @@ class DB foreach ($args as $arg) { $type = array_shift($types); $pos = strpos($sql, '?'); - if ($pos === false) die("Badly formatted SQL query: $sql"); + if ($pos === false) DB::nonSQLError("Badly formatted SQL query: $sql"); if ($type == 's') $replacement = "'" . DB::escape($arg) . "'"; else if ($type == 'i') $replacement = intval($arg); - else die("Badly formatted SQL query: $sql"); + else DB::nonSQLError("Badly formatted SQL query: $sql"); $sql = substr_replace($sql, $replacement, $pos, 1); } @@ -291,7 +314,7 @@ class DB $result = "'%" . DB::escape(str_replace(array('%', '_'), array('\%', '\_'), $arg)) . "%'"; } else { $array_type = true; - if (! is_array($arg)) die("Badly formatted SQL query: $sql -- expecting array, but didn't get one!"); + if (! is_array($arg)) DB::nonSQLError("Badly formatted SQL query: $sql -- expecting array, but didn't get one!"); } if ($type == 'ls') $result = DB::wrapStr($arg, "'", true); @@ -299,7 +322,7 @@ class DB else if ($type == 'ld') $result = array_map('floatval', $arg); else if ($type == 'lb') $result = array_map('DB::formatTableName', $arg); else if ($type == 'll') $result = $arg; - else if (! $result) die("Badly formatted SQL query: $sql"); + else if (! $result) DB::nonSQLError("Badly formatted SQL query: $sql"); if (is_array($result)) { if (! $array_type) $result = $result[0]; @@ -340,7 +363,9 @@ class DB public static function queryHelper() { $args = func_get_args(); $type = array_shift($args); - if ($type != 'buffered' && $type != 'unbuffered' && $type != 'null') die("Error -- first argument to queryHelper must be buffered or unbuffered!"); + if ($type != 'buffered' && $type != 'unbuffered' && $type != 'null') { + DB::nonSQLError('Error -- first argument to queryHelper must be buffered or unbuffered!'); + } $is_buffered = ($type == 'buffered'); $is_null = ($type == 'null'); @@ -357,6 +382,7 @@ class DB $error_handler = is_callable(DB::$error_handler) ? DB::$error_handler : 'meekrodb_error_handler'; call_user_func($error_handler, array( + 'type' => 'sql', 'query' => $sql, 'error' => $error )); @@ -621,8 +647,8 @@ class MeekroDBException extends Exception { } function meekrodb_error_handler($params) { - $out[] = "QUERY: " . $params['query']; - $out[] = "ERROR: " . $params['error']; + if (isset($params['query'])) $out[] = "QUERY: " . $params['query']; + if (isset($params['error'])) $out[] = "ERROR: " . $params['error']; $out[] = ""; if (php_sapi_name() == 'cli' && empty($_SERVER['REMOTE_ADDR'])) { diff --git a/simpletest/BasicTest.php b/simpletest/BasicTest.php index 0ce6807..4ecddd3 100644 --- a/simpletest/BasicTest.php +++ b/simpletest/BasicTest.php @@ -15,12 +15,14 @@ class BasicTest extends SimpleTest { function __construct() { error_reporting(E_ALL); require_once '../db.class.php'; - DB::$user = 'libdb_user'; - DB::$password = 'sdf235sklj'; - DB::$dbName = 'libdb_test'; - DB::query("DROP DATABASE libdb_test"); - DB::query("CREATE DATABASE libdb_test"); - DB::useDB('libdb_test'); + DB::$user = 'meekrodb_test_us'; + DB::$password = 'akdfo59fg'; + DB::$dbName = 'meekrodb_test'; + DB::$host = 'mysql.meekro.com'; + + foreach (DB::tableList() as $table) { + DB::query("DROP TABLE $table"); + } } @@ -74,8 +76,8 @@ class BasicTest extends SimpleTest { 'age' => 15, 'height' => 10.371 )); - - DB::insert('`libdb_test`.`accounts`', array( + $dbname = DB::$dbName; + DB::insert("`$dbname`.`accounts`", array( 'username' => 'Charlie\'s Friend', 'password' => 'goodbye', 'age' => 30, @@ -134,7 +136,7 @@ class BasicTest extends SimpleTest { $this->assert($tablelist[0] === 'accounts'); $tablelist = null; - $tablelist = DB::tableList('libdb_test'); + $tablelist = DB::tableList(DB::$dbName); $this->assert(count($tablelist) === 1); $this->assert($tablelist[0] === 'accounts'); } @@ -246,6 +248,7 @@ class BasicTest extends SimpleTest { } function test_6_exception_catch() { + $dbname = DB::$dbName; DB::$error_handler = ''; DB::$throw_exception_on_error = true; try { @@ -258,7 +261,7 @@ class BasicTest extends SimpleTest { $this->assert($exception_was_caught === 1); try { - DB::insert('`libdb_test`.`accounts`', array( + DB::insert("`$dbname`.`accounts`", array( 'id' => 2, 'username' => 'Another Dude\'s \'Mom"', 'password' => 'asdfsdse',