我现在正在使用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;
}
有没有办法通过使用单个函数来缩小此代码,我或服务器是否可以从中获利?
谢谢路易斯
答案 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;
}
然而:
$this->dbh
和$exc
设置为null。
$exc
在超出范围时将被取消引用,例如:在封闭函数的末尾,然后在以后进行垃圾收集。$this->dbh
包含的对象超出范围时,同样如此;如果你想/需要在类中的其他地方使用它,该怎么办?请不要告诉我你反复重新初始化它。set_exception_handler()
来定义您的应用处理未捕获的异常的方式,例如:安全地记录详细信息和/或显示用户友好的错误消息。