封装MySQL调用通常意味着创建一个类或一组函数,将数据库连接、查询执行、结果处理等操作隐藏在统一的接口背后,以简化代码、提高复用性和降低耦合度。以下是一个使用PHP PDO(PHP Data Objects)封装MySQL调用的详细例子:
<?php
class Database
{
private $host = 'localhost';
private $dbname = 'your_database';
private $username = 'your_username';
private $password = 'your_password';
private $pdo;
/**code by每日教程teachcourse.cn
* 构造函数,初始化数据库连接
*/
public function __construct()
{
try {
$dsn = "mysql:host={$this->host};dbname={$this->dbname}";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 抛出异常而非错误信息
PDO::ATTR_EMULATE_PREPARES => false, // 禁用预处理模拟,提高安全性
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 默认以关联数组返回结果
];
$this->pdo = new PDO($dsn, $this->username, $this->password, $options);
} catch (PDOException $e) {
throw new RuntimeException("Could not connect to the database: " . $e->getMessage());
}
}
/**
* 执行一条SQL查询并返回结果集
* code by每日教程www.teachcourse.cn
* @param string $sql SQL查询语句
* @param array $params 查询参数(预处理语句中的占位符对应值)
* @return array 查询结果集
*/
public function query(string $sql, array $params = []): array
{
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll();
}
/**
* 执行一条非查询SQL语句(如INSERT、UPDATE、DELETE)
*
* @param string $sql SQL语句
* @param array $params 查询参数(预处理语句中的占位符对应值)
* @return int 影响的行数
*/
public function execute(string $sql, array $params = []): int
{
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt->rowCount();
}
/**
* 开启事务
*/
public function beginTransaction(): void
{
$this->pdo->beginTransaction();
}
/**
* 提交事务
*/
public function commit(): void
{
$this->pdo->commit();
}
/**
* 回滚事务
*/
public function rollBack(): void
{
$this->pdo->rollBack();
}
}
// 使用示例
$db = new Database();
// 查询示例
$results = $db->query("SELECT * FROM users WHERE id = ?", [1]);
foreach ($results as $row) {
echo $row['username'] . "\n";
}
// 非查询操作示例
$affectedRows = $db->execute("UPDATE users SET status = ? WHERE id = ?", ['active', 1]);
// 事务示例
//code by每日教程teachcourse.cn
$db->beginTransaction();
try {
$db->execute("UPDATE accounts SET balance = balance - ? WHERE user_id = ?", [100, 1]);
$db->execute("INSERT INTO transactions (user_id, amount) VALUES (?, ?)", [1, 100]);
$db->commit();
} catch (\Throwable $e) {
$db->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
在这个例子中,我们创建了一个名为 Database
的类,封装了与MySQL数据库的连接、查询执行、事务管理等功能。通过实例化这个类并调用其方法,可以轻松地执行SQL操作,而无需直接处理底层的PDO对象或关注数据库连接细节。这种方法不仅提高了代码的整洁性和可维护性,也增强了应用程序的安全性,因为使用了预处理语句来防止SQL注入攻击。
当前文章价值9.74元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)
评论已关闭!