Blogger Information
Blog 55
fans 3
comment 0
visits 54024
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
MySQLi扩展库
王佳祥
Original
3095 people have browsed it

MySQLi扩展库

一、MySQLi扩展库安装

1. 在php.ini文件中找到extension=mysqli去掉分号注释



2. 在php.ini文件中查看extension_dir目录是否正确



3.检测MySQLi扩展库是否已经安装成功

  • phpinfo();函数显示php所有配置信息


  • var_dump(extension_loaded('mysqli'));返回true加载成功,否则加载失败


  • var_dump(get_loaded_extensions());返回所有加载项


  • var_dump(function_exists('mysqli_connect'));检查指定的函数是否已经定义


二、mysqli类

1.mysqli类

  1. mysqli类的对象主要控制PHPMYSQL数据库服务器之间的连接,数据库选择,发送SQL语句,以及设置字符集。

2.连接数据库

$mysql = new mysqli('localhost','用户名','密码','数据库名');

  1. //建立mysql连接,并且打开指定数据库
  2. $mysql = @new mysqli('localhost','root','wang1111','tp5');
  3. print_r($mysql);


3.异常错误处理

  • connect_errno 返回最后一次的错误代码

  • connect_error 返回最后一次的错误信息描述

  • errno 返回最近一次的错误代码

  • error 返回最近一次的错误信息描述

  • die(); 函数输出一条消息,并退出当前脚本

  • @ PHP中用作错误控制操作符,可以忽略错误信息

  1. //如果数据库账号密码不对的话,就返回错误信息
  2. if($mysqli->connect_errno){
  3. //如果存在连接错误
  4. //connect_errno返回最后一次的错误代码
  5. die("CONNECT_ERROR:".$mysqli->connect_error);
  6. //die() 函数输出一条消息,并退出当前脚本
  7. //connect_error返回最后一次的错误信息描述
  8. }


4.sql语句执行

  • $mysqli::set_charset() 设置默认的客户端字符集

  • $mysqli::query() 在数据库内执行查询

    1. 失败返回false,成功执行SELECT, SHOW, DESCRIBE EXPLAIN查询会返回一个mysqli_result 对象,其他查询则返回TRUE
  • $multi_query() 执行多条SQL语句的查询

    1. 第一条语句执行成功返回true,否则返回false,并且后面的sql语句都不会执行成功
  • $mysqli::prepare() )准备(prepare)需要执行的 SQL 语句

    1. mysqli_prepare() 返回一个 statement 对象,如果发生错误则返回 FALSE
  • $mysqli::insert_id 返回上次查询中所自动生成的 ID

  • $mysqli::close() 关闭先前打开的数据库连接

  • 更新数据

  1. //- 更新一条数据
  2. $mysql = new mysqli('localhost','root','wang1111','tp5');
  3. if($mysql->connect_errno){
  4. die("CONNECT_ERROR:".$mysql->connect_error);
  5. }
  6. $mysql->set_charset('utf8');
  7. $sql = "UPDATE staff SET name='孙悟空' WHERE name='郭靖'";
  8. $res = $mysql->query($sql);
  9. var_dump($res);


  • 插入数据
  1. //插入一条数据
  2. $sql = "INSERT INTO user(`username`,`password`) VALUES ('Timo','Timo')";
  3. //反引号``防止和关键字冲突
  4. $res = $mysql->query($sql);
  5. if($res){
  6. echo "恭喜注册成功,您是本站的第".$mysql->insert_id."位用户";
  7. //$mysqli::insert_id返回上次查询中所自动生成的 ID
  8. }


  • 删除数据
  1. //删除数据
  2. $sql = "DELETE FROM `user` WHERE `id` >=5";
  3. $res = $mysql->query($sql);
  4. if($res){
  5. echo $mysql->affected_rows.'条记录受影响<br>';
  6. }else{
  7. echo "ERROE:".$mysql->errno.":".$mysql->error;
  8. }


  • 查询数据
  1. //查询操作
  2. /* 失败时返回 FALSE, 通过mysqli_query()
  3. 成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN
  4. 查询会返回一个mysqli_result 对象,其他查询则返回TRUE。 */
  5. $sql = "SELECT `username`,`password` FROM `user`";
  6. $res = $mysql->query($sql);
  7. var_dump($res);
  8. $mysql->close();//关闭先前打开的数据库连接


三、mysqli_result类

