【问题标题】:One Function for all DB Queries PHP适用于所有数据库查询 PHP 的一个函数
【发布时间】:2018-01-24 23:16:07
【问题描述】:

我使用 PHP 已经有几个星期了,我一直在问自己,是否可以用一个函数来处理所有数据库查询(SELECT、UPDATE、INSERT、DELETE)。

目前我有大约 30 倍的这些“try-catch”PDO 来与我的数据库进行通信:

//DB connection info already set...

    try {

        $exc = $this->dbh->prepare("SELECT uid FROM users WHERE email = :mail");

        $exc->bindParam(':mail', $mail, PDO::PARAM_STR);

        $exc->execute();
        $exc->setFetchMode(PDO::FETCH_ASSOC);

        while ($row = $exc->fetch()) {
            // do something with $row['uid']
        }

        $this->dbh = null;
        $exc = null;

    } catch (PDOException $e) {           
        echo $e;
        $this->dbh = null;
        $exc = null;
    }

有没有办法通过使用单个函数来缩小这段代码,我或服务器会从中获得任何利润吗?

谢谢你,路易斯

【问题讨论】:

  • 不清楚...您能否提供至少两个这样的代码块,以便我们看看它们是否可以缩小?
  • 听起来您正在考虑实现 PDO 包装器。这是一本好书~phpdelusions.net/pdo/pdo_wrapper
  • 是的,您可以通过构建自己的 db 类包装器来简化,或者找到一个已经存在的。唯一的缺点是,使用简化对象会变得懒惰,而不是像上面介绍的那样冗长冗长;-)
  • 您的问题是倒退的,因为它本质上是:“我在最佳实践方面或多或少正确地做事,我如何将此代码回归到完全不可取的东西?”说真的,如果你只是“几周”开始使用 PHP,那么你发布的代码比那些已经这样做了 的人领先了几英里。

标签: php mysql database pdo


【解决方案1】:

就像我在评论中所说,您的代码已经相当不错了,但是有几个地方可以减少您编写的样板代码量。

// You can set the default fetch mode in the constructor
$this->dbh = new PDO($cstr, $user, $pass, [PDO::DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);

try {
    $exc = $this->dbh->prepare("SELECT uid FROM users WHERE email = :mail");

    // you don't have to explicitly bind your parameters
    // and you can feed them directly to execute()
    $exc->execute([':mail' => $mail]);

    while ($row = $exc->fetch()) {
        // do something with $row['uid']
    }
} catch (PDOException $e) {           
    echo $e;
} finally {
    // 'finally' blocks are always executed
    $this->dbh = null;
    $exc = null;
}

但是:

  1. 我不确定你为什么在最后将$this->dbh$exc 设置为null。
    • $exc 超出范围时将被取消引用,例如:在封闭函数的末尾,然后在稍后进行垃圾收集。
    • $this->dbh 的包含对象超出范围时也是如此,如果您想/需要在类的其他地方使用它怎么办?请不要告诉我你反复重新初始化它。
    • 除非您的 RAM 非常低并且需要立即从这些对象中恢复字面 少数 字节,否则没有理由显式取消设置它们。
  2. 不要捕获你没有做任何事情的异常。
    • 只回显错误消息并让执行在中断/意外状态下继续执行,您会为自己设置更多麻烦。
    • 让异常冒泡到更高、更通用的层,或者根本不捕获它并让它导致执行停止。您可以使用set_exception_handler() 来定义您的应用如何处理未捕获的异常,例如:安全地记录详细信息和/或显示用户友好的错误消息。

【讨论】:

  • 感谢您的回答和评论 - 我会考虑的。
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2016-06-15
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多