PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。主要适用于Web领域的开发,能够完成动态网页的制作。
PHP是目前最流行的网站开发语言(B/S结构)之一。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
支持几乎所有流行的数据库以及操作系统。
源码开放、免费(free)
php是世界上最好的语言
静态网站:使用浏览器端语言进行编程,网站由静态代码(HTML.CSS,JS)组成。
动态网站 :网页通过服务器的程序(php等)动态生成。用户可以和服务器进行交互(可以根据用户输入的不同信息,返回不同的运行结果)
总结
动态网站的 动
指的是网站数据的动
而不是 视觉上的动
;
软件架构可以分为BS架构与CS架构
Client/Server架构,即客户端/服务器架构。需要安装对应的客户端软件,才能获取服务器的服务。
常见的CS架构:
QQ、LOL、微信等
特点:
需要安装才能使用
性能高效,使用更加稳定和流畅
Broswer/Server架构,即浏览器/服务器架构。随着Internet的兴起,无需安装专门客户端软件,通过浏览器去请求服务器;
不需要安装,只需要浏览器即可。
相比CS架构,性能相对较差,没有那么流畅和稳定。
HTML运行原理
1) 在浏览器的URL地址栏中输入 www.baidu.com/index.html 地址,点回车。请求就发送给百度服务器。
2) 百度服务器找到index.html文件,并将文件的内容返回给浏览器3) 浏览器接收到index.html中的内容,渲染到页面上。
同理: localhost/a.html , 则会返回 本机web服务器根目录下 a.html文件的内容。浏览器拿到内容后进行渲染。
PHP运行原理
apache不认识php 浏览器也不认识php
1) 在浏览器地址栏中输入 localhost/index.php ,点回车之后。将请求发送给apache服务器。
2) 服务器找到 index.php文件之后,转发给php解释器
3) php解释器将index.php文件中的php代码全部转为字符串,再返回给apache
4) apache将处理好的字符串返回给浏览器,浏览器渲染后就可以看到页面
php是一门弱类型语法,变量的类型可以随意改变。变量其实就是存储数据的容器
变量的命名规则
//1. 不需要关键字进行声明,变量在第一次赋值的时候被创建。
//2. 必须以$符号开始
//3. $后面的命名规则与js的变量命名规则一致。
$name = "呵呵";
echo $name;
删除变量
unset($var);
销毁指定的变量
判断变量是否设置值
bool isset($var)
检测变量是否设置,并且不是 NULL。
变量未设置或者设置为null,返回false(认为变量没有设置)。其余情况全部为true。一般用来判断变量是否设置,因为变量未设置,无法直接使用。(变量先赋值,在使用!)
判断变量是否为空
bool empty($var)
判断变量是否为空。PHP中认为变量的值为:""、0、"0"、NULL、FALSE、[]时,变量虽然赋值了,但是无实际的意义。为空。
php数据类型: 8种数据类型
基本数据类型: 布尔, 字符串, 整数, 浮点数
复合数据类型:数组, 对象
特殊的类型:resource(资源) null
字符串
$str = "php是世界上是最好的语言";
echo $str;
整数
$num = 100;
echo $num;
浮点型
$float = 11.11;
echo $float;
布尔类型
$flag = true;
//当布尔类型值为true时,输出1
echo $flag;
$flag = false;
//当布尔类型为false时,输出空字符串
echo $flag;
字符串连接符
//1. 在php中,+号只有算数的功能,并不能拼串
//2. 在php中,拼串使用.
$name = "大象";
echo "大家好,我是" . $name . ",今年18岁";
php中的单引号与双引号
//1. 字符串的定义可以使用单引号,也可以使用双引号
$name = "大象";
$desc = '很帅';
//2. 双引号可以解析变量
//3. 单引号的性能会高于双引号(了解)
$str = '$name 很帅';
echo $str;//$name 很帅
$str = "$name 很帅";
echo $str;//大象 很帅
在php中,数组分为两种,索引数组和关联数组
计算数组长度的方法: count(数组名);
索引数组(类似与JS中的数组)
$arr = array("张飞","赵云","马超");
echo $arr;//echo只能打印基本数据类型
echo $arr[0];//张飞
关联数组(类似与JS中的对象)
//属性名必须用引号引起来
$arr = array("name"=>"zhangsan", "age"=>18);
echo $arr["name"];
输出语句
//1. echo 输出简单数据类型
//2. print_r 输出数据结构,一般用于输出复杂类型。
print_r($arr);//print_r是一个函数,不要忘记小括号
//3. var_dump 输出完整的数据结构,包括类型,一般用于精准调试
var_dump($arr);
二维数组
数组中的每个元素又是一个数组二维数组的存取元素,需要两次访问,依次确定行和列
$arr[x][y]
;
//索引数组
$arr=[
[1,2,3],
[4,5,6],
[7,8,9]
];
//取值
echo $arr[2][2];
//存储一个人信息
$info=[
"name"=>"zs",
"age"=>100
];
//存储一个班信息
$infos=[
[
"name"=>"zs",
"age"=>100
],
[
"name"=>"ls",
"age"=>100
],
[
"name"=>"ww",
"age"=>100
]
];
//取值
echo $infos[1]["name"];
在php以及其他高级语言中,都有类的概念,表示一类对象,跟js中构造函数类似。
//定义一个类(类似js的构造函数)
class Person {
public $name = "小明";
public $age = 12;
private $sex = "男";
}
$zs = new Person;
print_r($zs);//打印对象的结构信息
echo $zs->name;//对象中取值用 ->
echo $zs->age;
echo $zs->sex;//私有属性,无法获取
基本上来说,所有语言的if..else语法都是一样
$age = 17;
if ($age >= 18) {
echo "终于可以抽烟喝酒烫头了";
} else {
echo "哎......";
}
//===================
switch(变量){
case 值1:
程序块1;
break;
case 值2:
程序块2;
break;
...
default:
程序块
}
while(判断表达式){
程序块;
}
for(赋值表达式; 判断表达式; 步进表达式){
程序块;
}
do{
程序块
} while(判断表达式)
遍历索引数组
$arr = array("张三", "李四", "王五", "赵六", "田七", "王八");
//获取数组的长度: count($arr)
for($i = 0; $i < count($arr); $i++) {
echo $arr[$i];
echo "
";
}
foreach 语句结构
用来遍历数组(关联数组和索引数组均可)。
foreach($arr as $key=>$value){程序体}
foreach($arr as $value){程序体}
$arr : 要遍历的数组
$key: 单元的下标,可以是任意变量名
$value: 单元的值,可以是任意变量名
//遍历关联数组
$arr = array(
"name"=>"zs",
"age"=>18,
"sex"=>20
);
foreach($arr as $k => $v) {
echo $k . "=" . $v . "
";
}
contiune和break
contiune: 结束当前循环,直接跳入下一次循环break: 结束整个循环
注意,在php中函数不能重复声明
";
[return 返回值;]
}
sayHello();//不传参数,会使用默认值
sayHello("大象");//传参数,默认值不生效
?>
php中关于函数需要注意的问题:
在php中函数不能重复声明
函数体内的变量只在函数体内有效
函数体外的变量只在函数体外有效
保存不会发生改变的数据(如:3.1415, 路径等)时,最好使用常量。
常量的使用方法: 1) 声明: define(常量名, 常量值, 大小写区分标志);
true(不区分)/false(区分/默认);
2) 调用: echo 常量名;
注意:一般在实际工作中,常量都用大写
max(),min() 分别返回一组数的最大值及最小值;
abs() 返回绝对值。
floor() 向下取整。
ceil() 向上取整。
round() 四舍五入。
rand(min, max) 返回随机数,可以取到两端的值。
time() 返回当前的 时间戳(1970到现在的时间的秒数)
date(format,time) 格式化一个本地时间或日期
年-月-日 时:分:秒
格式:Y(年) m(月) d(日) H(时) i(分) s秒
$time=time();//获取时间戳
echo date('Y-m-d H:i:s',$time); //格式化时间戳
默认时区会不太正确, 我们在东八区, 比0时区会多八小时
路径: D:\phpStudy\php\php-5.4.45
在php.ini里加上找到date.timezone项,设置date.timezone = "PRC",重启环境就ok了。
注意: 默认 date.timezone前面有个分号(;)在配置中分号是注释,要记得把分号删除掉,才能生效
PRC: 中华人民共和国
str_replace(查找的值,替换的值,执行替换操作的字符串) 字符串替换
trim(字符串); 去除首尾空白字符
explode(分割符,执行分割的字符串); 使用一个字符串分割另一个字符串,返回一个分割后的数组(类似split)
implode(连接符,执行连接的数组); 将数组根据连接符拼接成字符串(类似join)
substr( 字符串,起始索引,截取长度 ); 截取字符串 中文占3个字节长度
strchr(字符串,标识字符); 从左向右找标识字符,返回该字符后全部字符(包括该字符)
strrchr(字符串,标识字符); 从右向左找标识字符,返回该字符后全部字符(包括该字符) 主要用于获取后缀名
PHP本身支持与HTML混编
混编的文件后缀必须为 .php, Apache 才会调用 PHP 解析
PHP与HTML混编时,服务器中的 PHP 引擎 只会执行php标签内部的PHP代码,非PHP的代码(PHP标签外部的内容)直接忽略,最后会将PHP的执行结果和非PHP代码 一起返回给浏览器,由浏览器进行解析
百度一下
介绍
不同的页面中有相同的代码部分,可以将其分离为单个文件。需要调用时,include 引入对应的文件即可调用。提高代码的复用率。
类似于 js 中 script 标签导入, 可以用于函数复用
语法
include | include_once "文件的路径"
include 与 include_once区别
include 可以重复引入文件
include_once 只引入一次,防止多次引入文件
程序运行过程中,数据存储在内存中的,程序结束, 数据会销毁
如果希望可以永久存储某些数据,可以将数据存储在硬盘上(存储在文件中)
将数据由 内存 存储到硬盘的过程,称为数据持久化;
file_get_contents(path) 根据路径读取文件内容, 得到一个字符串
file_put_contents(path,$str) 将一个字符串写入到一个文件中。(只能存储字符串)
int file_put_contents(string $file, string $data[, constants flag]);
参数1: 文件路径
参数2: 要写入文件的字符串
参数3: 可选参数,默认不写,新内容覆盖原文件中的内容;FILE_APPEND是向文件中追加内容
返回值: 写入文件的字符串长度(不用记)
注意: 如果我们要将一个关联数组存储到本地文件,会造成数据丢失.
json_encode($data); 将PHP变量转成JSON格式字符串(常用于把数组转成json字符串)。
json_decode($str,true); 将 JSON 字符串, 转换为 PHP 数组。
表单(form):表单用于收集用户输入信息,并将数据提交给服务器。是一种常见的与服务端数据交互的一种方式
//1. action: 指定表单的提交地址
//2. method: 指定表单的提交方式,get/post,默认get
//3. input的数据想要提交到后台,必须指定name属性,后台通过name属性获取值
//4. 想要提交表单,不能使用input:button 必须使用input:submit
php获取表单数据
// $_GET 是 PHP 系统提供的一个超全局变量,是一个数组,里面存放了表单通过get方式提交的数据。
// $_POST 是 PHP 系统提供的一个超全局变量,是一个数组,里面存放了表单通过post方式提交的数据。
get与post的区别
//1. get方式
//1.1 数据会拼接在url地址的后面?username=pp&password=123456
//1.2 地址栏有长度限制,因此get方式提交数据大小不会超过4k
//2. post方式
//2.1 数据不会在url中显示,相比get方式,post更安全
//2.2 提交的数据没有大小限制, 可用于文件上传
html要求
1. 文件上传的提交方式必须是post方式
2. 需要给form指定enctype="multipart/form-data"
3. 指定name属性,后台才能获取到
php相关
文件上传时,通过$_FILES
才能获取到,这是一个二维数组。
Array
(
[photo] => Array
(
[name] => 001.jpg // 文件名字
[type] => image/jpeg // 文件类型
[tmp_name] => C:\Users\Jepson\AppData\Local\Temp\phpF2A0.tmp // 上传图片临时保存的位置
[error] => 0 // 上传错误码, 错误码为 0 表示没有错误
[size] => 6000 // 文件大小, 单位字节, 大小 6kb 左右
)
)
上传文件时,文件会临时保存在服务器上,如果文件最终没有保存,那么临时文件会被删除,保证服务器安全。
sleep(10)
可以让代码延迟10秒钟才执行。
move_uploaded_file($path, $newPath);
可以保存临时图片
// 保存图片的完整代码
// 思路:
// 1. 在文件上传成功的情况下, 进行图片的保存 error == 0
// 2. 获取临时文件路径
// 3. 随机生成新的文件名, 注意文件中后缀名是不能改变的
// 4. 根据新的文件名, 转移临时文件
$file = $_FILES['photo'];
// 判断上传是否成功
if ( $file['error'] == 0 ) { // 上传成功
// 1. 获取临时文件路径
$ftemp = $file['tmp_name'];
// 2. 随机生成新的文件名, 后缀不能随便起, 要获取一下
$name = $file['name'];
$text = strrchr($name, '.');
// 为了防止重复, 生成随机的文件名以当前时间秒数+随机数组成
$newName = time().rand(10000,99990).$text;
// 3. 进行转存
move_uploaded_file($ftemp, "./upload/$newName");
}
协议:
协议,就是事先的一种约定、规则、规范、标准。
常见协议
HTTP、HTTPS 超文本传输协议
FTP 文件传输协议
SMTP 简单邮件传输协议
HTTP协议
HTTP协议即超文本传输协议, 是一个 [浏览器端] 和 [服务器端] 请求和响应的标准
常用请求方法 GET, POST
请求 (request):请求行、请求头、请求主体
。
响应 (response):状态行、响应头、响应主体
。
请求/请求报文
请求由浏览器发起,其规范格式为:请求行、请求头、请求主体。
响应/响应报文
响应由服务器发出,其规范格式为:响应行(状态行)、响应头、响应主体。
get请求的请求报文详解
//--------------------------请求行--------------------------------
// GET 请求方式
// /day02/01.php?username=pp&password=123456 请求路径+参数(注意点)
// HTTP/1.1 HTTP的版本号
GET /day03/01.php?username=pp&password=123456 HTTP/1.1
//--------------------------请求头--------------------------------
// Host:主机地址
Host: www.study.com
// HTTP1.1版本默认开启,建立过连接后,TCP连接不会断开,下次连接可以继续使用(底层,不用管)
Connection: keep-alive
//chrome浏览器自己增加的,不用管
Upgrade-Insecure-Requests: 1
//浏览器的代理字符串(版本信息)
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36
//浏览器端可以接受的类型。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,`*/*`;q=0.8
//从哪个页面发出的请求
Referer: http://www.study.com/day02/01-login.html
//检查浏览器支持的压缩方式
Accept-Encoding: gzip, deflate, sdch
//浏览器支持的语言,优先中文。
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
//----------------------------请求主体-------------------------------------
//get请求没有请求体,因为要传递的数据已经拼接到了请求主头中
POST请求的请求报文
//-----------------------请求行---------------------------------------------
POST /day02/01.php HTTP/1.1
//-----------------------请求头--------------------------------------------
Host: www.study.com
Connection: keep-alive
//传递的参数的长度。
Content-Length: 29
Cache-Control: max-age=0
Origin: http://www.study.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36
//内容类型:表单数据,如果是post请求,必须指定这个属性。
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,`*/*`;q=0.8
Referer: http://www.study.com/day02/01-login.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
//------------------------请求体------------------------------------------
username=pp&password=123456
GET请求与POST请求的对比
GET请求没有请求体,因为GET请求的参数拼接到地址栏中了
POST请求有请求体,就是传递的参数。
//---------------------响应行(状态行)-------------------------------
//HTTP/1.1 HTTP版本
//200 响应的状态
//200表示成功
//302页面重定向
//304表示文档未修改
//404表示找不到资源
//500表示服务端错误
HTTP/1.1 200 OK
//----------------------响应头-----------------------------------------------
Date: Thu, 22 Jun 2017 16:51:22 GMT //服务器的时间
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 //服务器的版本信息
X-Powered-By: PHP/5.4.45 //后台编程语言信息
Content-Length: 18 //服务器的响应主体长度
//内容类型,告诉浏览器该如何解析响应结果
Content-Type: text/html;charset=utf-8
//-----------------------响应主体------------------------------------------------
用户登录成功
初识数据库概念
专门用来存储、管理数据的仓库 英文:Database, DB。
数据库的分类
关系型数据库: 基于表, 表与表之间可以存在关系,可以进行多表查询的存储方式, 适合较为复杂的存储
如: MySQL, SQL Server, oracle
表结构:
每一行代表一条数据 --- 记录
每一列都是一类数据 --- 字段
订单编号 | 商品名称 | 价格 | 数量 |
---|---|---|---|
100123 | 华为mate10 | 4999 | 2 |
100124 | 花裙子 | 499 | 1 |
订单编号 | 用户 | 配送地址 |
---|---|---|
100123 | 隔壁老王 | 北京市京顺路99号 |
100124 | 隔壁老宋 | 北京市清华大学1号楼 |
非关系型 数据库: 基于键值对的存储方式, 数据之间没有耦合性, 特点执行效率高 mongodb
//类似对象的键值对形式
{
"username": "gblw",
"password": 123456,
"uid": 007
}
MySQL只是一个数据库软件,如果我们要创建数据库,或对数据库进行增删改查,刚开始可以用可视化工具来操作,让我们更加直观的了解数据库
也就是数据库中可以存储的数据类型(又叫做字段类型)
字段类型初步介绍
整型 int
存储如年龄,产品数量,编号等。
小数类型 float , decimal
重量,工资,奖金,价格等
使用decimal类型,实现小数的精确存储,一般用来存储与钱有关的数字。3.333333331
字符串型 varchar(M),char(M) ,text
M为该字段可以存储的最多字符数(字节)
如varchar(10)最大可以存储10个字节
varchar一般用来存储长度变化比较大的字符串,如文章标题,商品名称,
char存储长度比较固定的字符串,如手机号,身份证号,序列号,邮编。
此外可以使用text类型,存储较长的字符串,无需指定字符串的具体长度。
日期时间型 datetime, date(年月日),time(时分秒)
年月日时分秒。
字段约束
字段约束: 字段数据的属性规则(特征)
not null 不为空
可以限制字段值不能为空
default 默认值,
可以设置字段的默认值,在没有录入时自动使用默认值填充。
primary key 主键 :唯一标识,不能重复,不能为空
设置字段为主键,主键字段的值不能重复,不能为空。而且一个数据表中只能设置一个字段为主键,作为每行记录的唯一身份信息(索引)。
auto_increment 自动增长
设置字段为自动增长,默认从1开始自动分配编号。自增长字段必须为一个key(索引,数据结构,便于快速查找数据,相当于书的目录),一般与primary key结合使用。
类型必须为整型。
unique key 不能重复
唯一键,设置字段的值为唯一的,可以设置多个字段为唯一键。唯一键字段的值可以为空。
学号设置为主键,要求唯一的,不能为空的,用来标识学生信息,
姓名 | 年龄 | 性别 | id |
---|---|---|---|
wb | 18 | 男 | 1 |
ww | 19 | 女 | 3 |
ls | 30 | 未知 | 4 |
hs | 80 | 女 | 5 |
呵呵呵 | 45 | 男 | 7 |
id | name | age | gender | score |
---|---|---|---|---|
SQL:structured Query Language 结构化查询语言。
通过这个语言可以对数据库,进行增删改查
SQL编写注意点: 注释用 -- , 语句结束加分号(;)
增删改查**
插入数据 insert
-- insert into 表名 (字段列表) values (值列表)
insert into book (name,author,category,price) values ('天龙八部','金庸','文学',20)
修改数据update
-- update 表名 set 字段名称1=值1,字段名称2=值2,... where 条件
-- 如果不加条件会修改表中所有对应的字段
update book set name='笑傲江湖',price='30' where id=10
删除数据delete
-- delete from 表名 where 条件
delete from book -- 会删除所有数据
delete from book where id=10
查询数据select
-- select 字段列表 from 表名
select name, author from book -- 只查询表中name和author的信息
-- select * from 表名 where 条件 *表示所有字段
select * from book where author='金庸' and price>20
where 条件
查询时,不添加 where 条件, 返回数据表所有行。需要添加限定条件,只返回需要的行。
select 字段列表 from table where 条件;
-- 条件 : =, >, <, >=, <=, and, or
Like 模糊匹配 % 通配符
-- 查找姓张的人
select * from 表名 where name like '张%';
in 语法:一次查询多个符合条件的数据
select * from 表名 where 字段 in (value1,value2,value3);
示例:
select * from stu1 where name in ('zs', 'ls', 'ww'); -- 查找name值为zs, ls, ww 的数据
count() 获取返回数据的总条数
表名-- 查询满足条件数据的总条数
select count(*) from 表名 where 条件
排序
select * from 表名 order by 字段名称; 默认升序
select * from 表名 order by age; -- 按照年龄来排序
select * from 表名 order by 字段名称 desc; 降序
limit 对结果集进行截取 一般用于取数据的前几条
select * from 表名 limit 截取的起始索引,截取的长度
联合查询(多个表联合查询)
select 字段列表 from 表A join 表B on 表A.字段=表B.字段
join 将表A和表B联合起来
on 根据什么字段把表A和表B联合起来
select * from teacher join class on class.id=teacher.classid; -- 老师表和班级表联合查询
select teacher.*, class.classname from teacher join class on class.id=teacher.classid; -- 老师表和班级表联合查询,但只显示老师表的全部内容和班级表的名称
-- 注意: 多表联合查询时,字段要写明是那个表的字段 如 表.字段名
连接数据库
准备sql语句
执行sql语句
获取执行的结果并分析
关闭数据库
mysqli_connect(IP, 用户名,密码,数据库名, 数据库的端口号)
连接数据库
mysqli_query($link, $sql)
执行SQL语句
mysqli_error($link);
返回错误描述
mysqli_close($link);
关闭连接
mysqli_fetch_assoc($res);
从结果集中取得一行作为关联数组返回
mysqli_num_rows($res);
返回结果集的行数 $res->num_rows
使用PHP发送SQL语句前,可以先打印SQL语句,检查语句的正确性。
// 1. 连接数据库
// mysqli_connect(ip地址, 用户名, 密码, 数据库的名称, 端口号);
// 执行结果
// 1. 连接成功, 返回一个数据库连接对象
// 2. 连接失败, 返回 false
// @表示错误抑制符, 可以抑制错误的输出
$link = @ mysqli_connect('127.0.0.1', 'root', 'root', 'test02', 3306);
// var_dump($link);
// 如果数据库连接失败
if ( !$link ) {
// 程序结束, die 方法, 终止当前程序执行, 输出一段语句
die("数据库连接失败");
}
echo "数据库连接成功
";
// 2. 准备 sql 语句: 删除一条数据
$sql = "delete from stu where id = 14";
// 3. 让数据库执行 sql 语句, 并分析结果
// mysqli_query(数据库连接对象, 要执行的sql语句)
// 执行成功返回 true, 执行失败返回 false
if ( mysqli_query( $link, $sql ) ) {
echo "删除成功";
}
else {
echo "删除失败
";
// mysqli_error 可以查看错误消息
echo mysqli_error($link);
}
// 4. 关闭数据库连接 (挂电话)
mysqli_close( $link );
通过mysqli_query()函数,来执行sql语句,操作数据库
执行的是非查询sql语句时,mysqli_query()执行成功返回true,失败返回false
而执行 时,mysqli_query()执行成功,返回查询数据的结果集,失败返回false查询数据逻辑如下
// 操作步骤:
// 1. 连接数据库
// 2. 准备 sql 语句
// 3. 让数据库执行 sql 语句
// 4. 分析执行结果
// 5. 关闭数据库连接
// 1. 连接
$link = @ mysqli_connect('127.0.0.1', 'root', 'root', 'test02', 3306);
if ( !$link ) {
// 连接失败
die('数据库连接失败');
}
// 2. 准备 sql 语句
$sql = 'select * from stu where id;';
// 3. 执行 sql 语句, 分析结果
// mysqli_query
// (1) 执行非查询语句, 成功 true, 失败 false
// (2) 执行查询语句, 成功返回结果集, 失败 false
$res = mysqli_query( $link, $sql );
if ( !$res ) {
echo mysqli_error( $link );
die('数据库查询失败');
}
// mysqli_fetch_assoc 查询成功, 从结果集中取数据, 以关联数组的形式返回
// 一次只取一条数据, 如果没取到, 返回 null
$arr = [];
while( $row = mysqli_fetch_assoc( $res ) ) {
// 将值推到数组中
$arr[] = $row;
}
echo '';
print_r($arr);
echo '
';
为了提高代码的复用性,把数据增删改的操作封装成一个方法
// 定义常量
define( 'HOST', '127.0.0.1' );
define( 'UNAME', 'root' );
define( 'PWD', 'root' );
define( 'DB', 'test02' );
define( 'PORT', 3306 );
// 非查询语句封装
// 封装一个执行非查询语句的方法, 提高代码的复用性
// 参数: $sql 要执行的 sql 语句
// 返回值: true / false
function my_exec( $sql ) {
// 1. 连接数据库
$link = @ mysqli_connect( HOST, UNAME, PWD, DB, PORT);
if( !$link ) {
echo '数据库连接失败';
return false;
}
// 2. 准备 sql 语句, 就是传递过来的 $sql
// 3. 执行 sql 语句, 分析结果
if ( mysqli_query( $link, $sql ) ) {
// 执行成功
mysqli_close( $link ); // 关闭数据库
return true;
}
else {
// 执行失败
mysqli_close( $link ); // 关闭数据库
return false;
}
}
// 查询语句的封装
// 参数: $sql 要执行的 sql 语句
// 返回值:
// (1) 成功, 返回数据(二维数组)
// (2) 失败, 返回 false
function my_query( $sql ) {
// 1. 建立连接
$link = @ mysqli_connect( HOST, UNAME, PWD, DB, PORT );
if ( !$link ) {
echo "数据库连接失败";
return false;
}
// 2. 准备 sql 语句 $sql
// 3. 执行 sql 语句, 分析结果
$res = mysqli_query( $link, $sql ); // 结果集 或者 false
if ( !$res ) {
echo "获取数据失败
";
echo mysqli_error($link);
mysqli_close( $link );
return false;
}
// 得到结果集, 将结果集的所有内容取出到数组中
$arr = [];
while ( $row = mysqli_fetch_assoc($res) ) {
$arr[] = $row;
}
mysqli_close( $link );
return $arr; // 返回结果数组
}
会话:浏览器与服务器之间的数据交流。
无状态的, 多次请求之间没有相关性
即同一用户请求同一网站的不同页面,服务器无法识别是否是同一用户发起的请求。因此,用户无法进行连续的业务逻辑。
如:登录,已在A页面登录,请求B页面,提示未登录。
cookie: 在浏览器端的 存储数据的 容器
session 在服务器端的 存储数据的 容器
在浏览器端的 存储数据的 容器
可以使用js对cookie进行操作
cookie 允许服务器脚本(PHP脚本)在浏览器端存储数据
cookie特点:在cookie中数据设置后,浏览器再次请求服务器指定页面时,会自动携带cookie中的数据到服务器,在服务器中可以获取cookie中的数据;
// 设置cookie
document.cookie = 'name=zs';
document.cookie = 'pwd=123';
// 获取cookie中的值
document.cookie;
//向页面中引入插件js文件,基于jquery的
$.cookie('weight',100,{expires:7});//设置 expires 过期时间
$.cookie('name');//获取
$.removeCookie('name');//删除
$.cookie(键,值,{expires:过期天数})
$.cookie(键) //获取
//设置cookie
setcookie('名称','值');
setcookie('名称','值','有效期');
//删除cookie 将过期时间设置为之前的时间即可
setcookie('名称','',time()-1000);
//获取cookie
//$_COOKIE是PHP的超全局变量,内部存放有浏览器传过来的cookie数据,$_COOKIE只能用于获取数据
$_COOKIE['名称'];
小结:
cookie中的数据 可以被同一个网站的页面所共享
不同浏览器的cookie 不能共享
cookie的数据存储在浏览器中,每次请求服务器,在请求报文中携带cookie的数据,发送给服务器
服务器端无法直接操作cookie,是通过在服务器端设置响应头的的方式,通知浏览器对cookie进行设置,
cookie中的数据有效期,不设置是会话级别的, 浏览器关闭,会话结束,数据销毁
cookie存储容量小,约4kb
存储的cookie值中不要出现空格,等号,分号
在服务器端存储数据的容器
session容器是一个数组的形式,通过超全局变量$_SESSION 进行取值和设置
session在使用前,必须先 session_start 开启session 机制
session中的数据可以被当前网站所共享
开启session机制(使用session前必须调用此方法)
session_start(); //开启session会话或者重用已经创建的会话。
小结:
会在服务器中自动对每个第一次访问的用户, 随机生成一个sessionID
再根据 sessionID, 自动创建一个session会话文件,我们可以在其中存储该用户的数据
响应时, 在响应头中设置set-cookie, 存放该用户的sessionID
将来浏览器端根据响应头, 将sessionId 存到 cookie 中, 并在下一次请求时携带
下次访问时, 服务器端就会根据 sessionId 找到该用户的会话文件, 我们可以从session中读取用户信息, 实现会话保持
设置和获取session中的数据(通过超全局变量$_SESSION进行操作)
//设置
$_SESSION['键']='值';
//删除
unset($_SESSION['键']);
//清空session
$_SESSION=[];
//直接删除session会话文件,PHP脚本将无法读取session数据
session_destroy();
//获取session的id
session_id();
登录模块的基本思路:
如果用户登录成功,在服务器中记录用户的登录状态
session_start(), 对于第一次访问的用户, 会自动生成 sessionId, 并创建session文件,
我们需要在session文件中,记录当前用户的信息
通过响应头,给浏览器的cookie设置sessionID
if($name=='zs'&&$pwd=='666'){
// 登录成功, 将该用户唯一标识存到 session 中
// 该用户数据库中 id 为 1
$id = 1;
session_start();
$_SESSION['userid']=$id;
}
后续访问其他页面(个人中心),浏览器会自动发送cookie中存放的sessionID到服务器
服务器会浏览器传递根据sessionID,找到对应的session文件,查看其中是否存放有当前用户的信息
是: 用户已登录 ,正常浏览
否:用户未登录,跳转到登录页