PHP中WEB典型应用技术

主要讲5个方面:

  1. PHP与web页面的交互:表单传值,文件的上传与下载
  2. http协议
  3. PHP的会话技术:cookie和session
  4. PHP的图像技术:GD库,图像的常见的制作和操作,验证码,二维码,水印、缩略图,3D图等等
  5. 文件操作:打开、关闭、读取文件、写入文件,遍历目录等

一、PHP与web页面的交互:表单传值,文件的上传与下载

1、表单传值

1.1、单选框

single.html

<!DOCTYPE html>
<html>
<head>
    <title>单选项传值</title>
    <meta charset="utf-8">
</head>
<body>
    <form method="GET" action="single.php">
        <p>用户名:<input type="text" name="username" /></p>
        <p>
           性  别:
           <input type="radio" name="gender" value="1" />男
           <input type="radio" name="gender" value="2" />女
           <input type="radio" name="gender" value="3" />保密
        </p>
        <p>密  码:<input type="password" name="password" /></p>
        <p><input type="submit" value="提交"></p>
    </form>
</body>
</html>

single.php

<?php

header(‘Content-type:text/html;charset=utf8‘);
echo ‘<pre>‘;
var_dump($_GET);

注意:

  • 一组选择的name值必须相同;
  • 必须要有value属性,且value属性的值不能相同。

1.2、多选框

muliSelect.html

<!DOCTYPE html>
<html>
<head>
    <title>单选项传值</title>
    <meta charset="utf-8">
</head>
<body>
    <form method="POST" action="muliSelect.php">
        <p>用户名:<input type="text" name="username" /></p>
        <p>
           爱 好:
           <input type="checkbox" name="hobby[]" value="唱歌">唱歌
           <input type="checkbox" name="hobby[]" value="跳舞">跳舞
           <input type="checkbox" name="hobby[]" value="电影">电影
           <input type="checkbox" name="hobby[]" value="篮球">篮球
        </p>
        <p><input type="submit" value="提交"></p>
    </form>
</body>
</html>

muliSelect.php

<?php

header(‘Content-type:text/html;charset=utf8‘);
/*echo ‘<pre>‘;
var_dump($_POST);*/
// 1,连接数据库
mysql_connect(‘localhost:3306‘,‘root‘,‘aaa‘);
mysql_query(‘set names utf8‘);
mysql_query(‘use php2018‘);
// 2,接收数据
$user_name = trim($_POST[‘username‘]);
$user_gender = $_POST[‘gender‘];
$hobby = $_POST[‘hobby‘];
$user_password = md5(trim($_POST[‘password‘]));

// 将数组转换成字符串才能写入数据库
$user_hobby = implode(‘,‘,$hobby);

// 3,数据入库
$sql = "insert into user values
        (null,‘$user_name‘,‘$user_gender‘,‘$user_hobby‘,‘$user_password‘)";

$result = mysql_query($sql);

if($result) {
    echo ‘插入成功‘;
}else {
    echo ‘插入失败‘;
}

/*create table user(
    user_id int primary key auto_increment,
    user_name varchar(20) not null default ‘匿名‘,
    user_gender enum(‘1‘,‘2‘,‘3‘) comment ‘1是男2是女3是保密‘,
    user_hobby set(‘唱歌‘,‘跳舞‘,‘电影‘,‘篮球‘),
    user_password char(32)
);*/

注意:

  • 当我们用PHP获取多选框的值时,会获得一个数组;
  • 当我们将多选框的值存入数据库时,需要将获得的数组用 implode() 函数分成一个字符串,再存入数据库中。

2、文件上传

实现文件上传,由下面几步:

1)、在服务器端要开启文件上传功能;

2)、在浏览器端提供能够进行文件上传的表单。其实就是给表单添加属性:enctype=”multipart/form-data”;

3)、使用$_FILES接收上传的文件的相关信息;

4)、验证文件;

5)、将文件从临时文件夹移动到指定的目录下。

其实就是利用一个函数:move_upload_file(临时文件名,目标存放的目录及文件名);有一个返回值,如果上传成功就返回true,否则就返回false;

PHP默认的上传临时文件夹是在C盘下,有时候因为权限问题会导致上传失败, 因此我们一般会修改上传的临时文件夹。

封装文件上传函数

upload.php

<?php

# 文件上传函数

/**

* 文件上传

* @param array $file 上传文件的信息(是一个数组,有5个元素)

* @param array $allow 文件上传的类型

* @param string & $error 引用类型,用来记录错误信息

* @param string $path 文件上传的路径

* @param int $maxsize = 2*1024*1024 允许上传的文件的大小

* @return false|$newname 如果上传失败就返回false,成功则返回文件的新名字

*/

