【问题标题】:PDO CLASS - Is this technically correct? [closed]PDO CLASS - 这在技术上是否正确? [关闭]
【发布时间】:2013-09-11 19:59:53
【问题描述】:

我在 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 类?
  • 您学习的教程没有任何目的。对于它确实有什么小功能,为什么不首先简单地从 PDO 继承呢?我不会使用那个教程。

标签: php class pdo


【解决方案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 实现相比没有任何优势。

【讨论】:

  • 谢谢。这正是我正在寻找的那种反馈。最近刚开始使用 PDO,但仍然很难掌握课程。仍在研究我是否需要一个仅用于连接的类。看起来如果我想使用多个数据库,那么我可能至少需要那个。感谢您的回复。
  • @Coder 需要多个数据库和“至少那个”之间有什么关系?你是不是在幻想你不能将原始 PDO 用于多个数据库?
  • PDO可以使用多个数据库连接,但是本教程提供的Database类只能使用DB_*常量定义的连接参数进行连接。这是使用此类时的另一个限制。
【解决方案2】:

有什么问题

一切。即,

private $host = DB_HOST;

为 DB 凭证设置一个类变量绝对没有意义。它们仅在构造函数中使用,仅一次。

catch (PDOException $e)

意义不大。无处使用捕获的错误,这破坏了异常的概念。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多