PHP编程基础学习记录

× 文章目录
  1. 1. PHP
    1. 1.1. PHP变量的数据类型
    2. 1.2. 常量
    3. 1.3. 预定义变量
    4. 1.4. 运算符
    5. 1.5. 语言结构
  2. 2. 函数
    1. 2.1. 函数的定义
    2. 2.2. 函数的参数
    3. 2.3. 函数返回值
    4. 2.4. 函数的变量
      1. 2.4.1. 局部变量
      2. 2.4.2. 全局变量
    5. 2.5. 复杂函数
    6. 2.6. 系统函数库
      1. 2.6.1. 字符函数库
      2. 2.6.2. 数学函数库
      3. 2.6.3. 日期时间函数
  3. 3. 数组
    1. 3.1. 数组分类
    2. 3.2. 定义数组
    3. 3.3. 使用数组
    4. 3.4. 标量类型转换为数组
    5. 3.5. 数组运算符
    6. 3.6. 遍历数组
    7. 3.7. 数组指针遍历数组
  4. 4. 会话控制
    1. 4.1. 为什么使用session
    2. 4.2. 与session相关的函数
    3. 4.3. cookie
  5. 5. 文件操作
    1. 5.1. 文件函数库
    2. 5.2. 类操作
    3. 5.3. 可变参数列表
    4. 5.4. 对象序列化
  6. 6. mysql相关操作
    1. 6.1. MySQL方连接数据库
    2. 6.2. MySQL执行SQL语句
    3. 6.3. 数据库操作
    4. 6.4. 数据表操作
    5. 6.5. MySQL事务和锁
    6. 6.6. MySQL数据操作
  7. 7. MySQLi面向过程方式操作数据库

印象笔记中躺着一篇当时学PHP的一篇笔记,贴出来,从慕课网上学的

PHP官方手册

看代码还是直接查手册吧

PHP

运行在服务端、跨平台、脚本语言、免费

代码标识

1
2
3
<?php
echo "hello world!"; //可以把多个字符串连接起来,连接符用点 (.) 表示,结束符(;)表示,注释用(//)表示
?> // ?>可以忽略

PHP变量的数据类型

变量在程序执行期间可以变化的量,是用于存储数据的
定义变量就是向服务器的内存申请空间,用来存储数据
变量名和变量值

1
$var_name = "test"   //$ 变量标识符

变量名称命名规则
变量名必须以字母或下划线开头,由字母、数字和下划线组成,不允许包含空格,当变量名由多个单词组成,建议使用下划线法($my_name)或驼峰命名法($myName),注意变量名区分大小写
var_dump 函数可以用来输出变量的数据类型
memory_get_usage函数获取当前PHP消耗的内存
数据类型
8种原始类型,其中包括四种标量类型、两种复合类型和两种特殊类型
PHP是一门松散类型的语言,不必向PHP声明变量的数据类型,PHP会自动把变量转换为自动的数据类型

数据类型 种类 特点
标量类型 整型 八进制/十进制/十六进制 范围:有符号-21亿到21亿,无符号0-42亿,超过溢出
标量类型 浮点型
标量类型 布尔型
标量类型 字符串型
复合类型 数组(array)
复合类型 对象(object)
特殊类型 资源(resource)
特殊类型 空(null)

标量类型只能存储单一数据

标量类型-布尔类型

尔类型(boolean):只有两个值,一个是TRUE,另一个FALSE,可以理解为是或否。它不区分大小写,主要用在条件结构中,判断是否满足条件

标量类型-整型

整型(integer):类似于常见的整数。它可以用十进制、八进制(0,如0123)、十六进制(0x,如0x123)指定

标量类型-浮点型

浮点型(浮点数、双精度数或实数),也就是通常说的小数,可以用小数点或者科学计数法表示。科学计数法可以使用小写的e,也可以使用大写的E。

如1.234,1.2e3,1.2E-10

标量类型-字符串

字符串是由一系列字符组成,在PHP中,字符和字节一样,也就是说,一共有256种不同字符的可能性。字符串型可以用三种方法定义:单引号形式、双引号形式和Heredoc结构形式。

当双引号中包含变量时,变量会与双引号中的内容连接在一起;当单引号中包含变量时,变量会被当做字符串输出。

当字符串很长,可以使用Heredoc结构形式解决 首先使用定界符表示字符串(<<<),接着在“<<<“之后提供一个标识符GOD,然后是字符串,最后以提供的这个标识符结束字符串

1
2
3
4
5
6
7
8
9
10
<?php 
$string1 = <<<GOD
我有一只小毛驴,我从来也不骑。
有一天我心血来潮,骑着去赶集。
我手里拿着小皮鞭,我心里正得意。
不知怎么哗啦啦啦啦,我摔了一身泥.
GOD;

