前言:
PHP是一种流行的服务器端编程语言,它被设计用于Web开发。PHP最初由Rasmus Lerdorf于1995年创建,现在已经成为世界上最流行的Web编程语言之一;是一个开源的语言,可以在各种操作系统上运行,包括Windows、Linux、Unix和Mac OS X。它易于学习和使用,并提供了广泛的文档和支持社区。PHP可以与HTML一起使用,以生成动态的Web页面。它允许你连接到数据库并处理表单数据,还支持文件上传和图像处理等功能。PHP还可以与其它技术如JavaScript、XML和Ajax一起使用,以实现更复杂的Web应用程序。
最新版本的PHP是PHP 8,它带来了更快的性能、更好的类型系统、更好的错误处理和改进的安全性。与之前的版本相比,PHP 8还引入了一些新的功能和语法,使开发人员能够更轻松地编写高质量的代码。
PHP简介
PHP
即服务端的脚本 / 编程语言,用来生成动态的网页
Hypertext Preprosessor 超文本预处理器(底层 C语言)
静态 / 动态 网站
1️⃣静态网站
1.网页内容一经发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都是保存在网站服务器上的,也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件;
2.静态网页的内容相对稳定,因此容易被搜索引擎检索;
3.静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难;
4.静态网页的交互性较差,在功能方面有较大的限制。
📜Apache Web服务器软件
1.解析网页语言,如html,php,jsp等
2.接收web用户的请求,并给予一定的响应
2️⃣动态网站
1.交互性:网页会根据用户的要求和选择而动态地改变和响应,浏览器作为客户端,成为一个动态交流的桥梁,动态网页的交互性也是今后Web发展的潮流。
2.自动更新:即无须手动更新Hhtmo文档,便会自动生成新页面,可以大大节省工作量。
3.因时因人而变:即当不同时间、不同用户访问同一网址时会出现不同页面。
此外动态网页是与静态网页相对应的,也就是说,网页Url 的后缀不是. hth、. html、. shtml.. xml等静态网页的常见形式,而是以. asp、. jsR、. php、. pexl、.cgi等形式为后缀。在动态网页网址中有-一个标志性的符号--“?”
网站概念
1.服务器
服务器(server), 也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。
在网络环境下,根据服务器提供的服务类型不同,分为文件服务器,数据库服务器,应用程序服务器,WEB 服务器等。
例:Web服务器:提供web服务(网站访问),就需要安装web服务软件
2.IP
IP: Internet Protocol, 网络之间互联协议。网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP 地址具有唯一性。(即每台电脑都有一个唯一的IP地址)
3.域名
域名(Domain Name),是由一串用点分隔的名字组成 (www. itcast. cn)的Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置,地理上的域名,指代有行政自主权的一个地方区域)。域名是一个IP地址上有“面具”。一个域名的目的是便于记忆和沟通的一组服务器的地址(网站,电子邮件,FTP等)。
域名作为力所能及难忘的互联网参与者的名称。
如:特殊IP:127.0.0.1 代表本机
特殊域名:localhost
4.DNS
DNS (Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
用户输入域名 localhost ——> DNS(localhost 127.0.0.1——> 服务器电脑 即域名解析
5.端口
端口(Port), 可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。
Web程序访问流程
浏览器发起访问——>DNS解析域名——>服务器电脑——>服务软件
URL:Uniformed Resource Location 统一资源定位 (绝对路径)
URI(Identifier)统一资源标识 目标及其上相对某个文件夹的相对路径
静态网站访问
动态网站访问
虚拟主机就是将计算机中不同的文件夹进行不同的命名,然后可以实现让服务器(Apache)根据用户的需求从不同的文件夹(网站)中读取不同的内容。
在Apache中,可以将虚拟主机划分成两类: .
1、 基于IP的虚拟主机:一台电脑上有多个IP,每个IP对应一个网站。
原理:电脑默认只有一个IP,因为通常只配有一一个网卡;但是有的电脑(服务器居多)可以配置多个网卡,每个网卡可以绑定一个IP地址。。
2、 基于域名的虚拟主机: 一台电脑上只有一个IP,但是IP下可以制作多个网站,但是需要给每个网站不同的名字(虚拟主机名)。
PHP上手初步
1.PHP代码标记
在PHP历史发展中,可以使用多种标记来区分PHP脚本
- ASP标记: <% php代码%>
- 短标记: <? Php代码?>, 以上两种基本弃用,如果要使用那么需要在配置文件中开启。
- 脚本标记: <script language=" php" >php代码</script>
- 标准标记(常用): <?php php代码?>
PHP语句分隔符
① PHP中标记结束符 ?> 有自带语句结束符的效果,最后一行PHP代码可以没有语句结束符 “;”
② PHP 中其实很多代码的书写并不是嵌入到HTML中,而是单独存在,通常书写习惯中就不建议使用标记结束符?>, PHP会自动从开始到最后全部认为是PHP代码,从而解析。
2.变量的使用
PHP中的所有变量都必须使用“$”符号。
1、定义:在系统中增加对应的变量名字(内存)
2、赋值:可以将数据赋值给变量名(可以在定义的同时完成)
3、可以通过变量名访间存储的数据 echo $var2;
4、可以将变量从内存中删除
(1)预定义变量
预定义变量: 提前定义的变量,系统定义的变量,存储许多需要用到的数据(预定义变量都是数组)
$_ GET:获取所有表单以get方式提交的数据。
$_ POST: POST提交的数据都会保存在此
$_ REQUEST: GET和POST提交的都会保存。
$GLOBALS: PHP 中所有的全局变量
$_ SERVER: 服务器信息。
$_ SESSION: session 会话数据
$_COOKIE: cookie 会话数据
$_ENV: 环境信息
$_FILES:用户上传的文件信息
(2)可变变量:
如果一个变量保存的值刚好是另外一个变量的名字,那么可以直接通过访问一个变量得到另外一个变量的值:在变量前面再多加一个$符号。
- $a ='b';
- $b ='bb';
- echo $$a;
(3)变量传值
——将一个变量赋值给另外一个变量
①值传递:将变量保存的值赋值一份, 然后将新的值给另外一个变量保存(两个变量没有关系)。
②引用传递:将变量保存的值所在的内存地址,传递给另外一个变量:两个变量指向同一块内存空间(两个变量是同一个值)。
在内存中,通常有以下分区。
- 栈区:程序可以操作的内存部分(不存数据,运行程序代码),少但是快
- 代码段:存储程序的内存部分(不执行)
- 数据段:存储普通数据(全局区和静态区)
- 堆区:存储复杂数据,大但是效率低
引用传递基本一致
3.常量:
const / constant , 是一种在程序运行当中,不可改变的量(数据)
1、使用定义常量的函数: define('常量名’,常量值);
2、5.3之后才有的: const 常量名=值;
//使用函数定义常量: define
define('PI' ,3.14);
//使用const关键字定义
const PII = 3;
常量名字的命名规则
1、常量不需要使用 “$”符号,一旦使用系统就会认为是变量;
2、常量的名字组成由字母、数字和下划线组成,不能以数字开头;
3、常量的名字通常是以大写字母为主(与变量以示区别);
4、常量命 名的规则比变量要松散,可以使用-些特殊字符,该方式只能使用define定义;
4.数组
PHP支持两种数组: 索引数组( indexed array ) 和 联合数组( associative array),前者使用数字作为键,后者使用字符串作为键。
数组可以构造成一系列“键-值( key-value)”对,其中每一对都是数组的一个项目或元素( element )。对于列表中的每个项目,都有一个与之关联的键(key)或索引(index)
(1)声明数组
在PHP中声明数组的方式主要有两种:
①应用 array( ) 函数声明数组
②直接通过为数组元素赋值的方式声明数组
Ⅰ.直接赋值方式
一个变量声明为一个数组元素有三种方法:
1️⃣不指定数组元素的“键”
示例程序: $characters[ ] = "humour";
2️⃣将数组元素的“键”指定为某个整数
示例程序: $interests[2] = "music";
3️⃣将数组元素的“键”指定为某个字符串
示例程序: $colors["red"] = "red";
Ⅱ.数组元素 “值”的访问
通过指定数组名并在方括号内指定“键名”的方式“访问”
数组元素的“值”
$ages['Peter'] ="32" ;
$ages['Joe'] = "34";
//显示
echo "Peter is . $ages[ 'Peter'] . " years old. ";
✍🏻通过array( )函数声明数组:
$array_ name = array ([key]=>value],[[key]=>value]...[[key]=>value]);
⭕注意 :
元素键名在数组中不能重复,如有重复后面的元素将会覆盖前面同键名的元素,它与数组元素一一对应。
如不指定数组元素键名,PHP 将按照第1个出现的未指定键名的元素的索引名为0,之后元素的键名为当前最大整数键名加1。
$arr_tmp = array("张三",3=>"男",32,"G03"=>"广州","大二");
✍🏻该数组第1个元素没有指定键名,所以其默认键名为0,因为第2个元素指定了键名为3,故第3个元素的键名为 3+1 即4,第5个元素的键名为4+1即5,该数组的结构如下所示:
Array([0]=>张三,[3]=>男,[4]=> 32,[G03]=>广州,[5]=> 大二)
(2)二维数组
二维数组是指数组的元素本身也是数组。二维数组的定义与使用与一维数组相同,不同的是数组元素也是数组。
✍🏻定义二维数组:
$arr_ goods = array(
"tv"=>array("日立","三星""海信","创维"),
"computer"=>array("think pad","dell","联想","华硕"),
"network"=>array("tp-link" ,"d-link","华为")
);
✍🏻访问数组元素:
$arr_ goods["network"][0];
// 访问键名为network的第1个二级元素
(3)遍历数组
1️⃣使用 foreach 结构 遍历数组:遍历数组元素最常用的方法
✍🏻//定义数组
$ages = array( "Peter"=>32,"Quagmire"=>30, "Joe"=>34);
//遍历数组,不使用下标
foreach($ages as $age){
echo"$age </br>";
}
//遍历数组,使用下标
foreach($ages as $name=>$age){
echo "$name's $age </br>";
}
2️⃣使用 for结构 遍历数组:如果数组是数字索引数组,并且
数组的索引值为连续的整数
//定义数组
$names = array( "Peter", "Quagmire","Joe");
//遍历数组,不使用下标
for ( $i=0; $i<count ($names); $i++){
echo $names [$i]."</br>";
}
(4)输出数组元素
1️⃣bool print r ( mixed expression )
如果该函数的参数 expression 为普通的整型、字符型或实
型变量,则输出该变量本身。如果该参数为数组,则按一
定键值和元素的顺序显示出该数组中的所有元素
2️⃣void var dump ( mixed expression [, mixed expression[, ..]] )
此函数显示关于一个或多个表达式的结构信息,包括表达式
的类型与值。数组将递归展开值,通过缩进显示其结构。
连接数据库
1.建立数据库连接
mysqli_connect(host,username,password);
die( )函数输出一条消息, 并退出当前脚本。
2.选择数据库
mysqli_select_db(connection,dbname);
3.数据库操作函数
mysqli_query(connection,query) | 函数向指定连接发送一条SQL语句; connection必需,规定要使用的MySQL连接。query必需,规定查询字符串。对于查询语句当函数成功执行则返回查询结果集的资源引用,否则返回false; 对于其他SQL语句成功执行返回true,否则为false. |
mysql_num_rows(resource result) | 该函数取得结果集的行数;参数result为执行SQL语句返回的结果集。函数查看select语句查询到的表 |
mysqli_num_fields(resource result) | 该函数取得结果集中字段的数目;参数result为执行SQL语句返回的结果集。 |
mysqli_fetch_array(resource result[,int result_type]) | 函数从结果集中取得结果集指针指向的记录行,由记录行的各个字段的内容组成一个数组;可选参数result_type决定返回数组的索引方法,可选值包括: MYSQL_ ASSOC、MYSQL_ NUM和MYSQL BOTH。 |
mysqli_fetch_assoc(resource result) | 该函数与mysql fetch_ array( )具相同功能。返回数组中每个元素对应一个字段,且元素键名为字段名,字段值为元素值。 |
mysqli_free_result(resource result) | 释放结果集。 |
mysqli_close(connection) | 关闭数据库连接。 |
4.数据查询
请编写程序查询并显示论坛数据库中的用户表中的记录。
✍🏻分析: 在要获得用户表(tbl_ user) 中的记录,在创建与数据库连接的基础之上,使用mysqli_ query函 数执行一条SQL 查询语句。由于要显示所有用户记录,因此该SQL语句是“select * from tbl_user ”。
数据库访问层设计
帖子数据表设计
帖子数据表 tbl_topic 的核心业务包括
■发表新帖子
■修改、删除帖子
■查询帖子详细内容
■统计发贴数量
■获取最新帖子
■获取版块帖子列表
topic.php
//取版块最新的帖子
function findLastTopic($boardld){
$strQuery= " select * from tbl _topic t.tbl_user u where t.uld = u.uld and boardld = $boardld order by publshTime desc limit 0,1 "; //0表示查询索引值 第一条数据,1表示查询获取数据数量
$rs = execQuery($strQuey),//执行统计
if(count($rs)>0){
return $rs[0];
}
return $rs;
}
//分页获取帖子信息
function findListTopic($page.$boardld){
$pageSize= $GLOBALS["cg"]["server"]["page_size"];
if($page >= 1){//分页处理
$page --;
}
$page *= $pageSize;
//分页查询
$strQuery = "select * from tbl_topic t.tbl _user u where t.uld= u.uld and boardld= $boardld order by publishTime desc limit $page, $pageSize";
$rs = execQuery($strQuery); //执行查询
return $rs;
}
config.php
function bbsError($ermo. $errstr){
//使用header函 数将错误信息转发到错误显示页面
die(header("location:./ Jerror.php?msg=$errstr"));
}
//初始变量
//数据库服务器参数配置
$cfg["server]["adds"]="localhost"; //二维数组
$cfg["server]["db_user"] = "root";
$cfg["server]["db_psw"] =" ";
$cfg["server]"db_name"] = "cxbbs";
$cfgl["server"]["page_size"]= 20;
//设置用户自定义的错误处理函数set_error_handler(error_ function,error _types)
set_ error handler("bbsError".E_ERROR);
comm.php
require_once 'config.php'; //引入配置文件
//公共方法集,引入数据库
SESSION与COOKIE的区别
①COKIE在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
②Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
1、保存的位置不同
cookie保存在浏览器端,session保存在服务端。
2、使用方式不同
cookie如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。
session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
3、存储内容不同:
cookie只能存储字符串,而session存储结构类似于hashtable的结构,可以存放任何类型。
4、存储大小:
cookie最多可以存放4k大小的内容,session则没有限制。
5、安全性:
session的安全性要高于cookie
6、cookie的session的应用场景:
cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录;
session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息或者购物车的信息。
7、session和cookie的弊端:
cookie的大小受限制,cookie不安全,如果用户禁用cookie则无法使用cookie。如果过多的依赖session,当很多用户同时登陆的时候,此时服务器压力过大。sessionId存放在cookie中,此时如果对于一些浏览器不支持cookie,此时还需要改写代码,将sessionID放到url中,也是不安全。
会话技术
web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
HTTP协议的特点是无状态/无连接,当一个浏览器连续多次请求同一个web服务器时,服务器是无法区分多个操作是否来自于同一个浏览器(用户)。会话技术就是通过HTTP协议想办法让服务器能够识别来自同一个浏览器的多次请求,从而方便浏览器(用户)在访问同一个网站的多次操作中,能够持续进行而不需要进行额外的身份验证。
会话技术分类
(1) cookie技术
Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。
Cookie是由Web 服务器保存在用户浏览器(客户端)上的小文本文件(HTTP协议响应头设置),它可以包含有关用户的信息。无论何时用户链接到服务器(HTTP请求携带数据),Web 站点都可以访问Cookie信息
(2) session技术
Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。 Session 技术是将数据保存到服务器端,无论何时用户链接到服务器, Web站点都可以访问Session信息。 SESSION技术的实现是依赖COOKIE技术的。
两种会话技术区别
(1) 安全性方面
(a) Session 存储服务器端,安全性高
(b) Cookie 存储浏览器段,安全性低
(2)数据大小方面
(a) Cookie 的数量和大小都有限制(20 个/4K)
(b) Session 数据存储不限
(3)可用数据类型
(a) Cookie 只能存储简单数据,数值/字符串
(b) Session 可以存储复杂数据( 自动序列化)
(4)保存位置方面
(a)Cookie保存在浏览器上
(b)Session保存在服务器上