博客列表 >PHP基础-使用mysqli操作MySQL数据库

PHP基础-使用mysqli操作MySQL数据库

岂几岂几
岂几岂几原创
2020年05月10日 21:42:34723浏览

使用msqli操作MySQL数据库

使用mysqli链接MySQL数据库

  1. mysqli连接参数
    1. 数据库主机名: host
    2. 用户名: username
    3. 密码: password
    4. 默认数据库: dbname
    5. 端口号: port
  1. // db_config.php
  2. namespace config;
  3. $config = [
  4. // 数据库主机
  5. 'host' => $host ?? 'localhost',
  6. // 默认数据库
  7. 'dbname' => $dbname ?? 'phpedu',
  8. // 默认字符编码
  9. 'charset' => $charset ?? 'utf8',
  10. // 默认端口号
  11. 'port' => $port ?? '3306',
  12. // 默认用户名
  13. 'username' => $username ?? 'root',
  14. // 默认用户密码
  15. 'password' => $password ?? 'root',
  16. ];
  1. 连接数据库
  1. // connect.php
  2. require_once('config/db_config.php');
  3. // 1. 使用exact()函数解构数组中的参数
  4. // 如果是vs storm编辑器,则需要写下面的注释, 否则用extract()会报错.
  5. /**
  6. * @var string $host
  7. * @var string $username
  8. * @var string $password
  9. * @var string $dbname
  10. * 略...
  11. */
  12. extract($config);
  13. // 2. 连接数据库
  14. $mysqli = new mysqli($host, $username, $password, $dbname, $port);
  15. // 3.判断是否连接成功(若连接失败, errorno会有值)
  16. if ($mysqli->connect_errno) {
  17. die($mysqli->connect_errno);
  18. }
  19. // 4. 设置客户端默认字符编码集
  20. $mysqli->set_charset($charset);
  21. // 5. 测试是否连接数据库成功
  22. dumpbr($mysqli);

2. 使用mysqli执行CURD操作

  1. 创建库表和示例数据