echo $string1;
?>

特殊类型-资源

资源(resource):资源是由专门的函数来建立和使用的,例如打开文件、数据连接、图形画布。我们可以对资源进行操作(创建、使用和释放)。任何资源,在不需要的时候应该被及时释放。如果我们忘记了释放资源,系统自动启用垃圾回收机制,在页面执行完毕后回收资源,以避免内存被消耗殆尽。

1
2
3
4
5
<?php
$file=fopen("f.txt","r"); //打开文件
$con=mysql_connect("localhost","root","root"); //连接数据库
$img=imagecreate(100,100);//图形画布
?>

特殊类型—空类型

NULL(NULL):NULL是空类型,对大小写不敏感,NULL类型只有一个取值,表示一个变量没有值,当被赋值为NULL,或者尚未被赋值,或者被unset(),这三种情况下变量被认为为NULL。

1
2
3
4
5
6
7
8
9
10
11
12
<?php 
error_reporting(0); //禁止显示PHP警告提示
$var;
var_dump($var);
$var1 = null;
var_dump($var1);
$var2 = NULL;
var_dump( $var2);
$var3 = "节日快乐!";
unset($var3);
var_dump($var3);
?>

常量

什么是常量?常量可以理解为值不变的量(如圆周率);或者是常量值被定义后,在脚本的其他任何地方都不可以被改变。PHP中的常量分为自定义常量和系统常量
自定义常量
定义常量是根据我们开发的需要,而定义的常量,它通过使用PHP中的函数define()定义。
使用 const定义常量
const WEB_TITLE=”XXXX”

常量主要功效是可以避免重复定义,篡改变量值。

bool define(string $constant_name, mixed $value[, $case_sensitive = true])

它有3个参数(也就是原料):第一个参数“constant_name”为必选参数,常量名称,即标志符,常量的命名规则与变量的一致,但是要注意哦,它可不带美元符号哦。第二个参数“value”为必选参数,它是常量的值。第三个参数“case_sensitive”为可选参数,指定是否大小写敏感,设定为true表示不敏感,一般不指定第三个参数的情况下,默认第三个参数的值为false。(注: string表示参数类型为字符串类型,mixed表示参数类型可以接受为多种不同的类型,case_sensitive = true表示默认为布尔类型TRUE)

1
2
3
4
5
6
7
8
<?php
$p = "PII";
define("PI",3.14);
define($p,3.14);
echo PI;
echo "<br />";
echo PII;
?>

系统常量

1
2
3
4
5
6
7
8
9
10
<?php
echo __FILE__; //php程序文件名,获取当前文件在服务器的物理位置
echo "<br />";
echo __LINE__;//当前的行数
echo "<br />";
echo PHP_VERSION;//当前解析器版本号
echo "<br />";
echo PHP_OS;//操作系统名称
echo "<br />";
?>

结果

1
2
3
4
F:\study\php\a.php
9
7.0.12
WINNT

常量如何取值

获取常量值的有两种方法取值。第一种是使用常量名直接获取值;

第二种是使用constant()函数。它和直接使用常量名输出的效果是一样的,但函数可以动态的输出不同的常量,在使用上要灵活、方便,其语法格式如下:
mixed constant(string constant_name)

