前端之路(PHP篇)

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运行原理

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/switch)

基本上来说,所有语言的if..else语法都是一样

$age = 17;
if ($age >= 18) {
  echo "终于可以抽烟喝酒烫头了";
} else {
  echo "哎......";
}
​
//===================
switch(变量){
    case 值1:
        程序块1;
        break;
    case 值2:
        程序块2;
        break;
    ...
    default:
        程序块
}
​

循环结构(while / for / do...while)

while(判断表达式){
    程序块;
}
​
for(赋值表达式; 判断表达式; 步进表达式){
    程序块;
}
​
do{
    程序块
} while(判断表达式)

遍历索引数组

$arr = array("张三", "李四", "王五", "赵六", "田七", "王八");
//获取数组的长度: count($arr)
for($i = 0; $i < count($arr); $i++) {
  echo $arr[$i];
  echo "<br>";
}

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 . "<br>";
}

contiune和break

contiune: 结束当前循环,直接跳入下一次循环break: 结束整个循环

函数

注意,在php中函数不能重复声明

<?php
    header("content-Type:text/html;charset=utf-8");
    //php中函数的语法与js中函数的语法基本一样,不同点在于
    //1. 函数名大小写不敏感
    //2. 函数的形参可以设置默认值
    function sayHello ($name="周杰伦") {
        echo "大家好,我是$name";
        echo "<br>";
        [return 返回值;]
    }
    sayHello();//不传参数,会使用默认值
    sayHello("大象");//传参数,默认值不生效
?>

php中关于函数需要注意的问题:

  • 在php中函数不能重复声明

  • 函数体内的变量只在函数体内有效

  • 函数体外的变量只在函数体外有效

<?php  
    $age = 18
    function fn(){
        $name = '大象';
        echo $name;  //有效
        echo $age; //无效
    } 
    fn();
    echo $name;  //无效
    echo $age; //有效
    
?>

常量

  保存不会发生改变的数据(如:3.1415, 路径等)时,最好使用常量。

常量的使用方法: 1) 声明: define(常量名, 常量值, 大小写区分标志);

​ true(不区分)/false(区分/默认);

2) 调用: echo 常量名;

注意:一般在实际工作中,常量都用大写

PHP内置函数

数学函数

  • 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代码 一起返回给浏览器,由浏览器进行解析

  • <?php 
        header('content-type:text/html;charset=utf-8');    
        echo 2+3;
        // php的引擎 只会执行php代码块中代码,代码块外面的代码会被忽略
        // 最后 服务器会将php执行的结果 和代码块外面的内容一起返回给 浏览器,
        // 由浏览器进行解析
    ?>
    <a href="http://www.baidu.com">百度一下</a>

include文件引入

介绍

​ 不同的页面中有相同的代码部分,可以将其分离为单个文件。需要调用时,include 引入对应的文件即可调用。提高代码的复用率。

类似于 js 中 script 标签导入, 可以用于函数复用

语法

include | include_once   "文件的路径"

include 与 include_once区别

  • include 可以重复引入文件

  • include_once 只引入一次,防止多次引入文件

 

PHP数据读写到文件(数据持久化)

程序运行过程中,数据存储在内存中的,程序结束, 数据会销毁

如果希望可以永久存储某些数据,可以将数据存储在硬盘上(存储在文件中)

将数据由 内存 存储到硬盘的过程,称为数据持久化;

  • 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属性,后台才能获取到
<input type = "file" name="photo"/>

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协议

协议:

协议,就是事先的一种约定、规则、规范、标准。

 常见协议

  • 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
​
//-----------------------响应主体------------------------------------------------
用户登录成功

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
    }
    

使用可视化工具navicat操作数据库

MySQL只是一个数据库软件,如果我们要创建数据库,或对数据库进行增删改查,刚开始可以用可视化工具来操作,让我们更加直观的了解数据库

数据库表的操作

数据库的数据类型

也就是数据库中可以存储的数据类型(又叫做字段类型)

