千家信息网

通过PDO扩展与MySQL数据库交互如何实现增删改查和数据库事务

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,通过PDO扩展与MySQL数据库交互如何实现增删改查和数据库事务?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!通过预
千家信息网最后更新 2026年10月31日通过PDO扩展与MySQL数据库交互如何实现增删改查和数据库事务

通过PDO扩展与MySQL数据库交互如何实现增删改查和数据库事务?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

通过预处理语句进行增删改查

为什么使用预处理语句

关于预处理语句我们在上篇教程中已经简单介绍过,我们可以将其与视图模板类比,所谓预处理语句就是预定义的 SQL 语句模板,其中的具体参数值通过占位符替代:

INSERT INTO REGISTRY (name, value) VALUES (?, ?)INSERT INTO REGISTRY (name, value) VALUES (:name, :value)

然后在后续真正要执行 SQL 语句之前,再通过特定 API 方法将具体参数值与对应占位符进行绑定和映射。就好比定义的视图模板也是将变量通过特定占位符替代,然后真正渲染时将变量值传递进来填充和渲染一样。

为什么要费这番周折呢?直接用前面演示的 query 方法进行增删改查操作它不香吗?呃,那我们接下来来说说预处理语句的好处,或者说为什么要使用预处理语句进行数据库交互,好处有二:

  • 首先,使用预处理语句提前定义的 SQL 模板只会解析一次,但可以通过传递不同的参数值执行多次,从而避免模板相同的 SQL 语句重复分析、编译和优化,提高数据库操作执行速度;
  • 其次,后期传递给预处理语句的参数值会被底层驱动进行处理,从而有效避免 SQL 注入攻击。

综上,从性能和安全角度考虑,推荐使用预处理语句处理数据库的增删改查操作。

增删改查示例代码

接下来,我们基于 PDO 提供的预处理语句 API 实现 MySQL 数据库的增删改查操作,我们将通过面向对象的方式来实现:

