IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP学习(二) -> 正文阅读

[PHP知识库]PHP学习(二)

PHP

PHP核心概念

表单传值
  • 表单传值存在两种方式:
    • GET方式,可以通过GET方式请求的场景有:
      • form表单,method属性为GET
      • <a>标签中的链接默认以GET方式请求
      • location对象的herf属性和assign()方法。如<script>location.href=""</script><seript>location.assign("")</script>
    • POST方式
      form表单,method属性为POST
  • POSTGET方式的区别
    • GET方式的请求主要用于获取数据,不改变服务器上的资源,一般只是用于取得内容
    • POST方式的请求主要用于增加数据,即改变服务器上的资源
    • 传输方式上POST必须使用表单,而GET方式可以使用URL和表单等
    • GET传输的数据可以在URL上对外可见,而POST不可见
    • GET方式传输的数据长度有限制(2K),而POST方式理论上是没有限制的。实际上只是浏览器厂商对GET方式进行了限制,实际上都没有什么长度限制
    • GET用于传输简单数据,如数值字符串等。而POST方式可以用于传输复杂数据,如二进制。
  • php中接收数据的三种方式
    $_GET$_POST$_REQUEST都可用于接收请求中的数据。表单元素的name属性为下标,表单元素的value值为数组元素值。$_REQUEST会将get方式和post方式的数据合并到一个数组中,如果这两种方式有同名表单name元素,那么post方式会覆盖get方式提交的数据。可以在php.ini配置文件中对覆盖性进行设置。
  • php表单常见处理
    • 单选处理radio,使用同名name属性区分即可
    • 复选框checkbox,使用同名带[]name属性区分即可。因为浏览器不会识别[],而php认为[]具有特殊含义,会自动将其认为是数组形式,并且会将同名的带有[]的元素合并成数组。
    • 其他同名表单项处理参照checkbox,如下拉菜单的option也可以采取同样的处理
  • 文件上传
    • 文件上传是指通过web表单方式,将文件上传保存到服务器指定目录下。具有文件上传的表单form需要将enctype属性设置为multipart/form-data,如<form method="post" enctype="multipart/form-data"></form>
    • $_FILE变量
      在php中,$_FILE变量是专门用于存储用户上传的文件的变量,本质是一个关联数组。根据下标保存文件的相关信息。
      • name:文件在用户端的名字,实际上用于保存文件的后缀
      • tmp_name:文件上传到php服务器后保存的临时路径
      • type:文件的MIME类型,用于在计算机客户端识别文件类型
      • error:文件上传的代号,用来告知php在文件接收过程中出现了什么问题。问题代号分为七种:
        • 0:上传成功
        • 1:文件超过大小限制。具体限制在php.ini文件的upload_max_filesize中有限定
        • 2:超过HTML的MAX_FILE_SIZE的限制
        • 3:文件只有部分被上传(如网络不稳定等原因造成)
        • 4:没有文件被上传
        • 5:找不到对应的临时文件夹tmp_name
        • 6:文件写入失效
      • size:文件大小
    • 多文件上传
      针对同样内容的多文件上传,可以使用同名name[]的方式来实现多文件上传
MYSQL扩展