第一个参数constant_name为要获取常量的名称,也可为存储常量名的变量。如果成功则返回常量的值,失败则提示错误信息常量没有被定义。(注:mixed表示函数返回值类型为多种不同的类型,string表示参数类型为字符串类型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
$p="";
//定义圆周率的两种取值
define("PI1",3.14);
define("PI2",3.142);
//定义值的精度
$height = "中";
//根据精度返回常量名,将常量变成了一个可变的常量
if($height == "中"){
$p = "PI1";
}else if($height == "低"){
$p = "PI2";
}
$r=1;
$area= constant($p)*$r*$r;
echo $area;
?>

xmsec@evalsafe
http://47.95.199.122:8000

如何判断常量是否被定义

如果常量被重复定义以后,PHP解析器会发出“Constant XXX already defined”的警告,提醒我们该常量已经被定义过

defined()函数可以帮助我们判断一个常量是否已经定义,其语法格式为:
bool defined(string constants_name)
它只有参数constant_name,指的是要获取常量的名称,若存在则返回布尔类型true,否则返回布尔类型false; (注:bool表示函数返回值类型为布尔类型)

获取所有已定义的常量
get_defined_constants()
通过print_r打印数组
魔术常量
由__双下划线开始

预定义变量

所有预定义变量都是全局变量

1
2
3
4
5
6
7
8
9
$GLOBALS
$_SERVERS
$_ENV
$_COOKIE
$_SESSION
$_FILES
$_GET
$_POST
$_REQUEST ($_GET/$_POST/$_COOKIE)

运算符

算符是告诉PHP做相关运算的标识符号

PHP运算符一般分为算术运算符、赋值运算符、比较运算符、三元运算符、逻辑运算符、字符串连接运算符、错误控制运算符。
算术运算符

取模算术符

假设我们要在一个考场安排了一场考试,对考生从1开始,都进行了编号,那么怎么让服务器帮助我们计算考生在的位置呢,进而打印考场的考生对照表呢?

1
2
3
4
5
6
7
8
9
<?php 
$maxLine = 4; //每排人数
$no = 16;//学生编号

$line = ceil($no/$maxLine);
$row = $no%$maxLine?$no%$maxLine:$maxLine;

echo "编号<b>".$no."</b>的座位在第<b>".$line."</b>排第<b>".$row."</b>个位置";
?>

赋值运算符

(1)“=”:把右边表达式的值赋给左边的运算数。它将右边表达式值复制一份,交给左边的运算数。换而言之,首先给左边的运算数申请了一块内存,然后把复制的值放到这个内存中。
(2)“&”:引用赋值,意味着两个变量都指向同一个数据。它将使两个变量共享一块内存,如果这个内存存储的数据变了,那么两个变量的值都会发生变化。

1
2
3
4
5
6
$a = "我在慕课网学习PHP!";
$b = $a;
$c = &$a;
$a = "我天天在慕课网学习PHP!";
echo $b."<br />";
echo $c."<br />";

比较运算符

三元运算符

(“?:”)三元运算符也是一个比较运算符,对于表达式(expr1)?(expr2):(expr3),如果expr1的值为true,则此表达式的值为expr2,否则为expr3。

1
2
3
4
5
<?php 
$a = 78;//成绩
$b = $a >=60?'及格':'不及格';
echo $b;
?>

逻辑运算符

连接运算符

字符串连接运算符是为了将两个字符串进行连接,PHP中提供的字符串连接运算符有:
(1)连接运算符(“.”):它返回将右参数附加到左参数后面所得的字符串。
(2)连接赋值运算符(“.=”):它将右边参数附加到左边的参数后。

错误控制运算符

PHP中提供了一个错误控制运算符“@”,对于一些可能会在运行过程中出错的表达式时,我们不希望出错的时候给客户显示错误信息,这样对用户不友好。于是,可以将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉;

如果激活了track_error(这个玩意在php.ini中设置)特性,表达式所产生的任何错误信息都被存放在变量$php_errormsg中,此变量在每次出错时都会被覆盖,所以如果想用它的话必须尽早检查。

需要注意的是:错误控制前缀“@”不会屏蔽解析错误的信息,不能把它放在函数或类的定义之前,也不能用于条件结构例如if和foreach等。

语言结构

顺序结构

顺序结构就像一条直线,按着顺序一直往下执行。我们编写的代码默认都是按照顺序结构执行的。

条件结构

PHP中的“if…else…”语法

1
2
3
4
5
6
7
<?php
if(条件){
//分配服务器干的任务A
}else{
//分配服务器干的任务B
}
?>

PHP中的“if…else if…”语法

1
2
3
4
5
6
7
<?php
if(条件一){
//分配服务器干的任务A
}else if(条件二){
//分配服务器干的任务B
}
?>

PHP条件结构之if…else if…else…

1
2
3
4
5
6
7
8
9
<?php
if(条件一){
//分配服务器干的任务A
}else if(条件二){
//分配服务器干的任务B
}else{
//分配服务器干的任务C
}
?>

PHP条件结构之switch…case…

使用 switch 语句可以避免冗长的 “if..else if..else”代码块

break的作用是阻止代码进入下一个case 中继续执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
switch (条件)
{
case 条件值一:
//任务一
break;
case 条件值二:
//任务二
break;
default:
//默认任务
}
?>

循环结构

在PHP中,while循环语句如下:

1
2
3
4
5
<?php
while(条件){
//执行任务
}
?>

do…while循环语句语法如下:

1
2
3
4
5
<?php
do{
//执行任务
}while(条件)
?>

while与do…while循环语句的区别是,while先判断条件是否成立,后执行循环,do...while先执行一次任务,再判断是否继续执行循环,也就是说do...while至少会执行一次任务。当条件为FALSE时,while中的任务会一次也不执行,do...while中的任务会执行1次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //A例子
$num = 2;
$sum = 10;
while($num>3){
$sum = $sum + 10;
}
echo "A例子的结果:".$sum."<br />";
//B例子
$num = 2;
$sum = 10;
do{
$sum = $sum + 10;
}while($num>3);
echo "B例子的结果:".$sum."<br />";
?>
1
2
A例子的结果:10
B例子的结果:20

while和do…while可以根据具体情况选用。假设有一种棋类游戏,首先掷骰子,若不为6,前进骰子的点数的步长;若为6,前进骰子的点数的步长,并可以再掷一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
//while例子
$sum = 0;
$num = rand(1,6); //获取1至6的随机数,模拟掷骰子
$sum = $sum + $num;//前进步长
while($num==6){
$num = rand(1,6);//获取1至6的随机数,模拟掷骰子
$sum = $sum + $num;//前进步长
};
echo "while例子执行完毕,前进:".$sum ."<br />";
//do...while例子
$sum = 0;
do{
$num = rand(1,6);//获取1至6的随机数,模拟掷骰子
$sum = $sum + $num;//前进步长
}while($num==6);
echo "do...while例子执行完毕,前进:".$sum ."<br />";
?>

for循环语句结构如下:

1
2
3
4
5
<?php
for(初始化;循环条件;递增项){
//执行任务
}
?>

在PHP中foreach循环语句,常用于遍历数组,一般有两种使用方式:不取下标、取下标。
(1)只取值,不取下标

1
2
3
4
5
<?php
foreach (数组 as 值){
//执行的任务
}
?>

(2)同时取下标和值

1
2
3
4
5
<?php
foreach (数组 as 下标 => 值){
//执行的任务
}
?>

函数

函数的定义

实现特定功能的,可以重复执行的代码段

函数分为内置函数和用户函数

内置函数是指PHP本身提供的各类库函数,如字符函数库/数学函数库等

用户函数是指用户在程序中自定义的函数或方法

函数名定义规则:用正则表示:[a-zA-Z_\x7f-\xff]  [a-zA-Z0-9_\x7f-\xff]

1
2
3
function testa() {  
{代码段}
}

函数的参数

1
2
3
4
5
function testa($i) {
$i+=1;   
echo $i;
}
testa(1);

函数的默认值
给参数里的变量复制,就是参数的默认值
function testa($a=1, $b=2){
}
值传递
在函数内部修改变量的值的情况下,在函数调用时调用函数外部的变量,值不变

引用传递
在函数内部修改变量的值的情况下,在函数调用时,函数的参数前面加一个&符号,值发生改变

可变参数列表
func_num_args(); 参数个数
func_get_arg(); 返回一个参数,加数组的索引
func_get_args(); 返回参数数组
参数的类型
array 对象 callable

函数返回值

1
2
3
4
5
6
function testa($i) {
$i+=1;   
return $i; //return后面的代码不执行
}
$return = testa(1);
echo $return;

函数的变量

局部变量

局部动态变量
变量旨在函数内部执行,执行完毕后被销毁

1
2
3
4
5
6
7
8
9
10
11
12
function testa() {
$i=1;   
$i++;   
echo $i;
}
testa();
testa();

//输出结果
2
2

局部动态变量
在函数内部设置static,执行完毕后不被销毁

1
2
3
4
5
6
7
8
9
10
11
function testa() {
static $i=1;   
$i++;   
echo $i;
}
testa();
testa();

//输出结果
2
3
全局变量

使用global在函数内部定义全局变量

1
2
3
4
5
6
7
8
9
10
$i = 1;
function testa()
global $i
$i++;
}
testa();
echo $i;