1.mysqli_result类

  1. 这个类的对象包含SELECT查询的结果、获取结果集中数据的成员方法,以及和查询的结果有关的成员属性。

2.mysqli_result::fetch_all() 抓取所有的结果行并且以关联数组,数值索引数组,或者两者皆有的方式返回结果集。

  1. $sql = "SELECT `username`,`password` FROM `user`";
  2. $res = $mysql->query($sql);
  3. $a = $res->fetch_all();
  4. print_r($a);
  5. /* mysqli_result::fetch_all()抓取所有的结果行并且以关联数组,
  6. 数值索引数组,或者两者皆有的方式返回结果集 */


3.mysqli_result::fetch_array() 以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果

  1. $sql = "SELECT `username`,`password` FROM `user`";
  2. $res = $mysql->query($sql);
  3. $a = $res->fetch_array();
  4. print_r($a);


4.mysqli_result::fetch_assoc() 以一个关联数组方式抓取一行结果

  1. $sql = "SELECT `username`,`password` FROM `user`";
  2. $res = $mysql->query($sql);
  3. $a = $res->fetch_assoc();
  4. print_r($a)


5.mysqli_result::fetch_row() 以一个枚举数组方式返回一行结果

  1. $sql = "SELECT `username`,`password` FROM `user`";
  2. $res = $mysql->query($sql);
  3. $a = $res->fetch_row();
  4. print_r($a)


6.$mysqli_result::num_rows 获取结果中行的数量

  1. $sql = "SELECT `username`,`password` FROM `user`";
  2. $res = $mysql->query($sql);
  3. $a = $res->num_rows;
  4. print_r($a)


7.mysqli_result::free() 释放与一个结果集相关的内存

  1. $sql = "SELECT `username`,`password` FROM `user`";
  2. $res = $mysql->query($sql);
  3. $a = $res->num_rows;
  4. var_dump($a);
  5. echo '<hr>';
  6. $b = $res->free();
  7. var_dump($b);


四、mysqli_stmt类

1.mysqli_stmt类(预处理机制)

  1. mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理(Prepared Statement)的机制。

2.mysqli_stmt::bind_param() 绑定变量参数到 prepared 语句

  1. //mysql预处理机制,防止sql注入
  2. //1.建立到mysql的连接,并且打开指定的数据库
  3. $mysqli = new mysqli('localhost','root','wang1111','tp5');
  4. if($mysqli->connect_errno){
  5. die("CONNECT_ERROR:".$mysqli->connect_error);
  6. }
  7. //2.设置字符集
  8. $mysqli->set_charset('utf-8');
  9. $sql = "INSERT INTO `user`(`username`,`password`,`age`) VALUES(?,?,?)";
  10. //准备需要执行的SQL语句
  11. //返回一个statement对象,如果发生错误返回false
  12. $stmt = $mysqli->prepare($sql);
  13. //var_dump($res);
  14. //bing_param()绑定变量参数到prepared语句
  15. $username = 'php.cn';
  16. $password = md5('php.cn');
  17. $age = 12;
  18. $stmt->bind_param('ssi',$username,$password,$age);
  19. var_dump($stmt);


3.mysqli_stmt::execute() 执行 prepared 查询

  1. //执行预处理语句execute()
  2. $a = $stmt->execute();
  3. var_dump($a);


五、实战练习(表单)

