我构建这个类是为了与 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;
}
}
这还不错,正如人们所说,它可能对小型应用程序有所帮助,尽管它主要是另一个抽象上的非常薄的抽象。它没有带来很多其他功能。
除其他事项外,您可能需要考虑以下事项:
- 由于这是 PHP5 代码,因此使用例外情况 http://www.php.net/exceptions代替
trigger_error
and set_exception_handler http://www.php.net/manual/en/function.set-exception-handler.php如有必要,直到例外情况更加普遍,但它绝对更干净、更面向未来。
- 您使用的是单例,这不一定是一件坏事,但在这种情况下,例如,一个缺点是您只能处理与一个数据库的一个连接。
- 我不知道你是否使用存储过程,但是存储过程可能会返回一个结果集 http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.php.doc/doc/t0023501.htm通过
query()
方法也。
- 你有两个分号(
;;
)在你的末尾new PDO
line.
话虽这么说,我不认为你的查询方法太大,而且目前没有太多可以从其他地方召回的内容。不过,一旦您看到可以从另一个函数调用的两行或三行,请将其拆分。这是一个好方法DRY http://en.wikipedia.org/wiki/DRY.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)