渗透测试之后端编程PHP

1、php简介

PHP: Hypertext Preprocessor (超文本预处理器)

php的作用就是生成动态的html文档

2、php版本

php 1.0 1995

php 2.0 1995

php 3.0 ~ 免杀

php 4.0 2000

php 5.0 2004 5.0-5.6

php 7.0 2015 7.0-7.4

php 8.0 2020

市面上主流的还是5.x和7.x。

3、安装php的运行环境

phpstudy的安装,关闭windows更新功能和防病毒功能。

4、php基础语法

bash 复制代码
<?php 
echo "Hello!<br>";  //echo 在html中输出内容用的
?>


5、php的变量和常量

变量:可变化的值

常量:不变的值 圆周率:3.1415

bash 复制代码
#PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。 
#定义一个变量,前面不加$符号,那么就是普通字符
$num = 3.1415;
$a = 5;
$b = 6;
echo $a + $b;
$hello world
# 定义常量:
# 常量的名一般都是大写字母
方式1:define('常量名', '常量值');  例如:define('WebSite', 'php中文网');
方式2:const 常量名 = 常量值;  例如:const FOO = 'BAR';
方式2不能用在if判断中


变量的命名规则

$中 = 100

1.一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。

2.变量名不能以数字开头

3.变量名不要出现中文

4.变量名不要出现非下划线的其他特殊符号

5.变量名建议使用小写字母

不带符号,单引号,双引号的区别

bash 复制代码
<?php
header("Content-Type: text/html; charset=utf-8");  // 在响应头中添加了content-type: 
utf-8,header()是php提供的加工响应头键值对的
$name = 'kobe';
echo $name;
echo '最喜欢的NBA球星是'.$name.'<br>';  //变量不加符号,遇到字符串拼接,需要加.连接
echo '最喜欢的NBA球星是$name<br>';      //单引号,不解析变量,原样输出
echo "最喜欢的NBA球星是$name<br>";      //双引号,解析变量
?>

6、php的数据类型

◾布尔类型 0 非0 |false true # 判断条件的结果都是布尔值

◾整型 整数 -99999 +99999

◾浮点型 小数 -1.9 3.25 3.00005

◾字符串 'hello' "hello"

◾数组 array, 例如:$d = array('a', 1,'c',array(1,2,3)); #数组是容器类型的数据,可以存放各种类型的基础数据

$d = array('a', 1,'c',array(1,2,3));

echo $d; //会报错,因为echo是用来输出字符串类型数据的。

echo $d[0]; # 数组类型是可以通过索引取值的,索引是从0开始的

◾对象 object # 这个需要学到类之后才能看到

◾资源类型 Resource # 文件等资源数据

◾NULL 空 # $a = null; 提前定义,但是不想赋值的时候就可以这样用

查看变量对应值的类型:

1.使用"gettype(传入一个变量var)"来显示变量var的类型; 只会显示类型

2.使用"var_dump(传入一个变量var)"来显示变量var的类型; 会显示具体内容

7、php的运算符

算数运算符

bash 复制代码
运算符  名称   描述实例      结果
x + y  加   x 和 y 的和   2 + 2 4
x - y  减   x 和 y 的差   5 - 2 3
x * y  乘   x 和 y 的积   5 * 2 10
x / y  除   x 和 y 的商   15 / 5 3
x % y  模(除法的余数) x 除以 y 的余数 5 % 2 10 % 8 10 % 2 1 2 0
- x  取负数  x 取负数 <?php $x =2; echo -$x; ?> -2
a . b  并置  连接两个字符串 "Hi" . "Ha" HiHa

存在优先级 (乘除 > 加减),提升优先级就加括号。

bash 复制代码
<?php 
    $x=10; 
    $y=6;
    echo ($x + $y); // 输出16
    echo '<br>';  // 换行
    echo ($x - $y); // 输出4
    echo '<br>';  // 换行
    echo ($x * $y); // 输出60
    echo '<br>';  // 换行
    echo ($x / $y); // 输出1.6666666666667
    echo '<br>';  // 换行
    echo ($x % $y); // 输出4
    echo '<br>';  // 换行
    echo -$x;
    
    echo $x.$y //输出106
?>


自增自减

bash 复制代码
运算符 名称 描述
++ x 预递增 x 加 1,然后返回 x
x ++ 后递增 返回 x,然后 x 加 1
-- x 预递减 x 减 1,然后返回 x
x -- 后递减 返回 x,然后 x 减 1
bash 复制代码
<?php
$x=10; 
echo ++$x; // 输出11 先加1,再执行输出逻辑
 
$y=10; 
echo $y++; // 输出10 先执行输出逻辑,再加1
echo $y;
$z=5;
echo --$z; // 输出4
 
$i=5;
echo $i--; // 输出5
?>


比较运算符

bash 复制代码
运算符    名称  描述               实例
x == y 弱等于 如果 x 等于 y,则返回 true,不比较数据类型 5==8 返回 false
x ===y 绝对等于如果 x 等于 y,且它们类型相同,则返回 true,比较数据5==="5"返回 false
x != y 不等于 如果 x 不等于 y,则返回 true 5!=8 返回 true
x <> y 不等于 如果 x 不等于 y,则返回 true 5<>8 返回 true
x !==y 绝对不等于如果 x 不等于 y,或它们类型不相同,则返回 true 5!=="5"返回 true
x > y 大于 如果 x 大于 y,则返回 true 5>8 返回 false
x < y 小于 如果 x 小于 y,则返回 true 5<8 返回 true
x >= y 大于等于 如果 x 大于或者等于 y,则返回 true 5>=8 返回 false
x <= y 小于等于 如果 x 小于或者等于 y,则返回 true 5<=8 返回 true
bash 复制代码
==和===的区别
bash 复制代码
<?php
  $a = '10'; // 一个等号是赋值的意思
  $b = 10;
  if ($a === $b){ // 强等于,比较数据类型
  // if ($a == $b){ // 弱等于,不比较数据类型
     echo '这俩人相等';
 }else{
     echo '不相等' ;
 };
