我构建了这个类来使用PDO,使SQL查询"更容易"而不用担心.
这是我的想法
它应该更像是DB类扩展PDO吗?
查询方法太大了吗?它应该被分成私有方法吗?这就是所谓的松散耦合?
我检测SELECT查询的方式是否太难看了?
还有哪些明显问题?因为我有点学习,我确信我可以忽略很多潜在的问题.
谢谢
`
class Db { private static $_instance = NULL; private function __construct() { // can not call me } private function __clone() { // no! } public static function getInstance() { if (!self::$_instance) { try { self::$_instance = new PDO('mysql:host=' . CONFIG_MYSQL_SERVER . ';dbname=' . CONFIG_MYSQL_DATABASE, CONFIG_MYSQL_USERNAME, CONFIG_MYSQL_PASSWORD);; self::$_instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { trigger_error($e->getMessage()); } } return self::$_instance; } public static function query($query /*string*/, $bindings = NULL) { $queryPortion = substr($query,0, 6); try { if ($bindings) { $prepared = self::getInstance()->prepare($query); foreach($bindings as $binding=>$data) { // defaults to string if (!is_array($data)) { $prepared->bindParam($binding, $data); } else { switch(count($data)) { case 1: $prepared->bindParam($binding, $data['value']); break; case 2: $prepared->bindParam($binding, $data['value'], $data['dataType']); break; case 3: $prepared->bindParam($binding, $data['value'], $data['dataType'], (int)$data['length']); break; default: trigger_error('An error has occured with the prepared statement bindings.'); return false; break; } } } $prepared->execute(); return $prepared->fetchAll(PDO::FETCH_ASSOC); } else if (String::match($queryPortion, 'select')) { // if this is a select query $rows = self::getInstance()->query($query); return $rows->fetchAll(PDO::FETCH_ASSOC); } else { return self::getInstance()->exec($query); } } catch(PDOException $e) { trigger_error($e->getMessage()); } } public static function getLastInsertId() { try { self::getInstance()->lastInsertId(); } catch(PDOException $e) { trigger_error($e->getMessage()); } } public static function disconnect() { // kill PDO object self::$_instance = NULL; } }
lpfavreau.. 5
它并不坏,因为据说它可能对小应用程序有所帮助,尽管它主要是对另一个抽象的非常薄的抽象.它没有带来很多其他功能.
你可能想要考虑的事情,除其他外:
由于这是PHP5的代码,使用异常,而不是trigger_error
和set_exception_handler
如果必要的话,直到例外的是更广泛,但它肯定更清洁,更面向未来的.
你正在使用单例,这不是坏事,但在这种情况下,例如,一个缺点是你只能处理一个连接到一个数据库.
我不知道您是否使用存储过程,但存储过程也可能通过该query()
方法返回结果集.
你的行尾有两个分号(;;
)new PDO
.
话虽这么说,我认为你的查询方法不是太大,而且目前其他地方也无法回忆起来.虽然只要看到可以从另一个函数调用的两行或三行,就将其拆分.这是干燥的好方法.
它并不坏,因为据说它可能对小应用程序有所帮助,尽管它主要是对另一个抽象的非常薄的抽象.它没有带来很多其他功能.
你可能想要考虑的事情,除其他外:
由于这是PHP5的代码,使用异常,而不是trigger_error
和set_exception_handler
如果必要的话,直到例外的是更广泛,但它肯定更清洁,更面向未来的.
你正在使用单例,这不是坏事,但在这种情况下,例如,一个缺点是你只能处理一个连接到一个数据库.
我不知道您是否使用存储过程,但存储过程也可能通过该query()
方法返回结果集.
你的行尾有两个分号(;;
)new PDO
.
话虽这么说,我认为你的查询方法不是太大,而且目前其他地方也无法回忆起来.虽然只要看到可以从另一个函数调用的两行或三行,就将其拆分.这是干燥的好方法.