博客列表 >PHP 09 mysqli扩展库(0715wed)

PHP 09 mysqli扩展库(0715wed)

老黑
老黑原创
2020年07月26日 22:04:29611浏览

主要内容:

  1. mysqli的加载及验证
  2. 围绕一个登陆页面进行mysqli的增删改查
  3. prepare预处理机制防止sql注入
  4. 登录

1. mysqli的加载及验证

  • 建立连接
  1. <?php
  2. /*检测mysqli扩展有没有加载成功
  3. 1. phpinfo();
  4. 2. var_dump(get_loaded_extensions());
  5. 3. function_exists('mysqli_connect')
  6. */
  7. //建立到mysql的连接 ,并且打开指定到数据库
  8. $mysqli = @new mysqli('localhost','root','zhoujielun521','apple');
  9. //分别为地址,登陆账号,登陆密码,数据库名(注意这里不是table名)
  10. // print_r($mysqli);
  11. if ($mysqli->connect_errno) {
  12. //获取上次mysql操作受影响的函数
  13. die("CONNECT_ERROR:". $mysqli->connect_error);
  14. }
  15. // echo $mysqli->client_info;
  16. echo $mysqli->server_info;

2.insert增加操作

  • demo3.php中主要内容
  1. <?php
  2. //1.建立到mysql的连接 ,并且打开指定到数据库
  3. $mysqli = @new mysqli('localhost','root','zhoujielun521','apple');
  4. // print_r($mysqli);
  5. if ($mysqli->connect_errno) {
  6. //获取上次mysql操作受影响的函数
  7. die("CONNECT_ERROR:". $mysqli->connect_error);
  8. }
  9. // 2. mysqli::set_charset()设置默认的客户端字符集
  10. $mysqli->set_charset('utf-8');
  11. //3.sql查询,$mysqli->query()只能执行单条查询
  12. //多条命令的时候,可以用.=来继续写。
  13. $sql = "INSERT INTO user(`username`,`password`) VALUES('Chloe1','Chloe1'),('Chloe2','Chloe2'),('Chloe3','Chloe3')";
  14. $res = $mysqli->query($sql);
  15. if ($res) {
  16. echo "恭喜您注册成功,您是本站的第". $mysqli->insert_id . "位用户<br>";
  17. } else{
  18. //error返回最近一次错误代码的描述
  19. echo "ERROR:" .$mysqli->errno.":".$mysqli->error;
  20. }

3.delete删除和更新操作

  • demo4中内容
  1. <?php
  2. //1.建立到mysql的连接 ,并且打开指定到数据库
  3. $mysqli = @new mysqli('localhost','root','zhoujielun521','apple');
  4. // print_r($mysqli);
  5. if ($mysqli->connect_errno) {
  6. //获取上次mysql操作受影响的函数
  7. die("CONNECT_ERROR:". $mysqli->connect_error);
  8. }
  9. // 2. mysqli::set_charset()设置默认的客户端字符集
  10. $mysqli->set_charset('utf-8');
  11. // 3.sql查询,$mysqli->query()只能执行单条查询
  12. // 更新数据记录
  13. $sql = "UPDATE `user` SET `age`=18";
  14. $res = $mysqli->query($sql);
  15. if ($res) {
  16. //$mysqli::affected_rows获取上次mysql操作受影响的行数
  17. echo $mysqli->affected_rows."条记录受影响<br>";
  18. }else{
  19. echo "ERROR:" .$mysqli->errno.":".$mysqli->error;
  20. }
  21. //删除数据
  22. $sql = "DELETE FROM `user` WHERE `id`>=19 ";
  23. $res = $mysqli->query($sql);
  24. if ($res) {
  25. //$mysqli::affected_rows获取上次mysql操作受影响的行数
  26. echo $mysqli->affected_rows."条记录受影响<br>";
  27. }else{
  28. echo "ERROR:" .$mysqli->errno.":".$mysqli->error;
  29. }
  30. //mysqli::close()关闭先前打开的数据库连接
  31. $mysqli->close();

4. select查询操作

  • demo2.php中内容
  1. <?php
  2. //1.建立到mysql的连接 ,并且打开指定到数据库
  3. $mysqli = @new mysqli('localhost','root','zhoujielun521','apple');
  4. // print_r($mysqli);
  5. if ($mysqli->connect_errno) {
  6. //获取上次mysql操作受影响的函数
  7. die("CONNECT_ERROR:". $mysqli->connect_error);
  8. }
  9. // 2. mysqli::set_charset()设置默认的客户端字符集
  10. $mysqli->set_charset('utf-8');
  11. // 3.sql查询,$mysqli->query()只能执行单条查询
  12. //select查询
  13. //失败时返回 FALSE, 通过mysqli_query() 成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN查询会返回一个mysqli_result 对象,其他查询则返回TRUE。
  14. $sql = "SELECT `username`,`password` FROM `user`";
  15. //
  16. $res = $mysqli->query($sql);
  17. //mysqli_result::fetch_all()抓取所有的结果行并且以关联数据,数值索引数组,或者两者皆有的方式返回结果集。
  18. $a = $res->fetch_all(MYSQLI_BOTH);
  19. print_r($a);