?>


bash 复制代码
<?php
    $x=100; 
    $y="100";
    var_dump($x == $y);  //输出bool true
    echo "<br>";
    var_dump($x === $y);  //输出bool false
    echo "<br>";
    var_dump($x != $y);  //输出bool false
    echo "<br>";
    var_dump($x !== $y);  //输出bool true
    echo "<br>";
    $a=50;
    $b=90;
    var_dump($a > $b);  //输出bool false
    echo "<br>";
    var_dump($a < $b);  //输出bool true
?>

赋值运算符

bash 复制代码
运算符 			等同于 				描述
x = y 			x = y 			左操作数被设置为右侧表达式的值
x += y 		x = x + y			加等于
x -= y 		x = x - y 			减等于
x *= y 		x = x * y 			乘等于
x /= y 		x = x / y 			除等于
x %= y 		x = x % y 			模(除法的余数)等于
a .= b 		a = a . b 			连接两个字符串
bash 复制代码
<?php 
    $x=10; 
    echo $x; // 输出10
    $y=20; 
    $y +=100; // $y=$y+100
    echo $y; // 输出120
    $z=50;
    $z -= 25; //$z=$z-25
    echo $z; // 输出25
    $i=5;
    $i *= 6;
    echo $i; // 输出30
    $j=10;
    $j /= 5;
    echo $j; // 输出2
    $k=15;
    $k %= 4;
    echo $k; // 输出3
    $a = 10;
    $b = 3;
    $c = $a.$b;
    echo $c.'<br>'; // 103
    echo var_dump($c); // string
?>


逻辑运算符

bash 复制代码
运算符     名称    描述                                  实例
x and y    与    如果x和y都为true,则返回true        x=6 y=3 (x < 10 and y > 1) 返回 true
x or y     或    如果x和y至少有一个为true,则返回true x=6 y=3 (x==6 or y==5) 返回 true
x xor y   异或(pass)如果 x 和 y 有且仅有一个为 true,则返回 true x=6 y=3 (x==6 xor y==3) 返回 false
x && y    与    如果 x 和 y 都为 true,则返回 true     x=6 y=3 (x < 10 && y > 1) 返回 true
x || y    或    如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x==5 || y==5) 返回 false
! x      非,取反 如果 x 不为 true,则返回 true x=6 y=3 !(x==y) 返回 true
bash 复制代码
<?php
    $x = true;
    $y = false;
    //逻辑与(并且),要求两个都为true才执行真区间,所以代码中执行假区间
    if($x && $y){
       echo '执行了真区间';
   }else{
       echo '执行了假区间';
   }
?>

三元运算

bash 复制代码
判断条件?真的处理:假的处理
判断如果为true,那么执行真处理,也就是:冒号前面的代码会执行,否则:冒号后面的执行,和if..else差不多,不过更简洁一些,但是不能执行多条件判断
bash 复制代码
<?php
    $x = true;
    $x ? $y = 5 : $y = 6;
    //输出5
    echo  $y;
?>

8、php的控制结构

if

bash 复制代码
<?php
header("Content-Type: text/html; charset=utf-8");
$a=rand(1,10);
if ($a >5){
 echo "随机点数比较大";
}
echo "<br>";
echo "当前的点数是".$a;
?>

else

bash 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>登录表单</title>
</head>
<body>
    <?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        // 安全获取表单数据
        $username = $_POST['username'] ?? '';
        $password = $_POST['password'] ?? '';
        
        // 验证数据
        if (!empty($username) && !empty($password)) {
            // 安全输出数据
            echo "用户名: " . htmlspecialchars($username);
            echo "<br>密码: " . htmlspecialchars($password);
        } else {
            echo "请填写所有字段。";
        }
    }
    ?>		
    
    <form method="POST" action="">
        <label>用户名:</label>
        <input type="text" name="username"><br><br>
        
        <label>密码:</label>
        <input type="password" name="password"><br><br>
        
        <input type="submit" value="提交">
    </form>
</body>
</html>

elseif/else if

bash 复制代码
<?php
// A B C 其他
$jixiao='F';
if ($jixiao == 'A'){
 echo "发放1.2倍薪资";
} elseif ( $jixiao =='B'){
 echo "正常发放薪资";
}else if($jixiao == 'C'){
 echo "发放90%薪资";
}else {
echo "发放80%薪资";
}
?>

while

条件不成立,一次都不执行

bash 复制代码
<?php
$i = 1;
while ($i <= 10) {
 $i++;
    echo '哈哈<br>'.$i.'次'; 
}
?>

do-while

条件不成立,也会执行一次

bash 复制代码
<?php
$i = 0;
do {
   echo $i;
} while ($i > 0);
?>

for

bash 复制代码
for ($i = 1; $i <= 10; $i++) {
    echo $i;
}

foreach

遍历数组

bash 复制代码
$cars=array("特等奖"=>"布加迪","一等奖"=>"捷豹" ,"二等奖"=>"法拉利" ,"三等奖"=>"玛莎拉蒂");
foreach ($cars as $key => $value) {
    echo "<tr><td>$key</td><td>$value</td></tr>";
}

break 打断

打断循环;结束循环

bash 复制代码
$cars=array("特等奖"=>"布加迪","一等奖"=>"捷豹" ,"二等奖"=>"法拉利" ,"三等奖"=>"玛莎拉蒂" ,"四等奖"=>"迈凯伦");
foreach ($cars as $key => $value) {
 if ( $key == '三等奖' ){
 break;
 } else {
    echo $key."是".$value."<br>";
 }
}

continue 继续

跳出本轮,开始下一轮

