PDO CLASS - 技术上是否正确?

时间:2013-09-08 01:14:09

标签: php class pdo

我在Philip http://culttt.com/2012/10/01/roll-your-own-pdo-php-class/找到了以下PDO课程。

我是Classes的新手。这很好用。有人看到它有什么问题还是可以改进?我想在大规模的应用程序中使用它。

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();
    }

}

2 个答案:

答案 0 :(得分:1)

在我看来,你应该坚持使用原生的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实现相比没有任何优势。

答案 1 :(得分:0)

  

它有什么问题

一切。即,

private $host = DB_HOST;

拥有数据库凭据的类变量绝对没有意义。它们仅在构造函数中使用,只使用一次。

catch (PDOException $e)

没什么意义。一个被捕获的错误无处可用,这破坏了异常的想法。

该类的其余部分只是模仿PDO功能。

与原始PDO的唯一区别在于它可以让您自动将PDO NULL绑定到DB NULL。但是,我怀疑你会有这样的想法。

因此,和其他人一样,我建议你摆脱这个课程和本教程。 特别是如果您不熟悉课程。这样的例子会破坏你的整个体验。