本文主要是介绍【网络安全 --- 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的数据类型
◾布尔类型 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;//输出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-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文件是否存在
<?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-其他用户)
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/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() 。这个函数是将上传文件移动到指定位置,并命名。需要传入两个参数:第一个参数是指定移动的上传文件;第二个参数是指定的文件夹和名称拼接的字符串。大致步骤
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 错误级别
我们介绍一下其中几种:
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的相关配置项。这两个配置项为
说明: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
这篇关于【网络安全 --- PHP基础】学网安PHP语言所涉及到的知识,来看看吧,看着一篇文章就够了,建议收藏学习!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!