php针对mysql数据库提供了扩展,允许php作为mysql的一个客户端连接服务器进行操作。需要注意的是,在php7后可以使用mysqli等系列函数

  • 连接mysql
    可以使用$link = mysql_connect(ip,username,password)来获得数据库连接,默认是对一个服务器只连接一次。当需要对一个资源进行多次连接时,可以使用mysql_connect(ip,username,pwd, TRUE )。获取到的
  • 设置数据库连接编码
    用于保持客户端和服务器之间的字符集一致。
    mysql_query("set name utf-8" , $link);或者mysql_set_charset("utf-8");
  • 选择数据库
    mysql_query("user databaseA");或者mysql_select_db("databaseB");
  • 关闭数据库连接
    在php脚本执行结束后,数据库连接会自动释放。也可以进行手动释放。
    mysql_close($link);
  • 增删改查操作
    mysql_query(SQL语句); 在执行更新操作之后会返回true或者false,而执行查询操作后会返回结果集,结果集为资源类型,转换为布尔类型时始终为true
  • 对结果集进行操作
    使用$res = mysql_query($sql);执行查询语句获取到结果集$res
    • 获取结果集行数
      mysql_num_rows($res);解析获取到结果集行数
    • 解析结果集
      表示将结果集资源转换成php能够直接解析的数据格式(数组形式)——通过结果集中的指针按照指针所指的位置,将该条记录取出返回为数组格式。同时指针下移,直到离开结果集。
      • mysql_fetch_assoc():该函数用于获取关联数组,字段名作为下标,字段值作为元素值。每次解析一行结果。
      • msyql_fetch_row():获取到索引数组,数组下标从0开始自增。每次解析一行结果。
      • mysql_fetch_array():获取到关联或者索引数组,可以通过第二个参数进行获取结果的设置,默认为MYSQL_BOTH,即同时获取关联和索引数组。参数还有MYSQL_ASSOCMYSQL_NUM
  • 其他相关函数
    • mysql_num_fields():获取指定结果集中所有字段数
    • mysql_field_name():获取一个指定结果集中指定位置的字段名
    • mysql_error():获取对应出错的提示信息
    • mysql_errno():获取对应出错的错误代号
    • mysql_insert_id():获取到上次插入操作所产生的自增长id,如果没有自增长id则返回0
HTTP协议
  • HTTP协议特点

    • C/S模式(Clinet/Server)
    • Client请求Server时,只需要传送请求方式和路径即可,通信速度较快
    • HTTP允许传输任意类型的数据对象(任意MIME类型)
    • 无连接,指的是HTTP每个连接只处理一个请求,服务器在处理完客户请求并收到应答之后,即断开连接。HTTP方式可以节省连接时间
    • 无状态,HTTP是无状态协议。指的是对事务没有记忆能力,意味着如果后续需要处理先前的信息时,必须进行重新传送。这样可能导致每次连接传送的数据量增大
  • HTTP协议分类

    • 请求协议:Client=>Server
    • 响应协议:Server=>Client
  • HTTP请求

    • 请求行,独占一行。如GET/index.php/1.1,表示请求方式,资源路径,http协议号
    • 请求头,用于存放各项协议的内容,但是不会每次请求都会使用全部的协议内容
      • Host:表示请求的主机地址(必需)
      • Accept:表示当前请求能接收返回的MIME类型
      • Accept_Language:表示接受的语言
      • User_Agent:表示客户端浏览器的一些信息
    • 请求体,POST请求会有请求体,用于存放一些请求参数。而GET请求的请求参数会跟随在URL之后,以键值对的形式在请求行的资源路径上体现
  • HTTP响应

    • 响应行,独占一行。如HTTP/1.1 200 ok,表示协议版本号,状态码和状态信息
    • 响应头,存放着一些具体的协议内容,与响应体之间空出一行
    • 响应提,存放Server实际响应给Client的内容
  • HTTP常用状态码
    1XX:信息,表示服务器收到请求,需要请求者继续执行操作。如100,101
    2XX:成功,表示请求被成功接收并处理,如200 ok
    3XX:重定向,需要进一步的操作以完成请求
    4XX:客户端出错,请求包含语法错误或者无法完成请求,如404 not found
    5XX:服务器出错,服务器在处理请求的时候出现了错误,如502 bad gateway

  • PHP中HTTP响应设置
    php针对HTTP协议(响应)进行了底层设计,可以通过header()函数来修改HTTP响应,即修改响应头。

    • header()函数在设计HTTP响应前,不应该有任何的内容输出,这是因为一旦有内容输出,系统都会认为响应头结束,相应体开始,因此理论上设置header()无效。
    • 在php5之后,增加了程序缓存,可以在php.ini中的output_buffering属性中设置开启关闭。允许php输出脚本时先在Server端进行暂存,因此可以在有内容之后再进行header()设置,系统会自动调整响应头和响应体,但会报错警告。因此不推荐在有内容之后才设置响应头,最好在脚本的最开始就设置响应头。
    • header()的内容设置:
      • Location:立即跳转,重定向,并不会解析响应体。header('Location:202020selection.php');
      • Refresh:重定向,会定时跳转,会解析响应体。header('Refresh:3;url=303030selection.php');
      • Content-type:用于设置内容类型(MIME)类型。header('Content-type:text/html;charsetutf-8');
      • Content-disposition:MIME类型扩展,可以激活浏览器下载。header('Content-disposition:attachment;filename=a.jpg');
  • php模拟HTTP请求
    php可以通过模拟HTTP协议发起HTTP请求。CURL是一个开源库,支持HTTP,FTP,TELNET等多种协议,并且支持HTTPS。

    • php.ini中开启CURL扩展:extension=php-curl.dll;
    • 使用curl模拟http请求
      • 建立连接开启回话:$ch = curl_init();
      • 设置请求选项:如curl_setOpt($ch , $CURLOPT_URL,'localhost/2020.php');。请求选项分为如下几类:
        • CURLOPT_URL:设置连接对象
        • CURLOPT_RETURNTRANSFER:将服务器执行的结果响应以文件流的形式返回给请求界面(php脚本)
        • CURLOPT_POST:表示是否采用POST方式发起请求,默认为GET
        • CURLOPT_POSTFIELDS:用来传递POST提交的数据,分为两种形式——字符串形式name=abc&password=123和数组形式array('name'=>'abc'...)
        • CURLOPT_HEADER:表示是否得到相应的header信息(即响应头),默认不获取
      • 执行请求:$content = curl_exec($ch);,其中$content表示获取到的响应信息
      • 关闭连接:curl_close($ch);
