PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术
MYSQL:
查询函数:
执行查询语句:
1.mysql_query("SQL语法");
凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果);
2.执行结果的处理:成功为结果集,失败为false;
成功返回结果:SQL指令没有错误,但是查询结果本身为空也返回true(结果集是一种资源:转换成bool永远为TRUE)
失败为false:SQL指令有问题
获取结果集行数:
mysqli_num_rows(SQL指令变量);
<meta charset="utf-8 " />
<?php
include 'Untitled-1.php';$ress = "select * from n_name ";
$result = mysqli_query($mysqli,$ress);
if($result){$eses = mysqli_num_rows($result);echo '结果字符集'.$eses;//释放结果集内存
}else{echo '查询执行失败'.mysqli_error($mysqli);
}mysqli_close($mysqli); //var_dump(mysqli_num_rows($mysqli,$ress));
?>
解析结果集:
将一种结果集资源(PHP不能直接使用),转换成一种PHP能够解析的数据格式,通过从结果集中(结果集指针,类似数组指针),按照结果集指针所在位置取出对应的一条记录(一行),返回一个数组,同时指针下移……直到指针移出结果集.
myqsli_fetch_assoc(变量);
获取关联数组,表的表单名字作为数组下标,元素值作为数组元素值。
mysqli_fetch_row(变量):
获取索引数组,只获取数据的值,然后数组的下标从0开始自动索引。
mysqli_fetch_array:
获取关联后者索引数组,但是默认是同时存在的:一个记录取两次,形成一组是关联数组,一组是索引数组;但是可以通过第二个参数来决定获取的方式
补:MYSQL_ASSOC 只获取关联数组,MYSQL_NUM只获取数组,MYSQL_BOTH获取全部两种:
常用相关函数:
mysqli_num_fields(变量):
获取一个指定结果种所有的字段数
mysqli_fetch_field_direct():
函数返回的是一个 stdclass对象(代表字段元数据 )
有关出错信息:
mysqli_error(变量):
获取出错对应的提示信息
mysqli_errno(变量):
获取出错对应的错误提示代号
错误的判断:基于Mysql_query这个函数执行的结果,结果返回false就代表执行错误
其他函数:
mysqli_insert_id():
获取上次插入操作所产生的自增长ID,如果没有自增长ID就返回0
HTTP协议:
HTTP协议概念:
HTTP协议,即超文本传输协议。是一种详细规定了服务器和万维网服务器之间相互通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTP协议是用来从www服务器传输超文本到本地浏览器的传送协议。它可以使服务器更加高效,使网络传输更少.它不仅保证计算机正确快速的传输超文本文档,还确定了传输文档的哪一部分,已经哪一部分内容首先显示(如文本先于图形)等.
HTTP协议特点:
1.客户/服务器模式:客户端(浏览器)服务端
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,
使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并
收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状
态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据
量增大。另一方面,在服务器不需要先前信息时它的应答就较快。·
HTTP协议分类:
HTTP请求协议:浏览器向服务器发起请求的时候需要遵循的协议
HTTP响应协议:服务器向浏览器发起响应的时候需要遵循的协议
HTTP请求:
请求行:
形式:请求方式 资源路径 协议版本号
GET/index.php HTTP1.1
请求行独占一行(第一行 )
请求头:
请求头就是各种协议内容,具体的协议内容不会每次都使用全部
1.Host:请求的主机地址( 必须 );
2.Accept:当前请求能够接收服务器返回的类型(MIME类型);
3.Accept-Language:接收的语言;
4.User-Agent:客户服务器所在点的一些信息
注:请求头不固定数量,每个请求协议也是独占一行,最后会有一行空行(用来区分)
请求体:
请求数据:POST请求会有请求体.GET请求所有的数据都是跟在URL之后的,会在请求行中的资源路径上体现.
基本格式:资源名字=资源值&&资源名字=资源值……
HTTP响应:
响应行:
1.形式:协议版本号 状态码 状态信息(独占一行)
HTTP/1.1 200 ok;
2. 200 ok:成功;
3. 403 Forbidden: 没权限访问;
- 404 Not Found:未找到页面;
5. 500 Server Internal Error: 服务器内部错误;
响应头:
具体协议内容:
- 时间:web,16 Sep 2017 11:43:33 GMT
- 服务器: Server: Apache/2.2.22 (win32) PHP/5.3.13
- 内容长度:Content-Length:1571,数据具体的字节数(响应体);
- 内容类型:Content-Type:text/html:告诉浏览器对应的数据格式
列举了几个常见的响应头,并不是:响应头一个占一行
响应体:
实际服务器响应给浏览器的内容
常用HTTP状态码:
状态码 200 :成功
状态码 403 :forbidden,拒接访问(没有权限)
状态码 404 : NOT FOUND , 找不到(客户端出错了)
状态码 500 :服务器问题
1XX:
服务器正在处理中:
2XX:
3XX:
请求的目标已经转移或者需要更新:
4XX:
客户端(服务器)出错了
5XX:
服务器错误
常见HTTP响应设置及使用:
PHP中针对HTTP协议(响应)进行了底层设计,可以通过函数header来实现修改HTTP响应(响应头)
注意事项:
1、Header可以设计HTTP响应,因为HTTP协议特点是:响应行,响应头(空行结尾),响
应体。认为通过header设计响应头的时候,不应该有任何内容输出,所以一旦产生内容输
出(哪怕一个空格),系统都会认为响应头已经结束而响应体开始了,所有如果先输出内容
后设置响应头(header使用),理论设置无效;
2、在PHP5以后,增加程序缓存内容:允许服务器脚本在输出内容的时候,不直接返回刘
览器而是先在服务器端使用程序缓存保留(php.ini中使用output buffering),有了该内容之
后,在程序缓存内会自动调整响应头和响应体(允许响应头在已经输出的内容之后再设置),
但是此时会报错(警告)。
总结:header设置响应体之前不要有任何输出
location:重定向,立即跳转(响应体不用解析)
浏览器在解析服务器响应的时候:先判定响应行,继续响应头,最后响应体:location是在响应头中,所有浏览器一旦见到该协议项,不再往下解析.
Refresh:重定向,定时跳转(响应体会解析)
延时重定向,浏览器会根据具体时间延迟后在访问指定跳转链接:浏览器在准备跳转访问之前,会继续解析HTTP协议(响应头和响应体)
Content-type:内容类型,MIME类型
通过内容告知(MIME类型),浏览器正确解析内容
转换后:
content-disposition: 内容类型,MIME类型扩展,激活浏览器文件下载对话框
浏览器在解析内容的时候,默认是直接解析,那么有时候需要浏览器不解析,当做一个内容下载成文件
点击后立马下载成功:
PHP模拟HTTP请求:
原理:
PHP可以通过模拟HTTP协议发起HTTP请求
CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它
来发送HTTP请求。它给我们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,
并且支持HTTPS。CURL可以根据URL前缀是“HTTP”还是“HTTPS”自动选择是否加密发
送内容。
前提条件:HTTP协议的客户端/服务端模式,HTTP协议不局限于一定要刻览器访问
curl扩展库使用:
1.建立连接:curl_init():激活一个curl连接功能
2.设置请求选项:
基本语法:Curl_setopt(变量,操作,文件地址):设定(连接)选项
//文件地址也可以写成布尔类型,意为文件流形式返回数据(不直接显示)
操作:
curlopt_url:连接对象
curlopt_returntransfer:将服务器执行的结果(响应)以文件流的形式返回请求界面(php脚本)
curlopt_post:是否才有post方式发起请求(默认请求时GET)
curlopt_postfields:用来传递post提交的数据,分为两种方式:字符串(name=abc&password=123),
以及数组形式(array('name'=>'abc',……))
curlopt_header:是否得到响应的header信息(响应头),默认不获取。
3.执行请求:curl_exec():执行选项(与服务器发起请求),得到服务器返回的内容
4.关闭请求:curl_close():关闭资源
文件编程:
文件编程的必要性:
文件编程指利用PHP代码针对文件(文件夹)进行增删改查操作.
在实际开发项目中,会有很多内容(文件上传,配置文件等)具有很多不确定性,不能在一开始就手动的创建,需要根据实际需求和数据本身进行管理,这个时候就可以使用PHP文件编程来实现代码批量控制和其他操作
文件编程的分类:
1.目录操作:文件夹,用来存放文件的特殊文件
2.文件操作:用来存放内容
路径操作(增删改查):
目录操作:
文件操作创建目录结构:
1.mkdir(路径名字):创建成功返回true,创建失败返回false
//一般来说创建失败的原因有2
1.路径错误
2.已有该文件
错误:
应该加上错误抑制符:@
删除操目录:
rmdir(指定文件夹目录):移出文件夹
读取目录:
读取方式:将文件夹(路径)按照资源方式打开
1.opendir():打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹);
2.readdir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源
又或者循环遍历:
如果已经没有资源了,再往下就不会在运行了:
关闭目录:
closedir():关闭资源
其他目录操作:
1.dirname(一个路径):得到的是路径的上一层路径
2.realpath(一个路径/文件):得到真实的路径信息(目录路径)
3.is_dir(一个路径):判断指定路径是否是一个目录
同理,如果是文件,结果也是false
4.scandir():
封装版的opendir/readdir/closedir,获取一个指定路径下的所有文件信息(第一层),以数组的形式返回
文件的形式就会报错:
递归遍历目录:
递归遍历目录:指定一个目录的情况下,将其下所有的目录和文件,及其目录内容的所有内容都输出出来。
递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。
递归算法:将大问题切成相似的小问题(最小单位),然后可以调用解决大问题的方法来解决小问题。
递归函数:函数如果自己内部调用自己,该函数称之为递归函数。
递归遍历目录的思维逻辑:
1.设计一个能够遍历一层文件的函数:
a.创建函数
b.安全判定:是路径才访问
c.读取全部内容,遍历输出
2.找到递归,点:遍历得到的文件是目录,应该调用当前函数(调用自己):
a.需要构造路径(遍历得到的结果只是文件的名字)
b.需要注意除 “ . ” 和“ .. ”;
3、找到递归出口:遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己)
foreach自带递归出口
结果:
4、如问显示层级关系?
函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进行孙子目录如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进。
a.在函数参数中增加一个标记:默认值为0
b.递归调用的时候也需要使用该参数:但是是属于当前层级的子级,所以+1
c.根据层级缩进:str_repeat()
<?phpheader('Content_type:text/html;charset=utf-8');$res = 'xxx';function my_scandir($res,$lench = 0){if(!is_dir($res)){//保证文件安全,如果不是路径没有必要往下echo '没有路径';return ;}//读取全部路径信息,遍历输出$files = scandir($res);foreach($files as $file){//$file就是一个个文件名echo str_repeat("  ",$lench) ,$file . '<br/>';//排除.和..if($file == '.' || $file == '..'){continue;}//构造路径$files_dir = $res.'/'.$file;if(is_dir($files_dir)){my_scandir($files_dir,$lench+1);}}}//测试my_scandir($res);
?>
设计知识点:
str_repeat
函数
str_repeat
是 PHP 的内置函数,作用是将指定字 符串 重复指定次数。它有两个参数,第一个参数是要重复的字符串,第二个参数是重复的次数。在这句代码中,str_repeat(" ",$lench)
就是将 " "
这个字符串重复 $lench
次 。
的含义
是 HTML 中的一种实体字符,代表一个空格 。在 HTML 文档中,普通的空格在多个连续出现时,浏览器会自动将其合并为一个空格来显示。而使用
可以确保每个实体字符都显示为一个独立的空格。这里 " "
表示两个空格,通过 str_repeat
函数重复若干次,就能产生一定数量的空格效果。
文件操作:
常用文件操作函数:
file_get_contents(文件路径):获取指定文件的所有内容
如果路径不存在,最好做安全处理
file_put_contents(文件路径,内容):将指定内容写入指定文件内
如果当前路径不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)
fopen(文件路径,打开模式):打开一个文件资源,限定打开模式
fread(资源,长度):从打开的资源中读取指定长度的内容(字节)
fwrite(资源,内容):向打开的资源中写入指定的内容
fclose(资源):关闭资源
相关函数:
is_file():判断文件是否正确(不识别路径);
filesize():获取文件大小
file_exists():判断文件是否存在(识别路径);
unlink():取消文件名字与磁盘地址的连接(删除文件);
filemtime():获取文件最后一次修改的时间
fseek():设定fopen打开的文件的指针位置
fgetc:一次获取一个字符
fgets():一次获取一个字符串(默认行)
file():读取整个文件,类似file_get_contents,区别是按行读取,返回一个数组
文件下载:
文件下载:从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析保存成相应的文件。
提供下载方式可以使用HTML中的a标签:<a href="互联网绝对文件路径”>点击下载</a>
1、缺点1:a标签能够让浏览器自动下载的内容有限:浏览器是发现如果解析不了才会启用下载,如果能解析便不会下载
2、缺点2:a标签下载的文件存储路径会需要通过hf属性写出来,这样会暴露服务器存储数据的位置(不安全);
PHP下载:
读取文件内容,以文件流的形式传递给浏览器,在响应头中告知浏览器不要解析,激活下载框实现下载
1.指定浏览器解析字符集
2.设定响应头
a.设定文件返回类型:image/jpg || application/octem-stream
b. 设定返回文件计算方式:Accept-ranges:bytes
c. 设定下载提示:'content-disposition:attachment;fileename=' . 文件名字
d.设定文件大小:'Accept-length:' . 文件大小(字节)
//普遍使用filesize(文件名)来表示文件大小
//如果文件的名字是从文件夹里面读取出来,而且存在中文,那么如果直接使用名字作为下载名字会出现乱码,出现这种情况需要进行字符集转码,从GBK专成UTF-8:iconv(GBK,UTF-8,文件名字);
3.读取文件
4.输出文件
方案1:如果文件较小,可以直接使用文件函数操作:file_get_contents(文件名);
方案2:文件比较大,网络不是很好:使用文件操作方式:一次读一点
<?php//php文件下载$file = 'oende3';header( 'content-type:application/octem-stream');header('Accept-ranges:bytes');header('content-disposition:attachment;fileename='.$file);header('Accept-length:' . filesize($file));//输出文件//PHP:小文件//echo file_get_contents($file);//PHP:大文件$f = @fopen($file,'r') or die();while ($rew = fread($f,1024)){echo $rew;}?>
或者:
<?php//php文件下载$file = 'oende3';header( 'content-type:application/octem-stream');header('Accept-ranges:bytes');header('content-disposition:attachment;fileename='.$file);header('Accept-length:' . filesize($file));//输出文件//PHP:小文件//echo file_get_contents($file);//PHP:大文件$f = @fopen($file,'r') or die();while (!feof($f)){echo fread($f,1024);}//关闭资源fclose($f);
?>
补充:
结果(已经成功,只是页面没有改变而已):
会话技术:
初步认识:
web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
HTTP协议的特点是无状态无连接,当一个浏览器连续多次请求同一个web服务器时,服务器是无法区分多个操作是否来自于同一个浏览器(用户)。会话技术就是通过HTTP协议想办法让服务器能够识别来自同一个浏览器的多次请求,从而方便浏览器(用户)在访问同一个网站的多次操作中,能够持续进行而不需要进行额外的身份验证。
会话技术分类:
cookie技术
cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式.
cookie是由web服务器保存在用户浏览器(客户端)上的小文本文件(HTTP协议响应头),它可以包含有关用户的信息。无论何时用户链接到服务器(HTTP请求携带数据),web站点都可以访问cookie信息.
session技术
Session直接翻译成中文比按困难,一般都译成时域。
在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
Session技术是将数据保存到服务器端,无论何时用户链接到服务器,Web站点都可以访问Session信息.
SESSION技术的实现是依赖COOKIE技术的。
区别:
1.安全性方面:
- session存储服务器端,安全性高
- cookie存储浏览器端,安全性低
2.数据大小方面:
- cookie的数量和大小都有限制(20个/4k)
- session数据存储不限
3.可用数据类型:
- cookie只能存储简单数据,数值/字符串
- session可以存储复杂数据(自动序列化)
4.保存位置方面
- cookie保存在浏览器上
- session保存在服务器上
COOKIE:
工作原理:
服务器将数据通过HTTP响应存储到浏览器上,浏览器可以在以后携带对应的cookie数据访问服务器;
1.第一次请求时,PHP会通过setcookie函数将数据通过http协议响应头传输给浏览器;
2.浏览器在第一次响应时将cookie数据保存到浏览器;
3.浏览器后续请求同一个网站的时候,会自动检测是否存在cookie数据,如果存在将在请求头中将数据携带到服务器;
4.PHP执行的时候会自动判断浏览器请求中是否携带cookie,如果写到,自动保存到$_cookie中;
5.利用$_cookie访问cookie数据。
交互过程:
COOKIE的基本使用:
设置cookie信息息
setcookie函数用来设置cookie信息
setcookie(名字,值);
- cookie名的设置:字符串,第一个参数
- cookie值的设置:第二个参数
- cookie值的类型要求:必须是简单类型中的整数或者字符串
查看:F12 => application(应用程序) => cooies
读取cookie信息:
1.$_COOKIE数组的使用
同时:
COOKIE高级:
cookle生命周期:
cookie在浏览器生存时间(浏览器在下次访问服务器的时候是否携带对应的cookie)
- 默认(不设定)是的生命周期:不设定周期默认是关闭浏览器(会话结束)
- 设定一个常规日期戳的周期:通过setcookie第三个参数可以限定生命周期,是用时间戳来管理,从格林威治时间开始
在经过重启后,a1和a2都消失了
- 设定一个" 0 "的周期:在第三个参数设置为0代替时间戳的时候,表示的就是普通设置,相当于没有,会话结束过期
- 删除一个cookie的做法
服务器没有权限去操作浏览器上的内容(不可能删除),可以 通过设定生命周期来让浏览器自动判定cookie是否有效,无效 就清除
a. 清空cookie数据内容
b. 设定时间戳过期
COOKIE适用范围:
作用范围:不同的文件层级中,设定的C00KIE默认是在不同的文件夹下有访问限制。上层文件夹中设定的C00KIE可以在下层(子文件夹)中访问,而子文件夹中设定的C00KIE不能在上层文件夹中访问。(就是子能看到父,而父看不到子)
- 默认(不设定)的范围,就是使用cookie默认的作用范围
- 设定为"/"的含义:告知浏览器当前cooie的作用范围是网站根目录(就是设定全局都可以访问,父也可以访问子问);
语法:setcookie(名字,值,生命周期,'/')
COOKIE跨子域:
跨子域:在同一级别域名下,myitcast.com(一级域名),可以有多个子域名(www.myitcast.com 和 gz.myitcast..com) , 他们之间是搭建在不同的服务器上(不同文件夹:E:/server/apache/htdocs和E:web) , 但是可以通过COOKIE设置实现对应的COOKIE共享访问,但是默认是不允许跨域名访问的。
- 设定cookie的有效域名,不同的域名(包含主机)之间不能共享cookie,可以通过setcookie的第五个参数进行控制
基本语法:setcookie(名字,值,生命周期,作用范围,有效域名)
//意为,凡是以有效域名为结尾的网站都可以共享
不设定时的默认有效域名
- 3)跨子域的设定方法:在设定域名访问的时候用设定上级域名即可:myitcast..com,这个是有所有以myitcast.com结尾的网站都可以共享COOKIE
COOKIE数组使用:
C00KIE本身只支持简单数据(数字或者字符串),能的够保留的数据本身有限,也不成体系。
如果需要使用C00KE来保留一组数据的化,想办法凑成数组。(C00KIE不支持数组)
- 设置形式:setcookie('cl[k1]',值)
- 读取形式:$_COOKIE['c1']['k1']
注: