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中函数不能重复声明

<?phpheader("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 = 18function 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, 执行失败返回 falseif ( 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 / falsefunction 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) 失败, 返回 falsefunction 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)

    //设置cookiesetcookie('名称','值'); 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文件,查看其中是否存放有当前用户的信息

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

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

前端之路(PHP篇)相关推荐

  1. 我的前端之路 (css篇)

    CSS基础篇 第一章 文章目录 CSS基础篇 前言 一.CSS是什么? 二.css能做什么 1.CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化. 2.CSS 能够对网 ...

  2. 【2022年终总结】前端之路第一篇——实习

    目前

  3. 我的web前端自学之路-心得篇:我为什么要学习web前端?

    时光如流水,转眼间,自己已经是大三的学长了,看着一个个学弟学妹,心中有种莫名的感觉,很怀念大学的前两年时光,但也很憧憬着自己的未来,自己将要去经历很多从未经历的事.我是我们学校信科院的一名学生,在编程 ...

  4. 后端工程师的前端之路系列--小程序学习

    我是一名5+工作经验的后端程序员,但一直拥有一颗对前端向往的不死之心,在学校的时候,就开始学习css.js.juqery等技术栈,还不断的做一些小游戏,比如2048单机版.音乐盒子等, 后来就开始接触 ...

  5. 随感 | 毕设风雨 | 前端之路 | 暗夜与旅人 | 早槐与龙鲤

    当日何人送我行,别时江上雨如倾. 飘飖尽洗青天色,寥落初生白月明. 树色渐深春有影,人潮谁记我无名. 独怜怨语难销尽,此夜湖山未放晴. 此时已经是2021年五月二十日的深夜,过往风雨皆尽,老实说,直到 ...

  6. 【面试】前端面试之Vue篇

    文章目录 前端面试之Vue篇 vue组件的核心选项 vue组件的通信方式有哪几种? vue如何操作dom节点? vue当数据更新是如何更新dom节点的? computed内想传入一个参数,要怎么实现? ...

  7. 我的前端之路:从切图到放弃

    之前在那篇<我的编程之路>里,我讲述过我的编程之路.今天我们就来说说我的前端之路,相信以后还会有一篇<我的全栈之路>. 记得在一直有三个主要的发展方向:编程.写作.设计.依据这 ...

  8. 后端工程师的前端之路系列

    我是一名5+工作经验的后端程序员,但一直拥有一颗对前端向往的不死之心,在学校的时候,就开始学习css.js.juqery等技术栈,还不断的做一些小游戏,比如2048单机版.音乐盒子等, 后来就开始接触 ...

  9. 2016-我的前端之路:工具化与工程化

    2016-我的前端之路:工具化与工程化 2016-我的前端之路:工具化与工程化从属于笔者的Web 前端入门与工程实践,本文承接自笔者去年的年度总结:2015-我的前端之路:数据流驱动的界面.另外如果对 ...

  10. 前端之路:工具化与工程化

    前言 二十载光辉岁月 近年来,随着浏览器性能的提升与移动互联网浪潮的汹涌而来,Web前端开发进入了高歌猛进,日新月异的时代.这是最好的时代,我们永远在前行,这也是最坏的时代,无数的前端开发框架.技术体 ...

最新文章

  1. nmap 获取主机名
  2. 使用BeautifulSoup爬虫
  3. AIoT时代的新思维
  4. LiteOS基于Sensorhub的超声波模组移植
  5. Oracle和sqlserver数据类型对应
  6. Git:checkout命令无法切换回master
  7. mysql索引超出了数组接线_索引超出数组范围是什么意思
  8. 流媒体服务器搭建之Red5
  9. uniapp开发微信小程序canvas动画入门
  10. SSL P2133 腾讯大战360 题目
  11. SpringDataJPA(二):SpringDataJPA的运行原理以及基本操作
  12. java.util.Date中的loe_有趣的widget-日期和时间
  13. windows 性能监控--Perfmon主要指标
  14. dvwa上传php文件,DVWA之文件上传漏洞
  15. 关于电脑设置个性化此电脑属性打不开问题
  16. 数字商标能注册商标吗?
  17. 年薪50万的程序员_毕业之后,这些年薪50万+的90后程序员经历了什么?-阿里云开发者社区...
  18. 正则表达式 判断 是不是 包不包含 ulr
  19. 数据科普:定价模型与平价关系式(投资必知必会)
  20. MySQL注释形式_可执行注释语句(/*!...*/)_数据库注释_数据库脚本注释_SQL脚本注释格式_SQL脚本注释分类

热门文章

  1. 华为OD机试 - 机器人走迷宫(Java JS Python)
  2. 解决“psycopg2.errors.InsufficientPrivilege: permission denied for table”问题
  3. 灵飞经3 印神无双 第十四章 印神古墓 2
  4. 如何测试搜索引擎的索引量大小
  5. bitdock系统错误_Docker在centos下安装以及常见错误解决
  6. python代码情话_谁说程序员不懂浪漫?代码情书专门为你定制
  7. 用Python爬取中国新说唱歌曲信息
  8. iOS项目总结——梦享一键连接SDK
  9. 提醒事项同步日历代码
  10. JavaScript 对象字面量