当前位置:网站首页>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();
# 事务 - 结束
边栏推荐
- Allure use
- [book club issue 13] Chapter 1 multimedia processing tools ffmpeg tools
- Mechanical revolution Jiaolong P wired network card driver can't play
- [leetcode] 24. Exchange nodes in the linked list in pairs
- File editing component
- pyspark更改列顺序存入iceberg数据库
- 2018年1月西邻雪山自驾游攻略
- Plantuml Usage Summary
- [Qt5] a method of multi window parameter transmission (using custom signal slot) and case code download
- MySQL query error [err] 1046 - no database selected
猜你喜欢

Es6: template string

Melt cloud x chat, create a "stress free social" habitat with sound

VK1620温控仪/智能电表LED数显驱动芯片3/4线接口内置 RC振荡器,提供技术支持

Es6: arrow function usage

Change the dataDir path after mysql8.0.16 installation

CAT1 4G+以太网开发板232数据通过4G模块TCP发到服务器

Spiral matrix

Meituan Er Mian: why does redis have sentinels?

Prescan quick start to master the transportation elements in lesson 14, prescan
![[Qt5] QT small software release](/img/83/9867bd4513caadac6a056c801abe48.png)
[Qt5] QT small software release
随机推荐
Usage of qmap
CI框架如何集成Smarty模板
An article to understand data warehouse: metadata classification, metadata management
招贤纳士,GBASE高端人才招募进行中
Get the clicked line number in qtablewidget
微信小程序----微信小程序浏览pdf文件
Detailed explanation of random number generated by random class
金属质感登录框样式
Draw.io image saving path settings
2022 Niuke multi school first problem solving Report
一键开关机电路
c语言中函数的介绍(血书20000字!!!!)
The even number of an integer queue is placed in the front, the odd number is placed in the back, and the relative position of the even and odd numbers remains unchanged
Feign call
Prescan quick start to master the road elements of lecture 15
学术界爆火的类脑智能,啥时候能落地?来听行业大咖怎么说丨量子位·对撞派 x 时识科技...
五张图看懂EMI电磁干扰的传播过程-方波陡峭程度对高频成分的影响,时序到频域频谱图形,波形形状对EMI辐射的影响。
opencv+paddle orc 识别图片提取表格信息
Deep browser rendering principles
Usage of qgroupbox