服务器
什么是服务器?
通过安装服务器软件,提供服务 的计算机
服务器可以从硬件、软件(系统软件、应用软件)几个角度描述。
按硬件描述: 服务器就是一台超级计算机(配置很高)。
按操作系统划分: 在硬件上安装了什么操作系统,就可以称为该系统的服务器
例如: linux 服务器、windows 服务器、unix 服务器等。
按软件划分: 在操作系统中安装了什么软件,就可以称作该软件的服务器 iis tomcat
例如: web 服务器、数据库服务器、邮件服务器等。
什么是 Web 服务器
Web 服务器就是安装了 Web 服务软件,web 服务器的作用是能够提供网站服务的服务器。淘宝、京东、新浪等等
常见的 Web 软件:
Apache、Nginx、IIS、Tomcat、Node 等。
Apache 服务器、Nginx 服务器、IIS 服务器、Tomcat 服务器、Node 服务器
Apache 是世界使用排名第一的 Web 服务器软件。我们将编写好的 html、css、js 等文件存入 apache,就能够通过网络来访问这些文件了
PS: web 服务器又叫做 http/httpd 服务器
phpStudy 介绍
phpStudy 是一个 PHP 调试环境的程序集成包
该程序包集成最新的 Apache+PHP+MySQL
安装 phpStudy,一定不能有中文,否则肯定启动不起来
**注意: **将要访问的文件(html,php,img 等),放到安装路径下的 www
目录下,通过浏览器就可以访问到了
phpStudy 的错误解决
如果 phpStudy 启动发生错误,参数下列几点。
一是防火墙拦截
二是 80 端口已经被别的程序占用,如 IIS 等
三是没有安装 VC9 运行库,php 和 apache 都是 VC9 编译
PHP 基础(重点)
PHP 简介
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。主要适用于 Web 领域的开发 ,能够完成 动态网页 的制作
PHP 特点
- PHP 是目前最流行的网站开发语言(B/S 结构)之一
- PHP 是一种在服务器端执行的嵌入 HTML 文档的脚本语言
- 支持几乎所有流行的 数据库 以及操作系统
- 源码开放、免费(free)
- php 是世界上最好的语言
动态网站与静态网站(了解)
静态网站:使用浏览器端语言进行编程,网站由静态代码(HTML,CSS,JS)组成。
动态网站 :网页通过服务器的程序(php 等)动态生成。用户可以和服务器进行交互(可以根据用户输入的不同信息,返回不同的运行结果)
总结
动态网站的 动 指的是网站 数据的动 而不是 视觉上的动
软件架构(了解)
软件架构可以分为 BS 架构与 CS 架构
C/S 架构
Client/Server 架构,即客户端/服务器架构。需要安装对应的客户端软件,才能获取服务器的服务
常见的 CS 架构:QQ、LOL、微信等
特点:
需要安装才能使用
性能高效,使用更加稳定和流畅
B/S 架构
Broswer/Server 架构,即浏览器/服务器架构。随着 Internet 的兴起,无需安装专门客户端软件,通过浏览器去请求服务器
- 不需要安装,只需要浏览器即可。
- 相比 CS 架构,性能相对较差,没有那么流畅和稳定
php 基本语法结构
// 避免使用中文目录和中文文件名 |
输出中文乱码问题:如果使用 echo 输出中文,可能会乱码
|
PHP 运行原理
HTML 运行原理
- 在浏览器的 URL 地址栏中输入 www.baidu.com/index.html 地址,点回车。请求就发送给百度服务器。
- 百度服务器找到 index.html 文件,并将文件的内容返回给浏览器
- 浏览器接收到 index.html 中的内容,渲染到页面上。
同理: localhost/a.html , 则会返回 本机 web 服务器根目录下 a.html 文件的内容。浏览器拿到内容后进行渲染。
PHP 运行原理
apache 不认识 php
浏览器也不认识 php
- 在浏览器地址栏中输入 localhost/index.php ,点回车之后。将请求发送给 apache 服务器
- 服务器找到 index.php 文件之后,转发给 php 解释器
- php 解释器将 index.php 文件中的 php 代码全部转为字符串,再返回给 apache
- apache 将处理好的字符串返回给浏览器,浏览器渲染后就可以看到页面
变量
php 是一门弱类型语法,变量的类型可以随意改变。
变量其实就是存储数据的容器
变量的命名规则
- 不需要关键字进行声明,变量在第一次赋值的时候被创建
- 必须以
$
符号开始 $
后面的命名规则与 js 的变量命名规则一致
变量操作
声明变量
声明变量的时候也一定要同时赋值,否则变量无法声明成功
// 变量在声明的时候一定要同时赋值,否则变量无法声明成功 |
删除变量 unset()
unset($name); // 销毁指定的变量 |
判断变量是否设置值 isset()
isset($name); |
变量未设置或者设置为 null,返回 false(认为变量没有设置),其余情况全部为 true。一般用来判断变量是否设置,因为变量未设置,无法直接使用。(变量先赋值,在使用!)
判断变量是否为空 empty()
var_dump(empty($name)); // 为空打印出 bool(true),不为空则打印 bool(false) |
PHP 中认为变量的值为:""
、0
、"0"
、null
、false
、[]
时,变量虽然赋值了,但是无实际的意义,为空。
数据类型
php 数据类型: 8 种数据类型
基本数据类型: 布尔, 字符串, 整数, 浮点数
复合数据类型:数组, 对象
特殊的类型:resource(资源) null
简单数据类型
输出语句
//1. echo 输出简单数据类型 |
字符串
$str = "php是世界上是最好的语言"; |
字符串连接符
php 中,+
号只有算数的功能,并不能拼串,拼串使用 .
$name = "大象"; |
php 中的单引号与双引号
//1. 字符串的定义可以使用单引号,也可以使用双引号 |
整数
$num = 100; |
浮点型
$float = 11.11; |
布尔类型
$flag = true; |
数组
在 php 中,数组分为两种,索引数组 和 关联数组
计算数组长度的方法:count(数组名);
索引数组(类似与 JS 中的数组)
$arr = array("张飞","赵云","马超"); |
关联数组(类似与 JS 中的对象)
// 属性名必须用引号引起来 |
二维数组与多维数组
数组中的每个元素又是一个数组
二维数组的存取元素,需要两次访问,依次确定行和列 $arr[x][y]
;
多维数组数组里面嵌套了两层以上的数组
对象(了解)
在 php 以及其他高级语言中,都有类的概念,表示一类对象,跟 js 中构造函数类似。
//定义一个类(类似js的构造函数) |
流程控制
分支结构(if/switch)
基本上来说,所有语言的 if..else 语法都是一样
$age = 17; |
循环结构(while / for / do…while)
while(判断表达式){ |
遍历索引数组
$arr = array("张三", "李四", "王五", "赵六", "田七", "王八"); |
foreach 语句结构
用来遍历数组(关联数组和索引数组均可)。
foreach($arr as $key => $value){ |
$arr
: 要遍历的数组
$key
: 键,可以是任意变量名
$value
: 值,可以是任意变量名
//遍历关联数组 |
函数
注意,在 php 中函数不能重复声明
php 中函数的语法与 js 中函数的语法基本一样,不同点在于
- 函数名大小写不敏感
- 函数的形参可以设置默认值
|
- 在 php 中函数不能重复声明
- 函数体内的变量只在函数体内有效
- 函数体外的变量只在函数体外有效
|
常量
保存不会发生改变的数据(如:3.1415, 路径等)时,最好使用常量。
常量的使用方法:
define(常量名, 常量值, [是否区分大小写]); |
注意: 一般在实际工作中,常量都用大写,常量不能被重新赋值
PHP 内置函数
数学函数
- max(),min() 分别返回一组数的最大值及最小值;
- abs() 返回绝对值。
- floor() 向下取整。
- ceil() 向上取整。
- round() 四舍五入。
- rand() 返回随机整数,可以取到两端的值。
日期函数
time()
返回当前的时间戳 (1970 到现在的时间的秒数)date(format,time)
格式化一个本地时间或日期格式:Y(年) m(月) d(日) H(时) i(分) s 秒
$time = time(); // 获取时间戳 |
默认时区会不太正确, 我们在东八区, 比 0 时区会多八小时
路径: D:\phpStudy\php\php-5.4.45 |
字符串函数
str_replace(查找的值,替换的值,执行替换操作的字符)
字符串替换(会把符合的值全部替换)trim(字符串);
去除首尾空白字符explode(分割符,执行分割的字符串);
使用一个字符分割一个字符串,返回一个数组(类似 split)implode(连接符,执行连接的数组);
将数组根据连接符拼接成字符串(类似 join)substr(字符串,起始索引,截取长度);
截取字符串,注意中文占 3 个字节长度strchr(字符串,标识字符);
从左向右找标识字符,返回该字符后全部字符(包括该字符)strrchr(字符串,标识字符);
从右向左找标识字符,返回该字符后全部字符(包括该字符) 主要用于获取后缀名
补充
查找数组中是否含有指定内容
// in_array(查找的内容, 数组) 如果查找到返回 true ,查找不到返回 false |
从数组中随机获取数据
// array_rand(被操作的数据, 数据长度) 返回一个随机的下标 |
页面动态渲染
PHP 本身支持与 HTML 混编
混编的文件后缀必须为 .php, Apache 才会调用 PHP 解析
PHP 与 HTML 混编时,服务器中的 PHP 引擎 只会执行 php 标签内部的 PHP 代码,非 PHP 的代码(PHP 标签外部的内容)直接忽略,最后会将 PHP 的执行结果和非 PHP 代码 一起返回给浏览器,由浏览器进行解析
一个 php 页面当中,可以写多个 php 语法结构,但是 php 语法结构 不能嵌套
|
include 文件引入
介绍:不同的页面中有相同的代码部分,可以将其分离为单个文件。需要调用时,include 引入对应的文件即可调用。提高代码的复用率。类似于 js 中 script 标签导入, 可以用于函数复用
语法
// 可以是html、php或其他类型的页面 |
include 与 include_once 区别
- include 可以重复引入文件
- include_once 只引入一次,防止多次引入文件
- 如果文件中有函数,include 重复引入会报错,include_once 不会报错
PHP 数据读写到文件(数据持久化)
程序运行过程中,数据存储在内存中的,程序结束, 数据会销毁
如果希望可以永久存储某些数据,可以将数据存储在硬盘上(存储在文件中)
将数据由内存存储到硬盘的过程,称为数据持久化;
file_get_contents(path)
根据路径读取文件内容, 返回一个字符串file_put_contents(path,$str)
将一个字符串写入到一个文件中。(只能存储字符串)file_put_contents(string $file, string $data[, constants flag]);
参数1: 文件路径
参数2: 要写入文件的字符串
参数3: 可选参数,默认不写,新内容覆盖原文件中的内容;FILE_APPEND 是向文件中追加内容
返回值: 写入文件的字符串长度(不用记)
使用 file_put_contents
存储数组的时候,会丢失数据
$arr = ['zs', 'ls', 'ww']; |
把一个数组,转成一个 json 格式的字符串
json_encode($data)
将 PHP 数组转成 JSON 格式字符串。json_decode($str,true)
将 JSON 字符串, 转换为 PHP 数组。(不传 true, 有可能转完之后是个对象, 传了 true,一定是数组)
表单处理
表单(form):表单用于收集用户输入信息,并将数据提交给服务器。是一种常见的与服务端数据交互的一种方式
action
: 指定表单的提交地址(如果提交到当前页面,action 可以为空)method
: 指定表单的提交方式,get/post,默认 getinput
的数据想要提交到后台,必须指定 name 属性,后台通过 name 属性获取值- 想要提交表单,不能使用
input:button
必须使用input:submit
php 获取表单数据
// $_GET 是 PHP 系统提供的一个超全局变量,是一个数组,里面存放了表单通过 get 方式提交的数据 |
get 与 post 的区别
get
方式
数据会拼接在 url 地址的后面 (?username=pp&password=123456)
地址栏有长度限制,因此 get 方式提交数据大小不会超过 4kpost
方式
数据不会在 url 中显示,相比 get 方式,post 更安全
提交的数据没有大小限制,可用于文件上传
文件上传
html 要求
文件上传的提交方式必须是
post
方式需要给
form
指定enctype="multipart/form-data"
指定
name
属性,后台才能获取到
php 相关
- 文件上传时,通过
$_FILES
才能获取到,这是一个二维数组。
Array |
上传文件时,文件会临时保存在服务器上,如果文件最终没有保存,那么临时文件会被删除,保证服务器安全。
sleep(10)
可以让代码延迟 10 秒钟才执行。move_uploaded_file($path, $newPath);
可以转存临时文件,真正把文件存储起来unlink(filename,context)
删除文件,若成功,则返回 true,失败则返回 false
// 保存图片的完整代码 |
学生信息管理系统 1.0
基本功能
- 学生添加功能
- 展示学生信息功能
- 删除学生信息
// array_splice(数组, 开始的下标, 截取长度) 将匹配到的数据截取掉,会改变原来的数组 |
Mysql 数据库
数据库概念
专门用来存储、管理数据的仓库 英文: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 数据库软件
MySQL 数据库软件中可以有多个数据库,每一个数据库中可以有多个表
可视化工具 navicat
MySQL 只是一个数据库软件,如果我们要创建数据库,或对数据库进行增删改查,刚开始可以用可视化工具来操作,让我们更加直观的了解数据库
安装 navicat
让 navicat 和 MySQL 建立连接
点击左上角 连接 => MySQL => 常规 => 端口 3306 =>
数据库表的操作
数据库的数据类型
也就是数据库中可以存储的数据类型(又叫做字段类型)
字段类型
整型
int
存储如年龄,产品数量,编号等。
小数类型
float
,decimal
重量,工资,奖金,价格等使用 decimal 类型,实现小数的精确存储,一般用来存储与钱有关的数字。3.333333331
字符串型
varchar(M)
,char(M)
M 为该字段可以存储的最多字符数(字节) ,如 varchar(10)最大可以存储 10 个字节
varchar 一般用来存储长度变化比较大的字符串,如文章标题,商品名称
char 存储长度比较固定的字符串,如手机号,身份证号,序列号,邮编
此外可以使用 text 类型,存储较长的字符串,无需指定字符串的具体长度
日期时间型
datetime
,date(年月日)
,time(时分秒)
字段约束
字段约束: 字段数据的属性规则(特征)
not null
不为空,可以限制字段值不能为空default
默认值,可以设置字段的默认值,在没有录入时自动使用默认值填充。primary key
主键 :唯一标识,不能重复,不能为空设置字段为主键,主键字段的值不能重复,不能为空。而且一个数据表中只能设置一个字段为主键,作为每行记录的唯一身份信息(索引)。
auto_increment
自动增长设置字段为自动增长,默认从 1 开始自动分配编号。自增长字段必须为一个 key(索引,数据结构,便于快速查找数据,相当于书的目录),一般与 primary key 结合使用。类型必须为整型。
unique key
不能重复唯一键,设置字段的值为唯一的,可以设置多个字段为唯一键。唯一键字段的值可以为空。
创建数据表
注意 创建表时,每个表必须有一个主键
SQL-操作数据库的语言
SQL:structured Query Language 结构化查询语言。
- 通过这个语言可以对数据库进行增删改查
SQL 编写注意点: 注释用 --
, 语句结束加分号 ;
基本用法:增删改查
- 插入数据
insert
-- insert into 表名 (字段列表) values (值列表) |
- 修改数据
update
-- update 表名 set 字段名称1=值1,字段名称2=值2,... where 条件 |
- 删除数据
delete
-- delete from 表名 where 条件 |
- 查询数据 select
-- select 字段列表 from 表名 |
高级用法
where
条件查询时,不添加 where 条件, 返回数据表所有行。需要添加限定条件,只返回需要的行。
-- select 字段列表 from 表名 where 条件;
-- 条件 : =, >, <, >=, <=, and, orlike
模糊匹配 % 通配符-- 查找姓张的人
select * from 表名 where name like '张%';in
语法:一次查询多个符合条件的数据-- select * from 表名 where 字段 in (value1,value2,value3);
select * from stu where name in ('zs', 'ls', 'ww'); -- 查找name值为zs, ls, ww 的数据count()
获取返回数据的总条数-- 查询满足条件数据的总条数
-- select count(*) from 表名 where 条件order
排序-- select * from 表名 order by 字段名称; 默认升序
-- select * from 表名 order by age; -- 按照年龄来排序
-- select * from 表名 order by 字段名称 desc; desc 表示降序limit
对结果集进行截取 一般用于取数据的前几条-- select * from 表名 limit 截取的起始索引,截取的长度
联合查询(多个表联合查询)
select 字段列表 from 表A join 表B on 表A.字段=表B.字段 where 条件
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; -- 老师表和班级表联合查询,但只显示老师表的全部内容和班级表的名称
-- 注意: 多表联合查询时,字段要写明是那个表的字段 如 表.字段名
PHP 操作数据库
连接数据库基本步骤
- 连接数据库
- 准备 sql 语句
- 执行 sql 语句
- 获取执行的结果并分析
- 关闭数据库
操作数据库常用 API
mysqli_connect(IP, 用户名,密码,数据库名),端口号
连接数据库mysqli_query($link, $sql)
执行 SQL 语句mysqli_error($link);
返回错误描述mysqli_close($link);
关闭连接mysqli_fetch_assoc($res);
从结果集中取得一行作为关联数组返回mysqli_num_rows($res);
返回结果集的行数
sql 操作
- 使用 PHP 发送 SQL 语句前,可以先打印 SQL 语句,检查语句的正确性。
- 修改数据库的数据时, 使用变量拼接 SQL 语句=,字段的值为字符串类型时,需要在变量的两侧使用单、双引号包裹。可以将所有的字段外面都使用双引号包含。
// 1. 连接数据库 |
数据库工具函数的封装
为了提高代码的复用性,把数据增删改的操作封装成一个方法
// 定义常量 |
学生管理系统 2.0
基本功能
- 添加学生功能
- 展示学生列表功能
- 删除学生功能
- 查看学生详情
- 更新学生数据
实现思路
注册功能思路:
- 表单设计,点击提交按钮向服务器提交表单数据
- 在后台获取表单提交的数据,保存到数据库中
- 先获取表单的标签的数据
- 保存上传的图片(并保存图片存储的路径)
- 将表单的数据和图片的路径一起保存到数据库中
- 保存完成,跳转到列表页,查看新添加的数据
展示功能思路:
- 先从数据库中获取数据(二维数组 arr)
- 遍历二维数组,将数组中数据渲染到页面中
删除功能思路:
- 获取要删除数据的 id
- 根据 id 删除数据库中指定的数据
- 删除完毕,返回列表页
详情展示功能
- 获取要查看详情数据的 id
- 根据 id 通过联合查询,获取到需要用数据
- 把数据显示在页面中
- 点击返回按钮,可以返回到列表页
更新数据思路:
更新数据的思路=先渲染再提交
- 获取要查看详情数据的 id
- 把对应 id 的数据填充到修改页面中
- 点击修改按钮,获取表单的数据,提交给服务器
- 在服务器更新数据
- 更新完成后跳转到列表页
隐藏域表单:和其他表单标签一样,只是看不到而已 |