1.PHP简介
什么是PHP
PHP即超文本预处理器(PHP: Hypertext Preprocessor),是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言。JS是在浏览器端执行的脚本语言。
什么是PHP文件
PHP文件能够包含文本、HTML、CSS以及PHP代码,PHP代码在服务器上执行,而结果以纯文本返回给浏览器,PHP文件的后缀是.php
PHP能够做什么
- PHP能够生成动态页面内容
- PHP能够创建、打开、读取、写入、删除以及关闭服务器上的文件
- PHP能够接收表单数据
- PHP能够发送并取回cookies
- PHP能添加、删除、修改数据库中的数据
- PHP能够限制用户访问网站中的某些页面
- PHP能对数据进行加密
2.WAMP/LAMP架构
Windows/Linux下的Apache+Mysql+PHP,一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台
- Apache:Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。作用:存储文本文件
- Mysql:Mysql是最流行的关系型数据库管理系统。作用:存储数据
- PHP:超文本预处理器,既是一种语言,也是一种编译器,解释器
3.HTTP请求/响应
服务端
服务端(Server)是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据。服务端是一种有针对性的服务程序。它的主要表现形式以“windows窗口程序”与“控制台”为主。一般大型的服务端都是在linux环境下搭建。运行服务端的电脑称之为“服务器”
客户端
客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外,一般安装在普通的客户机上,需要与服务端互相配合运行。因特网发展以后,较常用的用户端包括了如万维网使用的网页浏览器,收寄电子邮件时的电子邮件客户端,以及即时通讯的客户端软件等。
B/S架构
B/S架构即浏览器和服务器架构模式(可以跨平台),是随着Internet技术的兴起,对C/S架构的一种变化或者改进的架构。在这种架构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。B/S架构是WEB兴起后的一种网络架构模式,WEB浏览器是客户端最主要的应用软件。
请求
是指从客户端到服务器端的请求消息(由前端向后端发出的)。
响应
是指从服务器端到客户端的响应消息(由后端给到前端的)。
HTTP
超文本传输协议(HTTP:Hyper Text Transfer Protocol),是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应
HTTPS
HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS在HTTP 的基础下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
GET
GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患
POST
POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。
4.PHP基础语法
PHP语法遵循以下几点基本要求
- 文件名只能是a-zA-Z0-9_-的组合,不能出现中文
- 和JS一样除了字符串,代码必须全英文加字母以及英文符号,不能出现中文和中文符号
- 每行代码写完结尾必须加分号
- 大小写敏感,变量区分大小写,函数名不分大小写
- 和JS不同,PHP双引号和单引号作用不一样
注释
- // 单行注释
- # 单行注释
- /**/ 块注释
输出方式
输出方式 | 作用 |
---|---|
echo | 输出字符串等单一数据,不能输出数组,对象等数据,不输出数据类型 |
die | 先输出单一数据内容,然后退出程序(退出当前文件) |
var_dump | 既能输出字符串等单一数据又能输出数组,对象等数据,同时会输出数据类型 |
print_r | 专门用来打印数组 |
响应求头
规定返回数据的相关信息
- header(‘content-type:text/html;charset=utf-8’) // 返回文本和html内容,编码方式utf-8
变量
变量以$符号开头,后面接变量名字,整体组合成变量,变量名和JS变量名要求基本相同,必须符合以下规定:
- 变量只能包含数字,字母,下划线
- 变量严格区分大小写
- 变量不能以数字开头,必须以字母或者下划线开头
函数
PHP只能声明命名函数,使用function关键字,不可以赋值式的声明匿名函数,函数名规则和变量相同,但不需要$符号,不区分大小写,调用方式与JS相同
作用域
全局变量
函数外部声明的变量是全局变量,全局变量能在全局使用,但是和js不同的是,PHP使用全局变量需要在函数内部使用global声明或使用全局$GLOBALS方法
局部变量
函数内部声明的变量和形参是局部变量,局部变量只能在函数内部访问
$num1 = 10; // 全局变量
function abc(){
global $num1; // 声明访问全局变量
$GLOBALS['num1']; // 全局方法访问
$num1 = 20;
}
echo $num1; // 20
静态变量
函数内部通过static方法声明静态变量(局部变量),静态变量只会初始化一次,函数释放后不会销毁,但作用域还在函数内部,形同于JS的闭包效果
function abc(){
static $num2 = 10;
$num2++;
echo $num2;
}
abc(); // 11
abc(); // 12
abc(); // 13
超全局变量
超全局变量是在全部作用域中始终可用的内置变量,常见的超全局 变量有:
- $GLOBALS:引用全局作用域中可用的全部变量
- $_GET:用于收集提交HTML表单method="get"之后的表单数据,也可以收集 URL 中的发送的数据
- $_POST:广泛用于收集提交method="post"的HTML表单后的表单数据, 也常用于传递变量
- $_REQUEST:用于收集HTML表单提交的数据,不论GET或者POST都支持
魔术变量
魔术变量 ≈ js中的this
所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化,常见的魔术变量有:
- __LINE__:获取文件中的当前行号
- __FILE__:获取文件的完整路径和文件名
- __DIR__:获取文件所在目录
- __FUNCTION__:获取函数名称
条件语句
if() {
} elseif () {
} else {
}
switch() {
case:
break;
default:
}
循环语句
while() {
}
do {
} while();
for(;;) {
}
基本数据类型
字符串
单引号和双引号的区别:
- 双引号解析变量(约等于js中的字符串模板),但是单引号不解析变量
- 在双引号里面插入变量,变量后面如果有英文或中文字符,它会把这个字符和变量拼接起来,视为一整个变量。一定要在变量后面接上特殊字符,例如空格等分开
- 如果在双引号里面插变量的时候,后面不想有空格,可以拿大括号将变量包起来
- 双引号解析转义字符,单引号不解析转义字符。但单引号能解析’ 和\
- 单引号效率高于双引号,尽可能使用单引号
- 双号和单引号可以互插,双引号当中插入单引号,单引号当中插入变量,这个变量会被解析
- 神奇的字符串拼接胶水点(.)用来拼接字符串
整数
浮点数
布尔值
数组
索引型数组
类似于JS的数组,通过下标对应元素
// 定义数组
$arr = array(1, 2, 3);
$arr = [1, 2, 3];
// 插入元素
array_push($arr, 4);
// 删除元素
array_splice($arr, $index, $howmany);
// 修改元素
$arr[$index] = value;
// 获取元素
$arr[$index];
// 获取长度
count($arr);
// 遍历索引数组
for($i = 0; $i < count($arr); $i++) {
echo $arr[$i].' ';
}
// 索引数组排序
sort($arr); // 升序排列
rsort($arr); // 降序排列
关联型数组
类似于JS的对象,通过键值对来关联键和值
// 定义关联型数组
$arr = array('name' => '张三', 'age' => 18);
// 增加属性
$arr[$property] = '男';
// 删除属性
unset($arr[$property]);
// 修改属性
$arr[$property] = value;
// 获取属性
$arr[$property];
// 遍历关联型数组
foreach($arr as $property=>$value) {
echo $property.':'.$value;
}
增加、删除、修改、获取属性用[ ],不能用点(.),因为在PHP中,点是用来拼接字符串的
对象
暂不讲解
类型判断
类型判断
- gettype:获取并返回数据的类型
- isset:检测变量是否已设置并且非NULL(判断的是:存在,而不是不存在)
- is_int:整型检测函数
- is_bool:布尔值检测函数
- is_string:字符串检测函数
- is_array:数组检测函数
数学函数
- abs(x) 绝对值
- ceil(x) 向上舍入为最接近的整数
- floor(x) 向下舍入为最接近的整数
- pow(x, y) 返回 x 的 y 次方
- round(x[, prec]) prec表示四舍五入保留小数位,默认为0
- max(x1, x2, …) 返回最大值
- min(x1, x2, …) 返回最小值
- mt_rand(min, max) 介于min(或0)与max(或mt_getrandmax())之间(包括边界值)的随机整数。如果max<min则返回FALSE
- pi() 返回圆周率的值
5. Mysql简介
Mysql是最流行的关系型数据库管理系统,在WEB应用方面Mysql是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
- Mysql是开源的,所以你不需要支付额外的费用
- Mysql支持大型的数据库,可以处理拥有上千万条记录的大型数据库
- Mysql使用标准的 SQL 数据语言形式
- Mysql可以运行于多个系统上,并且支持多种语言
- Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言
- Mysql支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64 位系统支持最大的表文件为8TB
- Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统
6.Mysql常用类型简介
- char:定长字符类型
- varchar:不定长字符类型
- text:可以存储2的16次方减1的长度的值
- int:整数类型
- double:浮点数,小数类型
7.Mysql常用CURD
CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD。作用是用于处理数据的基本原子操作。它代表创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作
Mysql查询
基础查询
SELECT * FROM table // 查询table表中所有字段数据
SELECT field1, field2 FROM table // 查询table表中的指定字段
条件查询
SELECT * FROM table WHERE field = value // 查询table表中的指定字段值为value的数据
SELECT * FROM table WHERE field1 = value1 OR field2 = value2 // 指定多条件中的一个 where ... or ...
SELECT * FROM table WHERE field1 = value1 AND field2 = value2 // 指定多条件同时满足 where ... and ...
模糊查询
// 要查询的是 table 中包含 key 的数据
SELECT * FROM table WHERE field LIKE '%key%' // key 指要查询的关键字
查询排序
SELECT * FROM table ORDER BY field // 根据指定字段升序(默认)排列
SELECT * FROM table ORDER BY field ASC // 根据指定字段升序(默认)排列
SELECT * FROM table ORDER BY field DESC // 根据指定字段降序排列
Mysql新增
INSERT INTO table (field1, field2, ...) VALUES (value1, value2, ...) // 插入单条数据,VALUES 前面接的是 字段名,VALUES 后面接的是 字段名对应的值
Mysql删除
DELETE FROM table // 删除整个表
DELETE FROM table WHERE field = value // 删除指定条件数据
Mysql更新
UPDATE table SET field1 = value1, field2 = value2 WHERE field = value // 修改单条数据
Mysql 查 拿到的是结果集,增、删、改拿到的是受影响的行
Mysql统计与计算
SELECT COUNT(*) from table // 统计数据总条数
SELECT SUM(field) from table // 求数据某个值的和
SELECT AVG(field) from table // 求数据某个值的平均值
8.PHP连接数据库
方法一:
header('content-type:text/html;charset=utf-8'); // 设置响应头,文本格式,utf-8编码
function connect_mysql() {
$host = 'localhost:3306';
$username = 'root';
$password = 'root';
$dbname = 'mall';
$conn = mysqli_connect($host, $username, $password, $dbname);
mysqli_set_charset($conn, 'utf8'); // 规定当与数据库服务器进行数据传送时要使用的默认字符集
if(!$conn) die('数据库链接失败');
return $conn;
}
$conn = connect_mysql();
方法二:
<?php
header('content-type:text/html; charset=utf8');
$server = 'localhost:3306';
$username = $password = 'root';
$dbname = 'mall2004';
$conn = mysqli_connect($server, $username, $password, $dbname);
if(!$conn) {
die('数据库连接失败');
}
// echo '数据库连接成功';
$sql = "select * from userinfo";
$result = mysqli_query($conn, $sql); // 拿到结果集
$data = mysqli_fetch_assoc($result); // 拿单条数据
echo json_encode($data);
9.用户注册接口
方法一:
require_once 'connect.php';
$array = array(
'code' => 0,
'data' => false,
'msg' => '缺少必传参数',
);
if(!isset($_REQUEST['username']) || !isset($_REQUEST['password'])) die(json_encode($array));
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$sql = "select * from userinfo where `username` = '$username'";
$result = mysqli_query($conn, $sql);
$data = mysqli_fetch_assoc($result);
$array = array(
'code' => 0,
'data' => false,
'msg' => '用户名已存在',
);
if (!$data) {
$sql = "INSERT INTO userinfo (`username`, `password`) VALUES ('$username','$password')";
mysqli_query($conn, $sql);
$rows = mysqli_affected_rows($conn);
if ($rows > 0) {
$array = array(
'code' => 1,
'data' => true,
'msg' => '注册成功',
);
} else {
$array['msg'] = '系统错误';
}
}
echo json_encode($array);
方法二:
<?php
header('content-type:text/html; charset=utf8'); // 返回文本和html内容,编码方式utf-8
header("Access-Control-Allow-Origin:*"); // 告诉浏览器,别拦我,谁都可以访问
$server = 'localhost:3306'; // 服务器
$username = $password = 'root'; // 用户名 密码
$dbname = 'mall2004'; // 库名(数据库名)
// 数据库连接对象,mysqli_connect的作用是负责连库,$conn代表当前连好的库
$conn = mysqli_connect($server, $username, $password, $dbname);
mysqli_set_charset($conn, 'utf8'); // 解决数据库中文乱码
if (!$conn) { // 如果$conn不存在,表示:数据库连接失败
die('数据库连接失败');
}
// echo '数据库连接成功';
// 后端接收前端传过来的参数
// $_REQUEST 支持get和post拿到的参数
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
// 注册
$sql = "SELECT * from userinfo WHERE username = '$username'"; // 从库里面找到当前参数,$username 表示用户传进来的数据
$result = mysqli_query($conn, $sql); // 得到结果集
$data = mysqli_fetch_assoc($result); // 从结果集中拿一条数据(数据只能一条一条拿)
if ($data) { // 表示当前库中 用户名 存在
echo json_encode(array( // json_encode() 是将 PHP对象/数组 变为一个 json数据(以字符串的形式体现的)
'code' => 0, // 表示失败
'msg' => '用户名已存在', // 表示为什么失败
));
} else { // 表示 用户名 不存在
$sql = "INSERT INTO userinfo (username, password) VALUES ('$username', '$password')"; // 在数据库中创建并插入数据
mysqli_query($conn, $sql); // 表示:受影响行数
$rows = mysqli_affected_rows($conn);// 拿到受影响行数
if ($rows > 0) { // 表示:受影响行数至少是 1
echo json_encode(array(
'code' => 1, // 表示成功
'msg' => '注册成功',
));
}
}
10.用户登录接口
方法一:
require_once 'connect.php';
$array = array(
'code' => 0,
'data' => false,
'msg' => '缺少必传参数',
);
if (!isset($_REQUEST['username']) || !isset($_REQUEST['password'])) {
die(json_encode($array));
}
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$sql = "select * from userinfo where `username` = '$username'";
$result = mysqli_query($conn, $sql);
$data = mysqli_fetch_assoc($result);
$array = array(
'code' => 0,
'data' => false,
'msg' => '用户名或密码错误',
);
if ($data && $data['password'] === $password) {
$array = array(
'code' => 1,
'data' => true,
'msg' => '登录成功',
);
}
echo json_encode($array);
方法二:
<?php
header('content-type:text/html;charset=utf-8'); // 返回文本和html内容,编码方式utf-8
header("Access-Control-Allow-Origin:*"); // 告诉浏览器,别拦我,谁都可以访问
$server = 'localhost:3306'; // 服务器
$username = $password = 'root'; // 用户名 密码
$dbname = 'mall2004'; // 库名(数据库名)
// 数据库连接对象,mysqli_connect的作用是负责链接库,$conn代表当前连好的库
$conn = mysqli_connect($server, $username, $password, $dbname);
mysqli_set_charset($conn, 'utf8'); // 解决数据库中文乱码
if (!$conn) { // 如果$conn不存在,表示:数据库连接失败
die('数据库连接失败');
}
// echo '数据库连接成功';
$obj = array( // 定义 $obj
'code' => 0, // 默认失败(满足条件时才成功)
'msg' => '登录失败', // 默认登录失败
);
// 如果前端的 username 没有 拿到(存在/传入) 或者 前端的 password 没有 拿到(存在/传入)
if (!isset($_REQUEST['username']) || !isset($_REQUEST['password'])) { // 判断当前 参数是否传入
$obj['msg'] = '缺少必要参数'; // 缺少必要参数
die(json_encode($obj)); // 表示后面的 路 都不走了
}
// 后端接收前端传过来的参数
// $_REQUEST 支持get和post拿到的参数
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
// 登录
$sql = "SELECT * from userinfo WHERE username = '$username'"; // 查询用户:从库里面找到当前参数,$username 表示用户传进来的数据
$result = mysqli_query($conn, $sql); // 得到结果集
$data = mysqli_fetch_assoc($result); // 从结果集中拿一条数据(数据只能一条一条拿)
if ($data) { // 表示当前库中 用户名 存在
// 当用户名存在时,进行密码的比对
if ($data['password'] === $password) { // 如果从$data中拿出的密码 password 恒等于用户传进来的密码 password
$obj['code'] = 1; // 表示成功
$obj['msg'] = '登录成功'; // 表示登录成功
} else { // 表示从$data中拿出的密码 password 不恒等于用户传进来的密码 password
$obj['msg'] = '用户名或密码错误'; // 失败
}
} else { // 表示 用户名 不存在
$obj['msg'] = '用户名或密码错误'; // 失败
}
echo json_encode($obj); // 给前端返回
11.用户列表接口
<?php
header('content-type:text/html;charset=utf-8'); // 返回文本和html内容,编码方式utf-8
header("Access-Control-Allow-Origin:*"); // 告诉浏览器,别拦我,谁都可以访问
$server = 'localhost:3306'; // 服务器
$username = $password = 'root'; // 用户名 密码
$dbname = 'mall2004'; // 库名(数据库名)
// 数据库连接对象,mysqli_connect的作用是负责连库,$conn代表当前连好的库
$conn = mysqli_connect($server, $username, $password, $dbname);
mysqli_set_charset($conn, 'utf8'); // 解决数据库中文乱码
if (!$conn) { // 如果$conn不存在,表示:数据库连接失败
die('数据库连接失败');
}
// echo '数据库连接成功';
// 用户列表
$sql = 'select * from userinfo'; // 查 用户列表
$result = mysqli_query($conn, $sql); // 得到结果集
$list = array(); // 创建一个 空数组
// 循环中 拿到所有的数据($data)
while ($data = mysqli_fetch_assoc($result)) { // 循环的条件:当 $data 不等于 null 时
// 伪插是 $list[]
$list[] = $data; // 将拿到的所有 数据($data)插入 空数组中
};
echo json_encode(array( // 包装数组:json_encode() 是将 PHP对象/数组 变为一个 json数据(以字符串的形式体现的)
'code' => 1, // 表示成功
'data' => $list // data 中放入 $list 数组
));
12.用户删除接口
<?php
header('content-type:text/html; charset=utf8'); // // 返回文本和html内容,编码方式utf-8
header("Access-Control-Allow-Origin:*"); // 告诉浏览器,别拦我,谁都可以访问
$server = 'localhost:3306'; // 服务器
$username = $password = 'root'; // 用户名 密码
$dbname = 'mall2004'; // 库名(数据库名)
// 数据库连接对象,mysqli_connect的作用是负责链接库,$conn代表当前连好的库
$conn = mysqli_connect($server, $username, $password, $dbname);
mysqli_set_charset($conn, 'utf8'); // 解决数据库中文乱码
if (!$conn) { // 如果$conn不存在,表示:数据库连接失败
die('数据库连接失败');
}
// 后端接收前端传过来的参数
// $_REQUEST 支持get和post拿到的参数
$uid = $_REQUEST['uid']; // 从前端拿到一个uid(唯一标识)
// 删除
$sql = "DELETE FROM userinfo WHERE uid = $uid"; // 删除 userinfo 表中 uid 为 $uid 的数据
mysqli_query($conn, $sql); // 执行 sql 删除
$rows = mysqli_affected_rows($conn); // 从 $conn 中拿到受影响行数
$obj = array(
'code' => 0, // 默认失败(满足条件时才成功)
'msg' => '服务器异常'
);
if ($rows > 0) { // 表示:受影响行数至少是 1
$obj = array(
'code' => 1, // 表示成功
'msg' => '删除成功' // 表示删除成功
);
}
echo json_encode($obj); // 给前端返回
13.用户更新接口
<?php
header('content-type:text/html; charset=utf8'); // // 返回文本和html内容,编码方式utf-8
header("Access-Control-Allow-Origin:*"); // 告诉浏览器,别拦我,谁都可以访问
$server = 'localhost:3306'; // 服务器
$username = $password = 'root'; // 用户名 密码
$dbname = 'mall2004'; // 库名(数据库名)
// 数据库连接对象,mysqli_connect的作用是负责链接库,$conn代表当前连好的库
$conn = mysqli_connect($server, $username, $password, $dbname);
mysqli_set_charset($conn, 'utf8'); // 解决数据库中文乱码
if (!$conn) { // 如果$conn不存在,表示:数据库连接失败
die('数据库连接失败');
}
// 后端接收前端传过来的参数
// $_REQUEST 支持get和post拿到的参数
$uid = $_REQUEST['uid']; // 从前端拿到一个uid(唯一标识)
$password = $_REQUEST['password']; // 从前端拿到一个password,需要修改
// 修改,更新
$sql = "UPDATE userinfo SET `password` = '$password' WHERE uid = $uid"; // 修改/更新 userinfo 表中 uid 为 $uid 的数据
mysqli_query($conn, $sql); // 执行 sql 修改/更新
$rows = mysqli_affected_rows($conn); // 从 $conn 中拿到受影响行数
$obj = array(
'code' => 0, // 默认失败(满足条件时才成功)
'msg' => '更新失败',
);
if ($rows > 0) { // 表示:受影响行数至少是 1
$obj = array(
'code' => 1, // 表示成功
'msg' => '更新成功', // 表示更新成功
);
};
echo json_encode($obj); // 向前端返回