博客列表 >使用mysqli与pdo对数据库操作

使用mysqli与pdo对数据库操作

longlong
longlong原创
2020年07月21日 18:22:32802浏览

1. 配置文件

config.php

  1. <?php
  2. // 配置文件
  3. // 写法一:常量的方式
  4. // define('DB_TYPE','mysql');
  5. // define('DB_HOST','php.edu');
  6. // define('DB_USER','root');
  7. // define('DB_PWD','root');
  8. // define('DB_NAME','first');
  9. // define('PORT','3306');
  10. // define('DB_CHARSET','uft-8');
  11. // define('DB_DSN',DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME.':charset='.DB_CHARSET);
  12. // $dsn = 'mysql:host=php.edu;dbname=first;charset=utf8;port=3306';
  13. // 写法二:返回数组的方式
  14. return [
  15. 'type' => $type ?? 'mysql',
  16. 'host' => $host ?? 'php.edu',
  17. 'username' => $username ?? 'root',
  18. 'password' => $password ?? 'root',
  19. 'dbname' => $dbname ?? 'first',
  20. 'port' => $port ?? '3306',
  21. 'charset' => $charset ?? 'utf8',
  22. ''
  23. ];

2.使用Mysqli操作数据库

2.1 连接数据库

connect.php

  1. <?php
  2. // 连接数据库
  3. // 1. 引入配置文件,得到一个关联数组
  4. $config = require __DIR__ ."/../config.php";
  5. // 2. 将关联数组拆分为独立变量
  6. extract($config);
  7. // 3. 建立连接对象
  8. $mysqli = new mysqli($host,$username,$password,$dbname,$port);
  9. // 4. 错误检查
  10. if ($mysqli->connect_errno) {
  11. die('连接错误: '. $mysqli->connect_error);
  12. }
  13. // 5. 设置编码方式
  14. $mysqli->set_charset($charset);

2.2 插入数据

  1. <?php
  2. // 1. 连接
  3. require __DIR__.'/connect.php';
  4. // 2. 操作
  5. // $sql = 'INSERT INTO `ta_users` (`username`,`password`) VALUES (?,?)';
  6. $sql = 'INSERT `ta_users` SET `username`=?,`password`=?';
  7. $stmt = $mysqli->prepare($sql);
  8. // 插入方式一:直接给绑定的变量赋值
  9. // $username = '妞妞';
  10. // $password = md5('123456789');
  11. // $stmt->bind_param('ss',$username,$password);
  12. // $stmt->execute();
  13. // printf('新增了 %s 条记录,是第 %d 位用户',$stmt->affected_rows,$stmt->insert_id);
  14. // 插入方式二:数组的形式
  15. // $user = [
  16. // 'username' => '猪猪',
  17. // 'password' => md5('88888'),
  18. // ];
  19. // extract($user);
  20. // $stmt->bind_param('ss',$username,$password);
  21. // $stmt->execute();
  22. // printf('新增了 %s 条记录,是第 %d 位用户',$stmt->affected_rows,$stmt->insert_id);
  23. // 插入方式三:以二维数组的方式同时插入多条记录
  24. $users = [
  25. ['username'=>'小黄人','password'=>md5('123')],
  26. ['username'=>'佩奇先生','password'=>md5('456')],
  27. ['username'=>'布兰达','password'=>md5('852')],
  28. ];
  29. foreach ($users as $user) {
  30. extract($user);
  31. $stmt->bind_param('ss',$username,$password);
  32. if ($stmt->execute()) {
  33. printf('新增了 %s 条记录,是第 %d 位用户<br>',$stmt->affected_rows,$stmt->insert_id);
  34. }else{
  35. echo '新增失败 ,'. $stmt->errno . ':' . $stmt->error;
  36. }
  37. }
  38. // 3. 关闭
  39. $mysqli->close();

2.3 更新数据

  1. <?php
  2. // 更新数据
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'UPDATE `ta_users` SET `username`=? WHERE `id`=?';
  7. $stmt = $mysqli->prepare($sql);
  8. $stmt->bind_param('si',$username,$id);
  9. $user = ['username'=>'牙擦苏','id'=>21];
  10. extract($user);
  11. $stmt->execute();
  12. echo '更新了 '.$stmt->affected_rows.' 条记录,'.'是第 '.$id.' 位用户';
  13. // 3. 关闭
  14. $mysqli->close();

2.4 删除数据

  1. <?php
  2. // 删除数据
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2.操作
  6. $sql = 'DELETE FROM `ta_users` WHERE `id`>?';
  7. $stmt = $mysqli->prepare($sql);
  8. $stmt->bind_param('i',$id);
  9. $id = 15;
  10. $stmt->execute();
  11. printf('被删除的记录有 %s 条',$stmt->affected_rows);
  12. // 3. 关闭
  13. $mysqli->close();