1.防sql注入

  • demo3.php
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>实战练习</title>
  7. <style>
  8. body{
  9. margin:0;
  10. padding: 0;
  11. box-sizing: border-box;
  12. background-color: gainsboro;
  13. display:flex;
  14. justify-content: center;
  15. align-items: center;
  16. }
  17. .content{
  18. width: 500px;
  19. height: 300px;
  20. border-radius: 10px;
  21. box-shadow: 0 0 5px #888;
  22. background-color: #fff;
  23. position:absolute;
  24. top:30%;
  25. padding:10px;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <table class="content">
  31. <form action="enter.php" method="post">
  32. <tr>
  33. <td><label for="username">账号:</label></td>
  34. <td><input type="text" name="username" id="username"></td>
  35. </tr>
  36. <tr>
  37. <td><label for="password">密码:</label></td>
  38. <td><input type="password" name="password" id="password"></td>
  39. </tr>
  40. <tr>
  41. <td colspan="2"><input type="submit" name="sub" value="提交"></td>
  42. </tr>
  43. </form>
  44. </table>
  45. </body>
  46. </html>
  • enter.php
  1. <?php
  2. //数据接收
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5. //连接数据库
  6. $mysqli = @new mysqli('localhost','root','wang1111','tp5');
  7. if($mysqli->connect_errno){
  8. die("CONNECT_ERROR:".$mysqli->connect_error);
  9. }
  10. $mysqli->set_charset('utf-8');
  11. //mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理
  12. //使用问号参数占位符来构成预处理sql语句
  13. $sql = "SELECT * FROM `user` WHERE `username` = ? AND `password` = ?";
  14. //$res = $mysqli->query($sql);
  15. //var_dump($res);
  16. $stmt = $mysqli->prepare($sql);
  17. $stmt->bind_param('ss',$username,$password);
  18. $stmt->execute();
  19. //get_result()获取结果
  20. $res = $stmt->get_result();
  21. print_r($res->num_rows);




2.不用sql注入

  1. <?php
  2. //数据接收
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5. //连接数据库
  6. $mysqli = @new mysqli('localhost','root','wang1111','tp5');
  7. if($mysqli->connect_errno){
  8. die("CONNECT_ERROR:".$mysqli->connect_error);
  9. }
  10. $mysqli->set_charset('utf-8');
  11. //mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理
  12. //使用问号参数占位符来构成预处理sql语句
  13. $sql = "SELECT * FROM `user` WHERE `username` = '{$username}' AND `password` = '{$password}'";
  14. $res = $mysqli->query($sql);
  15. print_r($res->num_rows);




六、学习总结:

1.mysqli类

函数名 描述
affected_rows 获取上次mysql操作受影响的行数
connect_errno 返回最后一次连接数据库的错误代码
connect_error 返回最后一次连接数据库的错误描述,类型为字符串
errno 返回最近一次函数调用所产生的错误代码
error 返回最近一次错误代码的描述,类型是字符串
set_charset() 设置默认的客户端字符集
select_db() 为数据库查询设置默认数据库
query() 在数据库内执行查询
multi_query() 执行多条SQL语句的查询,第一条语句执行成功返回true,否则返回false
prepare() 准备(prepare)需要执行的 SQL 语句,返回一个 statement 对象
insert_id 返回上次查询中所自动生成的 ID
mysqli::close() 关闭先前打开的数据库连接

2.mysqli_result类

函数名 描述
fetch_all() 抓取所有的结果行并且以关联数组,数值索引数组,或者两者皆有的方式返回结果集
fetch_array() 以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果
fetch_assoc() 以一个关联数组方式抓取一行结果
fetch_row() 以一个枚举数组方式返回一行结果
num_rows 获取结果中行的数量
free() 释放与一个结果集相关的内存

3.mysqli_stmt类

函数名 描述
affected_rows 返回受上次执行语句影响的总行数
num_rows 返回语句结果集中的行数
errno 返回最近一次语句调用的错误代码
error 返回最后一条语句错误的字符串描述
prepare() 准备执行 SQL 语句
bind_param() 绑定变量参数到 prepared 语句
bind_result() 绑定变量参数到 prepared 语句,用于结果存储
execute() 执行 prepared 查询
get_result() 获取 prepared 语句中的结果
fetch() 获取 prepared 语句中的结果, 返回true,否则返回false
free_result() 释放给定语句处理存储的结果集所占内存

4.遍历结果集

  1. <?php
  2. //连接数据库
  3. $localhost = 'localhost';
  4. $username = 'root';
  5. $password = 'wang1111';
  6. $database = 'tp5';
  7. $mysqli = new mysqli($localhost,$username,$password,$database);
  8. //判断数据库连接是否正确
  9. if($mysqli->connect_error){
  10. die("CONNECT_ERROR:".$mysqli->error);
  11. }
  12. //查询数据库staff表的所有内容
  13. $sql = "SELECT * FROM `user`";
  14. //执行sql语句,并将结果集赋值给$res变量
  15. $res = $mysqli->query($sql);
  16. //遍历$res结果集
  17. foreach($res as $value){
  18. echo $value['id'].'|'.$value['username'].'|'.$value['password'].'|'.$value['age'].'<br>';
  19. }
  20. //释放资源,关闭数据库连接
  21. $mysqli->free;
  22. $mysqli->close();


Correcting teacher:GuanhuiGuanhui

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!