function upload($file,$allow,& $error,$path,$maxsize=2097152){

# 1,判断系统错误

switch ($file[‘error‘]) {

case 1:

$error = ‘上传错误,超出了文件限制的大小!‘;

return false;

case 2:

$error = ‘上传错误,超出了表单允许的大小!‘;

return false;

case 3:

$error = ‘上传错误,文件上传不完整!‘;

return false;

case 4:

$error = ‘请先选择要上传的文件!‘;

return false;

case 6:

case 7:

$error = ‘对不起,服务器繁忙,请稍后再试!‘;

return false;

}

# 2,判断逻辑错误

// 2.1,判断文件大小

if ($file[‘size‘] > $maxsize) {

$error = ‘超出文件大小,允许的最大值为:‘. $maxsize . ‘字节‘;

return false;

}

// 2.2,判断文件类型

if (!in_array($file[‘type‘], $allow)) {

//文件类型非法

$error = ‘上传的文件类型不正确,允许的类型有:‘ . implode(‘,‘, $allow);

return false;

}

# 3, 得到文件的新名字

$newname = randName($file[‘name‘]);

# 4,移动临时文件到指定路径

$target = $path . ‘/‘ . $newname;

if (move_uploaded_file($file[‘tmp_name‘], $target)) {

return $newname;

}else {

$error = ‘发生未知错误,上传失败!‘;

return false;

}

}

# 定义一个产生随机名字的函数

/**

* @param string $filename 文件的旧名字

* @param string $newname 文件的新名字

*/

function randName($filename) {

//生成文件名的时间部分

$newname = date(‘YmdHis‘);

//加上随机的六位数

$str = ‘0123456789‘;

//得到六位随机数

for ($i=0; $i < 6; $i++) {

//将每次得到的随机数加到新名字后

$newname .= $str[mt_rand(0,strlen($str))];

}

// 加上后缀名

$newname .= strrchr($filename, ‘.‘);

return $newname;

}

?>

3、文件下载

二、http协议

1、请求协议

1.1、组成:请求行、请求头、空行、请求数据

1.1.1、请求行。分为三个部分:请求方式、请求路径、协议版本

1.1.2、请求头。

请求头就是所有当前需要用到的协议项的集合!

协议项就是浏览器在请求服务器的时候事先告诉服务器的一些信息,而且每一个协议项都要单独的占用一行!

常见的请求头:

    • host:当前url中所要请求的服务器的主机名(域名)
    • accept-encoding:是浏览器发给服务器,声明浏览器支持的压缩编码类型 比如gzip
    • accept_charset:表示,浏览器支持的字符集
    • referer:表示,此次请求来自哪个网址
    • accept-language:可以接收的语言类型,cn,en等
    • cookie:
    • user-agent:用户代理,当前发起请求的浏览器的内核信息
    • accept:表示浏览器可以接收的数据类型,text/html,image/img
    • content-length(post):只有post提交的时候才会有的请求头,显示当前提交的数据长度(字节)
    • if-modified-since(get):在客户端向服务器请求某个资源文件时,询问此资源文件是否被修改过
    • content-type(post):定义网络文件的类型和网页的编码,决定浏览器将以什么形式、编码读取这个文件

1.1.3、空行

用来分离请求头和请求数据,意思就是请求头到处结束!

1.1.4、请求数据

2、响应协议

2.1、组成:响应行、响应头、空行、响应主体

三、会话技术

1、cookie

1.1、基本操作

    • 增删改:setCookie(名,值)
    • 查:$_COOKIE

1.2、属性

    • 有效期:默认一个会话周期。可通过setCookie第三个参数设置;
    • 有效路径:默认当前目录及其子目录。可通过第四个参数设置;
    • 有效域:默认当前站点(子域),可通过第五个参数设置;
    • 是否仅安全传输:默认否,第六个参数设置;
    • HTTPONLY:默认否,第七个参数设置。

1.3、注意事项

    • cookie的值,仅仅支持字符串类型;
    • cookie的键(下标),可以写成数组下标的形式。

2、session

2.1、基本操作

增删该查都是通过$_SESSION数组来完成的。

2.2、属性

session的实现需要cookie的支持,它的属性和cookie的属性一样。

2.3、注意事项

    • session数据可以是任意类型的数据(cookie只能是字符串类型)
    • $_SESSION数组元素的下标只能是字符串型(关联型),不能是索引数组