字段类型初步介绍

  • 整型 int

    ​ 存储如年龄,产品数量,编号等。

  • 小数类型 float , decimal

    重量,工资,奖金,价格等

    ​ 使用decimal类型,实现小数的精确存储,一般用来存储与钱有关的数字。3.333333331

  • 字符串型 varchar(M),char(M) ,text

    ​ M为该字段可以存储的最多字符数(字节)

    ​ 如varchar(10)最大可以存储10个字节

    ​ varchar一般用来存储长度变化比较大的字符串,如文章标题,商品名称,

    ​ char存储长度比较固定的字符串,如手机号,身份证号,序列号,邮编。

    ​ 此外可以使用text类型,存储较长的字符串,无需指定字符串的具体长度。

  • 日期时间型 datetime, date(年月日),time(时分秒)

    ​ 年月日时分秒。

字段约束

字段约束: 字段数据的属性规则(特征)

  1. not null 不为空

    可以限制字段值不能为空

  2. default 默认值,

    可以设置字段的默认值,在没有录入时自动使用默认值填充。

  3. primary key 主键 :唯一标识,不能重复,不能为空

    设置字段为主键,主键字段的值不能重复,不能为空。而且一个数据表中只能设置一个字段为主键,作为每行记录的唯一身份信息(索引)。

  4. auto_increment 自动增长

    设置字段为自动增长,默认从1开始自动分配编号。自增长字段必须为一个key(索引,数据结构,便于快速查找数据,相当于书的目录),一般与primary key结合使用。

    类型必须为整型。

  5. unique key 不能重复

    唯一键,设置字段的值为唯一的,可以设置多个字段为唯一键。唯一键字段的值可以为空。

    学号设置为主键,要求唯一的,不能为空的,用来标识学生信息,

    姓名 年龄 性别 id
    wb 18 1
    ww 19 3
    ls 30 未知 4
    hs 80 5
    呵呵呵 45 7
    id name age gender score
             

SQL-操作数据库的语言

SQL:structured Query Language 结构化查询语言。

  • 通过这个语言可以对数据库,进行增删改查

SQL编写注意点: 注释用 -- , 语句结束加分号(;)

增删改查**

  1. 插入数据 insert

-- insert into 表名 (字段列表) values (值列表)
insert into book (name,author,category,price) values ('天龙八部','金庸','文学',20)
  1. 修改数据update

-- update 表名 set 字段名称1=值1,字段名称2=值2,... where 条件
-- 如果不加条件会修改表中所有对应的字段
update book set name='笑傲江湖',price='30' where id=10
  1. 删除数据delete

-- delete from 表名 where 条件
delete from book -- 会删除所有数据
delete from book where id=10
  1. 查询数据select

-- select 字段列表 from 表名
select name, author from book -- 只查询表中name和author的信息 
-- select * from 表名 where 条件  *表示所有字段
select * from book where author='金庸' and price>20

SQL高级

  • 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;   -- 老师表和班级表联合查询,但只显示老师表的全部内容和班级表的名称
    ​
    -- 注意: 多表联合查询时,字段要写明是那个表的字段 如  表.字段名

    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); 返回结果集的行数 $res->num_rows

  • sql操作注意事项:

  • 使用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 "数据库连接成功<br>";
    ​
      // 2. 准备 sql 语句: 删除一条数据
      $sql = "delete from stu where id = 14";
    ​
      // 3. 让数据库执行 sql 语句, 并分析结果
      // mysqli_query(数据库连接对象, 要执行的sql语句)
      // 执行成功返回 true, 执行失败返回 false
      if ( mysqli_query( $link, $sql ) ) {
        echo "删除成功";
      } 
      else {
        echo "删除失败<br>";
        // mysqli_error 可以查看错误消息
        echo mysqli_error($link);
      }
    ​
      // 4. 关闭数据库连接 (挂电话)
      mysqli_close( $link );

    非查询(增删改)和查询语句(select)的区别

    通过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 '<pre>';
      print_r($arr);
      echo '</pre>';
  • 数据库工具函数的封装

    为了提高代码的复用性,把数据增删改的操作封装成一个方法

      // 定义常量
      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 "获取数据失败<br>";
          echo mysqli_error($link);
          mysqli_close( $link );
          return false;
        }
    ​
        // 得到结果集, 将结果集的所有内容取出到数组中
        $arr = [];
        while ( $row = mysqli_fetch_assoc($res) ) {
          $arr[] = $row;
        }
    ​
        mysqli_close( $link );
        return $arr; // 返回结果数组
      }