创建库表

  1. DROP DATABASE IF EXISTS `phpedu`;
  2. CREATE DATABASE `phpedu` /*!40100 DEFAULT CHARACTER SET utf8 */;
  3. USE `phpedu`;
  4. DROP TABLE IF EXISTS `user`;
  5. CREATE TABLE `user` (
  6. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  7. `username` varchar(50) NOT NULL,
  8. `realname` varchar(50) NOT NULL DEFAULT '',
  9. `password` varchar(50) NOT NULL,
  10. `in_use` int(11) NOT NULL DEFAULT '1',
  11. `create_time` int(11) NOT NULL,
  12. `update_time` int(11) NOT NULL,
  13. PRIMARY KEY (`id`),
  14. UNIQUE KEY `username` (`username`)
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建示例数据

  1. 数据库CURD操作
  1. require '../out.php';
  2. /* 打印用户信息 */
  3. function showUserInfo($user)
  4. {
  5. $update_time = date('Y-m-d H:i:s', $user['update_time']);
  6. $create_time = date('Y-m-d H:i:s', $user['create_time']);
  7. $status = ($user['in_use'] == 1) ? '使用中' : '停用';
  8. echobr("ID: {$user['id']}, 用户名: {$user['username']}, 姓名: {$user['realname']}, 使用状态: {$status}, 创建时间: {$create_time}, 更新时间: {$update_time}");
  9. }
  10. // 1. 连接数据库
  11. require_once('connect.php');
  12. // 2. 执行CURD操作
  13. // 2.1 查询一条记录
  14. /* SQL语句 */
  15. $sql = "SELECT * FROM `user` WHERE `in_use` = 1";
  16. /* 执行查询, 并获取返回的结果集对象 */
  17. $mysqli_result = $mysqli->query($sql);
  18. /* fetch_array()方法: 一次输出一条记录, 并自动下移指针;
  19. 参数:
  20. MYSQLI_ASSOC: 只获取关联部分数组元素.
  21. MYSQLI_BOTH: 默认参数, 同时获取关联部分和索引部分元素.
  22. MYSQLI_NUM: 值获取索引部分元素.
  23. */
  24. /* mysqli_fetch_assoc() 等效于 $mysqli_result->fetch_array(MYSQLI_ASSOC) */
  25. /* $mysqli_result->fetch_row() 等效于 $mysqli_result->fetch_array(MYSQLI_NUM) */
  26. $user = $mysqli_result->fetch_array(MYSQLI_ASSOC);
  27. showUserInfo($user);
  28. /* 若要输出下一条记录, 则再调用一次fetch_array()方法. */
  29. /* 结果集指针复位方法: $mysqli_result->data_seek(0); */
  30. echo '<hr>';
  31. // 2.2 查询多条记录
  32. /* SQL语句 */
  33. $sql = "SELECT * FROM `user` WHERE `in_use` = 1";
  34. /* 执行查询, 并获取返回的结果集对象 */
  35. $mysqli_result = $mysqli->query($sql);
  36. /* 判断返回结果集是否有记录 */
  37. if ($mysqli_result && $mysqli_result->num_rows > 0) {
  38. $users = $mysqli_result->fetch_all(MYSQLI_ASSOC);
  39. /* 循环输出结果记录 */
  40. foreach ($users as $user) {
  41. showUserInfo($user);
  42. }
  43. }
  44. /* result:
  45. ID: 1, 用户名: zhangsan, 姓名: 张三, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:34, 更新时间: 2020-05-07 00:45:34
  46. ID: 2, 用户名: lisi, 姓名: 李四, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:55, 更新时间: 2020-05-07 00:45:55
  47. ID: 5, 用户名: zhuqi, 姓名: 朱七, 使用状态: 使用中, 创建时间: 2020-05-07 00:47:07, 更新时间: 2020-05-07 00:47:07
  48. ID: 7, 用户名: bajie, 姓名: 八戒, 使用状态: 使用中, 创建时间: 2020-05-07 21:27:54, 更新时间: 2020-05-07 21:27:54
  49. */
  50. echo '<hr>';
  51. // 2.3 新增一条记录
  52. $newUser = ['username' => 'chenjiu', 'password' => md5('123456'), 'realname' => '陈九', 'in_use' => 1, 'create_time' => time(), 'update_time' => time()];
  53. /* 给字符串字段加上引号 */
  54. array_walk($newUser, function (&$value, $key) {
  55. if (gettype($value) === 'string') {
  56. $value = "'$value'";
  57. }
  58. });
  59. /* 解构数组记录参数 */
  60. extract($newUser);
  61. /* 拼出SQL */
  62. $sql = "INSERT `user` SET `username` = {$username}, `password` = {$password}, `realname` = {$realname}, `in_use` = {$in_use}, `create_time` = {$create_time}, `update_time` = {$update_time}";
  63. /* 插入操作的返回值是插入结果(成功/失败) */
  64. if ($mysqli->query($sql)) {
  65. if ($mysqli->affected_rows > 0) {
  66. echobr('成功添加了' . $mysqli->affected_rows . '条记录, 新增记录主键: ' . $mysqli->insert_id);
  67. } else {
  68. echobr('没有添加新纪录');
  69. }
  70. } else {
  71. /* 实际项目中会把错误信息写到日志中 */
  72. echobr('插入失败:' . $mysqli->errno . '->' . $mysqli->error);
  73. }
  74. /* result: 成功添加了1条记录, 新增记录主键: 24 */
  75. /* 2.4 更新一条记录 */
  76. $id = $mysqli->insert_id;
  77. $update_time = time();
  78. $sql = "UPDATE `user` SET `in_use` = 0, `update_time` = {$update_time} WHERE `id` = {$id}";
  79. echobr($sql);
  80. /* 更新操作的返回值也是更新结果(成功/失败) */
  81. if ($mysqli->query($sql)) {
  82. if ($mysqli->affected_rows > 0) {
  83. echobr('成功更新了' . $mysqli->affected_rows . '条记录.');
  84. } else {
  85. echobr('没有更新任何数据');
  86. }
  87. } else {
  88. echobr('更新失败:' . $mysqli->erro . '->' . $mysqli->error);
  89. }
  90. /* result: 成功更新了1条记录. */
  91. // 2.5 删除一条记录
  92. /* $id变量值现在还是指向刚才插入的记录 */
  93. $sql = "DELETE FROM `user` WHERE `id` = {$id}";
  94. if ($mysqli->query($sql)) {
  95. if ($mysqli->affected_rows > 0) {
  96. echobr('成功删除了' . $mysqli->affected_rows . '条记录');
  97. }
  98. } else {
  99. echobr('删除失败:' . $mysqli->erro . '->' . $mysqli->error);
  100. }
  101. /* result: 成功删除了1条记录 */

学习心得

  • 先学习PDO,再学习mysqli,感觉mysqli不太安全,SQL语句是以拼接字符串的形式创建,是不是会遭受SQL注入攻击?好在以后也不用mysqli,熟悉它的用法,能读懂代码就好.
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议