Blogger Information
Blog 60
fans 5
comment 3
visits 65273
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
使用mysqli与pdo对数据库操作
longlong
Original
791 people have browsed it

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() 绑定占位符与值
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:总结内容希望记住,多写多看
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post