【网络安全 --- PHP基础】学网安PHP语言所涉及到的知识,来看看吧,看着一篇文章就够了,建议收藏学习!!!

本文主要是介绍【网络安全 --- PHP基础】学网安PHP语言所涉及到的知识,来看看吧,看着一篇文章就够了,建议收藏学习!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

五,PHP

1,变量和常量

#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判断中。

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

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

3,php的数据类型

◾布尔类型 00 |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的类型;  会显示具体内容打印array:$a = array(1,2,3);print_r($a);

4,php 运算符

4-1 算数运算符

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

image-20231019195934736

4-2 自增自减

image-20230719114224996

4-3 比较运算符

image-20230719114259055

image-20230719114313699

4-4 赋值运算符

image-20230719114401720

4-5 逻辑运算符

image-20230719114450348

4-6 三元运算

<?php$x = true;$x ? $y = 5 : $y = 6;//输出5echo  $y;
?>

5 PHP流程控制

5-1 if

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

5-2 else

<?php
header("Content-Type: text/html; charset=utf-8");
$user = $_POST["username"];
$pass = $_POST["password"];
if ($user =='admin' and $pass =='123456' ){echo "登录成功";
}else {echo "登录失败";
}
?>

5-3 elseif/else if

<?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%薪资";
}
?>

5-4 while

<?php
$i = 1;
while ($i <= 10) {$i++;echo '哈哈'.$i.'次'; 
}
?>

5-5 do…while

<?php
$i = 0;
do {echo $i;
} while ($i > 0);
?>

5-6 for

#$i=1初始值,$i<=10 条件,$i++每次加1
for ($i = 1; $i <= 10; $i++) {echo $i;
}

5-7 foreach

# 属组的索引默认是从0开始的数字,也可以自行指定索引
$cars=array("特等奖"=>"布加迪","一等奖"=>"捷豹" ,"二等奖"=>"法拉利" ,"三等奖"=>"玛莎拉
蒂");
foreach ($cars as $key => $value) {echo "<tr><td>$key</td><td>$value</td></tr>";
}

5-8 break

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

5-9 continue

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

5-10 switch

$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;default: // 条件都不成立时执行echo '原来啥也不是';break;  
}

6,php函数