bash 复制代码
$cars=array("特等奖"=>"布加迪","一等奖"=>"捷豹" ,"二等奖"=>"法拉利","三等奖"=>"玛莎拉蒂" ,"四等奖"=>"迈凯伦");
foreach ($cars as $key => $value) {
 if ( $key == '三等奖' ){
 continue;
 } else {
    echo $key."是".$value."<br>";
 }
}

switch

bash 复制代码
$a=5;
$b=10;
$c=4;  
//
switch ($c) {
    case 1:
        echo "$a + $b = ".($a+$b)."<br>";
        break;
    case 2:
        echo "$a - $b = ".($a-$b)."<br>";
        break;
    case 3:
        echo "$a * $b = ".($a*$b)."<br>";
        break;
 	case 4:
		echo "$a / $b = ".($a/$b)."<br>";
 		break;
}


9、php的函数

函数的介绍

函数的英文叫作:function,而function的解释项中有另外一个含义:功能,函数就是功能,比如我们发微信,可能发微信这个后台代码逻辑就是一个函数,将整体的发微信的逻辑代码封装到了函数中,调用并执行这个函数,就能够实现发微信的动作。

bash 复制代码
<?php
// 使用默认参数,使参数可选
function welcom($a = null) {
    if ($a === null) {
        echo "欢迎光临!";
    } else {
        echo $a . ", 欢迎光临!";
    }
}

// 调用时不传参
welcom(); // 输出: 欢迎光临!

// 调用时传参
welcom('张三'); // 输出: 张三, 欢迎光临!

// 计算平方的函数
function pf($a) {
    if (!is_int($a)) {
        echo "请输入正整数";
        exit;
    } else {
        return $a * $a;
    }
}
$a = pf(6);
echo $a;
?>

内置函数

文件包含的函数

数学常用函数

字符串常用函数

bash 复制代码
addcslashes --- 以 C 语言风格使用反斜线转义字符串中的字符
addslashes --- 使用反斜线引用字符串
bin2hex --- 将二进制数据转换为十六进制表示
chop --- rtrim 的别名
chr --- 从数字生成单字节字符串
chunk_split --- 将字符串分割成小块
convert_cyr_string --- 将字符由一种 Cyrillic 字符转换成另一种
convert_uudecode --- 解码一个 uuencode 编码的字符串
convert_uuencode --- 使用 uuencode 编码一个字符串
count_chars --- 返回字符串所用字符的信息
crc32 --- 计算一个字符串的 crc32 多项式
crypt --- 单向字符串散列
echo --- 输出一个或多个字符串
explode --- 使用一个字符串分割另一个字符串
fprintf --- 将格式化后的字符串写入到流
get_html_translation_table --- 返回使用 htmlspecialchars 和 htmlentities 后的转换表
hebrev --- 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)
hebrevc --- 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符
hex2bin --- 转换十六进制字符串为二进制字符串
html_entity_decode --- Convert HTML entities to their corresponding characters
htmlentities --- 将字符转换为 HTML 转义字符
htmlspecialchars --- 将特殊字符转换为 HTML 实体
htmlspecialchars_decode --- 将特殊的 HTML 实体转换回普通字符
implode --- 用字符串连接数组元素
join --- 别名 implode
lcfirst --- 使字符串的第一个字符小写
levenshtein --- 计算两个字符串之间的 Levenshtein 距离
localeconv --- Get numeric formatting information
ltrim --- 删除字符串开头的空白字符(或其他字符)
md5 --- 计算字符串的 MD5 散列值
md5_file --- 计算指定文件的 MD5 散列值
metaphone --- Calculate the metaphone key of a string
money_format --- 将数字格式化成货币字符串
nl_langinfo --- Query language and locale information
nl2br --- 在字符串所有新行之前插入 HTML 换行标记
number_format --- 以千位分隔符方式格式化一个数字
ord --- 转换字符串第一个字节为 0-255 之间的值
parse_str --- 解析 URL 查询字符串
print --- 输出字符串
printf --- 输出格式化字符串
quoted_printable_decode --- 将 quoted-printable 字符串转换为 8-bit 字符串
quoted_printable_encode --- 将 8-bit 字符串转换成 quoted-printable 字符串
quotemeta --- 转义元字符集
rtrim --- 去除字符串末尾的空白字符(或者其他字符)
setlocale --- 设置区域信息
sha1 --- 计算字符串的 sha1 散列值
sha1_file --- 计算文件的 sha1 散列值
similar_text --- 计算两个字符串的相似度
soundex --- Calculate the soundex key of a string
sprintf --- 返回格式化字符串
sscanf --- 根据指定格式解析输入的字符
str_contains --- 确定字符串是否包含指定子串
str_decrement --- Decrement an alphanumeric string
str_ends_with --- 检查字符串是否以指定子串结尾
str_getcsv --- 解析 CSV 字符串为一个数组
str_increment --- Increment an alphanumeric string
str_ireplace --- str_replace 的忽略大小写版本
str_pad --- 使用另一个字符串填充字符串为指定长度
str_repeat --- 重复一个字符串
str_replace --- 子字符串替换
str_rot13 --- 对字符串执行 ROT13 转换
str_shuffle --- 随机打乱一个字符串
str_split --- 将字符串转换为数组
str_starts_with --- 检查字符串是否以指定子串开头
str_word_count --- 返回字符串中单词的使用情况
strcasecmp --- 二进制安全比较字符串(不区分大小写)
strchr --- 别名 strstr
strcmp --- 二进制安全字符串比较
strcoll --- 基于区域设置的字符串比较
strcspn --- 获取不匹配遮罩的起始子字符串的长度
strip_tags --- 从字符串中去除 HTML 和 PHP 标签
stripcslashes --- 反引用一个使用 addcslashes 转义的字符串
stripos --- 查找字符串首次出现的位置(不区分大小写)
stripslashes --- 反引用一个引用字符串
stristr --- strstr 函数的忽略大小写版本
strlen --- 获取字符串长度
strnatcasecmp --- 使用"自然顺序"算法比较字符串(不区分大小写)
strnatcmp --- 使用自然排序算法比较字符串
strncasecmp --- 二进制安全比较字符串开头的若干个字符(不区分大小写)
strncmp --- 二进制安全比较字符串开头的若干个字符
strpbrk --- 在字符串中查找一组字符的任何一个字符
strpos --- 查找字符串首次出现的位置
strrchr --- 查找指定字符在字符串中的最后一次出现
strrev --- 反转字符串
strripos --- 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
strrpos --- 计算指定字符串在目标字符串中最后一次出现的位置
strspn --- 计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度
strstr --- 查找字符串的首次出现
strtok --- 标记分割字符串
strtolower --- 将字符串转化为小写
strtoupper --- 将字符串转化为大写
strtr --- 转换字符或替换字串
substr --- 返回字符串的子串
substr_compare --- 二进制安全比较字符串(从偏移位置比较指定长度)
substr_count --- 计算字串出现的次数
substr_replace --- 替换字符串的子串
trim --- 去除字符串首尾处的空白字符(或者其他字符)
ucfirst --- 将字符串的首字母转换为大写
ucwords --- 将字符串中每个单词的首字母转换为大写
utf8_decode --- 将字符串从 UTF-8 转换为 ISO-8859-1,替换无效或者无法表示的字符。
utf8_encode --- 将字符串从 ISO-8859-1 转换为 UTF-8 编码
vfprintf --- 将格式化字符串写入流
vprintf --- 输出格式化字符串
vsprintf --- 返回格式化字符串
wordwrap --- 打断字符串为指定数量的字串