5. prepare预处理机制

  1. <?php
  2. //mysqli预处理机制 防止sql注入
  3. //1.建立到mysql的连接 ,并且打开指定到数据库
  4. $mysqli = @new mysqli('localhost','root','zhoujielun521','apple');
  5. // print_r($mysqli);
  6. if ($mysqli->connect_errno) {
  7. //获取上次mysql操作受影响的函数
  8. die("CONNECT_ERROR:". $mysqli->connect_error);
  9. }
  10. // 2. mysqli::set_charset()设置默认的客户端字符集
  11. $mysqli->set_charset('utf-8');
  12. //mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理(Prepared Statement)的机制。
  13. //使用问号参数占位符来构成预处理sql语句
  14. $sql = "INSERT INTO `user`(`username`,`password`,`age`)VALUES(?,?,?)";
  15. //mysqli::prepare()准备(prepare)需要执行的 SQL 语句
  16. //mysqli_prepare() 返回一个 statement 对象,如果发生错误则返回 FALSE。
  17. $stmt = $mysqli->prepare($sql);
  18. //mysqli_stmt::bind_param()绑定变量参数到 prepared 语句
  19. // s i d->double
  20. $username = 'php.cn';
  21. $password = md5('php.cn');
  22. $age = 12;
  23. //
  24. $stmt->bind_param('ssi',$username,$password,$age);
  25. //执行预处理语句
  26. //mysqli_stmt::execute()执行 prepared 查询
  27. $res = $stmt->execute();
  28. // var_dump($res);
  29. if ($res) {
  30. //返回上次查询中所自动生成的 ID
  31. echo $stmt->insert_id;
  32. }

6. 登陆表单:防止SQL注入

  • 先是形成一个login.php表单
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>用户登录</title>
  5. </head>
  6. <body>
  7. <h2>用户登录</h2>
  8. <form action="enter.php" method="post">
  9. <table>
  10. <tr>
  11. <td>用户名</td>
  12. <td>
  13. <input type="text" name="username">
  14. </td>
  15. </tr>
  16. <tr>
  17. <td>密码</td>
  18. <td>
  19. <input type="password" name="password">
  20. </td>
  21. </tr>
  22. <tr align="center">
  23. <td colspan="2">
  24. <input style=" border:red;background: red" type="submit" name="sub">
  25. </td>
  26. </tr>
  27. </table>
  28. </form>
  29. </body>
  30. </html>

  • 不安全的验证enter.php文件,直接用sql语句查询并返回。有可能会返回所有的值,并进行删除
  1. <?php
  2. //数据接受
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5. //mysqli预处理机制 防止sql注入
  6. //1.建立到mysql的连接 ,并且打开指定到数据库
  7. $mysqli = @new mysqli('localhost','root','zhoujielun521','apple');
  8. // print_r($mysqli);
  9. if ($mysqli->connect_errno) {
  10. //获取上次mysql操作受影响的函数
  11. die("CONNECT_ERROR:". $mysqli->connect_error);
  12. }
  13. // 2. mysqli::set_charset()设置默认的客户端字符集
  14. $mysqli->set_charset('utf-8');
  15. //mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理(Prepared Statement)的机制。
  16. //使用问号参数占位符来构成预处理sql语句
  17. //字符串中可以适用{}来将变量直接引入,这样php引擎是可以解析的。
  18. $sql = "SELECT * FROM `user` WHERE `username`='{$username}' AND `password`='{$password}'";
  19. echo $sql;
  20. /*这种情况如果username输入' or 1=1 #,密码随便输入就可以拿到所有的数据。原因是这个意思是:username为空或1=1,这样就变成了一个永远正确的判断。而#在sql语句中将后面所有的都变成注释了。不发挥作用了 */
  21. die;
  22. $res = $mysqli->query($sql);
  23. //num_rows返回语句结果集中的行数
  24. var_dump($res->num_rows);

具体展示出来的sql语句见下图:

  • 下面使用?占位符及stmt来进行,更安全
  1. <?php
  2. //数据接收
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5. //mysqli预处理机制 防止sql注入
  6. //1.建立到mysql的连接 ,并且打开指定到数据库
  7. $mysqli = @new mysqli('localhost','liang','622788','liangtest');
  8. // print_r($mysqli);
  9. if ($mysqli->connect_errno) {
  10. //获取上次mysql操作受影响的函数
  11. die("CONNECT_ERROR:". $mysqli->connect_error);
  12. }
  13. // 2. mysqli::set_charset()设置默认的客户端字符集
  14. $mysqli->set_charset('utf-8');
  15. //mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即预处理(Prepared Statement)的机制。
  16. //使用问号参数占位符来构成预处理sql语句
  17. $sql = "SELECT * FROM `my_user` WHERE `username`=? AND `password`=?";
  18. $stmt = $mysqli->prepare($sql);
  19. $stmt->bind_param('ss',$username, $password);
  20. $stmt->execute();
  21. //mysqli_stmt::get_result()获取 prepared 语句中的结果。
  22. $res = $stmt->get_result();
  23. print_r($res);
  24. //最后这几个也是值得琢磨的一些方法。后面再去琢磨。
  25. //htmlspecialchars();
  26. //trim();
  27. //strip_tags();

7. 实战部分

  • 使用mysqli类的对象去连接数据库,然后获取到mysqli_result对象,使用mysqli _result对象中的成员方法或者属性将获得的结果集中的数据(二维数组)遍历出来
  • 连接部分后面用pdo实现了。遍历的方法有固定的一些种,后面会整理。下面列一个
  1. foreach ($res as $key => $value) {
  2. foreach ($value as $k => $v) {
  3. printf('<pre>%s</pre>',print_r($v,true));
  4. //从大的res到value,再从value推进到v。
  5. }
  6. }
  7. echo '<hr><br>';

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议