0x01 前言:
数据库: 什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
数据库又分为关系型数据库(SQL)和非关系型数据库(NOSQL)。而我们今天的主角MySQL则为关系型数据库。
什么是 关系型数据库 ?
关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
什么是关系型数据库管理系统 ?
关系型数据库管理系统,是一个用于维护关系数据库的程序,是所有现代数据库系统的基础,例如 MySQL、Microsoft SQL Server、Oracle 和 Microsoft Access,重要的是其使用 SQL 查询 来访问数据库中的数据。
关系型数据库管理系统有如下特点:
- 数据以表格的形式出现
- 每行为各种记录名称
- 每列为记录名称所对应的数据域
- 许多的行和列组成一张表单
- 若干的表单组成database
0x02 Mysql 安装
可以使用phpstudy等软件,或者直接从官网下载安装。过程略
安装完后我们就可以 连接mysql:
(账号密码填安装时修改的、这里我默认都使用root用户操作,自己使用的时候注意权限问题)
环境:php5.3+mysql5.5.53
①二进制方式连接
mysql.exe -uroot -proot
②PHP脚本连接Mysql
这里使用的是 mysql_connect 函数连接.
PHP代码:
<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 4, PHP 5) mysql_connect — 打开一个到 MySQL 服务器的连接
@$con = mysql_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
echo "Failed to connect to MySQL: " . mysql_error();
}else{
echo "连接成功~";
}
?>
连接效果如图所示:
…以及其他方式连接
0x03 Mysql SQL语言
注:
- sql有个特性,sql关键字不区分大小写,如:
select
和SELeCT
相同。 - 分号是在数据库系统中分隔每个 SQL 语句的标准方法,允许同时执行多条sql语句,一些数据库系统会要求在SQL语句的末尾使用分号。
03.1 Mysql 创建数据库
当第一次连接/登录Mysql服务器后,我们可以使用 create
命令创建数据库. 命令如下:
CREATE DATABASE [你的数据库名称]
比如新建一个名称为 “hello_test” 的数据库,这里也可以通过多种方式创建:
① mysql 命令行创建:
CREATE DATABASE hello_test;
② 通过可视化数据库连接工具创建,如Navicat
CREATE DATABASE hello_test; //命令不变
//或者..直接在Navicat中 右键 新建数据库
③ 使用 PHP 创建数据库
这里使用 mysqli_query 函数连接,不用 mysql_query 是因为此函数已经在php5.5.0废弃。
mysqli_query 函数使用方法:
mysqli_query(connection,query,resultmode);
参数 | Description |
---|---|
connection | 必需。规定要使用的 MySQL 连接。 |
query | 必需,规定查询字符串。 |
resultmode | 可选。一个常量。 |
完整的PHP代码👇:(注意这里的mysql操作语句都换成了mysqli_xx)
<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 5, PHP 7, PHP 8) mysqli_query — Open a new connection to the MySQL server
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
echo "Failed to connect to MySQL: " . mysqli_error();
}else{
echo "连接成功~";
}
echo "<br>";
$newdbname = "hello_test";
$sql = 'CREATE DATABASE $newdbname;';
$res = mysqli_query($con,$sql);
if(!$res){
die("Unable to create to the database: $newdbname".mysqli_error());
}
echo "$newdbname 数据库创建成功";
?>
最后在数据库中也可以看到我们新建的库。
mysql> show databases;
+-----------------------+
| Database |
+-----------------------+
| information_schema |
| 10fenpk |
| $newdbname |
| booksystem |
| challenges |
| college |
| dcr1_1_5 |
| dedecmsv57utf8sp2 |
| dvwa |
| gjcms |
| hello_test |
| mysql |
| performance_schema |
| #mysql50#phpcmsV9.6.3 |
| phpcmsv9 |
| pikachu |
| pkxss |
| rockxinhu |
| scms5 |
| security |
| test |
+-----------------------+
21 rows in set (0.00 sec)
03.1 Mysql 删除数据库
是不是很熟悉,删库跑路。
注意:此操作和创建数据库一样,都需要特定的权限才能操作数据库,业务中请勿轻易删库。
这里可以使用 drop
命令来删除数据库,命令如下:
drop DATABASE [你的数据库名称];
同样以 hello_test 数据库为例:
① mysql命令行:
drop DATABASE hello_test;
② Navicat中删除数据库
or
③ 使用 PHP 删除数据库
同样还是使用 mysqli_query 函数。
PHP完整代码👇:
<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
echo "Failed to connect to MySQL: " . mysqli_error();
}else{
echo "连接成功~";
}
echo "<br>";
$newdbname = "hello_test";
$sql = 'drop DATABASE $newdbname;'; //删除数据库--
@$res = mysqli_query($con,$sql);
if(!$res){
die("Unable to drop to the database: $newdbname".mysqli_error());
}
echo "$newdbname 数据库删除成功";
?>
03.3 Mysql 使用数据库
在连接到MySQL服务器后,我们可以选择需要操作的数据库。
使用方法:
① MySQL命令行中:
mysql -uroot -pxxxx
use mysql;
再此之前,如果不知道有哪些数据库,show databases;
查看即可
② 使用 PHP 来选择 Mysql 数据库
这里我们用到 mysqli_select_db 这个函数
两个参数,含义也是顾名思义,同时该函数返回布尔值:函数执行成功返回True,失败则返回False。
下面给出具体PHP代码👇:(注意,在这里发现了一个问题:mysqli_error这个函数是 必须要接受一个参数的,难怪之前经常报错…)
<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
echo "Failed to connect to MySQL: " . mysqli_error($con);
}else{
echo "连接成功~";
}
echo "<br>";
$dbname = "mysql"; //这里选择mysql数据库
@$res = mysqli_select_db($con, $dbname);
if(!$res){
die("选择数据库失败:".mysqli_error($con));
}
echo "success,使用".$dbname."数据库";
?>
mysqli_error(connection);
参数 | Description |
---|---|
connection | 必需,规定要使用的 MySQL 连接 |
03.4 Mysql 创建表
在创建表之前我们先了解一下MySQL支持的一些数据类型:
大致分为三类:数值、日期/时间和字符串(字符)类型。
- 数值类型:如int,bigint,float,double等。
- 日期/时间类型:如data、time、datatime等。
- 字符串类型:CHAR、VARCHAR、TINYBLOB等。
而创建MYSQL的数据表需要以下信息:表名、(表的)字段名、定义表的字段
SQL语法为:
CREATE TABLE table_name (column_name data_type[size] [NOT NULL|NULL] [DEFAULT value]
[AUTO_INCREMENT])
这里看 菜鸟教程 的一个例子:
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
解释:
- column_name指定列的名称。每列具有特定数据类型和大小,例如:VARCHAR(100)。
- NOT NULL或NULL表示该列是否接受NULL值。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- AUTO_INCREMENT指示每当将新行插入到表中时,列的值会自动增加。每个表都有一个且只有一个
auto_increment列,一般用于主键。
- DEFAULT值用于指定列的默认值。
- ENGINE 设置存储引擎,CHARSET 设置编码。
① 使用MySQL命令行创建表👇
mysql> use security;
Database changed
mysql> create table test_security (
-> id int NOT NULL AUTO_INCREMENT,
-> name VARCHAR(100) NOT NULL,
-> PRIMARY KEY ( id )
-> );
Query OK, 0 rows affected (0.01 sec)
看到已经创建成功:
② 使用PHP连接创建Mysql数据表
(这里需要注意的一点是,在创建表之前,需要先 选择/使用数据库 )
PHP实现代码如下:👇
<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 5, PHP 7, PHP 8) mysqli_query — Open a new connection to the MySQL server
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
echo "Failed to connect to MySQL: " . mysqli_error($con);
}else{
echo "连接成功~";
}
echo "<br>";
//选择数据库
mysqli_select_db( $con, 'security' );
$sql =
"create table test2_security (".
"id int NOT NULL AUTO_INCREMENT,".
"name VARCHAR(100) NOT NULL,".
"PRIMARY KEY ( id )".
");";
$res = mysqli_query($con,$sql);
if(!$res){
die("Unable to create to the table ".mysqli_error($con));
}
echo "表创建成功";
?>
查看数据库:
·ps·当没有选择数据库时,报错如下:
03.5 Mysql 删除表
SQL语法为:(使用方法同 MySQL删除数据库
)
drop TABLE table_name ;
不过有一点需要注意的是,在删除数据表之前需要先选择数据库:
use dbname;
mysqli_select_db( $conn, $dbname );
03.6 Mysql 数据的 增(I) 查(S) 改(U) 删(D)
03.6.1 插入数据-insert
当我们创建好了MySQL数据库和数据表(同时创建了表的字段)的时候,这时我们可以使用SQL语句 insert into
来向数据库中插入数据,语法如下:
INSERT INTO table_name ( field1, field2,…fieldN )
VALUES
( value1, value2,…valueN );
① 使用MySQL命令行插入:
insert INTO test_security(id,name)
values
(1,“user1”),(2,“user2”);
结果如下:
mysql> use security;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_security |
+--------------------+
| emails |
| referers |
| test2_security |
| test_security |
| uagents |
| users |
+--------------------+
6 rows in set (0.00 sec)
mysql> select * from test_security;
Empty set (0.00 sec)
mysql> insert INTO test_security(id,name)
-> values
-> (1,"user1"),(2,"user2");
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test_security;
+----+-------+
| id | name |
+----+-------+
| 1 | user1 |
| 2 | user2 |
+----+-------+
2 rows in set (0.00 sec)
② 使用PHP连接 插入数据:
代码如下:
<?php
@error_reporting(0);
$dbuser ='root';
$dbpass ='root';
$host = 'localhost';
//(PHP 5, PHP 7, PHP 8) mysqli_query — Open a new connection to the MySQL server
@$con = mysqli_connect($host,$dbuser,$dbpass);
//Check connection
if (!$con){
echo "Failed to connect to MySQL: " . mysqli_error($con);
}else{
echo "连接成功~";
}
echo "<br>";
//选择数据库
mysqli_select_db( $con, 'security' );
$sql = //插入语句
"insert INTO test_security(id,name)".
"values".
"(3,'user3'),(4,'user4');";
$res = mysqli_query($con,$sql);
if(!$res){
die("Unable to insert to the table ".mysqli_error($con));
}
echo "插入成功";
?>
03.6.2 查询数据-select
我们可以使用SQL语句 SElEcT
来进行查询数据。
SQL查询语法为:
select column_name_1,column_name_2,[…]
from
[schema_name.]table_name
[where cause]
[limit x][ offset n]
其中column_name
代表要查询的字段名,table_name
表示从某张表中查询、这里也可以使用 [数据库名.表名]
的形式来指定从 库a.表b 中查询数据,【where cause】
为限定条件,limit
可以用来限定返回的数据条数,offset
为开始查询时的数据偏移量/默认为0。
mysql中limit子句用于限制由 SELECT 语句返回的数据数量,这里提及一下MySQL中 limit 的用法:
1、select * from test_security limit 2; //表示从表中提取(前)2行,结果如下:
.
.
2、select * from test_security limit 2,4; //表示取第 3,4行的数据
.
3、select * from test_security LIMIT 4 OFFSET 2; //同2,表示取第 3,4行的数据
.
简单演示下:
mysql> use mysql;
Database changed
mysql> select * from security.test_security;
+----+-------+
| id | name |
+----+-------+
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
+----+-------+
4 rows in set (0.00 sec)
mysql> select * from security.test_security where id<>1 limit 2 offset 1;
+----+-------+
| id | name |
+----+-------+
| 3 | user3 |
| 4 | user4 |
+----+-------+
2 rows in set (0.00 sec)
这里解释一下最后一条语句:
此时我们使用的是mysql
库,select 表示查询所有字段信息,但查询的是security
库下的 test_security
表,故为 from security.test_security,where 限定了 id字段 <> 1 /即不等于1。到了这里查询出来的数据则为 id=2,3,4 的这三条数据。现在以这三条数据为基准,再进行一次过滤,limit 2 表示取(从当前偏移量开始的)前两行数据,offset 值为 1、也就是 select 从第二行开始选择查询。故最后结果为 id=3,4 的两行数据。
03.6.3 更新数据-update
我们可以使用SQL语句 UpdAte
来进行更新数据。
SQL 语法为:
UPDATE table_name SET column_1=new-value1, column_2=new-value2 [WHERE Clause]
使用update语句:
可以同时更新一个或者多个字段;如果只想更新某个字段名,则只需要填写对应的即可。
where 子句为限定条件,最好给予充分,并且where 可以指定任何条件
下面使用两条命令在MySQL命令行中进行更新数据:
UPDATE test_security SET name=name+1 ;
//这里没有使用where子句。该语句可以将 test_security 表中的所有 name 的值增加1;
UPDAtE test_security SeT name=“name2” where id = 1 ;
//这里使用where子句。该语句将 test_security 表中 id=1 的 name 字段值修改为 “name2”;
结果如下:
mysql> select * from test_security;
+----+------+
| id | name |
+----+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
+----+------+
4 rows in set (0.00 sec)
mysql> UPDATE test_security SET name=name+1 ;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> select * from test_security;
+----+------+
| id | name |
+----+------+
| 1 | 2 |
| 2 | 2 |
| 3 | 2 |
| 4 | 2 |
+----+------+
4 rows in set (0.00 sec)
mysql> UPDAtE test_security SeT name="name2" where id = 1 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from test_security;
+----+-------+
| id | name |
+----+-------+
| 1 | name2 |
| 2 | 2 |
| 3 | 2 |
| 4 | 2 |
+----+-------+
4 rows in set (0.00 sec)
mysql>
03.6.4 删除数据-delete
我们可以使用SQL语句 delEte From
来进行删除数据。
SQL 语法为:
DELETE FROM table_name [WHERE Clause]
注意:
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。还是有必要添加 WHERE 子句的
下面在MYSQL中删除id为1的数据,语句为:
dEleTe from test_security wHere iD = 1;
结果如下:
mysql> select * from test_security;
+----+-------+
| id | name |
+----+-------+
| 1 | name2 |
| 2 | 2 |
| 3 | 2 |
| 4 | 2 |
+----+-------+
4 rows in set (0.00 sec)
mysql> dEleTe from test_security wHere iD = 1;
Query OK, 1 row affected (0.00 sec)
mysql> select * from test_security;
+----+------+
| id | name |
+----+------+
| 2 | 2 |
| 3 | 2 |
| 4 | 2 |
+----+------+
3 rows in set (0.00 sec)
同时注意下 delete 和 drop 的区别。
0x04 暂告一段落
在这里简单先介绍一下MySQL语言的特性 和 MySQL的一些基础语法,数据库的创建以及对数据的增删改查,还有很多细节没有讲。后面陆续总结更新sql注入和sql注入绕waf等等的时候会尽量都写出来。