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

发布时间:2024-02-17
相关学习推荐: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 数据库的增删改查操作,我们将通过面向对象的方式来实现:
<?phpclass post{ public $id; public $title; public $content; public $created_at; / * @var pdo */ protected $pdo; public function __construct(pdo $pdo = null) { if ($pdo != null) { $this->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 对象,接下来,就是调用
上一个:组合逻辑电路的特点
下一个:刷bios啥意思(刷bios是干嘛的)

deutschmann凸轮控制器locon 200
给排水阀门、管道施工禁忌及措施有哪些?
喝姜茶改善血液循环 如何制作姜茶?
电脑登录淘宝怎么看直播(淘宝直播电脑客户端)
工程量清单的项目设置要点有哪些?
电脑里文字怎么变大(电脑里的字怎么变大)
签租房合同时要注意什么
电除尘器的试验项目内容是?
微信美团外卖打不开怎么回事儿(微信美团外卖打不开怎么办)
笔记本硬盘如何装在台式机电脑上