WEB应用(七)

关于Mysqli还有一点东西,和今天学习的内容有很大的关系

Mysqli的预处理:

  • 用执行多条相同的sql语句,并且提高处理效率
  • 对于防范Mysql注入是非常有用的

话不多说,直接上代码

<?php
    header('Content-type:text/html;charset=utf-8');
    // 1.连接数据库
    $conn = mysqli_connect('localhost','root','root');
    if($conn == false){
        echo '数据连接失败!';
    }else{
        echo '数据库连接成功!';
    }

    // 使用预处理的方式完成数据的新增操作
    // 2.准备SQL语句,同样这里的用的函数名也可以看出来
    // ? : 占位符        这里是先写出sql语句,后传入参数
    $stmt = $conn->prepare("INSERT myDD.myuser(uname,upwd) VALUES(?,?)");
    // 3.绑定参数
    // var_dump($stmt);
    // bind_param(数据类型,参数1,参数2...):
    // 给准备好的字符串中的占位符来进行绑定参数
    // ss:给两个参数设置数据类型,类型为string  string
    // s : string 字符串
    // i : integer 整型  代表整数
    // d : double 双精度浮点型  代表小数
    // b : BLOB 二进制大对象
    $stmt->bind_param('ss',$uname,$upwd);
    $uname = '老六';
    $upwd = 'abc123';
    // 4.执行:execute()
    $stmt->execute();
    //去数据库里查看有没有新增数据
?>

SQL注入:

之前我们学习的PHP,和可视化的SQL_front,都可以去连接数据库,当然连接数据库的方式有很多,我们这里再介绍一种,首先找到你的phpstudy的文件夹,在这里打开你的命令行(cmd)

 细心地小伙伴就看见我第一次连接数据库失败了,因为没有开启对应的服务,所以你们也要注意一下

 

接下来就可以在mysql>后面输入建库建表等SQL语句了 

-- 接下来学习一下mysql中其他的查询语句
-- 查询数据库服务器中有哪些数据库
-- 显示所有的数据库
SHOW DATABASES;

-- 使用数据库
-- USE 数据库名
USE myDD;

-- 显示所有的数据表
SHOW TABLES;

-- 查询数据表中所有的数据
-- SELECT * FROM 库.表;
SELECT * FROM myDD.myuser;

接下来安装,pikachu靶场这里有一篇文章可以看看 

我们去使用该靶场的数据库来练习操作数据库

我们先看看pikachu数据库里的member表里有什么数据

SELECT * FROM pikachu.member;

 接下来去查询表中所有性别为女的数据

SELECT * FROM pikachu.member WHERE sex="girl";        WHERE 后边的既是条件

-- 比较运算符
-- =   相等
-- !=  <>  不相等
-- 查询pikachu数据库中member数据表中性别不是girl的用户
SELECT *FROM pikachu.member WHERE sex != "girl";
SELECT *FROM pikachu.member WHERE sex <> "girl";

-- > 大于 >= 大于等于 < 小于 <= 小于等于
-- 查询pikachu数据库中member表中的id大于等于3的用户
SELECT * FROM pikachu.member WHERE id >= 3;

-- IN 在集合中
-- 查询pikachu数据库中member表中的id 为2,5,7的用户
SELECT * FROM pikachu.member WHERE id IN (2,5,7);

-- NOT IN 不在集合中
-- 查询pikachu数据库中member表中的id 不为2,5,7的用户
SELECT * FROM pikachu.member WHERE id NOT IN (2,5,7);

-- BETWEEN  AND  俩值之间
-- 查询pikachu数据库member表中的id在3~6之间的用户
SELECT * FROM pikachu.member WHERE id BETWEEN 3 AND 6;

-- AND 逻辑与
-- 查询pikachu数据库中member表中的id大于3并且性别为boy的用户
SELECT * FROM pikachu.member WHERE id > 3 AND sex = "boy";

-- OR 逻辑或
-- 查询pikachu数据库中member表中的id小于3或者性别为girl的用户
SELECT * FROM pikachu.member WHERE id < 3 OR sex = "girl";

模糊查询

-- 模糊查询(相似性查询)
-- 查询用户名包含字符c的用户
-- % : 通配符 代替任意数量的任意字符
SELECT * FROM pikachu.member WHERE username LIKE '%c%';

-- 查询地址的前三个字符是nba的用户数据
SELECT * FROM pikachu.member WHERE address LIKE 'nba%';

-- 查询用户名中第3个字符是c的用户
-- _ : 通配符 代替一个任意字符
SELECT * FROM pikachu.member WHERE username LIKE '__c%';

下面学习sql函数

-- 字符函数


-- 1. LENGTH(s) : 获取字符串s的长度(字符数)
SELECT LENGTH('你好');

-- 查询pikachu数据库member数据表中username字段所对应的值的字符数
SELECT username,LENGTH(username) FROM pikachu.member;

-- 2. SUBSTR(s,n,len) : 截取字符串s,从第n个字符开始截取,截取len长度
-- hello => ll  从第3个字符开始截取,截取2个字符长度
SELECT SUBSTR('hello',3,2);

-- 截取pikachu数据库中member数据表中用户名第3个字符
-- (从第3个字符开始截取,截取1个字符长度)
SELECT username,SUBSTR(username,3,1) FROM pikachu.member;