2.4、session的销毁

    • unset():销毁session中某个数据,并没有销毁会话数据区;
    • $_SESSION = ARRAY():清空$_SESSION,并没有销毁会话数据区;
    • session_desroy(():销毁会话数据区。

3、cookie和session的区别

  cookie session
存储位置 浏览器端 服务器端
数据量
存储的数据类型 只能是字符串 任意类型
安全性 较低 较高
默认的有效路径 只能是当前目录及其子目录 整站有效

四、图像技术

1、GD图片制作

1.1、创建画布

imagecreatetruecolor(width,height);

1.2、创建画笔颜色

imagecolorallocate(img,red,green,blue);

1.3、绘制文字(在画布上画画)

imagestring(img,size,x,y,string,color);

1.4、输出或保存图片

    • 输出:imagepng(图片资源);

输出前要:

1)、设置响应头信息:header("content-type:image/png");

2)、清除缓存区数据:ob_clean();

    • 保存:imagepng(图片资源,路径/图片名称);

2、实现验证码

<?php

# 1、创建画布

$canWidth = 170; // 画布的宽

$canHei = 40; // 画布的高

$img = imagecreatetruecolor($canWidth, $canHei);

# 2、为画布填充背景色

$bgColor = imagecolorallocate($img, mt_rand(0,120), mt_rand(0,120), mt_rand(0,120));

imagefill($img, 1, 1, $bgColor);

#/3、定义在画布上的显示文字

// 显示随机字符的范围

$arr = array_merge(range(‘a‘, ‘z‘), range(‘A‘, ‘Z‘), range(0, 9));

// 得到指定位数的随机字符

$str = ‘‘;

shuffle($arr);

$charNum = 4; //验证码个数

$keyArr = array_rand($arr,$charNum);

foreach ($keyArr as $value) {

$str .= $arr[$value];

}

// 4、将字符写入到画布

$span = ceil($canWidth/($charNum+1));

for ($i=1; $i <= $charNum; $i++) {

// 为画布创建画笔色

$charColor = imagecolorallocate($img, mt_rand(120,255), mt_rand(120,255), mt_rand(120,255));

imagestring($img, 5, $span*$i, 12, $str[$i-1], $charColor);

}

// 5、创建干扰线

for ($i=0; $i < 8; $i++) {

//创建干扰线颜色

$linColor = imagecolorallocate($img, mt_rand(75,150), mt_rand(75,150), mt_rand(75,150));

//创建干扰线

imageline($img, mt_rand(0,$canWidth-1), mt_rand(0,$canHei-1), mt_rand(0,$canWidth-1), mt_rand(0,$canHei-1), $linColor);

}

// 6、显示图片

header(‘content-type:image/png‘);

ob_clean();

imagepng($img);

?>

五、文件操作

1、目录基本操作

    • 创建目录:mkdir(目录地址和名字,权限);
    • 删除删除:rmdir(目录地址);
    • 移动/重命名目录:rename(原始文件路径,新的文件路径);

(此处的移动实质上也是重命名,不过目录的名字不单单是文件名,还包括目录的路径,当我们改变目录的路径时,既是移动目录,也可以说是重命名;)

    • 获取目录内容:
  1. 打开目录,opendir,得到一个目录句柄(目录资源);
  2. 依次读取目录内的文件,readdir;
  3. 关闭目录句柄(closedir);

1.2、常用目录操作函数

    • getcwd:获取当前的工作路径;
    • chdir:改变当前的工作路径;
    • rewinddir:重置资源指针,回到第一个;
    • scandir:浏览某一目录,以索引数组的形式返回目录中内容。

1.3、递归遍历目录

bianli.php

<?php

/**

* 递归遍历文件

* @param string $path 目录路径(地址)

* @param int $deep=0 当前目录的深度

*/

function readDirs($path,$deep=0) {

$dir_handle = openDir($path); //得到$path目录的句柄

while (false !== $file = readDir($dir_handle)) {

//筛选掉./和../

if ($file == "." || $file == "..") {

continue;

}

//输出文件

echo str_repeat(‘-‘, $deep*3),$file,‘<br/>‘;

//进入递归点和递归出口

if (is_dir($path . ‘/‘ .$file)) {

readDirs($path . ‘/‘ .$file,$deep+1);

}

}

}

$path = ‘./‘;

readDirs($path);

?>

2、文件操作

2.1、文件基本操作

    • 读:file_get_contents;读取指定路径的文件内容,以字符串形式返回;
    • 写:file_put_contents;覆盖写,往指定文件写入指定数据,并覆盖以前的内容。如果需要追加数据,则需要设置第三个参数FILE_APPEND;

2.2、常用文件函数

    • filetype:获取一个文件的类型。windows下文件类型有三种,dir、file、unknown。
    • file_exists:判断一个文件是否存在;
    • is_dir:判断一个文件是否是dir文件;
    • is_file:判断一个文件是否是file文件;