pdo = $pdo;        }    }    public function insert($title, $content)    {        $sql = 'INSERT INTO `post` (title, content, created_at) VALUES (:title, :content, :created_at)';        try {            // 准备预处理语句            $stmt = $this->pdo->prepare($sql);            // 获取当前时间对应的格式化字符串:2020-05-28 13:00:00            $datetime = date('Y-m-d H:i:s', time());            // 绑定参数值            $stmt->bindParam(':title', $title, PDO::PARAM_STR);            $stmt->bindParam(':content', $content, PDO::PARAM_STR);            $stmt->bindParam(':created_at', $datetime, PDO::PARAM_STR);            // 执行语句            $stmt->execute();            return $this->pdo->lastInsertId();  // 返回插入记录对应ID        } catch (PDOException $e) {            printf("数据库插入失败: %s\n", $e->getMessage());        }    }    public function select($id)    {        $sql = 'SELECT * FROM `post` WHERE id = ?';        try {            // 准备预处理语句            $stmt = $this->pdo->prepare($sql);            // 绑定参数值            $stmt->bindValue(1, $id, PDO::PARAM_INT);            // 执行语句            $stmt->execute();            return $stmt->fetchObject(self::class);  // 以对象方式返回结果集        } catch (PDOException $e) {            printf("数据库查询失败: %s\n", $e->getMessage());        }    }    public function selectAll()    {        $sql = 'SELECT * FROM `post` ORDER BY id DESC';        try {            // 准备预处理语句            $stmt = $this->pdo->prepare($sql);            // 执行语句            $stmt->execute();            return $stmt->fetchAll();  // 返回所有结果集        } catch (PDOException $e) {            printf("数据库查询失败: %s\n", $e->getMessage());        }    }    public function update($id)    {        $sql = 'UPDATE `post` SET created_at = :created_at WHERE id = :id';        try {            // 准备预处理语句            $stmt = $this->pdo->prepare($sql);            $datetime = date('Y-m-d H:i:s', time());            // 绑定参数值            $stmt->bindParam(':created_at', $datetime, PDO::PARAM_STR);            $stmt->bindValue(':id', $id, PDO::PARAM_INT);            // 执行语句            $stmt->execute();            return $stmt->rowCount();        } catch (PDOException $e) {            printf("数据库更新失败: %s\n", $e->getMessage());        }    }    public function delete($id)    {        $sql = 'DELETE FROM `post` WHERE id = ?';        try {            // 准备预处理语句            $stmt = $this->pdo->prepare($sql);            // 绑定参数值            $stmt->bindValue(1, $id, PDO::PARAM_INT);            // 执行语句            $stmt->execute();            return $stmt->rowCount();        } catch (PDOException $e) {            printf("数据库删除失败: %s\n", $e->getMessage());        }    }}

我们构建了一个 Post 类,然后在构造函数中初始化 $pdo 实例(从外部传入),然后将基于预处理语句实现的增删改查操作分解到对应的类方法中。整体逻辑非常简单,以 insert 为例,首先通过 PDO 对象的 prepare 方法传入 SQL 模板构建预处理语句,该方法返回 PDOStatement 对象,接下来,就是调用该对像的 bindParam 方法绑定具体参数值,该方法的第一个参数是占位符,第二个参数是参数值,第三个参数是值类型(对应的常量可以在 PDO 预定义常量中查询),绑定好参数后,就可以调用 PDOStatement 对象的 execute 方法执行预处理语句了。

对于插入操作,可以通过 PDO 对象上的 lastInsertId 方法返回插入记录的主键 ID,对于更新和删除方法,可以通过 PDOStatement 对象上的 rowCount 方法返回受影响行数表示是否操作成功。对于查询操作,可以通过 PDOStatement 对象的 fetch 方法返回单条记录,也可以通过 fetchObject 方法返回映射到指定类后的对象实例(也是单条记录),对于多个结果,可以通过 fetchAll 方法返回。

需要注意的是,在声明预处理语句的时候,可以通过 ? 占位符,也可以通过 :name 这种可读性更好的占位符,然后在绑定参数时,既可以通过 bindValue 也可以通过 bindParam 方法,两者传递参数一样,只是对于 ? 占位符,需要通过数值序号建立与 SQL 模板的映射(从 1 开始)。

结合代码和 PHP 官方文档理解上面的代码并不困难,接下来,我们来编写测试代码:

// 初始化 PDO 连接实例$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4';$user = 'root';$pass = 'root';try {    $pdo = new PDO($dsn, $user, $pass);} catch (PDOException $e) {    printf("数据库连接失败: %s\n", $e->getMessage());}// 测试代码$post = new Post($pdo);// insert$title = '这是一篇测试文章
以上就是通过PDO扩展与MySQL数据库交互 实现增删改查实现和数据库事务的详细内容,更多请关注其它相关文章!

感谢各位的阅读!看完上述内容,你们对通过PDO扩展与MySQL数据库交互如何实现增删改查和数据库事务大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注行业资讯频道。

语句 预处理 数据 数据库 参数 方法 可以通过 对象 模板 代码 内容 准备 文章 查询 事务 接下来 实例 就是 结果 测试 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山东特亿宝互联网科技有限公司 互联网科技公司起名 互联网科技工作委员会 今日互联网科技 互联网和科技创新 盈实互联网科技 北京互联网科技 卓越科技(互联网 ) 西安互联网科技公司 广州凡科互联网科技 伴你行互联网科技有限公司 玖二柒互联网科技公司待遇 温州喔噻互联网科技有限公司 阿里巴巴算科技企业还是互联网 彤创互联网科技有限公司 上海互联网科技公司ppt 万物互联网智能科技 10位科技互联网大佬 互联网科技自媒体灵感 伍佰万互联网科技是干嘛的 湖北九亚互联网络科技有限公司 河南云网互联网络科技有限公司 云之行互联网科技 互联网最新的科技有限公司 北京互联网科技公司 美国互联网前沿科技 互联网公司会议桌创意科技软装饰 湖南洣水互联网科技有限公司扣款 天速互联网络科技有限公司 保山浩联互联网科技有限公司
0