我也是类(class)和 PDO 的新手。我正在尝试编写一个具有单独函数的类,用于连接到数据库并关闭连接,以便在页面中,我可以:
- 使用
$db->connOpen
打开连接 - 在页面内执行我需要的所有查询
使用
$db->connClose
在脚本末尾关闭连接class database { private $host = ''; private $db_name = ''; private $charset = ''; private $username = ''; private $password = ''; public function setHost($host) { $this->host = $host; } public function setDbName($db_name) { $this->db_name = $db_name; } public function setUser($username, $password) { $this->username = $username; $this->password = $password; } public function connOpen() { try { $dsn = "mysql:host=$this->host;dbname=$this->db_name;charset=$this->charset"; $db = new PDO($dsn, $this->username, $this->password, array(PDO::ATTR_PERSISTENT => true)); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo $e->getMessage(); } } public function connClose() { $db = null; } }
我猜问题更多的是类语法而不是 PDO,因为要在页面中触发如下查询,我需要再次实例化类 PDO
,将连接加倍数据库。
$stmt = $dbo->prepare('SELECT * FROM products WHERE id=:id');
$stmt->execute(array(':id' => $id));
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
我的问题是:
- 如何使用上面这样的类来实现我想要的效果?
- 在本例中,使用持久连接是否正确?
谢谢
最佳答案
出于某种原因,大多数想要学习 OOP 的人都是从实现单例并干扰错误处理的数据库包装器开始。
我的建议是,将数据库连接视为任何其他变量:
class Post {
function getByUserId(PDO $connection, $user_id) {
}
}
$database = new PDO(...);
$post->getByUserId($database, 123);
这称为依赖注入(inject)。
并且不要浪费时间和精力编写代码来避免使用有用的功能,例如:
- 集中错误处理
- 能够连接到多个数据库
只有当您确实有真正的功能要添加到 PDO 之上时,才关心编写数据库包装器。我能想到的是:
- 自动将日期转换为
DateTime
对象 - 将所有查询传递给记录器
- 对有趣的事件抛出自定义异常,例如重复索引违规
...即使如此,也要非常小心,不要让 PDO 变得更糟;-)
关于php - 检索页面内的连接 : PDO and PHP class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504869/