博客列表 >PHP 12 数据库操作总结mysqli与PDO(0720mon)

PHP 12 数据库操作总结mysqli与PDO(0720mon)

老黑
老黑原创
2020年07月26日 15:32:53701浏览

主要内容

  1. mysqli连接
  2. mysqli增删改查
  3. pdo连接
  4. pdo增删改查
  5. 查询的地方都涉及到遍历等,因此方法相对较多

1. mysqli连接

  • 首先先做一个config.php文件
  1. <?php
  2. // 连接参数
  3. return [
  4. // 类型
  5. 'type' => $type ?? 'mysql',
  6. // 先问下,没有的情况下再默认。默认数据库主机名(IP)
  7. 'host' => $host ?? 'localhost',
  8. // 默认数据库名
  9. 'dbname' => $type ?? 'phpedu',
  10. // 默认字符编码集
  11. 'charset' => $type ?? 'utf8',
  12. // 默认端口号
  13. 'port' => $type ?? '3306',
  14. // 默认用户名
  15. 'username' => $username ?? 'root',
  16. // 默认用户的密码
  17. 'password' => $password ?? 'root'
  18. ];
  • mysqli连接文件connect.php
  1. <?php
  2. // 连接数据库
  3. // 导入配置参数,就是一个数组。因为在上一级目录,因此有..
  4. $config = require __DIR__ . '/../config.php';
  5. // 关联数组 ===> 独立变量
  6. extract($config);
  7. // 创建连接对象: 连接数据库
  8. $mysqli = new mysqli($host, $username, $password, $dbname);
  9. // 检测错误
  10. if ($mysqli->connect_errno) die('Connect Error: ' . $mysqli->connect_error);
  11. // 字符编码
  12. $mysqli->set_charset($charset);

2. mysqli增删改查

2-1. mysqli - 增(insert)

  1. // mysqli新增操作
  2. // 1. 连接
  3. require 'connect.php';
  4. // 2. 操作
  5. // sql语句, ?:匿名占位符
  6. $sql = 'INSERT `users` SET `name`=?, `email`= ?, `password`=?;';
  7. // 第一步: 将sql语句转为sql语句对象: stmt对象,预处理对象, 预编译语句对象
  8. $stmt = $mysqli->prepare($sql);
  9. // 给sql语句中的占位符?,绑定变量分二步
  10. // 1. 给占位符绑定一个变量名(变量标识符)
  11. $stmt->bind_param('sss', $name,$email,$password);
  12. //sss代表三个string字符串占位
  13. // 2. 将变量名与一个具体的值进行绑定: 变量赋值
  14. // $name = 'admin';
  15. // $email = 'admin@php.cn';
  16. // sha1():生成40位由16进制字母组成的随机字符串
  17. // $password = sha1('123');
  18. // 第二步:执行
  19. // $stmt->execute() or die($stmt->error);
  20. // printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
  21. //也可以用这种方式。
  22. // $data = [
  23. // 'name'=> 'peter',
  24. // 'email'=> 'peter@php.cn',
  25. // 'password' => sha1('123456'),
  26. // ];
  27. // 将关联数组解构到一组独立变量中
  28. // extract($data);
  29. // // 执行
  30. // $stmt->execute() or die($stmt->error);
  31. // printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
  32. // 通过遍历一个二维数组,可以实现一次性插入多条记录
  33. $users = [
  34. ['name'=> '小燕子','email'=>'xyz@php.cn', 'password'=>sha1('123456')],
  35. ['name'=> '紫薇','email'=>'zw@php.cn', 'password'=>sha1('123456')],
  36. ['name'=> '五阿哥','email'=>'wag@php.cn', 'password'=>sha1('123456')],
  37. ['name'=> '尔康','email'=>'ek@php.cn', 'password'=>sha1('123456')],
  38. ['name'=> '金锁','email'=>'js@php.cn', 'password'=>sha1('123456')],
  39. ];
  40. foreach ($users as $user) {
  41. extract($user);
  42. if ($stmt->execute())
  43. printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
  44. //$s为string占位符,%d为数字占位符。
  45. else
  46. exit(sprintf('新增失败 , $d: %s', $stmt->errno, $stmt->error ));
  47. }
  48. // 第三步:关闭
  49. $mysqli->close();

