接下来我们学习后端编程语言PHP
PHP简介:
全称:Hypertext Preprocessor,超文本预处理器。
是一种创建动态交互性站点的开源语言
在服务器上执行
网络安全最常用方案以PHP为范本
PHP文件:
PHP文件可包含文本、HTML、css、JavaScript代码和PHP代码。
在服务器上执行,结果以纯HTML形式返回给浏览器
文件的后缀以 .php
创建第一个PHP文件:
1、位置必须在phpstudy /www 目录中或者phpstudy/www 目录的子目录中
2、使用vscode 打开我们创建好的文件夹中
3、确保我们的Apache和Mysql 为开启状态。
4、配置文件 参考这篇文章
怎么查看phpstudy可以使用了呢。 随意打开一个浏览器
现在就可以在vscode中创建文件,写代码了。
<?php
// 解决中文乱码
// Content:内容
// type:类型
// charset:character set 字符集合/编码
header('Content-type:text/html;charset=utf-8');
// php中的注释
// 单行注释 快捷写法:ctrl + /
// 多行注释 /* */
// echo : 输出 一次可以输出多个数据
echo '你好世界!' , '你好网络安全' , '你好北京';
// print() : 打印 一次只能打印一个数据
print('hello');
echo '<br>';
// var_dump():输出 既可以打印数据的值,也可以输出数据的类型
var_dump('你好');
// HTML中的标签在php文件中书写的方式:
// 在php文件中以字符串(用单引号或者双引号包裹)的形式来书写HTML标签
// 输出h1标题标签效果
echo "<h1>标题标签</h1>";
// 书写Js代码
echo "<script>alert(123)</script>";
?>
每次执行新的代码,刷新页面。
<?php
header('Content-type:text/html;charset=utf-8');
// php中的变量
$num = 100;
$age = 18;
$name = 'tony';
echo $num , '<br>' , $age , '<br>' , $name;
// php中变量的命名规则:
// 1.变量名以$美元符号开头
// 2.$符号后的第一个字符必须是字母或者下划线_
// 3.变量名的其他字符只能是数字,字母或者下划线
// 4.变量名中不能包含空格
// 5.变量名严格区分大小写,$Y和$y不是同一个变量
?>
<?php
header('Content-type:text/html;charset=utf-8');
// php的数据类型
// 一:基本类型
// 1.int : 整型 代表整数
// 2.float : 浮点型 代表小数
// 3.bool : 布尔类型 true/false
// 4.string : 字符串型 使用单引号或者双引号包裹的内容
$num = 10;
var_dump($num); // int
$float = 3.14;
var_dump($float); // float
$bool = true;
var_dump($bool); // bool
$str = '100';
var_dump($str); // string
// 二:复合类型
// 1.array 数组
// 2.object 对象
// 三:特殊类型
// NULL 空
$a = NULL;
var_dump($a); // NULL 和JS里的NULL是一样的 主动赋值
?>
运算符 :加减乘除等。这些,都和JS是一样的,这里就不讲了。
当然还有流程控制,唯一不同的是PHP在循环结构中多了一种foreach
其中foreach主要用于遍历可迭代对象
数组:
是可以在单个变量中存储多个数值的特殊变量
<?php
header('Content-type:text/html;charset=utf-8');
// 创建数组
// array()
$arr = array('张三','tony','老六');
var_dump($arr);
echo '<br>';
// [键名1]=>键值1
// [键名2]=>键值2
// 数值数组:带有数字ID键的数组
// 关联数组:带有指定键(可能是字符串)的数组,每个键关联一个值
$arr1 = array('name'=>'tony','age'=>18,'sex'=>'男');
var_dump($arr1);
// echo,print 输出的时候只能输出基本类型数据
// var_dump() 可以输出复合类型数据
echo '<br>';
// 另一种方式生成数组
$arr2 = array(); // 空数组
$arr2['height'] = 180;
$arr2['sex'] = '女';
$arr2['weight'] = '100kg';
var_dump($arr2);
?>
<?php
header('Content-type:text/html;charset=utf-8');
// 数组
// 数组取值:数组[键名]
$arr1 = array('tony','lucy','lili','张三','李四','老六');
// 键: 0 1 2 3 4 5
// var_dump($arr1);
// 获取数组中每一个键的值
// echo $arr1[0] . '<br>';
// echo $arr1[1] . '<br>';
// echo $arr1[2] . '<br>';
// echo $arr1[3] . '<br>';
// for($i=0;$i<=4;$i++){
// echo $arr1[$i] . '<br>';
// }
// count(数组):计数 获取数组元素的数量
// echo count($arr1);
// 可以通过数值数组元素的数量推导出最大的键名
// 最大的键名 = 数组元素的数量 - 1
// 最大的键名 = count($arr1) - 1
for($i=0;$i<=count($arr1)-1;$i++){
echo $arr1[$i] . '<br>';
}
?>
<?php
header('Content-type:text/html;charset=utf-8');
// 生成一个关联数组
$arr2 = array('name'=>'tony','age'=>25,'sex'=>'男','height'=>180);
// var_dump($arr2);
// 获取数组键值: 数组[键名]
// echo $arr2['name'] . '<br>';
// echo $arr2['age'] . '<br>';
// echo $arr2['sex'] . '<br>';
// foreach : 遍历 可以遍历可迭代对象
// foreach(数组 as 键=>值){代码}
foreach($arr2 as $a=>$b){
// =>左侧的变量中保存的是每次循环时,数组的键名
// =>右侧的变量中保存的是每次循环时,数组的键值
// echo $a . '<br>';
echo $b . '<br>';
}
?>
函数当然和JS差不多,但这里做一个练习
<?php
header('Content-type:text/html;charset=utf-8');
// 封装一个可以判断两个数字中较大数字的函数
function getMax($a,$b){
// if($a>$b){
// return $a;
// }else{
// return $b;
// }
// 三元运算符/三目运算符 表达式 ? a : b;
// 判断表达式,如果为true,执行?后的a,否则执行:后的b
return $a>$b ? $a : $b;
}
// 调用函数
echo getMax(100,80);
?>
<?php
header('Content-type:text/html;charset=utf-8');
// 类和对象
// 类:一些具有共同特征事物的集合
// 对象:具体的事物,具体到独一无二的程度
// 在程序中声明一个类
// class 类名{
// 成员变量;
// 成员函数;
// }
// 声明一个'人'的类
// 注意:类名称的第一个字符大写
class Person{
// 成员变量,记录特征
var $name;
var $sex;
var $age;
// 成员函数,记录行为
function sleep(){
echo '可以睡觉';
}
function eat(){
echo '可以吃东西';
}
}
// 类的实例化,类经过实例化操作后,就会实例化出一个对象
// new : 实例化
// new 类 => 对象
$p = new Person;
// var_dump($p);
// 实例化成对象后,类中的成员变量->对象的属性
// 类中的成员成员函数->对象的方法
// 给对象的属性赋值 : 对象->属性名 = 属性值;
$p->name = 'tony';
$p->age = 25;
$p->sex = '男';
var_dump($p);
// 调用对象的方法:对象->方法名();
$p->sleep();
echo '<br>';
$p->eat();
?>
<?php
header('Content-type:text/html;charset=utf-8');
// 声明一个动物类
class Animal{
var $name;
var $age;
function sleep(){
// $this : 这个对象 调用此方法的对象
echo $this->name . '可以睡觉';
}
function eat(){
// $this : 这个对象 调用此方法的对象
echo $this->name . '可以吃东西';
}
}
$a = new Animal;
// 给对象的属性赋值:对象->属性 = 属性值;
$a->name = '哈士奇';
$a->age = 3;
// 获取对象的属性值:对象->属性名
echo $a->name;
echo '<br>';
echo $a->age;
echo '<br>';
// 调用对象的方法:对象->方法名()
$a->sleep();
echo '<br>';
$a->eat();
?>
<?php
header('Content-type:text/html;charset=utf-8');
// 声明一个人类
class Person{
var $name;
var $sex;
// 构造函数 类在被实例化(new)时自动触发构造函数
function __construct($a,$b){
// echo 'hello';
$this->name = $a;
$this->sex = $b;
}
}
// new 类名(参数),参数会传递给类的构造函数
$p = new Person('tony','男');
var_dump($p);
?>
PHP超级全局变量:
在PHP中预定义了几个超级全局变量(superglobals)
这表示它们在一个脚本的全部作用域都可以使用,不需要特别说明,就可以在函数及类中使用
常见的超级全局变量:
$_REQUEST
$_POST
$_GET
$_FILES
$_COOKIE
$_SESSION
现在我们就要进行简单的前后端交互了 先展示代码
<?php
header('Content-type:text/html;charset=utf-8');
// 超级全局变量
// $_GET : 获取get请求传递的参数
var_dump($_GET);
?>
注意:这个HTML文件同样和我们上面学习php时文件存放位置相同
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 注意:表单在访问的时候必须经过服务器(浏览器url中输入127.0.0.1) -->
<!-- form表单:收集用户的数据并传递给服务器 -->
<!-- action="表单数据传递的地址" -->
<!-- method="设置表单传参方式 get/post" -->
<form action="08_get.php" method="get">
用户名: <input type="text" name="username">
<br>
密码: <input type="password" name="userpwd">
<br>
<input type="submit">
</form>
</body>
</html>
首先我们在浏览器中的地址栏输入127.0.0.1 找到我们的文件夹
先打开HTML文件,再在表单中输入点东西。用户名:张三丰,密码:123456
点击提交 再到houduan.php中查看
出现这样的就是成功了
接下来可以试试post请求方式,代码不变,将get换成post即可。
但是我们看到效果是一样的,可是区别是什么呢?
这是get请求方式下
你们可以看看post请求
get请求和post请求的区别:
get请求:get一般是在服务器获取数据,get请求传递的参数会显示在url地址栏中,相对不安全,get请求的速度相对较快
post请求:post一般是向服务器发送数据,post请求传递的参数不会显示在url地址栏,相对更安全,post请求的速度相对较慢
查看post方式传递的数据:
表单页面按下F12->网络选项->提交表单->点击状态码为200的网络请求选项->找到请求选项->查看到表单数据
get请求:
1.在url地址栏输入的内容,回车发送请求,get类型的请求
2.表单method="get",提交表单时,发送的get请求
3.超链接传参也是get方式的请求
http://127.0.0.1/new_php/houduan.php?username=张三丰&userpwd=123456
? : 用来携带参数
& : 连接多个数据
post请求:
表单method="post",提交表单时,发送的是post类型请求
假设不知道前端发送的是get请求还是POST请求,那么后端就可以使用request。
HTML的代码不需要变,PHP中 var_dump($_REQUEST);
$_REQUEST :
1、 既可以获取get方式传递的数据,也可以获取post方式传递的数据
2、获取请求的速度相对$_GET和$_POST较慢
文件上传:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 文件上传时,表单method必须为"post" -->
<!-- 文件上传时,必须设置enctype="multipart/form-data" -->
<form action="file.php" method="post" enctype="multipart/form-data">
<!-- 文件上传控件 -->
<input type="file" name="pic">
<br>
<input type="submit">
</form>
</body>
</html>
<?php
header('Content-type:text/html;charset=utf-8');
// 超级全局变量
// $_FILES : 接收上传的文件数据
var_dump($_FILES);
// 当前的php默认设置上传文件大小的限制,最大不能超过2M
?>
接下来我们要对用户传入的内容进行校验 话不多,直接上代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="12_validate.php" method="post">
用户名: <input type="text" name="username">
<br>
密码: <input type="password" name="userpwd">
<br>
<input type="submit" value="登录">
</form>
</body>
</html>
<?php
header('Content-type:text/html;charset=utf-8');
// 接收用户传递的数据
// var_dump($_REQUEST);
// 数组取值:数组[键名]
$uname = $_REQUEST['username'];
$upwd = $_REQUEST['userpwd'];
// echo '用户名:' . $uname;
// echo '<br>';
// echo '密码:' . $upwd;
// empty(参数):判断参数是否是空字符串
// 如果是空字符串,返回true
// 如果不是空字符串,返回false
// 如果用户名或者密码没有输入内容,提示 用户名或密码不能为空!
if(empty($uname) || empty($upwd)){
// die('字符串'):输出字符串,并且终止后续程序的执行
die('用户名或密码不能为空!');
}
// 只允许用户名是大写或者小写字母
// preg_match(正则规则,需要校验的字符串):正则校验
// 在这里我们不去学习正则规则,如有需要可以去百度
// 如果字符串符合正则规则,返回1
// 如果字符串不符合正则规则,返回0
$res = preg_match('/^[a-zA-Z]+$/',$uname);
if($res == 0){
die('用户名只能包含大写或者小写字母!请勿输入其他字符!');
}
?>
欲知后事如何,且听下回分解。