//输出结果
2

复杂函数

可变函数
通过变量改变函数的名字并调用

1
2
3
4
5
6
7
8
9
10
11
12
13
function test1(){
echo 1;
}
function test2(){
echo 2;
}
if(false){
$fun = test1();
$fun;
}else{
$fun = test2();
$fun;
}

函数的嵌套
在一个函数内在定义一个函数,调用时先嗲用外面的函数在调用里面的函数,注意变量的作用域,内部函数不可以执行外部函数内的变量

递归调用
自己调用自己,递归里面要有跳出这个递归的判断条件

1
2
3
4
5
6
7
function fbnq($n){
if($n<=2){
return 1;
}
return fbnq($n-1) + fbnq($n-2);
}
echo fbnq(6);

匿名函数
使用变量代替函数名,调用时也用变量加小括号来进行调用
声明一个匿名函数,用来以后做回调函数使用

1
2
3
4
$a = function ($str){
echo $str;
};
$a('hello');

系统函数库

字符函数库

字符串长度
strlen
字符串大小写转换
strtoupper 全转换成大写
strtolower 全转换成小写
ucfirst 句子首字母转换成大写
ucwords 每个单词首字母转换成大写

字符串替换函数
str_replace
str_ireplace 不区分大小写

字符串转换实体函数