时间日期函数

中国的时区在东八区。时间相关函数:date()、getdate()、time()

bash 复制代码
// 时区的报错,修改php.ini,date.timezone = Asia/Shanghai
$d = date('Ymd H:i:s');  # 格式化时间日期的。
$d = date('Ymd H:i:s', 1661910865); # 通过某个时间戳来格式化时间
$t = time();  # 当前时间戳
<?php 
    $mytime = getdate(); // 得到当前时间日期的一个属组
 // $mytime = getdate(1661910865);
    echo "年 :".$mytime['year']."<br>";
    echo "月 :".$mytime['mon']."<br>";
    echo "日 :".$mytime['mday']."<br>";
    echo "时 :".$mytime['hours']."<br>";
    echo "分 :".$mytime['minutes']."<br>";
    echo "秒 :".$mytime['seconds']."<br>";
    echo "一个小时中的第几钟 :".$mytime['minutes']."<br>";
    echo "这是一分钟的第几秒 :".$mytime['seconds']."<br>";
    echo "星期名称 :".$mytime['weekday']."<br>";
    echo "月份名称 :".$mytime['month']."<br>";
    echo "时间戳   :".$mytime[0]."<br>";
?>

数组常用函数

bash 复制代码
array --- 新建一个数组
array_all --- Checks if all array elements satisfy a callback function
array_any --- Checks if at least one array element satisfies a callback function
array_change_key_case --- 将数组中的所有键名修改为全大写或小写
array_chunk --- 将一个数组分割成多个
array_column --- 返回输入数组中指定列的值
array_combine --- 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
array_count_values --- 统计数组中每个不同值的出现次数
array_diff --- 计算数组的差集
array_diff_assoc --- 带索引检查计算数组的差集
array_diff_key --- 使用键名比较计算数组的差集
array_diff_uassoc --- 用用户提供的回调函数做索引检查来计算数组的差集
array_diff_ukey --- 用回调函数对键名比较计算数组的差集
array_fill --- 用给定的值填充数组
array_fill_keys --- 使用指定的键和值填充数组
array_filter --- 使用回调函数过滤数组的元素
array_find --- Returns the first element satisfying a callback function
array_find_key --- Returns the key of the first element satisfying a callback function
array_first --- 获取数组的第一个值
array_flip --- 交换数组中的键和值
array_intersect --- 计算数组的交集
array_intersect_assoc --- 带索引检查计算数组的交集
array_intersect_key --- 使用键名比较计算数组的交集
array_intersect_uassoc --- 带索引检查计算数组的交集,用回调函数比较索引
array_intersect_ukey --- 在键名上使用回调函数来比较计算数组的交集
array_is_list --- 判断指定 array 是否为 list
array_key_exists --- 检查数组里是否有指定的键名或索引
array_key_first --- 获取指定数组的第一个键
array_key_last --- 获取一个数组的最后一个键值
array_keys --- 返回数组中部分的或所有的键名
array_last --- 获取数组的最后一个值
array_map --- 为数组的每个元素应用回调函数
array_merge --- 合并一个或多个数组
array_merge_recursive --- 递归地合并一个或多个数组
array_multisort --- 对多个数组或多维数组进行排序
array_pad --- 以指定长度将一个值填充进数组
array_pop --- 弹出数组最后一个单元(出栈)
array_product --- 计算数组中所有值的乘积
array_push --- 将一个或多个单元压入数组的末尾(入栈)
array_rand --- 从数组中随机取出一个或多个随机键
array_reduce --- 用回调函数迭代地将数组简化为单一的值
array_replace --- 使用传递的数组替换第一个数组的元素
array_replace_recursive --- 使用传递的数组递归替换第一个数组的元素
array_reverse --- 返回单元顺序相反的数组
array_search --- 在数组中搜索给定的值,如果成功则返回首个相应的键名
array_shift --- 将数组开头的单元移出数组
array_slice --- 从数组中取出一段
array_splice --- 去掉数组中的某一部分并用其它值取代
array_sum --- 对数组中所有值求和
array_udiff --- 用回调函数比较数据来计算数组的差集
array_udiff_assoc --- 带索引检查计算数组的差集,用回调函数比较数据
array_udiff_uassoc --- 带索引检查计算数组的差集,用回调函数比较数据和索引
array_uintersect --- 计算数组的交集,用回调函数比较数据
array_uintersect_assoc --- 带索引检查计算数组的交集,用回调函数比较数据
array_uintersect_uassoc --- 带索引检查计算数组的交集,用单独的回调函数比较数据和索引
array_unique --- 移除数组中重复的值
array_unshift --- 在数组开头插入一个或多个单元
array_values --- 返回数组中所有的值
array_walk --- 使用用户自定义函数对数组中的每个元素做回调处理
array_walk_recursive --- 对数组中的每个成员递归地应用用户函数
arsort --- 对数组进行降向排序并保持索引关系
asort --- 对数组进行升序排序并保持索引关系
compact --- 建立一个数组,包括变量名和它们的值
count --- 统计数组、Countable 对象中所有元素的数量
current --- 返回数组中的当前值
each --- 返回数组中当前的键/值对并将数组指针向前移动一步
end --- 将数组的内部指针指向最后一个单元
extract --- 从数组中将变量导入到当前的符号表
in_array --- 检查数组中是否存在某个值
key --- 从关联数组中取得键名
key_exists --- 别名 array_key_exists
krsort --- 对数组按照键名逆向排序
ksort --- 对数组根据键名升序排序
list --- 把数组中的值赋给一组变量
natcasesort --- 用"自然排序"算法对数组进行不区分大小写字母的排序
natsort --- 用"自然排序"算法对数组排序
next --- 将数组中的内部指针向前移动一位
pos --- current 的别名
prev --- 将数组的内部指针倒回一位
range --- 根据范围创建数组,包含指定的元素
reset --- 将数组的内部指针指向第一个单元
rsort --- 对数组降序排序
shuffle --- 打乱数组
sizeof --- count 的别名
sort --- 对数组升序排序
uasort --- 使用用户定义的比较函数对数组进行排序并保持索引关联
uksort --- 使用用户自定义的比较函数对数组中的键名进行排序
usort --- 使用用户自定义的比较函数对数组中的值进行排序

