全称:Hypertext Preprocesser,超文本预处理器.
PHP是一种后端语言,后端语言就是做动态交互的,HTML+CSS+JS就是做静态页面的,其中JS也算编程语言.
很多网站的后端都是PHP开发的,比如百度,51CTO学堂等等.
如果网页上,有和用户做一些数据上的交互,比如来到你的网站注册一些个人信息,比如注册账户,其实就是给后端发送一个数据,然后在数据库里面保存.
只要涉及到在前端页面动态展示一些数据库里面的数据(如不同的人来到你的页面展示的数据可能不同),也就是数据会发生变化,就会涉及到前端和后端的数据交互.
PHP作用:生成HTML文档.
PHP代码是可以写在HTML文件里面的.
PHP代码可能会被Windows Defender误杀,可在设置中设置免杀目录.
1. PHP基础语法
<?php
echo "Hello guy!" ;
echo "<br>I miss you";
?>
2. PHP变量
变量:可变化的值
常量:不变的值 ,如圆周率:3.1414…
#PHP中的变量用一个美元符号后面跟变量名来表示,变变量名是区分大小写的.
#定义一个变量,前面不加$符号,那么就是普通字符.
#变量:
$num = 5;
$a = 6;
$b = 3.1415;#这里的3.1415就是变量,和圆周率不一样.而变量是可以重新赋值的,会根据后面赋值的变化而变化.
#定义常量:
#常量的名一般都是大写字母
方式1:define('量名','常量值'); 例如:define('AA','123'); define('website','php中文网');
方式2:const 常量名 = 常量值; 例如:const AA = '123'; const FOO = 'BAR';
方式2不能再if判断中使用,否则会报错.
变量的命名规则:
- 必须有$符.
- 一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或下划线.
- 变量名不能以数字开头.
- 变量名不能出现中文.
- 变量名不能出现非下划线的其他特殊符号.
- 变量名建议使用小写字母.
变量不加符号,单引号,双引号的区别
<?php
$name = 'kobe';
echo $name.'<br>';
echo '最喜欢的NBA球星是'.$name.'<br>'; //变量不加符号,遇到字符串拼接需要加 . 连接
echo '最喜欢的球星是 $name <br>'; //单引号,不解析变量,原样输出
echo "最喜欢的球星是 $name <br>" //双引号,解析变量
?>
显示结果:
小练习:使用前后端交互实现的计算器
编辑前端页面 cal.html
<body>
<div>计算器</div>
<form action="./calc.php" method="get">
数字1<input type="text" name="num1">
数字2<input type="text" name="num2">
<input type="submit">
</form>
</body>
编辑后端页面 calc.php
<body>
<?php
$number1 = $_GET['num1'];
$number2 = $_GET['num2'];
$add = $number1 + $number2;
$jian = $number1 - $number2;
echo "加法计算结果:".$add.'<br>';
echo "减法计算结果: $jian";
?>
</body>
显示页面:
计算结果页面:
3. PHP的数据类型
布尔类型: 0 非0 | false true #判断条件的结果都是布尔值.
整型: 整数 -99999 +99999
浮点型: 小数 -1.9 3.25 3.0005
字符串 ‘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; 前提定义,但是不想赋值的时候可以这样用.
- 查看变量对应值的类型:
- 使用”gettype(传入一个变量var)”来显示变量var的类型; 只会显示类型.
- 使用”var_dump(传入一个变量var)”来显示变量var的类型; 双精度,会显示具体内容.
<?php
$a = 'a';
$aa = 'aa';
$b = 10.1;
$bb = 3;
$c = '你好!';
$d = array('a', 10.1, 3, array('a', 10.1, 3));
// 1.使用gettype
echo "<h2>这里使用了gettype()</h2>";
echo gettype($a)."<br>";
echo gettype($aa)."<br>";
echo gettype($b).'<br>';
echo gettype($bb). "<br>";
echo gettype($c) .'<br>';
echo gettype($d);
// 2. 使用var_dump
echo "<h2>这里使用了var_dump()</h2>";
echo var_dump($a).'<br>';
echo var_dump($aa).'<br>';
echo var_dump($b).'<br>';
echo var_dump($bb).'<br>';
echo var_dump($c).'<br>';
echo var_dump($d).'<br>';
?>
显示结果:
下标索引:
数组的每一个数据都有一个下标索引,如$d = array('a', 10.1, 3, array('a', 10.1, 3));
$d有四个数据,下表索引为:$d[0],$d[1],$d[2],$d[3]通过下标索引可从数组中取值.
//3.下标索引,取出数据
echo $d[0].'<br>';
echo $d[1].'<br>';
echo $d[2].'<br>';
echo $d[3].'<br>';#但echo不能打印数组,因此会报错,需要在子数组中再索引.
echo $d[3][2]; #这里输出结果为3,是子数组的第2个数据.
$f = array(1,2,3,4); //打印1234.
echo $f[0],$f[1],$f[2],$f[3]; //显示结果为1234.
4. PHP运算符
算数运算符
存在优先级,乘除>加减,提升优先级就加括号.
-
- +
- –
- *
- /
- % 取余
- -x 取反
- . 连接符
自增自减
<?php
$a = 10;
$b = 3;
$c = 2;
//自增$a++和++$a
echo $a++.'<br>'; //$a++会先执行逻辑(echo)再+1.因此输出10.
echo $a.'<br>'; //上一行执行完逻辑后(echo),+1,因此输出11.
echo ++$a.'<br>';//++$a会先+1再执行逻辑(echo),继承上一次的结果,即11,因此输出12.
echo $a; //上一行+1后,再执行逻辑(echo),因此输出结果为12.
?>
自减同理.
比较运算符
使用比较运算符的结果为布尔值,true或false.
- 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
- x >= y
- x <= y
赋值运算符
- 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
- x .= y ==>x =x.y
逻辑运算符
- x and y 与, 如果x和y都为true,则返回true.
- x or y 或, 如果x和y至少有一个为true,则返回true.
- x xor y 异或(pass), 如果x和y有且仅有一个为true,则返回true.
- x && y 与, 如果x和y都为true,则返回true.
- x || y 或, 如果x和y至少有一个为true,则返回true.
- !x 非,取反, 如果x不为true,则返回true.
<?php
$a = 10;
$b = 3;
if ($a < 10 && $b >3){
echo 'good';
}else{
echo '不ok';
}
?>
三元运算
也叫三目运算
一句话来完成两个条件的判断
简化了if语句的判断.
<?php
$a = 10;
$b = 3;
$c = 2;
$a > $b? $c='aa':$c='dd';
echo $c;
?>
上述代码输出结果为aa.
$a > $b? $c=’aa’:$c=’dd’;的意思是,先判断$a >$b,判断a的值是否大于等于b的值,如果结果为true,则返回aa;如果结果为false,则返回dd.
5. PHP的控制结构
条件语句 if
//单条件判断
<?php
$a = 10;
$b = 3;
$c = false;
if ($a > $b){
echo "哈哈";
}
echo "<br>完事了"
?>
练习:输出年份对应的生肖
<body>
<form action="/小练习_计算器/shengxiao.php" method="get">
请输入出生年份:
<input type="text" name="birth_date" id="birth_date">
<br><input type="submit" value="提交">
</form>
</body>
<?php
$shengxiao = $_GET['birth_date'];
$yushu = $shengxiao % 12;
if ($yushu == 0){
echo '你属猴';
}else if($yushu == 1){
echo '你属鸡';
}else if($yushu == 2){
echo '你属狗';
}else if($yushu == 3){
echo '你属猪';
}else if($yushu == 4){
echo '你属鼠';
}else if($yushu == 5){
echo '你属牛';
}else if($yushu == 6){
echo '你属虎';
}else if($yushu == 7){
echo '你属兔';
}else if($yushu = 8){
echo '你属龙';
}else if($yushu == 9){
echo '你属蛇';
}else if($yushu == 10){
echo '你属马';
}else if($yushu == 11){
echo '你属羊';
}
?>
循环语句 while,do while,for
while
无限循环,未添加任何条件限制
<!-- 无限循环 -->
<?php
$a = 0;
while (true){
echo 'haha'.'<br>';
}
可以通过控制条件来进行有限次数循环
$a = 0;
while ($a < 10 ){
$a++;
echo $a.'haha'.'<br>';
}
以上述代码为例,$a的初始值为0,$a++为每次循环自增1,即$a从0开始自增1后打印,因此第一次循环打印1,然后回去再次进行判定,如果满足条件打印结果后回去继续判定条件,直到$a不小于10,当$a=10时,不满足($a<10)的条件,打印结果并停止循环.
练习:展示表格,通过while循环,实现用户想要展示多少条数据就展示几条.
前端部分:
<div>展示表格</div>
<form action="./展示表格.php" method="get">
输入数量: <input type="text" name="num"> <br>
姓名: <input type="text" name="xingming"><br>
年龄: <input type="text" name="nianling"><br>
<input type="submit" value="确认">
</form>
后端PHP部分:
<div>
<div style="text-align: center;">表格展示</div>
<table border="1">
<thead>
<tr>
<th>学号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<?php
$number = $_GET['num'];
$mm = $_GET['xingming'];
$nl = $_GET['nianling'];
$num2 = 0;
while ($num2 < $number ){
$num2++;
echo "<tr>
<th> $num2 </th>
<th> $mm </th>
<th> $nl</th>
</tr>";
}
?>
</tbody>
</table>
</div>
输入相应内容展示结果:(输入了4,苍老师,18岁)
do while
do while 和 while的不同点
while:如果条件一开始就不成立,那么循环一次都不执行.
do while 先do后看条件,如果成立则继续循环,不成立则跳出循环.
do while至少会执行一次循环体,即使条件不满足.
<?php
$i = 0;
do {
echo $i;
}while ($i > 0);
?>
for
for循环也叫有限循环.
<?php
for ($a=1; $a<5; $a++){
echo "$a </br>";
}
?>
输出结果为:
以上述代码为例描述for循环的执行过程:先进行条件判断,$a=1满足条件,输出结果,然后再进行$a++,$a=2满足条件,输出结果,然后进行$a++ … … 直到$a不满足条件,当$a=5时,不满足条件,后面的循环不再进行,跳出循环,因此打印了4次结果.
foreach
主要用来做数组遍历的.
for也能做数组遍历.
##使用foreach遍历数组:array('cang','ikun','heizi')
<div>
<div>表格</div>
<table border="1">
<thead>
<tr>
<th>学号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<?php
$d = array('cang','ikun','heizi');
foreach ($d as $xx){
echo "<tr><th>$xx</th><th></th><th></th></tr>";
}
?>
</tbody>
</table>
</div>
输出结果为:
array(‘cang’,’ikun’,’heizi’)中一共有三个数据,使用foreach($d as $xx)的执行过程为:从$d中取出数据,第一次取出’cang’并赋值给$xx,然后进行第二次循环,第二次循环取出’ikun’然后赋值给$xx,第三次同理.
补充,数组是由索引的,比如上述的数组的索引为0,1,2.可以通过$key => $xx来取出索引和数据.
$key =>$xx中, $key是索引的下标,$xx是数组中的数据,$key和$xx可以用任意变量来赋值.
<?php
$d = array('cang','ikun','heizi');
foreach ($d as $f => $xx){
echo "<tr><th>$f kokok[\/. $xx</th><th></th><th></th></tr>";
}
?>
输出结果:
补充:使用for循环来遍历数组:
$d = array('cang','ikun','heizi');
for ($a = 0;$a < 3;$a++){
echo "<tr><th>$d[$a]</th><th></th><th></th></tr>";
}
?>
使用for循环来遍历数组的原理是:使用$a的值充当数组的索引,$a经过三次循环,取值分别是1,2,3.
使用$d[$a]来从数组中取出数据.分别是$d[1],$d[2],$d[3].
但是使用for循环来进行数组遍历仅限于数组的索引值是0,1,2,3,4,5 … … 这样的有序数字的时候使用
而有时候,数组是可以指定索引的,也就是说数组的索引不一定是有序的数字,因此for循环进行数组遍历具有局限性.
比如下面代码的情况:
使用for循环非有序数组索引的数组:
<?php
$d = array('xx'=>'cang','kk'=>'ikun','jj'=>'heizi');
for ($a = 0;$a < 3;$a++){
echo "<tr><th>$d[$a]</th><th></th><th></th></tr>";
}
?>
结果报错:
使用foreach遍历非有序数字的数组:
<?php
$d = array('xx'=>'cang','kk'=>'ikun','jj'=>'heizi');
foreach ($d as $k => $oo){
echo "<tr><th>$k $oo</th><th></th><th></th></tr>";
}
?>
结果正常:
break;
break是一个控制流程的关键字
在循环语句中使用break来立即退出循环并执行下一个语句.
这种情况通常用于在循环中查找某个特定的条件,一旦找到就退循环.
在嵌套循环中使用break只会终止当前循环,不会终止外部循环.如果想终止外部循环,可以给外层定义一个标识变量,然后再内部循环中使用break终止内部循环,并设置标识变量为true.
exit;
exit是php语言中的函数,用于终止当前脚本的执行.并可以选择性地输出一条消息
其语法为exit(string $message); //参数$message是可选的,用于终止当前脚本前指定输出内容.如果不选择内容则会立即终止脚本的执行.
需要注意的时,exit函数和die函数是等价的,die是exit函数的别名.再某些情况下,过度使用exit或die函数可能会导致代码难以调试和维护,建议谨慎使用.
6. PHP函数(内置函数)
语法
<?php
header("Content-type: text/html;charset=utf-8");
echo "do an addition";
//函数声明,提前定义两个形式参数(形参):$a,$b
function add($a,$b){
$c = $a + $b;
echo '<br>'.'加法计算的结果为: '.$c;
}
//如果未调用函数,则函数无法执行,要使用函数,就需要调用函数.
add (3,4);
echo '<br>'.'end';
//写法2:
function add($a, $b){
$c = $a + $b;
return $c;
}
//调用函数:
$ret = add(3,4);
echo '<br>'.加法计算的结果为: '.$ret;
//写法3:
function add($a, $b){
$a=2;
$b=3;
$c = $a + $b;
echo '<br>'.加法计算的结果为: '.$c;
}
add(2,3);
echo '<br>'.'end';
?>
文件包含
当前文件内引入其他PHP文件,HTML文件或文本文件等,一般用于包含公共方法,公共页面等,例如header footer sider等网页通用部分.
常用的文件包含函数:include()和require()
两者除了处理错误的方式不同,其他方面都是相同的,因此:
- 如果你希望被包含文件是必须的且缺少文件会导致脚本无法正常运行,应使用require()—–推荐
- 如果你希望被包含文件是可选的,即使缺少文件也希望继续执行脚本,可以使用include().
include()
写法:
<?php
include('aa/xxx.php');
include 'aa/xxx.php';
?>
include()函数用于在执行期间包含并运行指定的文件.这个文件可以是PHP文件,也可以是其他类型文件如HTML,CSS等.
包含失败则返回一条警告
特点:如果引入出错,文件会继续向下执行,通常用于动态包含.
<?php
$user = 'xxx';
//引用函数
include('hanshu.php');
$ret = add(5,6);
echo '<br>'.$ret.'<br>';
echo $name.'hello world'.'<br>';
echo PWD.'常量'.'<br>';
?>
被调用的php文件(内含函数代码):
//函数声明,提前定义两个形式参数(形参):$a,$b
function add($a,$b){
$c = $a + $b;
return $c;
}
$ret = add(2,3);
$name = 'cang';
const PWD = '12334';
?>
require
require() 函数也是用于包含并允许指定文件.
include()类似,但require()在文件不存在时会抛出致命错误,而include() 只会产生警告.
抛出致命错误后不会继续向下执行代码.程序中断,通常用于包含及其重要的文件,整个代码甭想执行.
可以通过设置include_path来指定文件路径.
<?php
$user = 'xxx';
//引用函数
require('hanshu.php');
$ret = add(5,6);
echo '<br>'.$ret.'<br>';
echo $name.'hello world'.'<br>';
echo PWD.'常量'.'<br>';
?>
上述代码执行结果和include()函数一致.
include_once()
include_once与include() 函数类似,主要区别在于include_once确保指定文件只被包含一次,即使在脚本中有多个地方尝试包含同一个文件,也能避免重复包含,从而防止函数重定义和变量重新赋值等问题.
//示例:
include_once "xxx.php"
使用场景:
当脚本执行期间有可能多次包含同一个文件时,确保文件只被包含一次,避免重复执行和潜在的问题.
加载包含函数和类定义的外部文件,拓展脚本的功能.
提高性能,避免重复包含相同文件而导致执行重复代码.
工作原理:
include_once会检查指定文件是否存在,如果文件不存在,则将其包含在当前脚本中.如果文件已存在,include_once会检查该文件是否被包含过.如果已包含,则不会再次包含,从而避免了代码重复.
如果包含的文件不存在,include_once会返回false.如果尝试再次包含同一个不存在的文件,include_once会返回true,因为PHP认为该文件已经被包含过一次(即使他不存在).
require_once()
require_once(pass) 用于在脚本执行期间包含并运行指定的文件.他与require的功能类似,唯一的区别是require_once会检查文件是否已经被包含过,如果已经被包含,则不会再次包含,以避免重复包含文件导致致命的错误,如函数重定义或变量重新赋值等问题.
require_once('xxx.php')
与 include_once 的区别
require_once 与 include_once 函数的作用相似,但它们在错误处理方面有所不同:
如果 filename 找不到,include_once 会产生警告,但不会中断脚本执行。
如果 filename 找不到,require_once 会导致致命错误,中断脚本执行。
注意:
- 始终使用绝对路径,以避免意外包含错误的文件。
- 谨慎使用 require_once,特别是包含较大型或复杂的文件时,因为它可能会影响脚本的性能。
数字常用函数
数学常用函数有很多,多看看官方文档.PHP Math官方文档
下面是常用的数学函数.
函数名 | 作用 | 示例 | 补充 |
abs() | 求绝对值 | $abs abs(-4.2);//4.2 | 输入数字,输出绝对值数字 |
ceil() | 进一取整法 | echo ceil(9.001);//10 | 输入浮点数,输出进一取整 |
floor() | 舍去法取整 | echo floor(9.999); //10 | 输入浮点数,输出舍去小数部分 |
fmod() | 浮点数取余 | "$x = 5.7; $y = 1.3; $r = fmod($x,$y); //r equals 0.5,because 4*1.6 + 0.5 = 5.7" | 输入两个浮点数,x>y,输出浮点余数 |
pow() | 返回数的n次方 | echo pow(-1,20); //1 | 输入基础数的n次方,输出乘方值 |
round() | 浮点数四舍五入 | echo round(1.95583,2); //1.96 | 输入一个数值,输出保留小数点后多少位,默认为0,四舍五入后的结果 |
sqrt() | 求平方根 | echo sqrt(9); //3 | 输入被开方数,输出平方根 |
max() min() | 求最大值 最小值 | echo max(1,3,5,6,7); //7 echo max(array(2,4,5)); // | 输入多个数字或数组,返回其中最大值\ 最小值 |
rand() | 取随机数 | echo rand(1,100); | 输入多个数字或数组,输出返回随机数 |
<?php
//abs绝对值.
$num1 = 100;
$num2 =-15;
$num3 = 11.111;
$num4 = 11.9999;
$num2_abs = abs($num2);
echo $num2.'的绝对值为:'.$num2_abs.'<br>';
//ceil进一取整和floor退一取证法
$num3_ceil = ceil($num3);
$num4_ceil = ceil($num4);
echo $num3.'的进一取整值为'.$num3_ceil.'<br>';
echo $num4.'的进一取整值为'.$num3_ceil.'<br>';
$num3_floor = floor($num3);
$num4_floor = floor($num4);
echo $num3.'的退一取整值为'.$num3_floor.'<br>';
echo $num4.'的退一取整值为'.$num4_floor.'<br>';
//四舍五入法,保留小数点后多少位,默认为0,输出四舍五入后的结果
$num3_round = round($num3,3);
$num4_round = round($num4,1);
echo $num3.'的四舍五入结果,保留小数点后1位结果为'.$num3_round.'<br>';
echo $num4.'的四舍五入结果,保留小数点后3位结果为'.$num4_round.'<br>';
//取最大值和最小值
$max_num = max($num2,$num3,$num4);
$min_num = min($num2,$num3,$num4);
echo "$num2,$num3,$num4 中的最大值为:$max_num<br>";
echo "$num2,$num3,$num4 中的最小值为:$min_num<br>";
//取随机数
$rand_num = rand();
echo $rand_num;
?>
字符串常用函数
字符串函数官方文档:PHP String官方文档
下面是常用的String常用函数
函数名 | 作用 | 语法 | 补充 |
trim() | 移除字符串两侧的空白字符和其他字符 | trim(string,charlist); | charlist可选,规定要从字符串中删除哪些字符,如果为空,则移除以下所有字符:”\0″ — NULL,”\t” — 制表符,”\n” — 换行,”\x0B” — 垂直制表符,”\r” — 回车,” ” — 空格 |
rtrim() | 移除字符串右侧的空白字符和其他字符 | 同上 | 同上 |
ltrim() | 移除字符串左侧的空白字符和其他字符 | 同上 | 同上 |
dirname() | 返回路径中的目录部分 | dirname(path); | path必需,规定要检查的路径.返回的结果不包含文件名称 |
str_split() | 将字符串按规定长度分割成数组 | str_split(string,length) | length可选,规定每个数组元素的长度,默认为1,如果length小于1,则返回false,如果length长度大于当前字符串的长度,则整个字符串将作为数组的唯一元素返回。数组不能使用echo输出,可以用var_dump或print_r输出. |
explode() | 把字符串打散为数组。”separator” 参数不能是空字符串。该函数是二进制安全的。 | explode(separator,string,limit) | limit可选,规定所返回的数组元素的数目。可能的值:大于 0 :返回包含最多 limit 个元素的数组,小于 0:返回包含除了最后的 -limit 个元素以外的所有元素的数组,0 :返回包含一个元素的数组 |
strrev() | 反转字符串 | strrev(string) | string必要,指定要反转的字符串 |
strtolower() | 字符串转为小写 | strtolower(string) | |
strtoupper() | 字符串转为大写 | strtoupper(string) | |
addslashes(); | 返回在指定字符前添加反斜杠的字符串 | addslashes(string,characters) | string 必须,规定要转义的字符串. characters 必须,规定要转义的字符或字符范围. |
chr(); | 从指定的 ASCII 值返回字符 | chr(ascii) | 参数ascii 必须,指定ASCII值.chr() 函数从指定的 ASCII 值返回字符。ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置 0,而十六进制值被定义为带前置 0x。 |
ord(); | 返回字符串的首个字符的 ASCII 值 | ord(string) | string必须,要从中获得ASCII值的字符串 |
substr(); | 截取字符串 | substr(string,start,length) | string必需。规定要返回其中一部分的字符串。 start必需。规定在字符串的何处开始。正数: 在字符串的指定位置开始;负数:在从字符串结尾开始的指定位置开始,0:在字符串中的第一个字符处开始。 length可选。规定被返回字符串的长度。默认是直到字符串的结尾。正数:从 start 参数所在的位置返回的长度,负数:从字符串末端返回的长度。 如果 start 参数是负数且 length 小于或等于 start,则 length 为 0 |
str_replace(); | 字符串替换操作,区分大小写 | str_replace(find,replace,string,count) | find必需。规定要查找的值。 replace必需。规定替换 find 中的值的值。 string必需。规定被搜索的字符串。 count可选。对替换数进行计数的变量。 |
str_repeat(); | |||
md5(); | 字符串md5编码,对字符串进行加密 | md5(string,raw) | string必需。规定要计算的字符串。 raw可选。规定十六进制或二进制输出格式:TRUE – 原始 16 字符二进制格式,FALSE – 默认。32 字符十六进制数。 |
parse_str(); | 将字符串解析成多个变量 | parse_str(string,$array) | string必须,规定要解析的字符串 array可选,规定存储变量的数组名称,该参数表示变量将变存储到数组中。 如果未设置array参数,则由该函数设置的变量将覆盖已存在的同名变量。php.ini文件中的magic_quotes_gpc 设置影响该函数的输出,如果已启用,那么在parse_str()解析之前,变量会被addslashes()转换。 |
parse_url(); | 解释url成为一个数组 | ||
htmlentities(); | 把html标签转化为普通文本如<h1>,<span>等 | echo htmlentities(string); | 使用htmlentities不指定编码的话会中文乱码. |
trim();
$a = " canglaoshi ";
$a = trim($a); //如果不添加trim函数,返回结果带空格,添加后返回结果不带空格.
if ($a == 'canglaoshi'){
echo '用户名正确';
}else{
echo "用户名错误!";
}
dirname();
echo __FILE__; //输出本文件的绝对路径,包括文件名:C:\Users\Administrator\phpcodes\函数\字符串.php
echo dirname(__FILE__); //输出本文件的路径,不包括文件名:C:\Users\Administrator\phpcodes\函数
$file_path = 'C:\Users\Administrator\phpcodes\函数\字符串.php';//定义文件路径.
echo dirname($file_path);//输出本文件的路径,不包括文件名:C:\Users\Administrator\phpcodes\函数
str_split();
<?php
$a = 'hello canglaoshi';
$b = str_split($a); //未指定length,默认分割长度为1,即每个字符都分割.
echo $b; //报错,因为echo不能输出数组.
print_t($b); //使用print_t输出数组,结果清晰整洁.
var_dump($b); //使用var_dump可输出数组,结果详细.
?>
指定分割长度length:
<?php
$a = 'hello canglaoshi';
$b = str_split($a,6); //指定length为6,即6每个字符进行分割,最后长度不足6的为一组.
echo $b; //报错,因为echo不能输出数组.
print_r($b);
var_dump($b);
?>
explode();
$c = 'hello.canglaoshi.nihaoa'
$e = explode(".",$c);
print_r($e);
strrev()
//反转字符串:strrev():
//反转字母
$aa = "hello world";
$bb = strrev($aa);
echo '反转前:'.$aa;echo '<br>';
echo '反转后:'.$bb;echo '<br>';
//反转数字
$cc = "1234";
$dd = strrev($cc);
echo '反转前:'.$cc;echo '<br>';
echo '反转后:'.$dd.'<br>';
//反转中文字符串
//乱码,需要使用别的方法进行中文反转.比如分割数组然后重新拼接.
$ee = "你好世界!";
$ff = strrev($ee);
echo '反转前:'.$ee;echo '<br>';
print_r($ff);'反转后:'.$ff.'<br>';
ASCII对照表
时间日期函数
中国的时区在东八区,时间相关函数:date(); getdate(); time();等等.
想要获取当前北京时间,需要配置时区,否则会输出世界默认事件UTC,北京时间为:UTC+8
查看当前时区的方法为:
<?php
$time_zone = date_default_timezone_get();
echo $time_zone
?>
//输出结果为:UTC
配置时区的两种方法:
1.在PHP.ini文件中配置时区为:Asia/Shanghai,然后需要重启PHP服务以生效.
2.在当前php文件中设置时区:
date_default_timezone_set("Asia/Shanghai");
格式化字符 | 含义 | 例如 |
Y | 四位数的年份 | 2024 |
m | 两位数的月份 | 01 |
d | 两位数的日期 | 31 |
H | 24小时制的小时 | 23 |
i | 分钟 | 59 |
s | 秒 | 59 |
a | 小写的上午或下午值 | am或pm |
A | 大写的上午或下午值 | AM或PM |
l | 星期几的完整文本格式 | Sunday |
D | 星期几的缩写文本格式 | Sun |
F | 月份的完整文本格式 | December |
M | 月份的缩写文本格式 | Dec |
w | 数字表示星期几 | 0(星期日) 到 6(星期六) |
z | 一年中的第几天 | 0 到 365 |
t | 指定月份的天数 | 28 到 31 |
L | 是否为闰年 | 1为闰年, 0为平年 |
o | ISO-8601格式年份数字 | 与Y相同,但考虑到ISO星期数可能属于前一年或下一年 |
T | 本机所在时区 | EST或MDT |
Z | 时差偏移量的秒数 | UTC西边的时区偏移量总是负的, UTC东边的时区偏移量总是正的 |
date();
<?php
date_default_timezone_set("Asia/Shanghai");
echo date('Y-M-d H:i:s a l')
?>
//输出的结果为:2024-11-24 10:39:39 am Sunday
time();
含义:返回当前的 Unix 时间戳
时间戳:返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
Unix 时间戳不包含任何有关本地时区的信息。建议使用 DateTimeImmutable 类来处理日期和时间信息, 以避免 Unix 时间戳带来的陷阱。
echo '当前的时间戳是'.time();
//是一串数字,如:1732416661
//这串数字是:从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
getdate();
作用:获取当前的时间的一个数组表示,
应用:通过索引输出对应的值,比如:
获取当前的时间的一个数组表示
print_r(getdate());echo '<br>';
//getdate写法1:
echo (getdate())['hours'].'<br>';
//getdate写法2
$a = getdate();
echo $a['hours'].'<br>';
也可以获取指定日期的相应内容:
//获取指定日期的一个属组
$aa = getdate(1732417633);
echo "年: ".$aa['year'].'<br>';
echo "月: ".$aa['mon'].'<br>';
echo "日: ".$aa['mday'].'<br>';
echo "小时: ".$aa['hours'].'<br>';
echo "分: ".$aa['minutes'].'<br>';
echo "秒: ".$aa['seconds'].'<br>';
echo "一个小时中的第几分钟: ".$aa['minutes'].'<br>';
echo "这是一分钟的第几秒: ".$aa['seconds'].'<br>';
echo "星期名称: ".$aa['weekday'].'<br>';
echo "月份名称: ".$aa['month'].'<br>';
echo "时间戳: ".$aa[0].'<br>';
数组常用函数
主要是数组元素的增删查改操作.
下面是一个数组简单示例,实现用户登陆认证.
<body>
<h1 style="text-align: center; background: aqua;">请登录</h1>
<form action="/函数/数组登录认证示例.php" method="get">
<div style="text-align: center;background: burlywood;">
用户名:<input type="text" name="uname" id=""><br>
密码: <input type="password" name="passwd"><br>
<input type="submit" value="走起!" id="anniu" style="background-color: brown;">
</div>
</form>
</body>
<body>
<?php
$a = array('admin'=>'aaa','cang'=>'333','ikun' => '555');
// $aa = $a['uname'].'<br>';
$b = $_GET['uname'];
$c = $_GET['passwd'];
foreach($a as $d => $e ){
if ($b == $d and $c == $e){
echo "恭喜 $b,欢迎来到这里!" ;
exit;
}
}
echo "sorry! $b, u got a wrong password!"
?>
</body>
上述代码实现了用户登录的账号密码验证
文件基本操作
file_put_contents();
file_put_file(‘文件路径’,’要写入的内容’);
将数据写入文件,如果文件内由内容,会把文件内容清空然后再写入内容.
如果文件不存在,则会自动创建一个新文件并写入内容.
如果是文件名,则会在当前目录下创建该文件,也可以指定绝对路径,在指定的路径下创建文件.如:C:\Users\Administrator\phpcodes\1.txt
还支持网址路径.
<?php
$a = file_put_contents('1.txt','hello');
echo $a.'<br>';
$a = file_put_contents('1.txt','world');
echo $a.'<br>';
?>
file_get_contents();
读取文件内容.
- 直接请求https的网址会报错,需要修改配置.
- 1.Windows下的PHP,只需要到拍php.ini文件中配置extension=php_opensll.dll前面的 ; 去掉,重启服务就可以了,如果还出现报错,则需要查看一下extension_dir的路径是否正确,如果不正确或者不完整,则把ext文件的绝对路径粘贴上去.
- 2.Linux下则需要安装openssl模块,安装好以后就可以访问.
使用file_put_contents和file_get_contents
获取网站内容
$a = file_get_contents('https://image.thepaper.cn/www/image/47/182/282.jpg');
echo file_put_contents('xxx.png',$a);
?>
readfile();
读取文件内容.输出内容长度
成功时返回从文件中内容和字节数, 或者在失败时返回 false
.
$a = readfile('1.txt');
echo '<br>'.$a;
fopen();
fopen,fread,fwrite,fclose 操作读取文件
resource fopen(string $文件名,string模式)
string fread (resource $操作资源(也就是文件路径),int 读取长度)
bool fclose (resource $操作资源)
注:resource,string,bool 表示的是方法的返回值.
- fopen的模式有下面几个:
- r 只读方式打开,文件指针指向文件头.
- r+ 读写方式打开,将文件指针指向文件头
- w 写入方式打开,将文件指针指向文件头并将文件大小截为零.如果文件不存在则尝试创建.
- w+ 读写方式打开,将文件指针指向文件头并将文件大小截为零.如果文件不存在则尝试创建.
- a 写入方式打开,将文件指针指向文件尾.如果文件不存在则尝试创建,称之为追加.
- x 创建并以写入方式打开,文件指针指向文件头.如果文件已存在,则fopen()调用失败,并返回false,并生成一条E_WARNING级别的错误信息.如果文件不存在则尝试创建.
- x+ 创建并以读写方式打开,将文件指针指向文件头.如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING基本错误信息.如果文件不存在则尝试创建.
r,r+w,a常用.
fread();
作用:读取文件(可安全用于二进制文件)。
语法:fread(file,length)
说明:文件指针 file 读取最多 length 个字节。该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件。
//fread()
$a = fopen('1.txt','r');
echo fread($a,1).'<br>';
//读取文件,设置读取字节数length,lenth定义了读取的字节数,一个字母或数字为1字节,一个中文字为3字节,如读取数不足将会出现乱码
fgets()
#fget()
$b = fgets($a);//获取完整文件内容
echo $b.'<br>';//输出1.txt第一行文件内容
fwrite()
作用:写入文件
语法:fwrite(file,string,length)
说明:fwrite() 把 string 的内容写入文件指针 file 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,具体看先碰到哪种情况。
// fwrite()
$aaa = fopen('1.txt','r+');
echo fwrite($aaa,'nihao i add datas by fwrite & fopen').'<br>';//输出结果为数字,告诉你写入了多少字节的数据.
fclose()
作用:关闭一个打开文件
语法:fclose(file);
说明:如果成功则返回 true,否则返回 false。文件指针必须有效,并且是通过 fopen() 或 fsockopen() 成功打开的。
//fclose()
$aa = fopen('1.txt','r');
echo fclose($aa).'<br>';//如果成功则返回 true,否则返回 false
目录基本操作
- 处理文件夹的基本思想如下:
- 1.读取某个路径的时候判断是否是文件夹.
- 2.是文件夹的话,打开指定文件夹.
- 3.使用readdir读取一次目录的文件,目录指针向后偏移一次.
- 4.使用readdir读取到最后,没有可读的文件返回false.
- 5.关闭文件目录.
常用的文件目录函数
函数名 | 功能 |
scandir | 列出指定路径中的文件和目录 |
opendir | 打开文件夹,返回操作源 |
readdir | 读取文件夹资源 |
is_dir | 判断是否是文件夹 |
closedir | 关闭文件夹操作资源 |
filetype | 显示是文件夹还是文件,文件显示file,文件夹显示dir |
展示当前文件所在文件夹里有什么文件:
<?php
//查看当前文件所在目录,绝对路径
$a = __FILE__;
//echo $a.'<br>';
//获取当前文件的上级目录名称
$b = dirname($a);
//echo $b.'<br>';
//查看当前文件所在文件夹里面有什么文件,使用var_dump输出数组
$c = (scandir($b));
//echo var_dump($c);
//展示当前文件所在文件夹里面的文件,使用foreach
foreach($c as $k => $filename){
echo $filename.'<br>';
}
?>
如果不想显示 . 和 ..
则使用if条件判断:
<?php
//查看当前文件所在目录,绝对路径
$a = __FILE__;
//获取当前文件的上级目录名称
$b = dirname($a);
//查看当前文件所在文件夹里面有什么文件
$c = (scandir($b));
//展示当前文件所在文件夹里面的文件,使用foreach
foreach($c as $k => $filename){
if($filename == '.' or $filename == '..'){
continue;
}else{
echo $filename.'<br>';
}
?>
如果要展示文件是文件夹, 使用is_dir
<?php
//查看当前文件所在目录,绝对路径
$a = __FILE__;
//获取当前文件的上级目录名称
$b = dirname($a);
//查看当前文件所在文件夹里面有什么文件
$c = (scandir($b));
//展示当前文件所在文件夹里面的文件,使用foreach
foreach($c as $k => $filename){
if($filename == '.' or $filename == '..'){
continue;
//单斜杠有特殊含义,因此加斜杠时要用双斜杠.
}if(is_dir($b.'\\'.$filename)){
echo 'dir:'.$filename.'<br>';
}else{
echo 'file:'.$filename.'<br>';
}
给输出来的文件加图标.
<?php
//查看当前文件所在目录,绝对路径
$a = __FILE__;
// echo $a.'<br>';
//获取当前文件的上级目录名称
$b = dirname($a);
//echo $b.'<br>';
//查看当前文件所在文件夹里面有什么文件,使用var_dump输出数组
$c = (scandir($b));
//echo var_dump($c).'<br>';
//展示当前文件所在文件夹里面的文件,使用foreach
foreach($c as $k => $filename){
if($filename == '.' or $filename == '..'){
continue;
}if(is_dir($b.'\\'.$filename)){
echo "<img src='https://kkimgs.yisou.com/path/to/a.jpg' style='width:30px;height:30px;'>"."<a href='#'>$filename</a>".'<br>';
}else{
echo "<img src='path/to/b/jpg' style='width:30px;height:30px;'>"."<a href='#'>$filename</a>".'<br>';
}
}
?>
创建临时文件
tmpfile();
<?php
//创建一个临时文件,并写入数据
$a = tmpfile();
//写入数据
$b = fwrite($a,'aaaa');
//设置文件自动删除时间
sleep(60);
// 关闭临时文件,文件即被删除
fclose($a);
echo '向文件中写入了'.$b.'字节的数据';
?>
临时文件默认保存在C:\Users\ADMINI~1\AppData\Local\Temp
可通过phpinfo()查看当前临时文件存放配置.可修改存放位置.
文件移动和重命名
- 获取文件的绝对路径 (__FILE__)
- 获取文件的当前目录 dirname(__FILE__)
- 重命名rename();
- 使用if条件语句判断是否重命名成功并返回结果(成功或失败)
//获取文件当前所在目录
$a = dirname(__FILE__);
//重命名当前目录的某个文件
$ret = rename($a.'\\重命名1.txt', $a.'\\重命名2.txt');
if($ret){
echo '文件:'.'重命名1.txt重命名为重命名2.txt,成功';
}else{
'文件:重命名1.txt,重命名失败';
}
上述是对当前目录下文件的文件重命名,同样也可以使用rename移动文件,指定目录即可.
//获取文件当前所在目录
$a = dirname(__FILE__);
//获取当前目录的上一级目录
$b = dirname($a);
$ret = rename($a.'\\重命名2.txt', $b.'\\重命名2.txt');
if($ret){
echo '文件移动成功';
}else{
'文件:移动失败';
}
上述是移动当前目录下的文件,同样也可以移动指定文件到指定目录:
//移动指定文件到指定目录
$ret = rename('C:\\Users\\Administrator\\phpcodes\\重命名 2.txt','C:\\Users\\Administrator\\phpcodes\\函数\\重命名2.txt');
if($ret){
echo 'successed';
}else{
echo 'failed';
}
上述代码将文件从phpcodes目录移动到了函数目录.
复制文件和删除文件
函数:copy();
在当前文件的上级目录有一个copy1.txt文件,把他复制到当前目录下:
<?php
$a = dirname(__FILE__);//获取当前目录路径
$b = dirname($a);//获取上一级目录路径
echo $a;
echo '<br>';
echo $b;
copy($b.'\\copy1.txt',$b.'\\函数\\copy2.txt')//复制文件.
?>
函数:unlink();
删除文件就是将指定路径下的一个文件删除,会直接将文件删除,windows系统下回收站也看不到这个文件.
<?php
//把上一级目录下的copy1.txt文件删除
$a = dirname(__FILE__);
$b = dirname($a);
echo $a;
echo '<br>';
echo $b;
//删除文件
$d = unlink($b.'\\copy1.txt') ;
//使用if条件语句输出是否删除成功.
if($d){
echo 'succeed';
}else{
echo 'failed';
}
?>
查看回收站,发现看不见被删文件.
检测文件属性
- file_exist(‘文件路径’):用于检测文件是否存在.返回布尔值
- is_readable(‘文件路径’):是否可读,返回布尔值
- is_writebable(),是否可写,返回布尔值
- is_executable(),是否可执行,返回布尔值
- is_file(),是否是文件,返回布尔值
- is_dir(),是否是目录,返回布尔值
- clearstatcache() 清除文件的状态缓存,返回void.
PHP文件权限设置
chmod,用于在linux系统中修改文件权限.
- 读写执行:
- r:读,4
- w:写,2
- x:执行,1
- u:用户
- g:用户组
- o:其他
<?php
//修改:/var/www/html/mycodes 的文件权限为755
chmod("/var/www/html/mycodes",755);
chmod("/var/www/html/mycodes","u+rwx,go+rx);
chmod("/var/www/html/mycodes",0755);
?>
PHP文件路径函数
- 问题:
- 如何取出文件后缀
- 如何取出路径中的名字而不取目录
- 只需要取出路径中的目录路径
- 把网址中的各个部分取出进行解析,取得独立值
- 把自己组成一个url出来
- … …
路径处理函数有很多:
pathinfo() | 返回文件的各个组成部分 |
basename() | 返回文件名 |
dirname() | 文件目录部分 |
parse_url() | 网址拆解成各部分 |
http_build_query() | 生成url中的query字符串 |
http_build_url() | 生成一个url |
pathinfo();
pathinfo函数的输出结果是数组,需要使用var_dump来输出结果.
<?php
$a = dirname(__FILE__);
$b = pathinfo($a.'\\copy2.txt');
var_dump($b);
?>
可以使用echo来输出键对应的值:
<?php
$a = dirname(__FILE__);
$b = pathinfo($a.'\\copy2.txt');
$c = var_dump($b);
echo '文件的目录为:'.$b['dirname'].'<br />';
echo '文件的文件全名为:'.$b['basename'].'<br />';
echo '文件的后缀为:'.$b['extension'].'<br />';
echo '文件的文件名,不含后缀为:'.$b['filename'].'<br />';
?>
文件上传
php.ini相关配置
配置php.ini文件,如:
- file_uploads:开启文件上传,on为开启,off为关闭.
- upload_tmp_size,临时文件存放目录,
- post_max_size,最大POST传参大小,默认为8M,暂时改为200M.
- upload_max_filesize:上传文件最大值,默认为2M,暂时改为100M.
- memory_limit:内存使用限制,一般设值要比post_max_size和upload_max_filesize大一些,这里设置为256M.
- max_execution_time:脚本执行时间,小文件传输得快一般使用系统默认值即可30-60s;如果文件过大,传输时间过长则需要修改这一项的参数.如果设置参数为0,则是不限制超时时间.
完成php.ini配置需要重启服务:
- apache重启:使用cmd或linux命令重启.
- nginx重启:使用cmd或linux命令重启.
- windows重启:使用了vscode的内置服务器插件则重启vscode即可.
可通过phpinfo()函数查看所有配置项.
php获取webserver相关配置信息
在phpinfo中展示了当前PHP环境的所有配置,同时也可以通过相关命令来提取或调用相关的配置信息.
如:
<?php
var_dump($_SERVER);
echo '<br>'.$_SERVER['HTTP_HOST'].'<br>';
echo $_SERVER['HTTP_USER_AGENT'];
$a = $_SERVER['SERVER_NAME'].'<br>';
echo $a.'<br>';
echo $_SERVER['DOCUMENT_ROOT'].'<br>';
echo dirname(__FILE__).'<br>';
?>
文件上传过程
html:
<div>上传文件</div>
<div>
<!-- 加入enctype="multipart/form-data"参数才能实现文件提交和上传,实现大文件分块发送.如百度网盘的上传进度条就这这么实现的. -->
<form action="./文件上传.php" method="post" enctype="multipart/form-data">
上传头像: <input type="file" name="img_tx" value="头像"><br>
<input type="submit" value="submit">
</form>
</div>
html表单中:
使用post方法来提交表单数据:method = “post”.
使用enctype属性来对上传数据进行分段:enctype = “mutipart/form-data”数据会以多段形式呈现,段与段之间会使用指定的随机字符串分隔.
<?php
$a = dirname(__FILE__);
//获取文件或图片都是使用$_FILES
$f = $_FILES['img_tx'];
//文件也是个数组:文件的各种描述信息
var_dump($f).'<br>';
//文件上传过程中会以临时文件保存在系统的临时文件目录下,命令会结束执行,结束执行后会立即删除该临时文件.因此可以使用sleep函数设置临时文件的保留时间,等保留时间到了再自动删除.
sleep(15);
echo $f['tmp_name'].'<br>';
//在移动上传的文件之前,应该先检查文件是否是通过POST上传的合法文件.使用is_uoloaded_file
if(is_uploaded_file($f['tmp_name'])){
//为了保证目录存在,可以再嵌套一个if语句来判断文件夹存不存在.
if(file_exists($a.'\\uploads2')){
//为了更好的保存文件,可以将文件移动到指定的文件夹进行保存.
move_uploaded_file($f['tmp_name'],$a.'\\uploads2\\'.$f['name']);
echo "1.文件夹已存在,可直接保存";
echo '2.文件'.$f['name'].'合法';
echo "3.文件". $f['name'] ."已保存在指定目录";
exit;
}else{
//文件夹不存在,创建一个文件夹
mkdir($a.'\\uploads2');
echo "1.文件夹不存在,立即创建文件夹!";
move_uploaded_file($f['tmp_name'],$a.'\\uploads2\\'.$f['name']);
echo '2.文件'.$f['name'].'合法';
echo "3.文件"."\"".$f['name']."\""."已保存在指定目录";
}
}else{
echo 'failed,illegal file!';
}
?>
$_FILE:用于储存通过HTTP POST方法上传到服务器的文件信息.这是一个数组,包含了上传文件的各种属性,如文件名,文件类型,大小,临时文件名以及上传过程可能出现的错误代码等.
上传文件错误码
$_FILES[‘myFILE’][‘error’]字段包含了上传过程中可能出现的错误代码,这些代码及其含义如下:
- UPLOAD_ERR_OK(0): 没有发生错误,文件上传成功.
- UPLOAD_ERR_INI_SIZE(1): 上传文件超过了php.ini中upload_max_filesize选项限制的值.
- UPLOAD_ERR_FORM_SIZE(2): 上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值.
- UPLOAD_ERR_PARTIAL(3): 文件只有部分被上传.
- UPLOAD_ERR_NO_FILE(4): 没有文件被上传.
- UPLOAD_ERR_NO_TMP_DIR(6): 找不到文件夹.
- UPLOAD_ERR_CANT_WRITE(7):文件写入失败.
使用sleep函数: 文件上传过程中会以临时文件保存在系统的临时文件目录下,命令会结束执行,结束执行后会立即删除该临时文件.因此可以使用sleep函数设置临时文件的保留时间,等保留时间到了再自动删除.
is_uploaded_file(): 用于判断文件是否通过HTTP POST方法上传的. 上传文件之前,为了确保安全,避免上传恶意文件,可以使用is_uploaded_file来判断文件是否合法,合法才上传,否则返回文件不合法,上传失败.
file_exist():用于判断文件或者目录是否存在. 再文件保存之前,可以先判断目标目录是否存在,如果存在则可以将缓存的文件移动保存到目标目录,如果不存在,则创建目标目录,再进行移动保存.
move_uploaded_file(): 移动保存文件到目标目录.move_uploaded_file(“目标文件”,”目标目录”),注意路径中不能使用一个斜杠”\”,因为单斜杠在编码中具有特殊含义,因此需要再加一个斜杠”\”来进行转义.
$t:添加一个时间戳,由于在文件保存时可能会出现文件名重复的情况,如果出现重名,原来的文件会被后来的同名文件覆盖,导致数据丢失.因此,在文件名前添加一个时间戳,可以避免文件名重复.如上述代码中移动文件时顺便给文件重命名:
//移动文件顺便重命名,添加一个时间戳.
$t = time();
move_uploaded_file($f['tmp_name'],$a.'\\uploads2\\'.$t.$f['name']);
文件上传存在漏洞,容易被黑客上传恶意软件入侵服务器,因此需要做更加安全的限制.
上传文件中文乱码
保存文件名如果是中文,如果没有进行相关配置,可能会出现中文名乱码.
由于WINDOWS系统的文件默认用的是GBK编码,后台使用的文件编码格式是UTF-8的,当文件上传到后端以后,会以UTF-8的格式保存在服务器中,如果服务器不是UTF-8的编码格式则会出现乱码的情况.比如服务器是WINDOWS系统.因此需要在文件保存时进行编码转换.而如果时是使用utf-8编码的系统则不会出现乱码问题,如LINUX内核的系统.
//使用iconv进行编码转换:
$name = $f['name'];
$new_name = iconv('utf-8','gbk',$name)
move_uploaded_file($f['tmp_name',$a.'\\uploads2'.$t.$new_name]);
上传文件大小/类型限制
以上传头像为例,不仅要上传图片的文件大小,同时也要限制文件的类型.
限制上传文件大小:
- 编辑html页面,action=”指定php文件”,使用post方法,使用enctype=’mutipart/form-data’
- 后端部分使用$_FILE获取文件
- 使用条件语句对文件的大小($ff_size = $ff[‘size’])进行限制判断
- 不符合条件则直接退出程序,复合条件则使用move_uploaded_file()对文件进行移动保存.
<?php
$ff = $_FILES['img_xz'];//获取前端页面post方法上传的文件.
// var_dump($ff);
$ff_size = $ff['size'];//获取上传文件的大小
//判断文件是否大于30k.
if($ff_size > 30000){
echo "文件大于30k,文件过大,上传失败";
exit;
}
$aa = dirname(__FILE__);//获取当前目录.
$tt = time();//获取时间戳
//保存文件到指定文件夹,重命名文件防止文件名重复.
move_uploaded_file($ff['tmp_name'],$aa.'\\uploads\\'.$tt.$ff['name']);
echo '文件上传成功';
?>
限制上传文件类型:
上述代码进行了文件大小的限制,在此基础上在进行文件类型的限制.
- 给出一个数组:$f_type = array(‘image/jpeg’,’image/png’,’image/gif’);里面包含的文件类型作为判断依据,上传文件的文件类型符合数组中给定的文件类型为true
- 使用foreach或in_array进行数组遍历
- foreach($f_type as $tt => $xx )
- in_array($ff[‘type’],$f_type)
使用foreach():
<?php
$ff = $_FILES['img_xz'];
// var_dump($ff);
$ff_size = $ff['size'];
if($ff_size > 300000){
echo "文件大于30k,文件过大,上传失败";
exit;
}
$aa = dirname(__FILE__);
$tt = time();//获取时间戳
$f_type = array('image/jpeg','image/png','image/gif');
foreach($f_type as $tt => $xx ){
if($xx == $ff['type']){
move_uploaded_file($ff['tmp_name'],$aa.'\\uploads\\'.$tt.$ff['name']);
echo '文件上传成功';
}else{
echo '文件类型不是'.$f_type[0].'或'.$f_type[1].'或'.$f_type[2];
exit;
}
}
?>
使用in_array()
if(in_array($ff['type'],$f_type) ){
move_uploaded_file($ff['tmp_name'],$aa.'\\uploads\\'.$tt.$ff['name']);
echo '文件上传成功';
}else{
echo '文件类型不是'.$f_type[0].'或'.$f_type[1].'或'.$f_type[2];
exit;
}
PHP执行系统命令函数
语法:
system(‘指令’);
exec(‘指令’),这个指令的结果回显不太好,但是指令执行是没有问题的.
仅执行文件,没有返回结果
- PHP执行系统命令过程:
- php脚本包含系统命令代码
- 后端执行代码指令
- 返回前端
使用exec或system执行windows系统指令,ipconfig
//执行windows系统指令,ipconfig
$a = exec('ipconfig');
$b = system('ipconfig');
echo $a.'<br>';
echo $b.'<br>';
使用exec或system,创建文件夹
//执行windows系统指令,创建文件夹
$c = exec('md xxx');
$c = system('md xxx1');
使用exec或system,创建文件并写入内容
//使用exec或system,创建文件并写入内容
exec('echo 111 > ./xxx1/222.txt');
system('echo 111 > ./xxx1/333.txt')
//仅执行文件,没有返回结果.
PHP错误处理
很多时候,如果代码写的不好,那么很容易报错.如果遇到错误,就应该想办法捕获这个错误并且记录下来,而且不要让用户看到.否则容易暴露服务端的一些隐私信息.记录错误方便后续修改.
配置项管理
在php.ini文件中,可以控制php的错误显示状态选项来控制是否将错误信息输出到网页.
display_errors:用于控制是否将错误信息输出到网页的控制项.默认为on开启,如果修改配置,需重启服务器以重载配置.
错误级别
错误类型 | 说明 |
E_ERROR | 错误,文件直接中断 |
E_WARNING | 警告,问题比较严重.但是还会继续向下执行. |
E_NOTICE | 提示,有些小问题不会影响到程序.常发生在未定义项 |
E_PARSE | 编译时语法解析错误.解析错误仅仅由分析器产生. |
E_ALL | 所有的错误 |
E_STRICT | 启用PHP对代码的修改建议,以确保代码具备最佳的互操作性和向前兼容性. |
E_DEPRECATED | 启用后将会对在未来版本中可能无法正常工作的代码给出警告. |
PHP中的正则表达式
正则表达式是可以运用在任何语言里面的
正则表达式,主要用在以下一些地方:匹配邮箱,手机号码,验证码,替换敏感词等.
许多常用的正则表达式可以在网上一搜就有,不用自己手写.
PHP提供了许多正则表达式的函数
界定符:
PHP的正则表达式界定符的规定如下:
界定符不能用a-zA-Z0-9\ 其他都可以用.必须成对出现,有开始的地方就有结束.
例子 | 说明 |
/中间写正则/ | 正确 |
$中间写正则$ | 正确 |
%中间写正则% | 正确 |
@中间写正则@ | 正确 |
^中间写正则^ | 正确 |
(中间写正则) | 错误 |
A中间写正则A | 错误 |
常用的正则表达式函数有:
函数名 | 功能 |
preg_filter | 执行一个正则表达式搜索和替换 |
preg_grep | 返回匹配模式的数组条目 |
preg_match | 执行一个正则表达式匹配 |
preg_match_all | 执行一个全局正则表达式匹配 |
preg_replace_callback_array | 传入数组,执行一个正则表达式搜索和替换使用回调 |
preg_replace_callback | 执行一个正则表达式搜索并且使用一个回调进行替换 |
preg_replace | 执行一个正则表达式的搜索和替换 |
preg_split | 通过一个正则表达式分隔字符串 |
修饰符
/g | 全局匹配,替换所有匹配项,不加/g则最多只会匹配一个 |
/i | 不区分大小写匹配 |
/m | 多行匹配,影响^和$符号的行为 |
/s | 单行模式匹配 |
/e | 可执行模式,$replacement 字符串会被当做PHP代码执行(注意:这可能带来安全风险,应谨慎使用) |
/x | 忽略空白模式 |
示例:
preg_match
<?php
$a = 'hello world,hello World';
$reg = '/wo/i';
$ret = preg_match_all($reg,$a,$res);
echo $reg.'<br>';
var_dump($res)
?>
preg_match函数用于执行正则表达式匹配,它尝试在字符串中搜索与给定正则表达式模式相匹配的内容。以下是对$ret = preg_match( $reg, $a, $res);这一行代码的详细解释:
- $reg:这是正则表达式的模式,用于定义要搜索的匹配规则。例如,
/wo/i
将匹配字符串中的”wo”,并且i
标志表示不区分大小写。 - $a:这是要进行搜索的字符串,即目标字符串。正则表达式模式将在这个字符串中查找匹配。
- $res:这是一个数组,用于存储匹配结果,如果匹配成功,$res数组将被填充。$res将包含与整个模式匹配的文本,$res将包含第一个捕获的子模式所匹配的文本,以此类推。
- $ret:这是preg_match函数的返回值。如果匹配成功,$ret将是一个非零值,表示匹配的次数(通常是1,因为preg_match在找到第一个匹配后停止搜索)。如果没有匹配,$ret将是0。如果发生错误,$ret将是FALSE。
preg_replace
preg_replace是一个在PHP中广泛使用的函数,他用于执行正则表达式的搜索和替换操作.这个函数非常强大,因为他允许开发者根据复杂的模式匹配和替换字符串中的文本.
基本语法:
- $pattern: 要搜索的正则表达式模式
- $replacement: 用于替换匹配内容的字符串
- $subject: 要进行匹配和替换操作的目标字符串
- $limit: 可选参数,指定最多替换次数,如果省略或者设置为-1,则替换所有匹配项
- $count: 可选参数,如果提供了这个参数,preg_replace将会替换的次数存入这个变量中
preg_replace示例:
搜索和替换字符串中的特定字符
//搜索和替换字符串中的特定字符
$a = 'hello ikun world'; //这是要进行搜索和替换的目标字符串
$reg = '/ikun/'; //这是要搜索的正则表达式模式
$ret =preg_replace($reg,'akunnn',$a); //'akunn'是用于替换匹配内容的字符串.
echo $ret.'<br>'; //输出搜索和替换后的结果.
echo $a.'<br>'; //输出$a
var_dump($ret); //输出$ret数组.
输出结果为:
<?php
$str = 'hello#world#';//这是目标字符串
$pattern = '/#/'; //这是要被替换的字符串
$replacment = '_'; //这是用于替换匹配内容的字符串
$ret = preg_replace($pattern,$replacment,$str);
echo $ret.'<br>';
var_dump($ret)
?>
输出结果为:
替换字符串中的多个可选字符
<?php
$str = 'abcderf'; //这是目标字符串
$replacment = '1'; //这是用于替换匹配内容的字符串
$pattern = '$[abc]$'; //这是要被替换的字符串
$ret = preg_replace($pattern,$replacment,$str);
echo $ret.'<br>';
var_dump($ret);
?>
输出结果为:
替换字符串中的邮箱地址
<?php
$str = '我的邮箱地址是:123456789@example.com';
$pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}/';
$replacment = '***';
$ret = preg_replace($pattern,$replacment,$str);
echo 'my email address is: '.$ret;
?>
- [A-Za-z0-9._%+-]: 匹配电子邮件地址的用户名部分,支持A-Z的所有字母,支持a-z的所有字母,支持0-9的所有数字,支持_%+-四种符号.即支持所有数字和大小写字母以及_%=-四种符号.
- [A-Za-z0-9.-]: 匹配电子邮件地址的域名部分,可以包含大小写字母、数字和点号(.)以及减号(-).
- [A-Za-z]{2,}: 匹配电子邮件地址的顶级域名部分,至少包含两个字母,可以包含大小写字母, 如“com”、“net”、“org”等。
- [A-Za-z]{2,7}: 匹配电子邮件地址的顶级域名部分,可以包含大小写字母,长度在2到7个字符之间。
输出结果为:
k
666
123