1
2
$str = "a<b'\"";
echo htmlspecialchars($str,ENT_QUOTES);

删除空格函数

ltrim rtrim trim函数
字符串位置获取相关函数
strpos
返回一个字符在另一个字符第一次出现的位置
stripos
同上,忽略大小写

strrpos
返回一个字符串在另一个字符串最后一次出现的位置
strripos
同上,忽略大小写

字符串截取函数

substr($str, 0, 4)
$str字符串
0 开始位置
4 截取长度

strstr
搜索一个字符串在另一个字符串中第一次出现的位置,返回字符串的其余部分

stristr
不区分大小写

strrchr
搜索字符串在另一个字符串中最后一次出现的位置,返回其余部分

使用场景
对于上传文件,如何获取文件名后缀,如 jpg

1
2
3
4
5
6
$filename = 'ab.cd.ef.jPg';

$num = strrpos($filename, '.'); // 首先获取'.'在最后一次出现的位置
echo strtolower(substr($filename, $num+1));
// substr 截取$num+1到结尾的字符串
// strtolower 转换成小写

反转字符串
strrev

字符串加密函数
md5

打乱字符串
str_shuffle

使用场景
验证码生成

1
2
3
$cap 'abcdefghigklmnopqrstuvwxyz';
//echo md5($cap);
echo substr(str_shuffle($cap),0,4);

字符串分割
拆分
explode
合并
implode

1
2
3
4
5
6
7
$cap = 'a|b|c|d';

$arr = explode('|', $cap);
print_r($arr);

$arr = implode(';',$arr);
echo $arr;

格式化字符串
sprintf

函数 是可以重复执行/封装好的程序代码段

数学函数库

进一/舍一取整
floor
舍一取整
ceil
进一取整

幂运算/平方根
pow幂运算
pow(2, 3) -> 8
sqrt 平方根
sqrt(4) -> 2

最大值/最小值
max
min(至少需要2个或2个以上参数)

随机数
rand
mt_rand

四舍五入
round

1
2
$num = '15.9015';
echo round($num, 3); //3保留3位小数,不写为整数

数字格式化
number_format
以千位分隔符方式格式化数字,使用方法同上

浮点数余数
fmod
fmod(7.8, 3) -> 1.8
7.8%3 -> 1 //整数余数操作

日期时间函数

格式化日期
date
date(‘Y-m-d H:i:s ‘)
时区修改

date_default_timezone_get();
获取默认时区
date_default_timezone_set(‘Asia/Shanghai’);
设置默认时区,或修改php.ini文件中的date片段

时间戳

Unix时间戳,定义从格林威治时间1970年1月1日0时0分0秒起至现在的总秒数

time函数
86400 一天的秒数

strtotime 字符串转时间戳函数

strtotime(‘-3 weeks’);

microtime 函数 获取时间戳和微秒数,用途,某某程序运行时间

1
2
3
4
5
6
7
$start = microtime(true);
$sum = 0;
for($i=0; $i<100000; $i++){
$sum += $i;
}
$end = microtime(true);
echo "总共使用", round($end - $start,4), "秒";

生成唯一ID
uniqid
实际使用 uuid 8-4-4-4-12 = 32 位
md5(uniqid(microtime().mt_rand()))
除了随机数、时间戳,还可以加上网卡mac地址等

获取日期、时间信息
getdate函数

数组

属于符合类型
数组实际上是一个有序映射
keys–values

数组分类

索引数组
数组的下标是数字
关联数组
数组的下标是字符

注意:都是根据键名找到对应的键值

定义数组

通过array()形式
通过[]动态创建
通过range()和compact()快速创建
通过define()定义常量数组

使用数组

通过键名找键值
通过键名进行增删查改

标量类型转换为数组

临时转换
$var = 123;
$res=(array)$var;
var_dump($res);
永久转换
$var = 123;
settype($var,’array’);
var_dump($var);

数组运算符

‘+’合并数组 如果数组键名相同,只会使用左边数组元素的值
‘==’ 比较数组的键名和键值是否相同,返回true或false
‘===’同上,顺序和类型也要相同
‘!= <> !==’ 取反

遍历数组

通过foreach遍历数组
count 计算数组的长度

1
2
3
4
5
6
7
$arr=[
5=>'a',
12=>'b'
];
foreach($arr as $v){
echo $v;
}
1
2
3
4
5
6
7
$arr=[
5=>'a',
12=>'b'
];
foreach($arr as $key=>$v){
echo $key, '--', $v;
}

foreach 用来遍历数组和对象,通过@符号无法抑制错误