文件编程

文件编程指的是利用php代码对文件或者文件夹进行的增删改查等操作。在实际开发中会有很多内容(如上传的文件,配置文件等)具有不确定性,不能在一开始就手动创建,这样就需要用到php文件编程。

目录操作
  • mkdir(路径名):如果想要创建的路径已经存在,可以使用错误抑制符抑制报错
  • rmdir(路径名):删除路径
  • opendir(路径名):打开目录,返回一个路径资源对象,包含路径下的所有文件和目录。$res = opendir('uploads');
  • readdir(资源变量):读取资源对象。从资源中读取指针所在位置,读取后指针下移直到移出资源:echo readdir($res);
  • closedir(资源变量):关闭资源
  • dirname(路径):用于获取该路径的上层路径
  • readpath(路径):取得该路径的真实路径,如果该路径为文件那么得到的是false
  • is_dir(路径):判断指定路径是否为目录
  • scandir(路径):封装版的opendir+readdir+closedir,获取一个指定路径下的所有文件信息,以数组形式返回。
echo '<pre>';
var_dump(scandir('uploads'));
//输出类似
//array(3){
//	[0]=> string(1) "."
//	[1]=> string(2) ".."
//	[2]=> string(17) "abcdefg1231134.txt"
//}
文件操作
  • touch(文件路径名):创建一个新文件
  • file_get_contents(文件路径):获取指定文件中的内容
  • file_put_contents(文件名,内容):将指定内容写入文件,如果路径下不存在该文件会直接创建,如果不存在该路径则不会创建路径

php4中的文件操作,是将文件作为资源处理,无论是读或者写都是依赖资源指针

  • fopen(文件路径,打开方式):打开方式分为r/w/a/x,返回一个资源对象
  • fread(资源,长度):从打开的资源中读取指定字节长度的内容
  • fwrite(资源,内容):向打开的资源中写入指定的内容
  • fclose(资源):关闭指定的资源

其他文件操作函数

  • is_file():判断是否是文件(不识别路径)
  • filesize():获取文件大小
  • file_exists():判断文件是否存在(识别路径)
  • unlink():取消文件名与磁盘的连接(即删除文件)
  • filemtime():返回文件最后一次修改的时间
  • fseek():设定fopen打开文件的指针位置
  • fgetc():一次获取一个字符
  • fgets():一次获取一个字符串,默认为行
  • file():读取文件,类似于file_get_contents,区别是按行读取,返回一个数组