10、php文件和目录操作

bash 复制代码
readfile()  //读取文件内容,并返回文件的长度,这个没啥用
file_get_contents('文件路径')  //读取文件,支持本地文件和远程文件url
file_put_contents('文件路径', '内容')  //保存文件
// readfile会自动打印文件内容,
$a = readfile('1.txt');
echo '<br>';
echo $a; //文件长度
// 写入数据    
$a = 'aabbkkdd';
file_put_contents('1.txt', $a); // 没有文件会自动创建
$b = 'ooooo';
file_put_contents('1.txt', $b); // 每次写入新数据都会先清空原文件数据
//读取文件内容
$a = file_get_contents('1.txt');
$a = file_get_contents('http://www.baidu.com/img/flexible/logo/pc/result.png'); 
//直接请求https的网址会报错,需要修改配置:
//1.windows下的PHP,只需要到php.ini中把extension=php_openssl.dll前面的;删掉,重启服务就可以了。
//2.linux下的PHP,就必须安装openssl模块,安装好了以后就可以访问了。
// file_put_contents('1.txt', $a) # 直接将读取的文件输入写入到本地文件中
echo $a;
# 注意:文件读写的内容都是字符串数据格式



fopen

fopen、fread、fwrite、fclose操作读取文件。

resource fopen ( string $文件名, string 模式)

string fread ( resource $操作资源(也就是文件路径), int 读取长度)

bool fclose ( resource $操作资源 )

注:resource 、string、bool表示的是方法的返回值 。

bash 复制代码
//先读取整个文件,再在文件末尾追加内容
// 使用 'r+' 模式,允许读写
$a = fopen('1.txt', 'r+');

// 先读取文件内容
while(!feof($a)) {
    $b = fgets($a);
    echo $b . "<br>";
}

// 此时文件指针在末尾,可以直接写入
$b = fwrite($a, 'aaaaa');
if ($b === false) {
    echo '写入失败';
} else {
    echo "成功写入 {$b} 个字符<br>";
}

fclose($a);


在文件末尾追加而不覆盖原有内容

bash 复制代码
$a = fopen('1.txt', 'a+'); // 追加读写模式,指针在末尾

// 如果想先读取内容,需要将指针移回开头
rewind($a);
while(!feof($a)) {
    $b = fgets($a);
    echo $b . "<br>";
}

// 写入时会自动追加到末尾
$b = fwrite($a, 'aaaaa');
if ($b === false) {
    echo '写入失败';
} else {
    echo "成功写入 {$b} 个字符<br>";
}

fclose($a);

PHP目录处理函数

处理思路:

1.读取某个路径的时候判断是否是文件夹

2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量

3.使用readdir读取一次目录中的文件,目录指针向后偏移一次

4.使用readdir读取到最后,没有可读的文件返回false

5.关闭文件目录

列举当前目录列表

bash 复制代码
$a = dirname(__FILE__);  // php多行注释/* 注释内容 */
echo '<br>';
$b = scandir($a);
var_dump($b);
foreach ($b as $key=>$filename){
    if ($filename == '.' or $filename == '..' ){
    continue;
   }
    echo $filename."<br>";
}
# 判断类型
filetype($a.'\wp');
filetype($a.'\1.txt');

示例:查看C盘下的文件和文件夹,并输出他们的类型

bash 复制代码
<?php
    //设置打开的目录是c盘
    $dir = "C:/phpStudy/PHPTutorial/WWW";
    //判断是否是文件夹,是文件夹
    if (is_dir($dir)) {
       if ($dh = opendir($dir)) {
          //读取到最后返回false,停止循环
          // while中的条件表示:将readdir每次读取的数据赋值给$file,然后比较$file是否等于false,如果等false,那么while循环结束
          while (($file = readdir($dh)) !== false) {
               echo "文件名为: $file : 文件的类型是: " . filetype($dir ."/". $file) 
. "<br />";
           }
           closedir($dh);
       }
   }