1
2
3
4
5
if(is_array($arr)){
foreach($arr as $v){
echo $v;
}
}

PHP7中foreach的改变

  • foreach循环对数组内部指针不再起作用
  • 按照值进行循环时,foreach是对该数组的值进行拷贝
  • 按照引用进行循环时,在循环内修改数组对循环有影响

数组指针遍历数组

数组指针相关函数
key($array) 得到当前指针所在位置的键名,如果不存在,返回null
current($array)得到当前指针所在位置的键值,如果不存在,返回false
next($array) 将数组指针向下移动一位,并返回当前指针所在位置的键值,如果没有,返回false
prev($array)将数组指针向上移动一位,并返回当前指针所在位置的键值,如果没有,返回false
reset($array)将数组指针移动到数组开始,并返回当前指针所在位置的键值,如果没有,返回false
end($array)将数组指针移动到数组末尾,并返回当前指针所在位置的键值,如果没有,返回false

会话控制

session
用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间,session是一个特定的时间概念

为什么使用session

  1. http协议是一种无状态的协议,同一客户端的本次请求和上次请求没有对应关系,http服务器并不知道这两个请求来自同一个客户端
    优点:在于减轻服务器的压力
    缺点:每次请求会传输大量重复的内容信息

  2. session提供在PHP脚本中定义全局变量的方法,是的这个全局变量在同一个会话周期内对于所有的PHP脚本文件都有效,所以,session是基于http服务器的用户保持状态的方法

  3. session允许通过将数据存储在http服务器中,已在整个用户会话过程中保持该数据,所以,session不仅是一个时间概念,还包括了特定的用户和服务器,以及特定的数据

session的工作原理

会话标识符 sessionID
会话是由一个唯一标识符标识,可使用session_id函数读取此标识符,为PHP应用程序启用会话状态时,将检查应用程序中每个页面请求是否有浏览器发送的sessionID值,如果未提供任何sessionID值,则PHP将启动一个新会话,并将该会话的sessionID值随响应一起发送到浏览器

默认情况下,sessionID存储在cookie中

只要一直使用相同的sessionID值来发送请求,会话就被视为活动的,如果特定会话的请求间隔超过指定的超时值(默认1440秒,也就是24分钟),则该会话被视为已过期。如果使用过期的sessionID值发送的请求将会生成一个新的会话

与session相关的函数

session_start()
启动新会话或者重用现有会话

session_id()
读取/设置sessionID
必须在调用session_start()函数之前调用session_id()函数

session_name()
读取/设置会话名称
必须在调用session_start()函数之前调用session_name()函数

session_destroy
销毁session会话

用途:

  • 会话状态管理(如用户登陆状态/购物车等)
  • 个性化设置(如用户自定义设置)
  • 浏览器行为追踪(如跟踪分析用户行为)

setcookie() 函数

文件操作

文件函数库

文件信息相关函数
filetype($filename)
filesize($filename)
filectime($filename) 文件创建时间
filemtime($filename)文件修改事件
fileatime($filename)文件最后访问时间
date(“Y/m/d H:i:s”, fileatime($filename))

检测文件是否可读/可写/可执行
is_readable()
is_writeable()
is_executable()

检测是否唯一个文件,,并且检测文件是否存在
if_file($filename)

文件路径相关的函数
pathinfo()
basename()
dirname()
file_exists() 检测文件目录是否存在

文件操作的相关函数
创建/删除/剪切/重命名/拷贝
touch($filename)
unlink($filename)
rename($filename, $newfilename)
copy($source, $dest)

操作文件内容相关的函数
fopen()
fread()
fgetc() 从文件指针中读取字符
fgets() 从文件指针中读取一行
fgetss() 从文件指针中读取一行并过滤HTML标记
ftell()
fseek()
feof() 检测文件指针是否到了文件结束的位置
rewind() 重置指针
ftruncate() 截断文件内容
fclose()
fwrite()
r+ 覆盖写入
w 清空写入
a 追加写入
fput()

csv格式文件操作
fgetcsv() 返回一个数组
fputcsv()

file_get_contents() 读取内容
file_put_contents() 向文件中写入内容,覆盖之前的内容
写入数组,可以使用序列化/json方式写入

类操作

范围解析操作符 (::)
范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。

1
2
3
4
5
6
7
8
9
10
11
class MyClass{
const PI=3.14;
public function S($r){
echo $r;
}
}
echo MyClass::PI;
MyClass::S(5);

$s = new MyClass();
$s->S(10);

两个冒号(::)是对类中的方法的静态引用
也就是不需要实例化对象,直接直接使用MyClass::PI 来取得PI的值
静态方法调用也同理MyClass::S(5); 直接调用静态方法S()