COOKIE 和 SESSION

会话:浏览器与服务器之间的数据交流。

HTTP协议特点:

无状态的, 多次请求之间没有相关性

即同一用户请求同一网站的不同页面,服务器无法识别是否是同一用户发起的请求。因此,用户无法进行连续的业务逻辑。

如:登录,已在A页面登录,请求B页面,提示未登录。

cookie 和 session 区分

  • cookie: 在浏览器端的 存储数据的 容器

  • session 在服务器端的 存储数据的 容器

cookie

  • 在浏览器端的 存储数据的 容器

  • 可以使用js对cookie进行操作

  • cookie 允许服务器脚本(PHP脚本)在浏览器端存储数据

  • cookie特点:在cookie中数据设置后,浏览器再次请求服务器指定页面时,会自动携带cookie中的数据到服务器,在服务器中可以获取cookie中的数据;

js操作cookie(了解)

// 设置cookie
document.cookie = 'name=zs'; 
document.cookie = 'pwd=123';   
​
// 获取cookie中的值
document.cookie;

jquery.cookie.js插件 操作cookie

//向页面中引入插件js文件,基于jquery的 
$.cookie('weight',100,{expires:7});//设置   expires 过期时间
$.cookie('name');//获取
$.removeCookie('name');//删除 
​
$.cookie(键,值,{expires:过期天数})
$.cookie(键) //获取 

PHP操作cookie(服务器端操作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在使用前,必须先 session_start 开启session 机制

  • session中的数据可以被当前网站所共享

session的基本操作

开启session机制(使用session前必须调用此方法)

 session_start(); //开启session会话或者重用已经创建的会话。

小结:

  1. 会在服务器中自动对每个第一次访问的用户, 随机生成一个sessionID

  2. 再根据 sessionID, 自动创建一个session会话文件,我们可以在其中存储该用户的数据

  3. 响应时, 在响应头中设置set-cookie, 存放该用户的sessionID

  4. 将来浏览器端根据响应头, 将sessionId 存到 cookie 中, 并在下一次请求时携带

  5. 下次访问时, 服务器端就会根据 sessionId 找到该用户的会话文件, 我们可以从session中读取用户信息, 实现会话保持

设置和获取session中的数据(通过超全局变量$_SESSION进行操作)

//设置
$_SESSION['键']='值'; 
//删除
unset($_SESSION['键']); 
//清空session
$_SESSION=[]; 
//直接删除session会话文件,PHP脚本将无法读取session数据
session_destroy();
 //获取session的id
session_id();

COOKE 和SESSION的应用--登录状态保持

登录模块的基本思路:

  1. 如果用户登录成功,在服务器中记录用户的登录状态

    • session_start(), 对于第一次访问的用户, 会自动生成 sessionId, 并创建session文件,

    • 我们需要在session文件中,记录当前用户的信息

    • 通过响应头,给浏览器的cookie设置sessionID

      if($name=='zs'&&$pwd=='666'){  
        // 登录成功, 将该用户唯一标识存到 session 中
        // 该用户数据库中 id 为 1
        $id = 1;
        session_start();
        $_SESSION['userid']=$id;
      }​
  2. 后续访问其他页面(个人中心),浏览器会自动发送cookie中存放的sessionID到服务器

  3. 服务器会浏览器传递根据sessionID,找到对应的session文件,查看其中是否存放有当前用户的信息

    • 是: 用户已登录 ,正常浏览

    • 否:用户未登录,跳转到登录页

猜你喜欢

转载自blog.csdn.net/weixin_44137393/article/details/86591973
今日推荐