?>

PHP创建临时文件

创建临时文件的几个好处:用完后即删除,不需要去维护这个文件的删除状态。

bash 复制代码
<?php
    //创建了一个临时文件
    $handle = tmpfile();
   
    //向里面写入了数据
    $numbytes = fwrite($handle, '写入临时文件');
    
    //关闭临时文件,文件即被删除
    fclose($handle);
    echo  '向临时文件中写入了'.$numbytes . '个字节';
?>
 //windows存储在C:\Users\用户名\AppData\Local\Temp目录中

PHP移动、拷贝和删除文件

bash 复制代码
重命名的函数是: bool rename($旧名,$新名); ,方法的返回结果是布尔值。
这个函数返回一个bool值,将旧的名字改为新的名字。
bash 复制代码
<?php
   //旧文件名
   $filename = '1.txt';
   //新文件名
   $filename2 = $filename . '.txt';
   //修改文件名称
   rename($filename, $filename2);
 //移动文件,比如移动到wp目录下
 //rename($filename, 'wp\\'.$filename2);
?>


bash 复制代码
<?php
   //旧文件名
   $filename = '1.txt';
   //新文件名
   $filename2 = $filename . '.txt';
   //修改文件名称
   //rename($filename, $filename2);
   //移动文件,比如移动到wp目录下
   rename($filename, 'wp\\'.$filename2);
?>


复制文件

bool copy(源文件,目标文件)

功能:将指定路径的源文件,复制一份到目标文件的位置。

bash 复制代码
<?php
   //旧文件名
   $filename = 'copy.txt';
   //新文件名
   $filename2 = $filename . '_new';
   //修改名字。
   copy($filename, $filename2);
?>


删除文件

删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。

bool unlink(指定路径的文件)

bash 复制代码
<?php
   $filename = 'copy.txt';
   if (unlink($filename)) {
       echo  "删除文件成功 $filename!\n";
   } else {
       echo "删除 $filename 失败!\n";
   }
?>



检测文件属性

检测一下xx.txt文件是否存在

bash 复制代码
<?php
    if(file_exists('文件路径')){
       echo '文件已存在';
       exit;
   }
?>

常用文件属性函数

bash 复制代码
bool file_exists ( $指定文件名或者文件路径)
功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径)
功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径)
功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径)
功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径)
功能:是否是文件
bool is_dir ( $指定文件名或者文件路径)
功能:是否是目录
void clearstatcache ( void )   pass它
功能:清除文件的状态缓存

PHP文件路径函数

bash 复制代码
例如:
 1.文件后缀需要取出来
 2.路径需要取出名字不取目录
 3.只需要取出路径名中的目录路径
 4.或者把网址中的各个部份进行解析取得独立值
 5.甚至是自己组成一个url出来
 ... ....
bash 复制代码
函数名 							功能
pathinfo 				返回文件的各个组成部份
basename 				返回文件名
dirname 				文件目录部份
parse_url 				网址拆解成各部份
http_build_query 		生成url 中的query字符串
http_build_url 			生成一个url
bash 复制代码
<?php
    $path_parts = pathinfo('d:/www/index.inc.php');
    echo '文件目录名:'.$path_parts['dirname']."<br />";
    echo '文件全名:'.$path_parts['basename']."<br />";
    echo '文件扩展名:'.$path_parts['extension']."<br />";
    echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; 
?>

PHP文件上传

建议尺寸: file_size(文件大小) < upload_max_filesize < post_max_size < memory_limit

通过php获取webserver相关配置信息的代码

bash 复制代码
<?php
header("Content-Type: text/html; charset=utf-8");  // 在响应头中添加了content-type: 
utf-8,header()是php提供的加工响应头键值对的
$a = $_SERVER['HTTP_HOST'];
$b = $_SERVER['HTTP_USER_AGENT'];
echo $a.'<br>';
echo $b.'<br>';
?>

上传文件步骤

1.系统返回的错误码详解

2.自定义判断是否超出文件大小范围

在开发上传功能时。我们作为开发人员,除了php.ini中规定的上传的最大值外。我们通常还会设定一个值,是业务规定的上传大小限制。

此处的判断文件大小,我们用于限制实际业务中我们想要规定的上传的文件大小。

例:新浪微博或者QQ空间只准单张头像图片2M。而在上传图册的时候又可以超过2M来上传。所以说,它的系统是支持更大文件上传的。

3.判断后缀名和mime类型是否符合

bash 复制代码
常见的MIME类型
   超文本标记语言文本 .html,.html text/html
   普通文本 .txt text/plain
   RTF文本 .rtf application/rtf
   GIF图形 .gif image/gif
   JPEG图形 .ipeg,.jpg image/jpeg
   au声音文件 .au audio/basic
   MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
   RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
   MPEG文件 .mpg,.mpeg video/mpeg
   AVI文件 .avi video/x-msvideo
   GZIP文件 .gz application/x-gzip
   TAR文件 .tar application/x-tar

在判断后缀和MIME类型的时候,我们会用到PHP的一个函数in_array(),该函数传入两个参数。

第一个参数是要判断的值;

第二个参数是范围数组。

我们用这个函数来判断文件的后缀名和mime类型是否在允许的范围内。

4.生成文件名

我们的文件上传成功了,不会让它保存原名。因为,有些人在原名中有敏感关键词会违反我国的相关法律和法规。我们可以采用date()、mt_rand()或者 unique()生成随机的文件名。

5.判断是否是上传文件