2-2. mysqli - 删(delete)

  1. <?php
  2. // mysqli删除操作
  3. // 1. 连接
  4. require 'connect.php';
  5. // 2. 操作
  6. $sql = 'DELETE FROM `users` WHERE `id` = ?;';
  7. // sql语句对象
  8. $stmt = $mysqli->prepare($sql);
  9. // 占位符与变量名绑定
  10. $stmt->bind_param('i',$id);
  11. // 变量赋值
  12. $id=14;
  13. //执行更新
  14. $stmt->execute();
  15. printf('删除了 %s 条记录', $stmt->affected_rows);
  16. // 3. 关闭
  17. $mysqli->close();

2-3. mysqli - 改(update)

  1. <?php
  2. // mysqli更新操作
  3. // 1. 连接
  4. require 'connect.php';
  5. // 2. 操作
  6. $sql = 'UPDATE `users` SET `name`=?, `email`= ?, `password`=? WHERE `id` = ?;';
  7. // sql语句对象
  8. $stmt = $mysqli->prepare($sql);
  9. // 占位符与变量名绑定
  10. $stmt->bind_param('sssi', $name, $email, $password, $id);
  11. // 变量赋值
  12. $user = ['name'=>'皇后','email'=>'hh@php.cn', 'password'=>sha1('888'), 'id'=>14 ];
  13. //展开为独立变量给sql语句模板中的与占位符对应的变量名赋值
  14. extract($user);
  15. //执行更新
  16. $stmt->execute();
  17. printf('更新了 %s 条记录', $stmt->affected_rows);
  18. // 3. 关闭
  19. $mysqli->close();

2-4. mysqli - 查(select)

  • 查询有好几种方式,主要是因为查询涉及到将取出来的数据展示出来。
2-4-1. fetch_assoc() + while()
  1. <?php
  2. // mysqli查询1: fetch_assoc() + while()
  3. // 1. 连接
  4. require 'connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT * FROM `users` WHERE `id` > ?';
  7. // sql语句对象
  8. $stmt = $mysqli->prepare($sql);
  9. $stmt->bind_param('i', $id);
  10. $id = 15;
  11. $stmt->execute() or die($stmt->error);
  12. // 获取结果集
  13. $result = $stmt->get_result();
  14. if ($result->num_rows === 0) exit('结果为空');
  15. // fetch_assoc():以关联数组方式返回一个记录
  16. // 循环遍历
  17. while ($user=$result->fetch_assoc()) {
  18. vprintf('%d: %s | %s <br>', $user);
  19. }
  20. // 3. 释放结果
  21. $result->free();
  22. // 4. 关闭连接
  23. $mysqli->close();
2-4-2. fetch_all() + foreach()
  1. $sql = 'SELECT * FROM `users` WHERE `id` > ?';
  2. // sql语句对象
  3. $stmt = $mysqli->prepare($sql);
  4. $stmt->bind_param('i', $id);
  5. $id = 15;
  6. $stmt->execute() or die($stmt->error);
  7. // 获取结果集
  8. $result = $stmt->get_result();
  9. if ($result->num_rows === 0) exit('结果为空');
  10. // fetch_all():以二维关联数组方式返回一个满足查询条件的所有记录集合
  11. $users=$result->fetch_all(MYSQLI_ASSOC);
  12. // 循环遍历
  13. foreach ($users as $user) {
  14. vprintf('%d: %s ******* | %s <br>', $user);
  15. //中间的*****只是为了区别于前面,可以不加。
  16. }
2-4-3. bind_result() + fetch() + while()
  1. $sql = 'SELECT `id`, `name`,`email` FROM `users` WHERE `id` > ?';
  2. // sql语句对象
  3. $stmt = $mysqli->prepare($sql);
  4. $stmt->bind_param('i', $id);
  5. $id = 15;
  6. $stmt->execute() or die($stmt->error);
  7. // 字段与变量的绑定
  8. $stmt->bind_result($id, $name, $email);
  9. // 因为当前操作不涉及结果集对象,如果要获取结果集中的数量,用以下二行代码
  10. $stmt->store_result();
  11. if ($stmt->num_rows === 0) exit('没有内容');
  12. // 循环遍历
  13. while ($stmt->fetch()) {
  14. printf('%d: %s ----| %s <br>', $id, $name, $email);
  15. }

3. pdo连接

  • pdo连接文件connect.php
  1. // pdo连接数据库
  2. // 导入配置参数,就是一个数组
  3. $config = require __DIR__ . '/../config.php';
  4. // 关联数组 ===> 独立变量
  5. extract($config);
  6. // 创建连接对象: 连接数据库。下面这个直接也可以,当然也可以用下面的try catch。
  7. // $dsn: 数据源名称
  8. // $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';//不过这里只是示例
  9. try {
  10. $dsn= sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$host,$dbname,$charset,$port);
  11. $pdo = new PDO($dsn, $username, $password);
  12. // 设置结果集的默认获取模式: 只关心关联数组部分
  13. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  14. } catch (PDOException $e) {
  15. exit('Connection Error: ' . $e->getMessage());
  16. }

