PHP基础知识 – PHP 使用 PDO

PHP基础知识 – PHP 使用 PDO

# 前言

列举一些常用的 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();
# 事务 - 结束
                       

点击阅读全文

上一篇 2023年 5月 28日 am10:45
下一篇 2023年 5月 28日 am10:46