->
先实例化这个对象
在使用->调用里面的方法

可变参数列表

自定义函数接受自定义个数的参数列表

1
2
3
4
5
6
7
8
9
10
11
12
13
function foo(){
$numargs=func_get_args();
foreach ($numargs as $args) {
echo $args,'<br>';
}
}
foo(1,2,3,4);
function foo(...$args){
foreach ($args as $arg) {
echo $arg,'<br>';
}
}
foo(1,2,3,4);

对象序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A{
public $one=1;
public function show_one(){
echo $this->one;
}
}

$a=new A;
$s=serialize($a);
file_put_contents('a.txt',$s);

$s=file_get_contents('a.txt');
$a=unserialize($s);
$a->show_one();

mysql相关操作

php操作MySQL的三种方式:

  • MySQL:非永久连接,性能比较低,PHP5.5以后被废弃
  • MySQLi:永久连接,减轻服务器压力
  • PDO:能实现MySQLi的常用功能,支持大部分数据库

php扩展查看函数:phpinfo()

MySQL方连接数据库

  1. 连接数据库
    mysql_connect($server, $username, $password)
    等同于数据库操作mysql -uroot -p123456;

  2. 选择数据库
    mysql_select_db($database_name)
    等同于use db;

  3. 设置字符集
    mysql_set_charset($charset)
    等同于 set names utf8;

MySQL执行SQL语句

mysql_query($query)
对insert/update/delete/drop之类进行操作,执行成功返回true失败返回false

数据库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#连接数据库
mysql -hlocalhost -P 6606 -uroot -proot
# 查看数据库
show databases;
# 创建数据库
create database [if not exists] db_name [default character set 'utf8'];
if not exists 检测数据库是否存在,如果不存在则创建

# 查看上一步操作产生的警告信息
show warnings;
# 查看指定数据库的详细信息
show create database vuldb;

# 修改指定数据库的编码方式
alter database vuldb default character set 'utf8'
# 选择数据库
use vuldb;
#
select database() 查看当前打开的数据库
select user() 查看登陆用户
select version() 查看数据库的版本信息
select now() 查看当前的日期时间
#创建表others
mysql> create table others(
-> id int primary key auto_increment,
-> name varchar(20),
-> money int);

#删除指定数据库
drop database [if exists] db_name;

数据表操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
数据表由行(row)和列(column)组成
每个数据表中至少要有一列
表明要求唯一
# 创建表
create table [if not exists] tbl_name(
字段名称 字段类型 [完整性约束条件],
字段名称 字段类型 [完整性约束条件],
字段名称 字段类型 [完整性约束条件]
...
)engine=存储引擎 charset=编码方式;

# 完整性约束条件
unsigned 无符号,从0开始,没有负数
zerofill 零填充,当数据长度不够时,使用补0的效果填充至指定长度
not null 非空约束
default 默认值
primary key 主键,标识记录的唯一值,值不能重复,一个表只能有一个主键
unique key 唯一值,一个表中可以有多个字段是唯一索引,值不能重复,null除外
auto_increment 自动增长,只能用于数值列
foreign key 外键约束

# 查看当前数据库下已有的数据表
show tables;
# 查看指定数据表的详细信息
show create table tbl_name;
#查看表结构
desc tbl_name;
# 删除指定的数据表
drop table if exists tbl_name;
# 表结构相关操作
# 添加字段
alter table tbl_name add 字段名称 字段属性 [完整性约束条件]
# 删除字段
alter table tbl_name drop 字段名称

MySQL事务和锁

