Blogger Information
Blog 57
fans 3
comment 0
visits 59779
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP基础-使用mysqli操作MySQL数据库
岂几岂几
Original
716 people have browsed it

使用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,熟悉它的用法,能读懂代码就好.
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:mysqli 也有预处理操作的, 只是我们没有讲罢了, 因为pdo讲了预处理, 所以, mysqli想让大家了解另一套规则,再讲就重复了, 意义不大
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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!