关于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注入的正式学习