事务
事务是一条或者多条数据库操作语句组合
事务处理可以用来维护数据库的完整性,事务必须满足4个特性ACID

  • atomicity原子性:一组事务,要么全部成功,要么撤回
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    例子:
    A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:

    1. 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。
    2. 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。

    如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。

    我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。

    如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。
  • consistency一致性:数据库正确的改变状态后,数据库的一致性约束没有被破坏
  • isolation隔离性:事务之间独立,互不干扰
  • durability持久性:事务的提交结果,将持久保存在数据库中
    1
    2
    3
    4
    1. 在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务
    2. MySQL命令行默认设置下,事物都是自动提交的,即对于独立的每条sql语句,MySQL都是自动commit或者回滚
    3. 如果要执行多条sql语句组成的事务,使用命令begin或者start transaction开始事务,使用commitrollback结束事务
    4. 在innodb存储引擎的事务中,对于updatedeleteinsert语句,会自动给涉及数据行加排他锁

    MySQL数据操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    插入记录
    # 不指定字段名称
    insert tbl_name value(值,...);
    # 指定字段名称
    insert tbl_name(字段名称,...) value(值,...);
    # 一次插入多条记录
    insert tbl_name[(字段名称,...)] values(值,...),(值,...),(值,...);

    修改记录
    update tbl_name set 字段名称=值,... [where 条件]
    注意添加where条件,如果不添加条件,整个表中的记录都会被更新

    删除记录
    delete from tbl_name [where 条件]
    注意如果不添加where条件,整个表中的记录都会被删除

    查询记录
    select * from tbl_name
    [where 条件{like 匹配字符 % 任意长度字符串 _ 任意一个字符}]
    [group by {col_name|position} HAVING 二次筛选 分组]
    [order by {col_name|position|expr}[asc|desc] 排序]
    [limit 限制结果集的显示条数]

    # group by 分组
    把值相同放到同一个组中,最终查询的结果只会显示组中的一条记录
    分组配置group_concat()函数查看组中某个字段的详细信息
    配合聚合函数使用
    count() sum() max() min() avg()

    -- 按照sex分组,得到用户名详情,并且分组中的总人数
    select sex, group_concat(username) as usersDetail, count(*) as totalUsers from tbl_name group by sex;

    having 子句对分组结果进行二次筛选,(等同意where进行第一次筛选)
    -- 查询按照addr分组,并对于分组结果进行二次筛选,条件是组中人数 >=3
    select addr,
    group_concat(username) as userDetail,
    count(*) as totalUsers,
    from tbl_name
    group by addr
    having count(*)>=3;

    # order by 排序
    order by 字段名称 asc|desc | rand() 默认升序asc
    -- 按照多个字段排序
    select id, username, age
    from tbl_name
    order by age asc, id asc;

    # limit 限制结果集显示条数
    主要用于分页
    --显示结果集的前5条记录
    select id, username, age, sex
    from tbl_name
    limit 0,5; --0 偏移量,从0开始

    多表查询
    笛卡尔积的形式(不推荐)
    内连接形式**
    查询两个表中符合连接条件的记录
    select 字段名称,... from tbl_name1
    [inner] join tbl_name2
    on 连接条件
    -- 测试
    select e.id, e.username, e.age, d.depName
    from emp as e
    [inner] join dep as d
    on e.depID=d.id
    外连接形式(会把主表的记录全部显示出来)
    #左外连接
    先显示左表中的全部记录,再去右表中查询符合条件的记录,不符合以null代替
    select 字段名称,... from tbl_name1
    left [outer] join tbl_name2
    on 连接条件
    #右外连接
    先显示右表中的全部记录,再去左表中查询符合条件的记录,不符合以null代替
    select 字段名称,... from tbl_name1
    right [outer] join tbl_name2
    on 连接条件

实际操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
header('content-type:text/html;charset=utf-8');

// 1、连接数据库
$link = @mysql_connect('localhost:6606',root,root) or die('数据库连接失败');

// 2、选择数据库
mysql_select_db('vuldb') or die('选择数据库不存在');

// 3、设置字符集
mysql_set_charset('utf8');

//插入数据
//$result=mysql_query("INSERT INTO others VALUES(NULL ,'张胜',100)");
//var_dump($result);

//更新数据
//$result=mysql_query("update others set money=10 where id=1");
//var_dump($result);

//删除单条数据
//$result=mysql_query("delete from others where id=2");
//var_dump($result);

//删除数据表
//$result=mysql_query("drop table test1");
//var_dump($result);

//查询
$result=mysql_query("select * from others");
//$line=mysql_fetch_row($result); //返回一个索引数组
//$line=mysql_fetch_assoc($result); //返回一个关联数组
while($line=mysql_fetch_array($result,MYSQL_ASSOC)){
$data[]=$line;
} //三个参数,默认MYSQL_BOTH返回关联索引数组,MYSQL_ASSOC返回关联数组,MYSQL_NUM返回索引数组
var_dump($data);

//关闭数据库
@mysql_close($link);

MySQLi面向过程方式操作数据库

  1. 连接数据库
    $connect=mysqli_connect(‘host’,’username’,’password’,’database’);

  2. 执行SQL语句
    $result=mysqli_query($connect,$sql);

  3. 获取结果集
    mysqli_fetch_all($result)

    1
    2
    3
    4
    5
    6
    7
    $conn=mysqli_connect('localhost:6606','root','root','vuldb');
    mysqli_query($conn,'set names utf8');
    $sql='select * from others';
    $result=mysqli_query($conn,$sql);
    $data=mysqli_fetch_all($result,MYSQLI_ASSOC); //MYSQLI_ASSOC返回索引数组
    var_dump($data);
    mysqli_close($conn);