-- 3. LEFT(s,n) : 截取字符串s前n个字符
-- 截取pikachu数据库member数据表中用户名的前3个字符
SELECT username,LEFT(username,3) FROM pikachu.member;

-- 4. CONCAT(s1,s2,s3...) : 将多个字符串合并为一个字符串
SELECT CONCAT('hello','world','hello','you');

-- 将pikachu数据库member数据表中usename字段值和pw字段值合并在一起
SELECT CONCAT(username,pw) FROM pikachu.member;

-- 5. GROUP_CONCAT():将同一分组多个字符串合并成一个字符串
-- GROUP_CONCAT(s1,s2,s3...) : 将多个字符串合并为一个字符串
SELECT GROUP_CONCAT('hello','world','hello','you');

-- 将pikachu数据库member数据表中usename字段值和pw字段值合并在一起
SELECT GROUP_CONCAT(username,pw) FROM pikachu.member;
-- 这里可以和上面的进行对比,发现,GROUP_CONCAT将所有的数据拼接成一个字符串,
-- 但会有分割,而CONCAT会有分组


-- 6. ASCII(s)  ORD(s): 获取字符串s的第一个字符的ascii码
SELECT ASCII('hello');

-- 获取pikachu数据库member数据表中用户名第一个字符的ascii码值
SELECT username,ASCII(username) FROM pikachu.member;

-- 获取pikachu数据库member数据表中用户名第2个字符的ascii码值
-- 先用SUBSTR()截取出第2个字符,然后再使用ASCII()函数进行转换
SELECT username,ASCII(SUBSTR(username,2,1)) FROM pikachu.member;

-- 7. HEX(s) : 将字符串s转换成十六进制
SELECT HEX('hello');

-- 68656C6C6F => hello

-- 将pikachu数据库member表中所有的用户名转换成十六进制形式
SELECT username,HEX(username) FROM pikachu.member;

 系统函数

-- 1.VERSION() : 获取数据库服务器版本号
SELECT VERSION();
-- 2.DATABASE() : 获取当前正在使用的数据库
SELECT DATABASE();
-- 3.USER() : 获取数据库服务器的用户名
SELECT USER();
-- 4.@@DATADIR : 获取数据库路径
SELECT @@DATADIR;

 其他函数

-- IF(expr,v1,v2) : 如果expr表达式成立,执行v1,否则执行v2
SELECT * FROM pikachu.member WHERE id=IF(1=1,1,3);
SELECT * FROM pikachu.member WHERE id=IF(1=2,1,3);

-- SLEEP(n) : 暂停n秒
-- SLEEP() : 返回值是0 => 不成立  否定 false
SELECT * FROM pikachu.member WHERE id=3 AND SLEEP(3);
-- 不会返回查询结果

-- RAND():返回0~1之间的随机数
SELECT RAND();

-- LOAD_FILE('文件路径') : 读取文件并返回文件内容
-- 读取 D:/hello.txt文件内容     创建一个文件,并写入一点东西
-- 注意:1.文件的路径分隔符需要写成/,不可以使用\

SELECT LOAD_FILE('D:/hello.txt');

-- ORDER BY 字段名 : 按照字段名的值进行排序
SELECT * FROM pikachu.member ORDER BY id;
SELECT * FROM pikachu.member ORDER BY username;

-- ORDER BY n : 按照数据表的第n个字段值进行排序
SELECT * FROM pikachu.member ORDER BY 1;

-- SQL注入中会ORDER BY 数字 来判断数据表字段的数量
SELECT * FROM pikachu.member ORDER BY 1;
SELECT * FROM pikachu.member ORDER BY 2;
....
SELECT * FROM pikachu.member ORDER BY 7;

-- 以上的SQL都能够正常执行,说明按照第1~7个字段的值进行排序是排序成功的

SELECT * FROM pikachu.member ORDER BY 8;
-- 报错:Unknown column 8 in order clause
-- 翻译:在排序子句中没有第8列

-- 通过以上的操作推断得出:
-- 当前的数据表只有7列数据(只有7个字段)

在这里如果你使用mysql-front可能无法对文件进行操作,需要改配置文件

在文件的最后一行添加secure_file_priv=""  保存 

重启phpstudy的服务

 联合查询

-- union : 联合查询,可以将union前的查询结果和union后的查询结果
-- 合并成一个结果集
-- union的使用条件:
-- 1.union前后的查询结果列数需要相同
-- 2.union前后字段的校验规则需要一致
SELECT * FROM pikachu.member UNION SELECT 1,2,3,4,5,6,7;

元数据库

 -- tables数据表
 -- table_schema字段:存储着所有的数据库名
 -- table_name字段:存储着所有的数据表名
    
 -- 借助information_schema元数据库中的tables数据表
 -- 查询某个数据库中的所有的数据表名

SELECT table_name FROM information_schema.tables WHERE table_schema='库名'


 -- 元数据库information_schema
 -- columns数据表
 -- table_schema字段:存储着所有的数据库名
 -- table_name字段:存储着所有的数据表名
 -- column_name字段:存储着所有的字段名

 -- 借助information_schema元数据库中的columns数据表
 -- 查询某个数据库中某个数据表中所有的字段名

SELECT column_name FROM information_schema.columns WHERE table_schema='库名' AND table_name='表名';

至此我们将所有的SQL注入前的基础知识已经学完了                                                                        明天开启SQL注入的正式学习

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值