文件上传成功时,系统会将上传的临时文件上传到系统的临时目录中。产生一个临时文件。同时会产生临时文件名。我们需要做的事情是将临时文件移动到系统的指定目录中。而移动前不能瞎移动,或者移动错了都是不科学的。移动前我们需要使用相关函数判断上传的文件是不是通过 HTTP POST 上传的,is_uploaded_file()传入一个参数($_FILES中的缓存文件名),is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的,如果文件是通过 HTTP POST 上传的,该函数返回 TRUE。

6.移动临时文件到指定位置

临时文件是真实的临时文件,我们需要将其移动到我们的网站目录下面了。让我们网站目录的数据,其他人可以访问到,我们使用:move_uploaded_file() 。这个函数是将上传文件移动到指定位置,并命

名。

需要传入两个参数:

第一个参数是指定移动的上传文件;

第二个参数是指定的文件夹和名称拼接的字符串。

bash 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <h1>上传文件</h1>
        <form action="chuli.php" method="post" enctype="multipart/form-data">
 
       请选择文件:<input type="file" name="file" /><input type="submit" value="上
传" />
        </form>
</body>
</html>

注意事项:

1.form 表单中的参数method 必须为post。

若为get是无法进行文件上传的

2.enctype须为multipart/form-data

bash 复制代码
<?php
    //取文件信息
    $arr = $_FILES["file"];
    //var_dump($arr);
 // 获取文件扩展名,可以用到pathinfo()函数
    //加限制条件
    //1.文件类型
    //2.文件大小
    //3.保存的文件名不重复
    if(($arr["type"]=="image/jpeg" || $arr["type"]=="image/png" ) && $arr["size"]<10241000 )
   {
        //临时文件的路径
        $arr["tmp_name"];
        //上传的文件存放的位置
        //避免文件重复: 
        //加时间戳.time()加用户名.$uid或者加.date('YmdHis')
        $filename = "./images/".date('YmdHis').$arr["name"]; //注意:要在当前代码文件所在目录下先去创建一个名为images的文件夹
        //保存之前判断该文件是否存在
          if(file_exists($filename))
         {
              echo "该文件已存在";
         }
          else
         {
              //中文名的文件出现问题,所以需要转换编码格式
              $filename = iconv("UTF-8","gb2312",$filename);
              //移动临时文件到上传的文件存放的位置(核心代码)
              //括号里:1.临时文件的路径, 2.存放的路径
              move_uploaded_file($arr["tmp_name"],$filename);
              echo "文件上传成功";
         }
       }
    else
   {
      echo "上传的文件大小或类型不符";
   }
?>

php执行系统命令函数

system('指令')

exec('指令'),这个指令的结果回显不太好,但是指令执行是没问题的。


11、php的错误处理

配置项管理

在php.ini配置文件中。我们可以控制php的错误显示状态。php.ini中有一个专门的配置项:display_errors

这个选项设置是否将错误信息输出到网页,或者对用户隐藏而不显示。在生产上必须要关闭显示错误,开发的时候可以打开方便调试。

这个值的状态为on 或者 off,也可以设值为1 或者0。

display_errors的值设为0或者off则不在页面中显示错误,如果设为1或者on则显示错误信息。

错误级别

bash 复制代码
错误类型 说明
E_ERROR 错误,文件直接中断
E_WARNING 警告,问题比较严重。但是还会继续向下运行
E_NOTICE 提示,有些小问题不会影响到程序。常发生在项目未定义
E_PARSE 编译时语法解析错误。解析错误仅仅由分析器产生。
E_ALL 所有的错误
E_STRICT 启用PHP对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。
E_DEPRECATED 启用后将会对在未来版本中可能无法正常工作的代码给出警告。
bash 复制代码
error最严重,必须要解决。不然程序无法继续向下执行
warning也很重要。但也必须要解决。如果明确的、故意的可以不用处理。
notice 你可以不用管。但是在有些公司,项目标准特别高。在高标准要求的项目中也必须要解决。因为,
notice会影响到PHP的执行效率。通常发生在函数未定义等。
parse错误,是指语法错写错了,必须要解决,代表全部类型的所有错误。
bash 复制代码
1、 在php.ini中error_reporting参数。如若error_reporting参数设置为0。整个PHP引擎发错误均不会
显示、输出、记录。在后面要讲的日志记录中,也不会记录。
如果我们想显示所有错误可以写上:
error_reporting = E_ALL
想要显示所有错误但排除提示,可以将这个参数写为:
error_reporting = E_ALL & ~ E_NOTICE
显示所有错误,但排除提示、兼容性和未来兼容性。可写为:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

2、在有些情况下我们无权限操作php.ini文件,又想要控制error_reporting怎么办呢?在运行的xxxx.php文件中开始处,我们可以使用error_reporting()函数达到目标。

演示代码如下:

bash 复制代码
<?php
    //关闭了所有的错误显示
    error_reporting(0);
    //显示所有错误
    //error_reporting(E_ALL);
    //显示所有错误,但不显示提示
    //error_reporting(E_ALL & ~ E_NOTICE);
?>

错误记录日志

常用的错误消息类型:

bash 复制代码
<?php
    //无法连接到数据库服务器,直接记录到php.ini 中的error_log指定位置
    error_log("无法连接到数据库服务器服务器");
    //可以发送邮件,但是php.ini必须配置过邮件系统
    error_log('可以用邮件报告错误,让运维人员半夜起床干活',1 ,'pig@php.cn');
    //记录在指定的位置
    error_log("我是一个错误哟", 3, "d:/test/my-errors.log");
?>

12、PHP中的正则表达式

定界符

PHP的正则表达示定界符的规定如下:

定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束