//不支持传参的函数
function welcom(){echo "欢迎光临!";
}
//调用函数
welcom();
<?php
header("Content-Type: text/html; charset=utf-8");  // 在响应头中添加了content-type: 
utf-8header()是php提供的加工响应头键值对的
echo '做一下加法计算!'.'<br>';
// 函数声明,提前定义了两个形式参数:$a, $b
function add($a, $b){//$a = 2;//$b = 3;$c = $a + $b;echo '加法计算结果为:'.$c.'<br>';}
// 函数调用: 3,4实际参数
add(3,4);echo '计算结束..'.'<br>';
?>
//返回值
// 函数声明,提前定义了两个形式参数:$a, $b
function add($a, $b){//$a = 2;//$b = 3;$c = $a + $b;// echo '加法计算结果为:'.$c.'<br>';return $c;}
// 函数调用: 3,4实际参数
$ret = add(3,4);
echo $ret.'<br>';echo '计算结束..'.'<br>';

7,内置函数

7-1 文件包含的函数

image-20230719120313350

7-2 数学常用函数

image-20231019200202236

image-20230719120411244

image-20230719120428733

image-20231019200245186

7-3 字符串常用函数

echo FILE; 打印当前文件的绝对路径。下面函数大家学习一下我标着 *** 的即可

echo __FiLE__.'</br>';  // D:\ruanjian\phpstudy_pro\WWW\index.php
echo dirname(__FILE__).'</br>';  // D:\ruanjian\phpstudy_pro\WWW

image-20231019200401521

image-20230719120614106

image-20231019200451561

image-20230719120656034

image-20230719120709032

image-20231019200606891

image-20230719120746315

image-20230719120815013

image-20231019200707929

image-20230719120851953

image-20230719120908134

7-4 时间日期函数

// 时区的报错,修改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>";
?>

7-5 数组常用函数

主要是数组元素的增删改查操作。

<?php
header("Content-Type: text/html; charset=utf-8");  // 在响应头中添加了content-type: 
utf-8header()是php提供的加工响应头键值对的
$a = array('aa', 'bb', 33, 55);
echo $a[0].'<br>';
echo var_dump($a).'<br>';
$a[5] = 'kk';
echo var_dump($a).'<br>';
$a[1] = 'cc';
echo var_dump($a).'<br>';
//unset()删除
unset($a[1]);
echo var_dump($a).'<br>';
?>

image-20231019200759155

image-20230719121131589

image-20230719121147519

image-20231019200821758

8,php文件和目录操作

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;
# 注意:文件读写的内容都是字符串数据格式。

8-1 fopen

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

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

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

bool fclose ( resource $操作资源 )

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

image-20231019200842620

$a = fopen('1.txt', 'r')
#$b = fread($a,18);
$b = fgets($a);
echo $b."<br>";
while(!feof($a)){  // !feof($a)表示如果读到文件最后了。$b = fgets($a);echo $b."<br>";
} 
$b = fwrite($a, 'aaaaa'); //失败返回false,成功就返回写入的字符个数
echo $b."<br>";
if ($b == false){  // r模式打开的文件不能写入,r+模式可以写,但是会从文件内容开头覆盖原有内容echo '写入失败';
}
#fclose($a);

9,目录处理

1.读取某个路径的时候判断是否是文件夹
2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量
3.使用readdir读取一次目录中的文件,目录指针向后偏移一次
4.使用readdir读取到最后,没有可读的文件返回false
5.关闭文件目录

image-20230719220157272

例如:列举当前目录列表

$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');

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

<?php//设置打开的目录是D盘$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);}}
?>

10.PHP创建临时文件

我们之前创建的文件都是永久文件。

而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处:用完后即删除,不需要去维护这个文件的删除状态。

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

11,PHP拷贝,移动,删除文件

11-1 重命名

我们日常在处理文件的时候,可以删除文件、重命名文件也可以也可复制文件。

我们先来说重命名,重命名的函数是: bool rename( 旧名 , 旧名, 旧名,新名); ,方法的返回结果是布尔值。这个函数返回一个bool值,将旧的名字改为新的名字。

<?php//旧文件名$filename = 'test.txt';//新文件名$filename2 = $filename . '.xx';//修改文件名称rename($filename, $filename2);//移动文件,比如移动到xx目录下rename($filename, '\\xx\\'.$filename2);
?>

11-2 复制文件

复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。 bool copy(源文件,目标文件)功能:将指定路径的源文件,复制一份到目标文件的位置。

我们来通过实验和代码来玩玩:

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

11-3 删除文件

删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。你只会发现,这个文件消失了。 bool unlink(指定路径的文件)

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

12,文件属性操作

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

<?phpif(file_exists('文件路径')){echo '文件已存在';exit;}
?>

常用文件属性操作

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

13,PHP文件权限设置

chmod 主要是修改文件的的权限。主要是针对linux系统的,这个我们前面学过,就不多说了。

<?php//修改linux 系统/var/wwwroot/某文件权限为755chmod("/var/wwwroot/index.html", 755);  chmod("/var/wwwroot/index.html", "u+rwx,go+rx"); chmod("/somedir/somefile", 0755); 
?>

权限说明(r-读,w-写,x执行,d-表示文件夹,u-当前用户,g-当前用户所在组,o-其他用户)

image-20230720114811478

14,PHP文件路径函数

我们经常会遇到处理文件路径的情况。

例如:1.文件后缀需要取出来2.路径需要取出名字不取目录3.只需要取出路径名中的目录路径4.或者把网址中的各个部份进行解析取得独立值5.甚至是自己组成一个url出来... ....

很多地方都需要用路径处理类的函数。

我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:

image-20231019201032238

示例,记住示例中的几个即可

<?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 />"; 
?>

15,PHP文件上传

在web常见漏洞中有一个文件上传的漏洞,后面我们会讲到。

在我们日常使用中经常会遇到很多种这样的情况:

文件上传需要注意php.ini这个配置文件,这个文件我们在phpstudy中就能看到

打开文件位置,找到php.ini文件,并打开

image-20230720115815562

只有 file_uploads = on 时,php才能支持上传文件

phpinfo()函数,也可以看到这些配置信息。

15-1 配置项:

image-20230720115841176

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

另外,需要注意的是脚本执行时间,max_execution_time配置,这个参数的单位为秒。它是设定脚本的最大执行时间。也可以根据需求做适当的改变。通常不需要来修改,系统默认值即可。超大文件上传的时候,可能会涉及到这一项参数的修改。上传时间太长了,会超时。如果你将此项参数设为0,则是不限制超时时间,不建议使用,文件太大了,想别的方式处理,一般会分块传输 。

完成了php.ini的相关配置,我们就可以开始试着完成第一次文件上传了。别忘了重启服务。

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

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

15-3 上传文件步骤

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

image-20230720121551769

image-20230720121605716

注:错误码中没有5。

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

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

例如:

## 新浪微博或者QQ空间只准单张头像图片2M。而在上传图册的时候又可以超过2M来上传。
## 所以说,它的系统是支持更大文件上传的。
## 此处的判断文件大小,我们用于限制实际业务中我们想要规定的上传的文件大小。
15-3- 3.判断后缀名和mime类型是否符合

在网络世界里面也有坏人。他们会把图片插入病毒,在附件中上传病毒,他们会在网页中插入病毒或者黄色图片。

我们需要对于上传的文件后缀和mime类型都要进行判断才可以

/*百度解释:MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。通俗解释: 有兴趣看一看其实MIME更像是一种协议。首先,我们要了解浏览器是如何处理内容的。在浏览器中显示的内容有 HTML、有 XML、有 GIF、还有Flash ……那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME Type,也就是该资源的媒体类型。媒体类型通常是通过 HTTP 协议,由 Web 服务器告知浏览器的,更准确地说,是通过 ContentType 来表示的,例如:Content-Type: text/HTML,表示内容是 text/HTML 类型,也就是超文本文件。为什么是“text/HTML”而不是“HTML/text”或者别的什么?MIME Type 不是个人指定的,是经过 ietf 组织协商,以 RFC 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范 (顺便说一句,Email 附件的类型也是通过MIME Type 指定的)。通常只有一些在互联网上获得广泛应用的格式才会获得一个 MIME Type,如果是某个客户端自己定义的格式,一般只能以 application/x- 开头。XHTML 正是一个获得广泛应用的格式,因此,在 RFC 3236 中,说明了 XHTML 格式文件的 MIME Type 应该是 application/xHTML+XML。当然,处理本地的文件,在没有人告诉浏览器某个文件的 MIME Type 的情况下,浏览器也会做一些默认的处理,这可能和你在操作系统中给文件配置的 MIME Type 有关。比如在 Windows 下,打开注册表的“HKEY_LOCAL_MACHINESOFTWAREClassesMIMEDatabaseContent Type”主键,你可以看到所有 MIME Type 的配置信息。在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中例如,假设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vnd.ms-excel”。在大多数实际情况中,这个文件然后将传送给Execl来处理(假设我们设定Execl为处理特殊MIME类型的应用程序)。在ASP中,设定MIME类型的方法是通过Response对象的ContentType属性。多媒体文件格式MIME最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。MIME意为多目Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
常见的MIME类型超文本标记语言文本 .html,.html text/html普通文本 .txt text/plainRTF文本 .rtf application/rtfGIF图形 .gif image/gifJPEG图形 .ipeg,.jpg image/jpegau声音文件 .au audio/basicMIDI音乐文件 mid,.midi audio/midi,audio/x-midiRealAudio音乐文件 .ra, .ram audio/x-pn-realaudioMPEG文件 .mpg,.mpeg video/mpegAVI文件 .avi video/x-msvideoGZIP文件 .gz application/x-gzipTAR文件 .tar application/x-tarInternet中有一个专门组织IANA来确认标准的MIME类型,但Internet发展的太快,很多应用程序等不及IANA来确认他们使用的MIME类型为标准类型。因此他们使用在类别中以x-开头的方法标识这个类别还没有成为标准,例如:x-gzip,x-tar等。事实上这些类型运用的很广泛,已经成为了事实标准。只要客户机和服务器共同承认这个MIME类型,即使它是不标准的类型也没有关系,客户程序就能根据MIME类型,采用具体的处理手段来处理数据。而Web服务器和浏览器(包括操作系统)中,缺省都设置了标准的和常见的MIME类型,只有对于不常见的 MIME类型,才需要同时设置服务器和客户浏览器,以进行识别。由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉客户程序数据的MIME类型。服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如 对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。Content-type: text/html注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。官方的 MIME 信息是由 Internet Engineering Task Force (IETF) 在下面的文档中提供的:RFC-822 Standard for ARPA Internet text messagesRFC-2045 MIME Part 1: Format of Internet Message BodiesRFC-2046 MIME Part 2: Media TypesRFC-2047 MIME Part 3: Header Extensions for Non-ASCII TextRFC-2048 MIME Part 4: Registration ProceduresRFC-2049 MIME Part 5: Conformance Criteria and Examples
不同的应用程序支持不同的 MIME 类型。*/
15-3-4.生成文件名
我们的文件上传成功了,不会让它保存原名。因为,有些人在原名中有敏感关键词会违反我国的相关法律和法规。我们可以采用date()、mt_rand()或者unique()生成随机的文件名。
15-3-5.判断是否是上传文件
文件上传成功时,系统会将上传的临时文件上传到系统的临时目录中。产生一个临时文件。同时会产生临时文件名。我们需要做的事情是将临时文件移动到系统的指定目录中。而移动前不能瞎移动,或者移动错了都是不科学的。移动前我们需要使用相关函数判断上传的文件是不是通过 HTTP POST 上传的,is_uploaded_file()传入一个参数($_FILES中的缓存文件名),is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的,如果文件是通过 HTTP POST 上传的,该函数返回 TRUE。
15-3-6.移动临时文件到指定位置
临时文件是真实的临时文件,我们需要将其移动到我们的网站目录下面了。让我们网站目录的数据,其他人可以访问到,我们使用: move_uploaded_file() 。这个函数是将上传文件移动到指定位置,并命名。需要传入两个参数:第一个参数是指定移动的上传文件;第二个参数是指定的文件夹和名称拼接的字符串。大致步骤

image-20230720123043628

15-3-7 php 文件上传表单注意事项

代码示例

创建index.html文件,内容如下


<!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

再创建一个php文件,比如叫做chuli.php

<?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 "上传的文件大小或类型不符";}
?>

16,PHP执行系统命令函数

system
exec

17 PHP的错误处理

17-1 配置项管理

在php.ini配置文件中。我们可以控制php的错误显示状态。php.ini中有一个专门的配置项:**<u>display_errors</u>**这个选项设置是否将错误信息输出到网页,或者对用户隐藏而不显示。这个值的状态为on 或者 off,也可以设值为1 或者0。display_errors的值设为0或者off则不在页面中显示错误,如果设为1或者on则显示错误信息。**问题:如果没有修改服务器****php.ini****的状态权限怎么办?**那么可以使用ini_set方法来进行设置。
<?phpini_set('display_errors' , 0 ); 
?>
上面的代码也相当于修改了php.ini中display_errors的值。不过,仅仅在当前php代码中生效。

问题:想取得php.ini的配置项状态怎么办?

可以使用ini_get(参数项) 得到参数的值。

演示例子:

<?phpecho '服务器中display_errors的状态为' . ini_get('display_errors');
?>
注:如果我们修改完php.ini文件中的配置,想让配置生效的话,需要在修改完php.ini文件后重启服务器。

17-2 错误级别

image-20230720132950784

image-20230720133003282

我们介绍一下其中几种:

error  ## 最严重,必须要解决。不然程序无法继续向下执行
warning  ## 也很重要。但也必须要解决。如果明确的、故意的可以不用处理。
notice ## 你可以不用管。但是在有些公司,项目标准特别高。在高标准要求的项目中也必须要解决。因为,
notice ## 会影响到PHP的执行效率。通常发生在函数未定义等。
parse  ## 错误,是指语法错写错了,必须要解决,代表全部类型的所有错误。
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_DEPRECATED2、在有些情况下我们无权限操作php.ini文件,又想要控制error_reporting怎么办呢?在运行的xxxx.php文件中开始处,我们可以使用error_reporting()函数达到目标。

演示代码如下:

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

17-3 错误记录日志

在一些公司里面,有专门的日志收集系统。日志收集系统会在背后默默的帮你收集错误、警告、提示。也有些公司没有专门的日志收集系统,通过文件来服务器当中的运行日志。其中:PHP的错误,警告这些是必须要收信的。那么问题来了——不让用户看到,设置好错误报告级别好,如何将错误收集到日志系统中呢?这里有需要使用到php.ini的相关配置项。这两个配置项为

image-20230720134448830

说明:1.在表格中的log_errors和log_errors_max_len非常好理解。2.而error_log 指定将错误存在什么路径上。配置项中的syslog可能有点不太好理解。syslog是指系统来记录。windows系统在电脑的日志收集器里面。linux默认在: /etc/syslog.conf[扩展] 了解知识点。若Linux系统启动或修改了日志收集。可能存储在第三方专用的日志收集服务器中。此外,PHP还为我们专门准备了一个自定义的错误日志函数:bool error_log ( string $错误消息 [, int $错误消息类型 = 0 [, string $存储目标]] )这个函数可以把错误信息发送到web服务器的错误日志,或者到一个文件里。常用的错误消息类型:

image-20231019201203590

示例:

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

web服务应用程序都有自己的日志文件,比如apache的,在phpstudy的安装路径中可以看到。

一般我们手动搭建的apache的默认日志路径是在,重点昂

linux: /etc/httpd/logs/access_log
windows: /Apache/logs/access_log

18,PHP正则表达式

preg_match ( string $正则 , string KaTeX parse error: Expected 'EOF', got '&' at position 14: 字符串 [, array &̲结果] )

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

<?php$zz = '/wq/';$string = 'ssssswqaaawqaaa';if(preg_match($zz, $string, $matches)){echo '匹配到了,结果为:';var_dump($matches);}else{echo '没有匹配到';}
?>

我们常用的正则函数有

image-20231019201233720

19,反序列化函数

19-1 面向对象

<?php
header("Content-Type: text/html; charset=utf-8");  // 在响应头中添加了content-type: 
#3 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();
*/
?>

19-2 序列化和反序列化

//序列化,将其他的数据转换成字符串
$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);

20 PHP操作MySQL

20-1 创建表

# 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());

20-2 查询

//连接数据库
$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);

其实php连接mysql有三种方式,phpstudy帮我们都内置了:mysql、mysqli、pdo,其中mysql淘汰了,不安全。

20-3 插入数据

$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);

删除数据,更新数据和插入数据步骤类似

21 Cookie和Session

登录认证。

只使用cookie

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

火狐浏览器有个Cookie-Editor插件。

cookie结合session

## 验证的地方: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

这篇关于【网络安全 --- PHP基础】学网安PHP语言所涉及到的知识,来看看吧,看着一篇文章就够了,建议收藏学习!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244534

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学