当前位置:网站首页>PHP基础知识 - PHP 使用 PDO
PHP基础知识 - PHP 使用 PDO
2022-07-28 06:58:00 【Chon.Wang】
# 前言
列举一些常用的 PDO 使用方法。本文需要你提前了解一些基本的
MySQL 增删改查语句知识。本文不作任何安全或验证方面的处理, 只列举示例。
一、PDO 类的使用
1.1 PHP 使用 PDO 连接 MySQL 与创建数据表
需要你自己提交准备好一个数据库, 本文数据库名: 为
test_pdo数据库
# 本文不作任何安全或验证方面的处理, 只记录每个命令的功能。
$db_name = 'test_pdo';
$mysql_username = 'root'; # MySQL 用户名
$mysql_password = 'root'; # MySQL 用户密码
$dsn = "mysql:host=127.0.0.1;dbname=$db_name"; # 主机名或主机 IP
$username = 'Chon';
$password = '123456';
$sex = 'Man';
$time = time();
# 1. 创建 pdo 实例, 连接 MySQL 数据库
$connect_obj = new PDO($dsn, $username, $password);
# 状态码与错误原因
if ($connect_obj->errorCode()){
die("错误代码: " . $connect_obj->errorCode . ', 错误描述: ' . $connect_obj->errorInfo());
}
1.2 执行 SQL 语句
# 习惯新增、修改、删除时使用
# pdo 采用 exec() 方法执行一条 SQL 语句
# 返回受影响的行数
# 格式: 对象->exec($sql_string);
# 习惯查询时使用, 也可以用来 新增、修改、删除
# 返回 PDOStatement 对象,如果失败返回 FALSE
# pdo 采用 query() 方法执行一条 SQL 查询语句
1.3 创建数据表
$create_table_sql = "CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户的ID', `user_name` varchar(140) NOT NULL DEFAULT '0' COMMENT '姓名', `password` varchar(120) NOT NULL COMMENT '登录密码', `sex` varchar(30) DEFAULT NULL COMMENT '性别', `creattime` varchar(40) NOT NULL COMMENT '创建时间', `is_del` enum('YES','NO') DEFAULT 'NO', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户表';";
$create_table_result = $connect_obj->exec($create_table_sql);
1.4 新增操作
$insert_sql = "INSERT INTO user (user_name, password, sex, creattime) VALUES ('Leslie','123456','MAN','1658569655')"; # SQL 语句
$insert_result = $connect_obj->exec($insert_sql); # 执行 SQL 语句
$inseret_id = $connect_obj->lastInsertId(); # 获取新插入数据的自增 ID
1.5 删除操作
$delete_sql = "DELETE FROM user WHERE id < 5"; # 删除功能的 SQL 语句
$delete_result = $connect_obj->exec($delete_sql); # 执行 SQL 语句
1.6 修改操作
$update_sql = "UPDATE user SET user_name = 'Chon' WHERE id = 6"; # 删除功能的 SQL 语句
$update_result = $connect_obj->exec($update_sql); # 执行 SQL 语句
1.7 查询操作
# 第一种: 查询数据 - query() 查询
# query() 返回的是 PDOStatement 对象, 需要遍历获取到数据
$select_all_sql = "SELECT * FROM user where id > 8";
$select_all_result = $connect_obj->query($select_all_sql); # 执行 SQL 语句
foreach($select_all_result as $val){
# 数据的一些处理
}
二、PDOStatement 类的使用
2.1 至 2.3 为预处理语句。
2.1 准备与执行
# 1. prepare() 准备要执行的 SQL 语句, 返回 PDOStatement 对象
$stmt = $connect_obj->prepare($sql_string);
# 2. execute() 执行准备好的 SQL 语句, 返回值 TRUE | FALSE
$stmt->execute();
2.2 冒号 : 占位符与参数绑定 bindParam() 执行
$statement_insert_sql = "INSERT INTO user (user_name, password, sex, creattime) VALUES (:user_name, :password, :sex, :creattime)";
$stmt = $connect_obj->prepare($statement_insert_sql);
# 第一种执行方式: 传入参数值数组
$result_1 = $stmt->execute([':user_name'=> 'Chon', ':password'=>123456, ':sex'=>'WOMAN', ':creattime'=>time()]);
# 第二种执行方式: 参数绑定 bindParam()
$stmt->bindParam(':user_name', $username);
$stmt->bindParam(':password', $password);
$stmt->bindParam(':sex', $sex);
$stmt->bindParam(':creattime', $time);
$result_2 = $stmt->execute();
2.3 问号 ? 占位符与参数绑定 bindValue() 执行
$statement_insert_sql = "INSERT INTO user (user_name, password, sex, creattime) VALUES (?, ?, ?, ?)";
$stmt = $connect_obj->prepare($statement_insert_sql);
# 第一种执行方式: 按占位符顺序, 传入参数值数组
$result_3 = $stmt->execute(['Leslie','123456','MAN','1658569655']);
# 第二种执行方式: bindValue()
$stmt->bindValue(1, $username);
$stmt->bindValue(2, $password);
$stmt->bindValue(3, $sex);
$stmt->bindValue(4, $time);
$result_4 = $stmt->execute();
2.4 列绑定 bindColumn()
# 获取数据
$stmt = $connect_obj->prepare($select_all_sql);
$stmt->execute();
# 第一种方式: 列号绑定
$stmt->bindColumn(1, $column_username);
$stmt->bindColumn(2, $column_password);
# 第二种方式:列名绑定
$stmt->bindColumn('sex', $column_sex);
$stmt->bindColumn('creattime', $column_creattime);
# 例子:
while ($row = $stmt->fetch()) {
echo $column_username, $column_password, $column_sex, $column_creattime;
}
2.5 查询操作 - 获取所有数据 fetchAll()
# 获取数据
$stmt = $connect_obj->prepare($select_all_sql);
$stmt->execute();
$all_result = $stmt->fetchAll(); # 数组
2.6 查询操作 - 获取单行数据
# 获取数据
$stmt = $connect_obj->prepare($select_all_sql);
$stmt->execute();
# 1. 对象格式
while ($row_obj = $stmt->fetchObject()) {
# 数据的一些处理
}
# 2. 数组格式
# 常用参数: PDO::FETCH_BOTH(默认), PDO::FETCH_ASSOC(关联数组), PDO::FETCH_NUM(索引数组)
while ($row_array = $stmt->fetch(PDO::FETCH_ASSOC)) {
# 数据的一些处理
}
2.7 获取受影响的行数 rowCount()
$stmt = $connect_obj->prepare($control_sql);
$stmt->execute();
# 该方式获取上一个 SQL 语句执行后所影响的行数
$stmt->rowCount();
三、事务操作
# 事务 - 第一步: 开启事务
$connect_obj->beginTransaction();
# 事务 - 第二步: CUD 等操作
$result = "SQL 操作";
# 事务 - 第三步: 提交事务或回滚事务
if ($result){
# 如果运行结果正确, 则提交事务
$connect_obj->commit();
} else {
# 如果错误则回滚事务
$connect_obj->rollback();
}
# 其它 - 检查是否在一个事务内 (bool: true | false)
$is_transaction = $connect_obj->inTransaction();
四、实例代码
<?php
# 本文不作任何安全或验证方面的处理, 只记录每个命令的功能。
$db_name = 'test_pdo';
$mysql_username = 'root'; # MySQL 用户名
$mysql_password = 'root'; # MySQL 用户密码
$dsn = "mysql:host=127.0.0.1;dbname=$db_name"; # 主机名或主机 IP
$username = 'Chon';
$password = '123456';
$sex = 'Man';
$time = time();
# 一、PDO 类的使用
## 1.1 创建 pdo 实例, 连接 MySQL 数据库
$connect_obj = new PDO($dsn, $mysql_username, $mysql_password);
# 状态码与错误原因
if ($connect_obj->errorCode()){
die("错误代码: " . $connect_obj->errorCode . ', 错误描述: ' . $connect_obj->errorInfo());
}
## 1.2 执行 MySQL 语句
# exec() 习惯新增、修改、删除时使用
# pdo 采用 exec() 方法执行一条 SQL 语句
# 返回受影响的行数
# 格式: 对象->exec($sql_string);
# query() 习惯查询时使用, 也可以用来 新增、修改、删除
# 返回 PDOStatement 对象,如果失败返回 FALSE
# pdo 采用 query() 方法执行一条 SQL 查询语句
## 1.3 创建数据表
/* $create_table_sql = "CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户的ID', `user_name` varchar(140) NOT NULL DEFAULT '0' COMMENT '姓名', `password` varchar(120) NOT NULL COMMENT '登录密码', `sex` varchar(30) DEFAULT NULL COMMENT '性别', `creattime` varchar(40) NOT NULL COMMENT '创建时间', `is_del` enum('YES','NO') DEFAULT 'NO', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户表';"; $create_table_result = $connect_obj->exec($create_table_sql); */
## 1.4 新增操作
# $insert_sql = "INSERT INTO user (user_name, password, sex, creattime) VALUES ('Leslie','123456','MAN','1658569655')"; # SQL 语句
# $insert_result = $connect_obj->exec($insert_sql); # 执行 SQL 语句
# $inseret_id = $connect_obj->lastInsertId(); # 获取新插入数据的自增 ID
## 1.5 删除操作
$delete_sql = "DELETE FROM user WHERE id < 5"; # 删除功能的 SQL 语句
$delete_result = $connect_obj->exec($delete_sql); # 执行 SQL 语句
## 1.6 修改操作
$update_sql = "UPDATE user SET user_name = 'Chon' WHERE id = 6"; # 删除功能的 SQL 语句
$update_result = $connect_obj->exec($update_sql); # 执行 SQL 语句
## 1.7 查询操作
# 第一种: 查询数据 - query() 查询
# query() 返回的是 PDOStatement 对象, 需要遍历获取到数据
$select_all_sql = "SELECT * FROM user where id > 8";
$select_all_result = $connect_obj->query($select_all_sql); # 执行 SQL 语句
foreach($select_all_result as $val){
# 数据的一些处理
}
# 二、预处理语句
## 2.1 准备与执行
# 1. prepare() 准备要执行的 SQL 语句
# $stmt = $connect_obj->prepare($sql_string);
# 2. execute() 执行准备好的 SQL 语句, 返回值 TRUE | FALSE
# $stmt->execute();
## 2.2 冒号(:) 占位符与参数绑定 bindParam() 执行
# $statement_insert_sql = "INSERT INTO user (user_name, password, sex, creattime) VALUES (:user_name, :password, :sex, :creattime)";
# $stmt = $connect_obj->prepare($statement_insert_sql);
# 第一种执行方式: 传入参数值数组
# $result_1 = $stmt->execute([':user_name'=> 'Chon', ':password'=>123456, ':sex'=>'WOMAN', ':creattime'=>time()]);
# 第二种执行方式: bindParam()
# $stmt->bindParam(':user_name', $username);
# $stmt->bindParam(':password', $password);
# $stmt->bindParam(':sex', $sex);
# $stmt->bindParam(':creattime', $time);
# $result_2 = $stmt->execute();
## 2.3 问号(?) 占位符与参数绑定 bindValue() 执行
# $statement_insert_sql = "INSERT INTO user (user_name, password, sex, creattime) VALUES (?, ?, ?, ?)";
# $stmt = $connect_obj->prepare($statement_insert_sql);
# 第一种执行方式: 按占位符顺序, 传入参数值数组
# $result_3 = $stmt->execute(['Leslie','123456','MAN','1658569655']);
# 第二种执行方式: bindValue()
# $stmt->bindValue(1, $username);
# $stmt->bindValue(2, $password);
# $stmt->bindValue(3, $sex);
# $stmt->bindValue(4, $time);
# $result_4 = $stmt->execute();
## 2.4 列绑定 bindColumn()
# 获取数据
# $stmt = $connect_obj->prepare($select_all_sql);
# $stmt->execute();
# 第一种方式: 列号绑定
# $stmt->bindColumn(1, $column_username);
# $stmt->bindColumn(2, $column_password);
# 第二种方式:列名绑定
# $stmt->bindColumn('sex', $column_sex);
# $stmt->bindColumn('creattime', $column_creattime);
# 例子:
#while ($row = $stmt->fetch()) {
# echo $column_username, $column_password, $column_sex, $column_creattime;
#}
# 2.5 查询操作 - 获取所有数据 `fetchAll()`
# $stmt = $connect_obj->prepare($select_all_sql);
# $stmt->execute();
# $all_result = $stmt->fetchAll(); # 数组
# 2.6 查询操作 - 获取单行数据
$stmt = $connect_obj->prepare($select_all_sql);
$stmt->execute();
# 1. 对象格式
# while ($row_obj = $stmt->fetchObject()) {
# 数据的一些处理
# }
# 2. 数组格式
# 常用参数: PDO::FETCH_BOTH(默认), PDO::FETCH_ASSOC(关联数组), PDO::FETCH_NUM(索引数组)
while ($row_array = $stmt->fetch(PDO::FETCH_ASSOC)) {
# 数据的一些处理
}
# 2.7 获取受影响的行数
$stmt = $connect_obj->prepare($select_all_sql);
$stmt->execute();
# 该方式获取上一个 SQL 语句执行后所影响的行数
$stmt->rowCount();
# 事务 - 开始
# 事务 - 第一步: 开启事务
$connect_obj->beginTransaction();
# 事务 - 第二步: CUD 等操作
$result = "SQL 操作";
# 事务 - 第三步: 提交事务或回滚事务
if ($result){
# 如果运行结果正确, 则提交事务
$connect_obj->commit();
} else {
# 如果错误则回滚事务
$connect_obj->rollback();
}
# 其它 - 检查是否在一个事务内
$is_transaction = $connect_obj->inTransaction();
# 事务 - 结束
边栏推荐
- ASP. Net core foundation V
- File editing component
- 49-OpenCv深入分析轮廓
- Unity切换到另一个场景的时候,发现该场景变暗了
- What happens when you unplug the power? Gaussdb (for redis) dual life keeps you prepared
- Creation of status bar (29)
- In QT multithreading, in which thread does the slot function perform analysis
- feign 调用
- How to write a JMeter script common to the test team
- Change the dataDir path after mysql8.0.16 installation
猜你喜欢

