所有数据库查询PHP的一个函数

时间:2018-01-24 23:16:07

标签: php mysql database pdo

我现在正在使用PHP几周,并且我正在问自己,是否可以使用单个函数处理所有数据库查询(SELECT,UPDATE,INSERT,DELETE)。

目前我已经完成了约30倍的这些"尝试捕获" 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;
    }

有没有办法通过使用单个函数来缩小此代码,我或服务器是否可以从中获利?

谢谢路易斯

1 个答案:

答案 0 :(得分: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包含的对象超出范围时,同样如此;如果你想/需要在类中的其他地方使用它,该怎么办?请不要告诉我你反复重新初始化它。
    • 除非你的内存很低,并且需要立即从这些对象中恢复文字少数字节,否则没有理由明确取消它们。
  2. 不要抓住你没有做任何事情的例外。
    • 通过回显错误消息并让执行继续处于中断/意外状态,您就会为自己设置更多麻烦。
    • 让异常冒泡到更高,更通用的层,或者根本不抓住它并让它导致执行暂停。您可以使用set_exception_handler()来定义您的应用处理未捕获的异常的方式,例如:安全地记录详细信息和/或显示用户友好的错误消息。