一.管理MySQL
1.基础操作
(1)连接MySQL
打开命令行窗口模式(cmd)。进入mysql安装目录的bin。输入:mysql -u root -p
(2)查看MySQL数据库
用:show databases 来查看
(3)使用数据库
用:use 'data_name' 来进入数据库。
(4)查看数据库中的表
用:show tables; 来查看
(5)查看表的类型
用:show columns from 'table_name'; 来查看
(6)查看表的内容
select [字段] from 'table_name'; 来查看具体指定的内容
2.相关函数
函数 | 描述 |
user(); | 查看当前用户 |
version(); | 查看当前数据库版本 |
database(); | 数据库名 |
@@version_compile_os | 操作系统 |
@@basedir | 查看MySQL安装目录 |
二.MySQL数据库操作
1.创建/删除数据库
(1)使用 create database 'database_name' 命令创建数据库。
(2)使用 drop database 'database_name' 命令删除数据库
2.创建/删除数据表&数据类型
(1)创建数据表
使用 create table 'table_name'(); 来创建。创建时要在括号内设置属性字段与字段类型。
数据类型 | 描述 |
VARCHAR | 字符串类型 |
TEXT | 大文本 |
INT | 整数型 |
FLOAT | 浮点数值 |
创建的同时也可以为每个字段设置约束,例如主键等
约束 | 描述 |
AUTO_INCREMENT | 表示自动增长 |
not_null | 表示不能为空 |
primary key('') | 表示主键 |
default | 默认值 |
UNIQUE | 标识该属性值是唯一的 |
(字段 字段类型 约束);
(3)查看表的结构
desc 'table_name';
各个字段的含义解释:filed字段名;Null表示该列可以存储NULL值;Key表示该列是否已编制索引。Default表示该列是否有默认值,如果有是多少;Extra表示可以获取的与给定列有关的附加信息,如AUTO_INCREMENT。
(4)删除数据表
用:drop table 'table_name'; 来删除
3.数据表的增删改查
(1)增加数据
使用:insert into 'table_name'(字段)values(值)
方法一:对应值添加到对应字段中
insert into 'table_name'(字段1,字段2,字段3)values(值1,只2,值3),values(.....);
如果添加的数据或值是字符串类型,需要使用单双引号。
方法二:直接添加,但是添加的值必须对应表中的字段
insert into 'table_name' values(...),values(....);
(2)查看数据
select [字段名] from ['table_name'];
可以使用 * 号来代替所有字段
设定返回的记录数 limit ;select [字段名] from ['table_name'] limit [开始索引],[查看条数];
该限制表示查询到的数据从第几行开始显示到几行。索引从0 开始。
添加限制条件 where
用select [字段值] from ['table_name'] where 条件表达式;
(3)修改数据
update 表名 set 字段名=字段值 where 条件表达式
如果不添加where限制条件。那么默认修改整个数据表该字段的值。
(4)删除数据
delete from 数据表名;
只想删除指定条目用where条件来判断
(5)逻辑运算符
and:查询时为了使查询结果更加准确,可以使用AND来连接两个或多个查询条件
or:OR只要满足其中一个条件就可被查询出来
and/or联用:AND优先级高于OR
(6)其他操作
查询表中的字段是否为空:select * from 表单名 where 字段 is null;
查询数据表中所有过滤重复值:select distinct 字段 from 表单名
查询表中字段:select * from 表单名 where 字段 like "%%/%s/s%"
对查询结果进行排序:select * from 表名 order by 字段 ASC升序/DESC降序;
进行分组查询:select * from 表名 group by 字段 相同字段中的值会被归类到一起
子查询:select * from 表名 where 字段=(select ....)
联合查询:union 注意前后查询的字段数量必须保持一致m
4.利用内置表进行查询
自带的表为内置表
information_schemata
存放着所有的数据库库名schema_name
information_tables
存放着所有数据库库名table_schema与数据表表名table_name
information_columns
存放着所有数据库库名table_schema,表名table_name,字段名与字段值column_name
三.数据库其他知识
1.算术运算符
运算符 | 作用 |
+ | 加法 |
- | 减法 |
* | 乘法 |
/或DIV | 除法 |
%或MOD | 取余 |
2.逻辑运算符
运算符号 | 作用 |
NOT 或 ! | 逻辑非 |
AND | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
3.注释符
/*。。。。*/ / --空格 / #
四.常见函数
函数 | 语法 | 描述 |
rand() | select rand() | 生成0-1之间的随机数 |
floor() | select floor(1.1/rand()) | 向下取整 |
concat() | select concat(1,'a','b') | 将数据进行拼接 |
concat_ws() | select concat(1,'~','a') | 将数据进行拼接 |
sleep() | select sleep(2) | 延时执行 |
length() | select length('asdasdf') | 返回结果长度 |
substr()/mld() | select substr(字段,1,2) | 截取从第一位到第二位 |
oscll()/ord() | select oscll(字段,1) | 将结果转为ASC值 |
if() | select if(a,b,c)判断结果,成立返回b不成立返回c | 条件判断 |
group_concat() | select group_concat(字段1,'~',字段2) from 表名 | 拼接查询结果显示 |
聚合函数
函数 | 语法 | 描述 |
COUNT() | select count(*) from 表名 | 返回某列的行数 |
SUM() | select sum(*) from 表名 | 返回某列的和 |
AVG() | select avg(*) from 表名 | 返回某列的平均值 |
MAX() | select max(*) from 表名 | 返回某列的最大值 |
MIN() | select min(*) from 表名 | 返回某列的最小值 |
读取load_file()函数
load_file()函数是MySQL读取本地/远程文件的函数
前提条件
必须有权限读取且⽂件是可读的,低权限⽆法读取⾼权限⽤⼾⽂件
必须知道⽂件的绝对路径 可⽤:select @@basedir;
secure_file_priv的值不为NULL 使⽤ show global variables like '%secure%'; ;\
查询是否为空,在my.ini设置为:secure_file_priv = ''
查询结果为:secure_file_priv NULL时,表⽰不允许导⼊导出;
查询结果为:secure_file_priv /xxx/时,表⽰只允许在当前⽬录导⼊导出;
查询结果为:secure_file_priv(空⽩)时,表⽰可以在任意⽬录进⾏导⼊导出;
写入into outfile()函数
在SQL注⼊时,我们可以利⽤load_file或者 into outfile()对⽂件进⾏读取,或者写⼊Webshell;
若过滤了单引号,则可以将函数中的字符进⾏hex编码。
五.PHP包含文件
1.介绍
(1)语法:include 文档名
作用:使用被包含的文件中的内容,实现代码的共享;自己的脚本内容可以给别的文件使用,实现代码的共享。
(2)文件的四种类型
include:生成一个告警,在错误后会继续执行。
include_once:系统会自动判断文件包含过程中,如果该文件已经被包含,则不会再次包含。
Require:生成一个致命错误,在错误发生后脚本会停止执行。
Require_once:与include_once相同。
2.函数的区别
(1)本质都是包含文件,唯一区别在于包含不到文件时候,报错形式不一样。
(2)include的错误级别较轻时;不会阻止代码的执行。
(3)Require要求较高;如果出现错误代码不再执行之后的代码。
3.文件包含路径
(1)绝对路径
(2)相对路径
六.PHP操作文件
readfile()函数读取文件,并把它写入输出缓冲。
1.fopen()函数
fopen()的第一个参数包含被打开的文件名,第二个参数规定打开文件的模式
die()函数输出一条消息,并退出当前脚本
文件操作模式
模式 | 描述 |
r | 打开文件只读。文件指针在文件的开头开始。 |
w | 打开文件只写。删除文件的内容或者创建一个新的文件,如果它不存在。文件指针在文件的开头开始。 |
a | 打开文件只写文件中的现有数据会被保留。文件指针在文件结尾开始。创建新的文件,如果文件不存在。 |
x | 创建新文件为只写。返回 FALSE 和错误,如果文件已存在。 |
r+ | 打开文件为读/写、文件指针在文件开头开始。 |
w+ | 打开文件为读/写。删除文件内容或创建新文件,如果它不存在。文件指针在文件开头开始。 |
a+ | 打开文件为读/写。文件中已有的数据会被保留。文件指针在文件结尾开始。创建新文件,如果它不存在。 |
x+ | 创建新文件为读/写。返回 FALSE 和错误,如果文件已存在。 |
2.fread()函数
读取打开的文件。fread()的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。
3.fclose()函数
fclose() 函数用于关闭打开的文件。
fclose() 需要待关闭文件的名称(或者存有文件名的变量)
4.fgets()函数
fgets() 函数用于从文件读取单行。
Ps:调用 fgets() 函数之后,文件指针会移动到下一行
5.feof()函数
feof() 函数检查是否已到达 "end-of-file" (EOF)。
feof() 对于遍历未知长度的数据很有用
6.fgetc()函数
fgets() 函数用于从文件读取字符。
ps:在调用 fgetc() 函数之后,文件指针会移动到下一个字符
7.fwrite()函数
fwrite() 函数用于写入文件。
fwrite() 的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串
七.PHP操作MySQL
1.面向过程连接
(1)连接数据库
$conn = mysqli_connect($localhost,$username,$password,$dbname);
检查连接失败的报错信息:mysqli_connect_error();
(2)执行SQL语句
常用函数
函数 | 描述 |
mysqli_query(连接,sql语句) | 执行SQL语句 |
mysqli_error(连接) | 获取报错信息 |
mysqli_num_rows | 函数返回结果集中行的数量 |
mysqli_fetch_assoc() | 从结果集中取得一行作为关联数组 |
(2).1创建数据表
$sql="create table 表名(字段名,字段类型,约束)";
mysqli_query(连接,$sql);
检查错误:mysqli_error(连接);
(2).2插入数据
$sql="insert into 表名(字段名) values(值)";
mysqli_query(连接,$sql);
检查错误:mysqli_error(连接);
(2).3删除数据
$sql="delete from 表名 where 条件表达式";
mysqli_query(连接,$sql);
检查错误:mysqli_error(连接);
(2).4获取数据
$sql="select * from 表名";
$result=mysqli_query(连接,$sql);
mysqli_num_rows($result)返回执行结果的数量
$row=mysqli_fetch_assoc($result)数据结果
2.面向对象连接
(1)连接数据库
$conn = new mysqli($localhost,$username,$password,$dbname)
检错:$conn->connect_error
(2)执行SQL语句
函数 | 描述 |
连接->query($sql) | 执行SQL语句 |
连接->connect_error | 获取连接报错信息 |
连接->error | 说去数据库报错信息 |
执行结果->num_rows | 函数返回结果集中行的数量 |
执行结果->fetch_assoc() | 从结果集中取得一行作为关联数组 |
(2).1创建数据表
$sql='create table 表名(字段,字段类型,约束)';
$conn->query($sql);
报错信息:$conn->error
(2).2插入数据
$sql='insert into 表名(字段)values(值)';
$conn->query($sql);
报错信息:$conn->error
(2).3删除数据
$sql='delete from 表名 where 条件表达式';
$conn->query($sql);
报错信息:$conn->error;
(2).4获取数据
$sql='select * from 表名';
$result=$conn->query($sql);
$result->num_rows;
$row=$result->fetch_assoc();
(3)小结
[连接对象] -> query //执行sql语句
[结果]->num_rows //判断是否有返回数据。
[结果]->fetch_assoc() //获取数据
[连接]->close(); //关闭连接
3.PDO连接
常用函数
函数 | 描述 |
try[正常代码]......catch[异常后的代码] | 异常捕获get |
getMessage(); | 获取异常错误并返回 |
$[数据库连接]->exec($SQL命令) | 执行SQL命令 |
$[]->prepare($SQL命令) | 预处理 |
$[]->execute() | 执行预处理 |
fetch() | 获取数据 |
$[连接]=null | 关闭连接 |
(1)创建数据表
(2)插入数据
(3)获取数据
PDO连接
预处理可以防止 SQL 注入攻击: prepare 预处理语句可以有效地防止 SQL 注入攻击,因为它会 将 SQL查询字符串与参数分开处理 ,确保参数不会被解释为 SQL 代码的一部分。这有助于保护数据库免受恶意用户的攻击。
八.补充与小结
MySQL
- 连接MySQL数据库
Mysql -u 用户名 -p
基础命令
命令 | 解释 |
show databases | 查看所有数据库 |
show tables | 查看某数据库下所有表 |
use 数据库 | 使用数据库 |
user() | 获取当前用户 |
version() | 获取mysql版本信息 |
@@version_compile_os | 查看当前操作系统 |
@@basedir | 获取Mysql安装路径 |
database() | 获取数据库名 |
常用函数
函数 | 语法 | 描述 |
rand() | select rand() | 生成0-1之间的随机数 |
floor() | selet floor(rand()) | 向下取整 |
concat() | select concat(0x3a,database(),0x3a) | 将数据进行拼接 |
concat_ws() | select concat_ws('',database(),'') | 将数据进行拼接 |
sleep() | select sleep(5) | 延时执行 |
length() | selec length(database()) | 返回结果得长度 |
substr()/mid() | select substr(user(),1,2); | 截取结果从第1位到第2位 |
ascii()/ord() | select ascii(mid(user(),1)); | 将结果转换成ascii码 |
if() | select if(a,b,c) | 条件判断 |
gourp_concat() | select group_concat(user,'~',city) from users; | 拼接查询结果显示 |
extractvalue() | select extractvalue('anything',concat('~',(select user()))); | 对xml文档进行查询语法:extractvalue(目标文档,路径) |
updatexml() | select updatexml('anything',concat('~',(select version())),'xxx'); | updatexml(目标xml文档,xml路径,更新的内容) |
函数 | 语法 | 描述 |
COUNT() | select count(*) from users; | 返回某列的行数 |
SUM() | select SUM(user_id) from users; | 返回某列值得和 |
AVG() | select AVG(user_id) from users; | 返回某列得平均值 |
MAX() | select MAX(user_id) from users; | 返回某列得最大值 |
MIN() | select MIN(user_id) from users; | 返回某列得最小值 |
增删改查
- 创建数据库
- 删除数据库
- 创建数据表
- 删除数据表
create database 名字
drop database 名字
CREATE TABLE 表名(字段名 类型 AUTO_INCREMENT,字段1 类型1,字段2,类型2 ,PRIMARY KEY (主键));
drop table 表名
针对数据的增删改查
- 增加数据
- 删除数据
- 查询数据
- 更改数据
- 模糊匹配
- where条件
insert into 表名(字段名1,字段名2,字段名3)values(值1,值2,值3)
delete from 表名 !!!谨慎使用,会删除表内全部信息
delete from 表名 where 条件 推荐使用
select 查询的字段(*代表所有) from 表名
update set 字段名=字段值 from 表名 where 条件
select * from 表名 where 字段名 like %s%
查看表中(字段值)包含s字符串的数据
可以在语句后使用where 进行条件判断
其他知识点
or 左右两那边有一方满足即为真
and 左右两边全部满足即为真
union 联合查询 (条件:左右两边字段数量必须保持一致)
注释符 -- # /**/
读取函数 load_file()
写入函数into outfile()
\ into dumpfile()
写入条件:
1. 必须高权限用户
2. 写入的目录必须有可写
3. secure_file_priv=''
PHP
构造函数
析构函数
超全局变量
文件包含函数
php操作mysql
PHP操作Mysql
-面向过程
mysqli_connect() 连接数据库
mysqli_query() 加载执行SQL语句
mysqli_num_rows() 判断是否由返回结果
mysqli_connect_error() 获取连接错误信息
mysqli_error() 获取报错信息
mysqli_fetch_assoc() 获取执行结果内容(以关联数组形式返回)
-面向对象
[连接对象] = new mysqli() 创建Mysql连接
[连接对象] -> query 执行sql语句
[结果]->num_rows 判断是否有返回数据。
[结果]->fetch_assoc() 获取数据
[连接对象]->close(); 关闭连接
[连接对象]->error() 获取连接错误信息
-PDO连接
try{正常代码}....catch{异常后的代码} //异常捕获
getMessage(); //获取异常错误并返回
$[数据库连接] -> exec($SQL语句) //执行SQL命令
$[连接] -> prepare($SQL语句) //预处理
$[预处理] -> execute(); //执行预处理
fetch() //获取数据
$[连接]=null //关闭连接
pdo可以预防SQL注入攻击(预处理可以防止 SQL 注入攻击)
prepare`预处理语句可以有效地防止 SQL 注入攻击,因为它会`将 SQL 查询字符串与参数分开处理`,确保参数不会被解释为 SQL 代码的一部分。这有助于保护数据库免受恶意用户的攻击。