Five screens, VR, projection, "Wei Xiaoli" rolled up on the intelligent cockpit

Es6: template string

Plantuml Usage Summary

5张图告诉你:同样是职场人,差距怎么这么大?

网口网络水晶头RJ45、POE接口定义线序

CarSim simulation quick start (10) - Modeling of braking system

五张图看懂EMI电磁干扰的传播过程-方波陡峭程度对高频成分的影响,时序到频域频谱图形,波形形状对EMI辐射的影响。

What happens when you unplug the power? Gaussdb (for redis) dual life keeps you prepared

百度智能云九州区县大脑,描绘城乡新蓝图!

VK1620温控仪/智能电表LED数显驱动芯片3/4线接口内置 RC振荡器,提供技术支持
随机推荐
Es6: template string
Openstack dashboard configuring public network access
JS candy xiaoxiaole game source code
Puzzle (004.3) pattern puzzle
Usage of qgroupbox
[reprint] man Rsync translation (Chinese Manual of Rsync command)
Characteristics of EMC EMI beads
Kubernetes技术与架构(七)
MySQL query error [err] 1046 - no database selected
Mechanical revolution Jiaolong P wired network card driver can't play
[leetcode] 24. Exchange nodes in the linked list in pairs
Plantuml Usage Summary
Regular expression for mobile number verification
UE4 engine customizes screenpass and MRT output
One key switch circuit
An article to understand data warehouse: metadata classification, metadata management
Deep browser rendering principles
Usage of qmap
2018年1月西邻雪山自驾游攻略
Simple use of unity queue