五,PHP
首先分享一个自己做的很不错的网路安全笔记,内容详细介绍了许多知识
分享一个非常详细的网络安全笔记,是我学习网安过程中用心写的,可以点开以下链接获取:
超详细的网络安全学习笔记,共21W字编辑
https://m.tb.cn/h.gcRis7s?tk=eBqAWGxQ9I2
网络安全学习笔记
**
**
不知道怎么获取的可以私信联系我,欢迎技术交流!
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的数据类型
◾布尔类型 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的类型; 会显示具体内容打印array:
$a = array(1,2,3);
print_r($a);
4,php 运算符
4-1 算数运算符
存在优先级 (乘除 > 加减),提升优先级就加括号。
4-2 自增自减
4-3 比较运算符
4-4 赋值运算符
4-5 逻辑运算符
4-6 三元运算
<?php
$x = true;
$x ? $y = 5 : $y = 6;
//输出5
echo $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-8,header()是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 文件包含的函数
7-2 数学常用函数
7-3 字符串常用函数
echo FILE; 打印当前文件的绝对路径。下面函数大家学习一下我标着 *** 的即可
echo __FiLE__.'</br>'; // D:\ruanjian\phpstudy_pro\WWW\index.php
echo dirname(__FILE__).'</br>'; // D:\ruanjian\phpstudy_pro\WWW
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-8,header()是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>';
?>
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表示的是方法的返回值 。
$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.关闭文件目录
例如:列举当前目录列表
$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文件是否存在
<?php
if(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/某文件权限为755
chmod("/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-其他用户)
14,PHP文件路径函数
我们经常会遇到处理文件路径的情况。
例如:
1.文件后缀需要取出来
2.路径需要取出名字不取目录
3.只需要取出路径名中的目录路径
4.或者把网址中的各个部份进行解析取得独立值
5.甚至是自己组成一个url出来
... ....
很多地方都需要用路径处理类的函数。
我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:
示例,记住示例中的几个即可
<?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文件,并打开
只有 file_uploads = on 时,php才能支持上传文件
phpinfo()函数,也可以看到这些配置信息。
15-1 配置项:
建议尺寸: 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-8,header()是php提供的加工响应头键值对的
$a = $_SERVER['HTTP_HOST'];
$b = $_SERVER['HTTP_USER_AGENT'];
echo $a.'<br>';
echo $b.'<br>';
?>
15-3 上传文件步骤
15-3-1.系统返回的错误码详解
注:错误码中没有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/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
Internet中有一个专门组织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 messages
RFC-2045 MIME Part 1: Format of Internet Message Bodies
RFC-2046 MIME Part 2: Media Types
RFC-2047 MIME Part 3: Header Extensions for Non-ASCII Text
RFC-2048 MIME Part 4: Registration Procedures
RFC-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() 。这个函数是将上传文件移动到指定位置,并命名。
需要传入两个参数:
第一个参数是指定移动的上传文件;
第二个参数是指定的文件夹和名称拼接的字符串。
大致步骤
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方法来进行设置。
<?php
ini_set('display_errors' , 0 );
?>
上面的代码也相当于修改了php.ini中display_errors的值。不过,仅仅在当前php代码中生效。
问题:想取得php.ini的配置项状态怎么办?
可以使用ini_get(参数项) 得到参数的值。
演示例子:
<?php
echo '服务器中display_errors的状态为' . ini_get('display_errors');
?>
注:如果我们修改完php.ini文件中的配置,想让配置生效的话,需要在修改完php.ini文件后重启服务器。
17-2 错误级别
我们介绍一下其中几种:
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_DEPRECATED
2、在有些情况下我们无权限操作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的相关配置项。这两个配置项为
说明:
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服务器的错误日志,或者到一个文件里。
常用的错误消息类型:
示例:
<?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 '没有匹配到';
}
?>
我们常用的正则函数有
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