bash 复制代码
注:\ 是转义字符,如果在以后正则表达示里面需要匹配/,需要把定界符里面的/ 用转义字符转义一
下,写成 / \/ / ,如果你觉得麻烦,遇到这种需要转义的字符的时候可以把两个正斜线(/ /)定界,
改为其他的定界符(# #)。

正则表达式的使用

bash 复制代码
preg_match ( string $正则 , string $字符串 [, array &$结果] )

功能:根据定界符,比如 正则变量,匹配 正则变量,匹配 正则变量,匹配字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。

bash 复制代码
<?php
    $zz = '/wq/';  //正则表达式写在中间,'/正则表达式/'
    $string = 'ssssswqaaawqaaa';
    if(preg_match($zz, $string, $matches)){
       echo '匹配到了,结果为:';
       var_dump($matches);
   }else{
       echo '没有匹配到';
   }
?>

常用的正则函数

13、反序列化函数

面向对象编程(类)

bash 复制代码
<?php 
header("Content-Type: text/html; charset=utf-8");  // 在响应头中添加了content-type: 
utf-8,header()是php提供的加工响应头键值对的
    class Fruit{
 var $name1 = 'apple';  // 定义 属性
 var $name2 = 'orange';
 
 function chi(){  //定义 方法
 echo '吃水果'.'<br>';
 echo $this->name1.'<br>';
 //...
 }
 function bo(){
 echo '剥皮'.'<br>';
 }
 
 // 特殊方法,魔法\魔术方法, 当某个时机到来时,自动执行
 function __destruct(){  //对象销毁时自动执行的方法 __construct 对象创建时自动
触发
 echo '对象被销毁了'.'<br>';
 }
 
 
 }
 $f = new Fruit();
 //echo $f->name1.'<br>'; // apple
 
 $f->chi();
 
 echo '哈哈'.'<br>';
 
 
 
 
/* 
function add(){
 $f = new Fruit();
  $f->chi();
}
add();
*/
?>

序列化和反序列化

bash 复制代码
//序列化,将其他的数据转换成字符串
$a = array('one', 33, 'two');
var_dump($a); // array(3) { [0]=> string(3) "one" [1]=> int(33) [2]=> string(3) 
"two" }
echo "<br>";  
$b = serialize($a);
var_dump($b);  // string(43) "a:3:{i:0;s:3:"one";i:1;i:33;i:2;s:3:"two";}"
//反序列化 将序列化的字符串还原成原来的数据类型
$c=unserialize($b);
var_dump($c);
//类的序列化
class S{
    var $name = "jaden";
    function __destruct(){
        echo $this->name; 
        //system('ipconfig');
        //echo '<script>alert(123);</script>';
   }
    function chi(){
        echo 'xxxxx';
   }
}
$a = new S();
echo $a->name.'aaaa<br>';
echo $a->chi().'<br>';
$b = serialize($a); // O:1:"S":1:{s:4:"name";s:5:"jaden";}
$c = unserialize($b);

14、php操作mysql

创建表

bash 复制代码
# phpstudy的mysql在:C:\phpStudy\PHPTutorial\MySQL\bin
# 注意下面插入数据的时候,不要插入中文数据!!!,因为php连接mysql的编码没有设置,容易乱码。
create database jaden charset utf8mb4; 
create table  user(id int  NOT NULL AUTO_INCREMENT,username char(20),password 
char(32),reg_time char(36),PRIMARY KEY (`ID`));
insert user(username,password,reg_time) 
values('admin','123456',CURRENT_TIMESTAMP());
insert user(username,password,reg_time) 
values('wulaoban','123456',CURRENT_TIMESTAMP());

查询

bash 复制代码
//连接数据库
$db=mysqli_connect('localhost','root','root','jaden', 3306);  # 默认端口如果就是
3306,那么其实不用写3306
$sql="select * from user where username='wulaoban'";
//$u = 'wulaoban';
//$sql="select * from user where username='$u'";
//执行sql语句
$a=mysqli_query($db,$sql); 
//遍历数据库的查询结果,
while ($row = mysqli_fetch_assoc($a)) {
    //var_dump($row);
 echo "用户名:".$row['username'].",密码:".$row['password'];
 echo "<br>";
}
mysqli_close($db);

插入数据

bash 复制代码
$db=mysqli_connect('localhost','root','root','jaden');
$sql="insert user(username,password) values('laowang2','111111')";
$a=mysqli_query($db,$sql);
//echo $a.'<br>';
if (!$a){
 echo "sql语句语法问题";
}else {
 echo "sql语句执行成功!";
}
mysqli_close($db);

15、cookie和session

登录认证。

只使用cookie

bash 复制代码
location.href='login.php';
#设置cookie
setcookie('user','admin');
#读取cookie
$_COOKIE['user'];

cookie结合session

bash 复制代码
验证的地方:
session_start();
isset($_SESSION['user'])
登录成功设置:
session_start();
$_SESSION['user']=$u;
$_SESSION['login_time']=time();
$_SESSION['d']='123';
$_SESSION['login_status']=1;
      
// session存放位置:在php.ini配置文件中可以找到,session.save_path
相关推荐
曹牧4 小时前
内部服务错误500
服务器·开发语言
while(1){yan}4 小时前
HTTP的数据报格式
java·开发语言·网络·网络协议·http·青少年编程·面试
wuguan_4 小时前
C#之List数组
开发语言·c#·list
Blasit5 小时前
Qt C++ 编译 libevent静态库
开发语言·c++·qt
白完就是肥5 小时前
QT编程之TCP编程
开发语言·qt·tcp/ip
宵时待雨5 小时前
C语言笔记归纳19:动态内存管理
java·开发语言·算法
weixin_307779135 小时前
Jenkins Pipeline共享库(Shared Library)完全指南
运维·开发语言·自动化·jenkins·etl
翼龙云_cloud5 小时前
腾讯云云渠道商:如何利用镜像实现跨云平台迁移?
运维·服务器·云计算·php·腾讯云
weixin_307779135 小时前
Jenkins Font Awesome API插件:现代化插件界面的图标引擎
开发语言·前端·自动化·jenkins