4. pdo增删改查

4-1. pdo - 增(insert)

  1. <?php
  2. // pdo 新增操作
  3. // 1. 连接
  4. require 'connect.php';
  5. // 2. 操作
  6. $sql = 'INSERT `users` SET `name`=?, `email`= ?, `password`=?;';
  7. // sql语句对象
  8. $stmt = $pdo->prepare($sql);
  9. // 1. ? 与 变量名绑定, 引用绑定
  10. // $stmt->bindParam(1, $name, PDO::PARAM_STR, 30);
  11. // $stmt->bindParam(2, $email, PDO::PARAM_STR, 100);
  12. // $stmt->bindParam(3, $password, PDO::PARAM_STR, 40);
  13. // 最后的数字为字段长短。
  14. // 2. 变量名与值绑定(赋值)
  15. // $name = '大飞111';
  16. // $email = 'df111@php.cn';
  17. // $password = sha1('df111');
  18. // 执行
  19. // $stmt->execute();
  20. // $name = '大飞99999';
  21. // $email = 'df1118888@php.cn';
  22. // $password = sha1('df111');
  23. // 执行
  24. // $stmt->execute();
  25. // rowCount():返回表中受影响的记录数量,当前是新增的记录数量
  26. // if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
  27. // 值绑定,变量必须先赋值,否则放在后面的不发挥作用。但变量引用绑定则不要紧。
  28. // $name = '蛋蛋';
  29. // $email = 'dd2@php.cn';
  30. // $password = sha1('dd999');
  31. // $stmt->bindValue(1, $name, PDO::PARAM_STR);
  32. // $stmt->bindValue(2, $email, PDO::PARAM_STR);
  33. // $stmt->bindValue(3, $password, PDO::PARAM_STR);
  34. // 执行
  35. // $stmt->execute() or die(print_r($stmt->errorInfo(),true));
  36. // $name = '蛋蛋888';
  37. // $email = 'dd2888@php.cn';
  38. // $password = sha1('dd999');
  39. // $stmt->bindValue(1, $name, PDO::PARAM_STR);
  40. // $stmt->bindValue(2, $email, PDO::PARAM_STR);
  41. // $stmt->bindValue(3, $password, PDO::PARAM_STR);
  42. // 执行
  43. // $stmt->execute() or die(print_r($stmt->errorInfo(),true));
  44. // rowCount():返回表中受影响的记录数量,当前是新增的记录数量
  45. // if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
  46. // bindParam(): 引用绑定,只需要绑定一次即可(直接绑定到模板上)
  47. // bindValue(): 值绑定, 实时映射,变量的变化或在实时的映射到占位符上,因此每一次都必须重新赋值
  48. // 值绑定实时性,直观好理解,但是操作非常麻烦,可以给execute()传参来简化它。----- 最后这种事最简化的值绑定。
  49. $stmt->execute(['小花','xh@php.cn', sha1('567')]);
  50. if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
  51. // 3. 关闭
  52. // $pdo = null;
  53. unset($pdo);

4-2. pdo - 删(delete)

  1. <?php
  2. // pdo删除操作
  3. // 1. 连接
  4. require 'connect.php';
  5. // 2. 操作
  6. $sql = 'DELETE FROM `users` WHERE `id` = ?;';
  7. $stmt = $pdo->prepare($sql);
  8. // 将值直接绑定到匿名占位符?上面
  9. $stmt->execute([42]);
  10. if ($stmt->rowCount() > 0) echo '删除成功 ' . $stmt->rowCount() . ' 条记录';
  11. // 3. 关闭
  12. $pdo = null;

4-3. pdo - 改(update)

  1. <?php
  2. // pdo更新操作
  3. // 1. 连接
  4. require 'connect.php';
  5. // 2. 操作
  6. $sql = 'UPDATE `users` SET `name`=?, `email`= ?, `password`=? WHERE `id` = ?;';
  7. $stmt = $pdo->prepare($sql);
  8. // 将值直接绑定到匿名占位符?上面
  9. $stmt->execute(['小龙人','xlr@php.cn', sha1('1234567'), 42]);
  10. if ($stmt->rowCount() > 0) echo '更新成功 ' . $stmt->rowCount() . ' 条记录';
  11. // 3. 关闭
  12. $pdo = null;

4-4. pdo - 查(select)