时间: 2024-10-12 04:02:49

PHP中WEB典型应用技术的相关文章

#前端杂谈 【Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?via知乎 张秋怡】

先附上链接:Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 这是分享自知乎用户张秋怡的一个回答,用通俗形象的语言解释了关于前端的一些基本概念,比较适合像我这种刚入门的小白阅读.

读书笔记--大规模web服务开发技术

总评   这本书是日本一个叫hatena的大型网站的CTO写的,通过hatena网站从小到大的演进来反应一个web系统从小到大过程中的各种系统和技术架构变迁,比较接地气. 书的内容不是很难,所以总的来说比较容易阅读,不需要特别累的啃,可想而知,不是非常深入的,更多的还是把作者的一些经验写出来,hatena这种量级的在国内应该是一个中型网站的水平,作者基本把这个量级web服务的运维的方方面面都讲了一遍,看完可以对这个这种量级网站有一个总体的了解,个人认为还是值得一读的. 逐章读书笔记: 第一章 大

Web Service 附件技术的发展及演变

Web Service 通常将业务数据封装在 SOAP 主体或者 SOAP 消息附件中进行传输,这些附件往往采用 Base64 编码二进制方式进行封装,这将大大增加待传输的数据量,消耗比较长的编码时间和传输时间.随着 SOA 以及 Web Service 技术的广泛采用,由于网络带宽,延时的影响以及内存大小的限制,越来越多的应用对 Web Service 附件传输方式以及传输效率提出了更高的要求. 引言 本文对 Web Service 附件技术及其相关开发工具进行了总结,详细介绍了 Web Se

Linux 中的零拷贝技术,第 2 部分

技术实现 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.第一部分主要介绍了一些零拷贝技术的相关背景知识,简要概述了 Linux 为什么需要零拷贝技术以及 Linux 中都有哪几种零拷贝技术.本文是本系列文章的第二部分,针对第一部分内容中提到的几种零拷贝技术分别进行更详细的介绍,并对这些零拷贝技术的优缺点进行分析. 0 评论: 黄 晓晨, 软件工程师, IBM 冯 瑞, 软件工程师, IBM 2011 年 1

web典型应用

关于web 典型应用; 此处是以传智的论坛为模板写的项目;具有注册用户,登录,发帖,回复等功能; 第一个功能的实现:用户的注册 先是创建MySQL数据表: 1 create table user( 2 user_id int unsigned primary key auto_increment comment '主键ID', 3 user_name varchar(20) not null unique key comment '用户名', 4 user_password char(32) n

【转】Web前端黑客技术揭秘{笔记}

原文 http://www.cnblogs.com/r00tgrok/articles/Web-Hacking.html 前些日子看完了白帽子讲Web安全,当时就PHP安全一 章做了点小笔记,感觉看书还是留下点东西比较好.翻开Web前端黑客技术揭秘一书决定要做笔记,但是这样下来其实进度就比较慢了,敲字做笔记绝对远比看书 来的慢.有时候上午看完的内容做笔记时要花一天时间,一方面是要敲字,另一方面是自己只从书上摘录部分内容有时候需要将其串起来,还有就是碰上自己想发两 句言也会拖慢进度.总之现在书是看

中大型移动互联网公司技术架构选择(转载)

原文地址:http://2014.54chen.com/blog/2014/03/05/ihaveadream/ 总体思考 总结这些年经验,进行构架演进的方向选择时,大致要做到下面的目标: 可快速开发部署 (五分钟写出来一个经过测试的hello world并可访问/调用,并可在公网访问) 天然可扩展(业务层无状态,尽可能全部放到最后) 自动化(内存不足了,除了报警,应该自动加点机器进去; 新的项目,基础代码应该都不用写,自动生成即可) 框架化(公共层面的东西尽可能框架化,一层类似日志.count

Java Web之会话技术

客户端与服务器通信过程中,会产生一些数据.比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存.根据Java Web之Servlet技术中所说,HttpServletRequest对象和ServletContext对象都可以保存数据,但是这二者在该情形下是不适合使用的. 客户端的每次请求,服务器都会产生一个HttpServletRequest对象,该对象只保存本次请求所传递的数据.由于购买和结账是两

第一章 Java Web应用开发技术

1.Java Web应用开发技术 Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支持两类软件的开发和应用,一类是做高级信息系统框架的Web应用服务器(Web Application Server),另一类是在Web服务器上运行的Web应用(Web Application).我们以后所说的Java Web应用开发就是这里的第二类.即在Web服务器上