文件下载
表示从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析而是将其保存为相应的文件。

  • 可以使用<a href=""></a>来进行文件下载,但是这样会出现以下问题:
    • a标签能够让浏览器自动下载的内容有限——只有在浏览器发现无法解析时才会启用自动下载
    • a标签的href属性会使用文件资源的绝对路径,这样会暴露服务器存储数据的位置,会导致安全问题
  • 还可以以文件流的形式将文件内容传递给浏览器,在响应头中告知浏览器不要解析,直接开启文件下载
<?php
header('Content-type:text/html;charset=utf-8');
header('Content-type:application/citem-stream');//以文件流的形式传输
header('Accept-ranges:bytes');//以字节方式计算
header('Content-disposition:attachment;filename='.$file);//附件下载,指定文件名
header('Accept-length:'.filesize($file));
//在响应头中进行设置之后,请求访问到该脚本时,会自动将该脚本中的内容作为文件下载
$file = 'a.txt';
$file = iconv('GBK','UTF-8',$file);//用于字符集转码
$res = fopen($file , 'r') or die();
while($row = fread($res , 1024)){
	echo $row;
}
fclose($res);
会话技术
  • 会话技术分类

    • cookie:是指在HTTP协议下,服务器或者脚本可以维护客户工作站上信息的一种方式。Cookie是由Web服务器保存在用户浏览器上的小文本文件(HTTP协议响应头),可以包含有关用户的信息,无论何时用户链接到服务器,Web站点都可以访问Cookie
    • Session:Session指的是一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统的时间。Session可以将用户信息保存到服务器端,Session技术是通过Cookie实现的。
  • 会话技术区别

    • 安全性:Session存储在服务器端,安全性高;Cookie存储在客户端,安全性低
    • 数据大小:Cookie的数量(20个)和大小(4K)都有长度限制;Session数据存储不限。
    • 可用数据类型:Cookie只能存储简单类型(数据和字符串);Session可以存储复杂数据(自动序列化)
    • 保存位置:Cookie保存在客户端;Session保存在服务端
  • Cookie的使用
    浏览器在首次请求服务器时,php可以通过setCookie()函数将数据通过响应头的形式将Cookie保存在浏览器。浏览器的后续请求都会携带Cookie,会自动保存在php的$_COOKIE中。

    • 设置Cookie信息
      setCookie(名,值),cookie名必须为字符串,cookie值可以为简单类型中的整数或者字符串,如setCookie(‘name’,'Mark');
    • 读取Cookie信息
      通过读取$_COOKIE数组来获取请求cookie中的数据,如var_dump($_COOKIE);
  • Cookie高级应用

    • Cookie生命周期
      不设定生命周期,则默认会话结束(关闭浏览器)时Cookie失效。通过setCookie()函数的第三个参数可以设置时间戳,用于设置Cookie的生命周期,如setCookie('name' , 'mark' , time() + 7*24*60*60);
      • 当时间戳设置为0时,为默认设置,即会话结束后关闭;
      • 删除cookie只能通过设置生命周期来实现
      • 清空cookie可以使用setCookie('name','');实现
      • 设置时间戳过期setCookie('name','mark',time());
    • Cookie的作用范围
      不同的文件层级中,默认Cookie是在不同的文件夹下有访问限制。上层文件中设定的Cookie可以在下层(子文件夹)中访问,但是子文件夹中设定的Cookie不能在上层文件夹中访问。
      • 默认范围,即不设定Cookie的访问范围
      • 设定为1,即告知浏览器当前Cookie的作用域是网站根目录,如setCookie('a','b',time()+24*60,'1');
    • Cookie跨子域
      在同一级别域名下,一级域名(如www.jarvis.com)可以有多个子域名,他们是搭建在不同的服务器上的,但是可以通过Cookie设置实现Cookie共享访问。但是默认是不允许跨域名访问Cookie的。
      • 通过setCookie()方法的第五个参数设定Cookie的有效域名,setCookie('name' , 'jarvis' , time() , '1' , 'www.jarvis.com');
      • 当不设定有效域名时,默认为当前站点有效
      • 设定跨子域的Cookie
        在设定有效域名访问的时候,使用上级域名设定即可,如设定jarvis.com,所有以jarvis.com结尾的网站都可以共享该Cookie
    • Cookie数组数据
      Cookie本身只能支持简单数据(数字或者字符串),能够保留的数据本身有限且不成体系,如果需要使用Cookie来保存一组数据,需要将其凑成数组(Cookie不支持数组),如setCookie('good_ids[0]' , '1000086');setCookie('good_ids[1]' , '1000086');。读取时使用echo $_COOKIE['good_ids'][0];即可。
  • Session的使用

    • Session的原理
      Session与浏览器无关,但是和Cookie有关。Session是基于Cookie实现的。
      • 当php遇到session_start()时会开启session会话,会自动检测sessionID,如果在cookie中存在,则会使用现成的作为Session的id;如果Cookie中不存在,则会创建一个sessionID通过响应头以Cookie的形式保存在浏览器端。
      • 初始化超全局变量$_SESSION为一个空数组
      • php会根据sessionID去指定位置(session文件的存储位置)去匹配对应的文件,不存在该文件时则会创建一个sessionID命名的文件;若存在该文件,则会读取文件内容,将数据存储到$_SESSION
      • 脚本执行结束时,会将$_SESSION中存储的所有数据序列化存储到sessionID对应的文件中。
    • Session的基本使用
      若启用session,则任何时候都要开启session,每在php脚本中使用$_SESSION时就会开启一次。而$_SESSION是通过session_start()函数定义的,没有直接定义,因此需要使用session_start()函数开启session后才能访问$_SESSION
    • 设置读取Session信息
      如果需要存储信息到Session中,只需要向$_SESSION中添加数据即可,如$SESSION['hobby'] = array('baseball' , 'hocky');。需要获取Session中的数据时,直接从$_SESSION中读取即可,如echo $_SESSION
    • 删除一个Session信息
      使用unset()函数即可,如unset($_SESSION('name'));
    • 删除全部的Session信息
      使$_SESSION变为一个空数组即可完成删除,如$_SESSION = array();
  • Session的相关配置
    基础配置(php.ini)中的配置

    • session.name = PHPSESSID,表示保存到Cookie中的sessionID对应的名字
    • session.aotu_start = 0,表示是否自动开启session(默认关闭),即无需手动通过session_start()开启
    • session.save_handler = file,表示session保存数据的方式,默认是文件方式
    • session.save_path = /tmp,表示session文件的默认存储位置
    • session.cookie_lifetime = 0,表示PHPSESSID在浏览器端对应Cookie的声明周期,默认是会话结束即失效
    • session.cookie_domain,表示cookie可以允许访问的子域,默认的PHPSESSID只能当前主机访问
  • Session的销毁
    Session的删除是指清空$_SESSION中的数据,使其无法访问,销毁指的是直接删除Session文件。

    • Session销毁使用函数session_destory(),会根据session_start()得到的sessionID将指定的session文件进行销毁。
  • Session垃圾回收机制
    Session会话技术中,session文件并不会自动清除,这导致会有很多不同的session垃圾文件,影响效率。通过给session文件指定生命周期,以最后修改时间综合判定,这样就可以及时清理无效的僵尸文件。
    任何一次Session开启,Session都会尝试读取session文件,读取后有可能触发垃圾回收机制(几率触发,类似于java的gc)。垃圾回收机制会自动读取所有session文件的最后编辑时间,结合生命周期作为是否回收的标准。
    垃圾回收参数如下:

    • session.gc_maxlifetime = 1440,规定的session文件最大生命周期为24min
    • session.gc_probability = 1,垃圾回收概率因子
    • session.gc_divisor = 1000,垃圾回收概率分母,即默认触发概率为1/1000

会话技术的本质是为了实现跨脚本共享数据,在一个脚本中定义会话数据,即可以在另一个脚本中访问到该数据。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:25:04  更:2021-07-29 11:25:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 20:03:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码