4-4-1. fetch() + while()
  1. <?php
  2. // pdo查询操作: fetch() + while()
  3. // 1. 连接
  4. require 'connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';
  7. $stmt = $pdo->prepare($sql);
  8. // 将值直接绑定到匿名占位符?上面
  9. $stmt->execute([30]);
  10. while ($user = $stmt->fetch()) {
  11. vprintf('<li>%s: %s | %s</li>', $user);
  12. }
  13. // 3. 关闭
  14. $pdo = null;
4-4-2. fetchAll() + foreach()
  1. $sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';
  2. $stmt = $pdo->prepare($sql);
  3. // 将值直接绑定到匿名占位符?上面
  4. $stmt->execute([40]);
  5. $users = $stmt->fetchAll();
  6. foreach ($users as $user) {
  7. vprintf('<li>%s: %s | %s</li>', $user);
  8. }
4-4-3. bindColumn() + fetch() + while()
  1. $sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';
  2. $stmt = $pdo->prepare($sql);
  3. // 将值直接绑定到匿名占位符?上面
  4. $stmt->execute([30]);
  5. // 将三个字段与三个变量绑定,变量名自己定义。
  6. $stmt->bindColumn('id', $id);
  7. $stmt->bindColumn('name', $name);
  8. $stmt->bindColumn('email', $email);
  9. while ($stmt->fetch(PDO::FETCH_BOUND)) {
  10. printf('<li>%s: %s | %s</li>',$id, $name, $email);
  11. }
  12. // 获取记录数量比较难,可以用下面的方式来实现。
  13. // echo $stmt->rowCount();
  14. $sql = 'SELECT COUNT(`id`) AS `count` FROM `users` WHERE `id` >= ?;';
  15. $stmt = $pdo->prepare($sql);
  16. // 将值直接绑定到匿名占位符?上面
  17. $stmt->execute([30]);
  18. $stmt->bindColumn('count', $count);
  19. $stmt->fetch(PDO::FETCH_BOUND);
  20. echo '满足条件的记录数量'. $count;

5. 总结部分(php数据操作)

5-1. 基本步骤

序号 步骤 描述
1 连接数据库 创建数据库连接对象的过程$mysqli$pdo
2 操作数据表 SELECT查询/INSERT新增/UPDATE更新/DELETE删除
3 释放结果集[可选] 仅针对查询操作有效,清空查询结果的过程
4 关闭数据库连接 实际上是销毁数据库连接对象的过程
  • 写操作(INSERT/UPDATE/DELETE): 返回受影响的记录数量(整数)
  • 读操作(SELECT/DESC…): 返回查询结果集(二维关联数组)

5-2. 连接参数

序号 参数 描述
1 type 数据库类型
2 host 默认数据库主机名
3 dbname 默认数据库名称
4 charset 默认字符集
5 port 默认端口号
6 username 默认用户名
7 password 默认用户密码

5-3. mysqli

仅介绍 mysqli 面向对象 + 预处理

5-3.1 mysqli接口
序号 属性/方法 描述
1 connect_errno 连接错误编码
2 connect_error 连接错误信息
3 set_charset 设置字符集
4 prepare 创建mysqli_stmt对象
5-3.2 mysqli_stmt接口
序号 属性/方法 描述
1 bind_param() 占位符与变量绑定
2 bind_result() 字段与变量绑定
3 execute() 执行 SQL 语句
4 get_result() 创建mysqli_result 对象
5 fetch() 遍历变量中的字段
6 close() 关闭预处理查询
7 affected_rows 受影响记录数量
8 insert_id 新增记录主键 id
9 errno 错误编号
10 error 错误信息
5-3.3 mysqli_result接口
序号 属性/方法 描述
1 fetch_assoc() 以关联数组返回一条记录
2 fetch_all() 获取全部记录
3 num_rows 结果集记录数量
4 free() 释放结果集

5-4. pdo

仅介绍 pdo 预处理

5-4.1 PDO接口
序号 属性/方法 描述
1 setAttribute() 设置属性
2 lastInsertId() 最后插入记录的主键 id
3 prepare() 创建PDOStatement对象
5-4.2 PDOStatement接口

它的实例与一条预处理语句对应, 上面定义了许多实用的方法

序号 属性/方法 描述
1 setAttribute() 设置属性
2 lastInsertId() 最后插入记录的主键 id
3 prepare() 创建PDOStatement对象
  • 后面很多内容跟mysqli类似,不展开了。还是要在实战中不断锻炼,琢磨每个方法或属性。
    最后附上mysqli、PDO之前的几张图(在第10次课的文件夹中)。

![]

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议