我在菲利普·布朗(Philip Brown)的 http://culttt.com/2012/10/01/roll-your-own-pdo-php-class/中找到了以下PDO类。
我是课程的新手。这运作良好。有没有人看出它有什么问题,或者可以改进吗?我想在大型应用程序中使用它。
class Database
{
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;
private $dbh;
private $error;
private $stmt;
public function __construct()
{
// Set DSN
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
// Set options
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
// Create a new PDO instanace
try
{
$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
}
// Catch any errors
catch (PDOException $e)
{
$this->error = $e->getMessage();
}
}
public function query($query)
{
$this->stmt = $this->dbh->prepare($query);
}
public function bind($param, $value, $type = null)
{
if (is_null($type))
{
switch (true)
{
case is_int($value):
$type = PDO::PARAM_INT;
break;
case is_bool($value):
$type = PDO::PARAM_BOOL;
break;
case is_null($value):
$type = PDO::PARAM_NULL;
break;
default:
$type = PDO::PARAM_STR;
}
}
$this->stmt->bindValue($param, $value, $type);
}
public function execute()
{
return $this->stmt->execute();
}
public function resultset()
{
$this->execute();
return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function single()
{
$this->execute();
return $this->stmt->fetch(PDO::FETCH_ASSOC);
}
public function rowCount()
{
return $this->stmt->rowCount();
}
public function lastInsertId()
{
return $this->dbh->lastInsertId();
}
public function beginTransaction()
{
return $this->dbh->beginTransaction();
}
public function endTransaction()
{
return $this->dbh->commit();
}
public function cancelTransaction()
{
return $this->dbh->rollBack();
}
public function debugDumpParams()
{
return $this->stmt->debugDumpParams();
}
}
在我看来,你应该坚持使用原生PDO类。 本教程中的数据库类不会为您提供任何额外的功能,实际上减少了它。例如
public function single()
{
$this->execute();
return $this->stmt->fetch(PDO::FETCH_ASSOC);
}
将返回的数据类型限制为数组,而原始PDO类有~8种不同的获取样式,您可以根据自己的喜好和需求使用。
我也在下面的代码中看不到任何像样的观点
public function beginTransaction()
{
return $this->dbh->beginTransaction();
}
只是包装具有相同名称的完全相同的函数,同样没有额外的功能。
此外,此类限制您创建多个预准备语句 - 使用原始 PDO 类,您可以执行以下操作:
$stmt1 = $db->prepare('SELECT * FROM foo');
$stmt2 = $db->prepare('SELECT * FROM bar');
...
$stmtn = $db->prepare('SELECT * FROM foobar');
您无法使用教程中提供的类执行此操作 - 语句对象被硬编码为单个类变量。
最后,我并不真正赞成这个类的函数命名。 函数名称应该像一个简短的描述,但像"single"和"resultset"这样的名称实际上并没有提供任何特定函数做什么、返回什么或它如何影响程序整体状态的信息。
总而言之,在我看来,它是设计得相当糟糕的类,与本机PDO实现相比没有任何优势。
有什么问题吗
万事。即
private $host = DB_HOST;
为数据库凭证使用类变量是绝对没有意义的。它们仅在构造函数中使用一次。
catch (PDOException $e)
意义不大。一个没有使用过的捕获错误,这破坏了异常的想法。
类的其余部分只是模仿PDO功能。
与原始PDO的唯一区别是它可以让你自动将PDO空绑定到数据库空。但是,我怀疑你永远不会有这样做的想法。
因此,像其他人一样,我建议您摆脱这个类和本教程。特别是如果你是新上课的人。这样的例子可能会破坏您的整个体验。