2.5 查询数据

  1. <?php
  2. // 数据查询,方式一:使用 while() + fetch_assoc()
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT * FROM `ta_users` WHERE `id`>=?';
  7. $stmt = $mysqli->prepare($sql);
  8. $stmt->bind_param('i',$id);
  9. $id = 10;
  10. $stmt->execute();
  11. // 获取结果集
  12. $res = $stmt->get_result();
  13. if ($res->num_rows === 0) {
  14. exit('未查询到结果');
  15. }else{
  16. while($user = $res->fetch_assoc()) {
  17. vprintf('%d ---- %s : %s <br>',$user);
  18. }
  19. }
  20. // 释放结果集
  21. $res->free();
  22. // 3. 关闭
  23. $mysqli->close();
  1. <?php
  2. // 数据查询,方式二:使用 foreach() + fetch_all()
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT * FROM `ta_users` WHERE `id`>=? AND `id`<=?';
  7. $stmt = $mysqli->prepare($sql);
  8. $stmt->bind_param('ii',$id1,$id2);
  9. $ids = ['id1'=>1,'id2'=>4];
  10. extract($ids);
  11. $stmt->execute();
  12. // 获取结果集
  13. $res = $stmt->get_result();
  14. if ($res->num_rows === 0) {
  15. exit('未获取到查询结果');
  16. }else{
  17. $users = $res->fetch_all(MYSQLI_ASSOC);
  18. foreach ($users as $user) {
  19. vprintf('%d ---- %s : %s <br>',$user);
  20. }
  21. }
  22. // 释放结果集
  23. $res->free();
  24. // 3. 关闭
  25. $mysqli->close();
  1. <?php
  2. // 数据查询,方式三:使用bind_result() + fetch() + while()
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT `id`,`username`,`password` FROM `ta_users` WHERE `id`>=?';
  7. $stmt = $mysqli->prepare($sql);
  8. $stmt->bind_param('i',$id);
  9. $id = 10;
  10. $stmt->execute();
  11. // 执行得到结果后,将查询的每个字段分别与变量绑定
  12. $stmt->bind_result($id,$username,$password);
  13. // 当前操作并没有结果集对象,所以想要获取受影响的行数,需向如下操作:
  14. $stmt->store_result();
  15. if ($stmt->num_rows === 0) {
  16. exit('未获取到查询结果');
  17. }else{
  18. while ($stmt->fetch()) {
  19. printf('%d ---- %s : %s <br>', $id, $username, $password);
  20. }
  21. }
  22. // 3. 关闭
  23. $mysqli->close();

3. 使用PDO操作数据库

3.1 连接数据库

  1. <?php
  2. // 连接数据库
  3. $config = require __DIR__.'/../config.php';
  4. extract($config);
  5. // 数据源名称 (模板)
  6. // $dsn = 'mysql:host=php.edu;dbname=first;charset=utf8;port=3306';
  7. // 写法一:拼接的方式
  8. // $dsn = $type.':host='.$host.';dbname='.$dbname.';charset='.$charset.';port='.$port;
  9. // 写法二:使用sprintf()的返回值
  10. $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$host,$dbname,$charset,$port);
  11. // 创建pdo对象,方式一:直接创建
  12. // $pdo = new PDO($dsn,$username,$password);
  13. // 创建pdo对象,方式二:使用try{...}catch(...){...}模块
  14. try {
  15. $pdo = new PDO($dsn,$username,$password);
  16. } catch (Throwable $e) {
  17. exit($e->getMessage());
  18. } catch (PDOException $e) {
  19. exit($e->getMessage());
  20. }

3.2 插入数据

  1. <?php
  2. // PDO 插入数据
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'INSERT `ta_users` SET `username`=?,`password`=?';
  7. $stmt = $pdo->prepare($sql);
  8. // 绑定方式一:占位符?与变量名绑定(引用绑定)
  9. // $stmt->bindParam(1,$username);
  10. // $stmt->bindParam(2,$password);
  11. // $user = [
  12. // 'username'=>'西门吹雪',
  13. // 'password'=>md5('456'),
  14. // ];
  15. // extract($user);
  16. // $stmt->execute();
  17. // 绑定方式二:占位符?与值绑定
  18. // $stmt->bindValue(1,'花无缺');
  19. // $stmt->bindValue(2,md5('789'));
  20. // $stmt->execute();
  21. // 绑定方式三:值绑定时可以直接在$stmt->execute()中传参,参数为一个数组
  22. $stmt->execute(['上官大人',md5('666')]);
  23. echo $stmt->rowCount()>0 ? '新增成功,是第 '.$pdo->lastInsertId().' 位用户' : '新增失败:';
  24. // 3. 关闭
  25. // 方式一:销毁变量
  26. // unset($pdo);
  27. // 方式二:变量赋值为null
  28. $pdo = null;

3.3 更新数据

  1. <?php
  2. // 更新数据
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. // 不指定 WHERE 的话,会影响整个数据表
  7. $sql = 'UPDATE `ta_users` SET `username`=?';
  8. $stmt = $pdo->prepare($sql);
  9. $stmt->execute(['憨豆先生']);
  10. echo '受影响的记录有 '.$stmt->rowCount().' 条';
  11. // 指定 WHERE
  12. $sql = 'UPDATE `ta_users` SET `username`=? WHERE `id`>? ';
  13. $stmt = $pdo->prepare($sql);
  14. $stmt->execute(['大头',10]);
  15. echo '受影响的记录有 '.$stmt->rowCount().' 条';
  16. // 3. 关闭
  17. $pdo = null;

3.4 删除数据

  1. <?php
  2. // 删除数据
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'DELETE FROM `ta_users` WHERE `username`=?';
  7. $stmt = $pdo->prepare($sql);
  8. $stmt->execute(['憨豆先生']);
  9. echo '受影响的记录有 '.$stmt->rowCount().' 条';
  10. // 3. 关闭
  11. $pdo = null;

3.5 查询数据

  1. <?php
  2. // 数据查询,方式一:使用 foreach() + fetchAll()
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT `id`,`username`,`sex`,`tel` FROM `student` WHERE `id`>?';
  7. $stmt = $pdo->prepare($sql);
  8. $stmt->execute([1]);
  9. $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  10. foreach($users as $user){
  11. vprintf('%s --- %s --- %s --- %s <br>',$user);
  12. }
  13. // 3. 关闭
  14. $pdo = null;
  1. <?php
  2. // 数据查询,方式二:使用 while() + fetch()
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT `id`,`username`,`sex`,`tel` FROM `student` WHERE `id`>?';
  7. $stmt = $pdo->prepare($sql);
  8. $stmt->execute([1]);
  9. while($user = $stmt->fetch(PDO::FETCH_ASSOC)){
  10. vprintf('%s --- %s --- %s --- %s <br>',$user);
  11. }
  12. // 3. 关闭
  13. $pdo = null;
  1. <?php
  2. // 数据查询,方式三:使用 bindColumn() + fetch() + while()
  3. // 1. 连接
  4. require __DIR__.'/connect.php';
  5. // 2. 操作
  6. $sql = 'SELECT `id`,`username`,`sex`,`tel` FROM `student` WHERE `id`>?';
  7. $stmt = $pdo->prepare($sql);
  8. $stmt->bindColumn('id',$id);
  9. $stmt->bindColumn('username',$username);
  10. $stmt->bindColumn('sex',$sex);
  11. $stmt->bindColumn('tel',$tel);
  12. $stmt->execute([1]);
  13. while ($stmt->fetch(PDO::FETCH_BOUND)) {
  14. printf('%s | %s | %s | %s <br>',$id, $username, $sex,$tel);
  15. }
  16. // 不能直接使用rowCount()获取记录数量,需如下使用:
  17. $sql = 'SELECT COUNT(`id`) AS `count` FROM `student` WHERE `id` > ?;';
  18. $stmt = $pdo->prepare($sql);
  19. $stmt->execute([1]);
  20. $stmt->bindColumn('count', $count);
  21. $stmt->fetch(PDO::FETCH_BOUND);
  22. echo '<br>满足条件的记录数量有 '. $count.' 条';
  23. // 3. 关闭
  24. $pdo = null;

4. 操作数据库总结

4.1. 通用步骤

序号 步骤 描述
1 连接数据库 使用 mysqli 或 pdo 对象连接
2 操作数据表 sql语句:SELECT查询、INSERT新增、UPDATE更新、DELETE删除
3 获取以及释放结果集[可选] 若是查询操作,获得结果时才会选择释放,与其他操作无关
4 关闭数据库连接 实际上就是销毁数据库连接对象

4.2 连接参数

序号 参数 描述
1 type 数据库的类型
2 host 数据库的主机名
3 dbname 数据库的名称
4 charset 设置编码方式
5 port 端口号
6 username 数据库用户名
7 password 数据库密码

4.3 mysqli

4.3.1 mysqli对象

序号 属性/方法 描述
1 connect_errno 连接错误信息的编码
2 connect_error 连接错误的具体信息
3 set_charset 设置编码方式
4 prepare 能得到mysqli_statement对象

4.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 错误信息

4.3.3 mysqli_result对象

序号 属性/方法 描述
1 fetch_assoc() 以关联数组的形式返回结果
2 fetch_all() 获取结果集,通常会传参数 MYSQLI_ASSOC 得到一个二维关联数组
3 num_rows 受影响的行数
4 free() 释放结果集

4.4 pdo

4.4.1 PDO对象

序号 属性/方法 描述
1 setAttribute() 设置属性
2 lastInsertId() 获取最后插入的记录的主键id
3 prepare() 预处理,得到一个PDOStatement对象

4.4.2 PDOStatement对象

序号 属性/方法 描述
1 execute() 执行预处理语句,也可以传参,用于值绑定
2 fetchAll() 获取结果集,通常会传参数 PDO::FETCH_ASSOC 得到一个二维关联数组
3 fetch() 获取结果,通常会传参 PDO::FETCH_ASSOC 得到关联数组
4 bindColumn() 绑定每个字段到对应的变量
5 rowCount() 受影响的行数
6 bindParam() 绑定占位符与变量名
7 bindValue() 绑定占位符与值
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议