印象笔记中躺着一篇当时学PHP的一篇笔记,贴出来,从慕课网上学的
看代码还是直接查手册吧
PHP
运行在服务端、跨平台、脚本语言、免费
代码标识
1 |
|
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 |
|
特殊类型-资源
资源(resource):资源是由专门的函数来建立和使用的,例如打开文件、数据连接、图形画布。我们可以对资源进行操作(创建、使用和释放)。任何资源,在不需要的时候应该被及时释放。如果我们忘记了释放资源,系统自动启用垃圾回收机制,在页面执行完毕后回收资源,以避免内存被消耗殆尽。
1 |
|
特殊类型—空类型
NULL(NULL):NULL是空类型,对大小写不敏感,NULL类型只有一个取值,表示一个变量没有值,当被赋值为NULL,或者尚未被赋值,或者被unset(),这三种情况下变量被认为为NULL。
1 |
|
常量
什么是常量?常量可以理解为值不变的量(如圆周率);或者是常量值被定义后,在脚本的其他任何地方都不可以被改变。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 |
|
系统常量
1 |
|
结果
1 | F:\study\php\a.php |
常量如何取值
获取常量值的有两种方法取值。第一种是使用常量名直接获取值;
第二种是使用constant()函数
。它和直接使用常量名输出的效果是一样的,但函数可以动态的输出不同的常量,在使用上要灵活、方便,其语法格式如下:mixed constant(string constant_name)
第一个参数constant_name为要获取常量的名称,也可为存储常量名的变量。如果成功则返回常量的值,失败则提示错误信息常量没有被定义。(注:mixed表示函数返回值类型为多种不同的类型,string表示参数类型为字符串类型)
1 |
|
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 | $GLOBALS |
运算符
算符是告诉PHP做相关运算的标识符号
PHP运算符一般分为算术运算符、赋值运算符、比较运算符、三元运算符、逻辑运算符、字符串连接运算符、错误控制运算符。
算术运算符
取模算术符
假设我们要在一个考场安排了一场考试,对考生从1开始,都进行了编号,那么怎么让服务器帮助我们计算考生在的位置呢,进而打印考场的考生对照表呢?
1 |
|
赋值运算符
(1)“=”:把右边表达式的值赋给左边的运算数。它将右边表达式值复制一份,交给左边的运算数。换而言之,首先给左边的运算数申请了一块内存,然后把复制的值放到这个内存中。
(2)“&”:引用赋值,意味着两个变量都指向同一个数据。它将使两个变量共享一块内存,如果这个内存存储的数据变了,那么两个变量的值都会发生变化。
1 | $a = "我在慕课网学习PHP!"; |
比较运算符
三元运算符
(“?:”)三元运算符也是一个比较运算符,对于表达式(expr1)?(expr2):(expr3),如果expr1的值为true,则此表达式的值为expr2,否则为expr3。
1 |
|
逻辑运算符
连接运算符
字符串连接运算符是为了将两个字符串进行连接,PHP中提供的字符串连接运算符有:
(1)连接运算符(“.”):它返回将右参数附加到左参数后面所得的字符串。
(2)连接赋值运算符(“.=”):它将右边参数附加到左边的参数后。
错误控制运算符
PHP中提供了一个错误控制运算符“@”,对于一些可能会在运行过程中出错的表达式时,我们不希望出错的时候给客户显示错误信息,这样对用户不友好。于是,可以将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉;
如果激活了track_error(这个玩意在php.ini中设置)特性,表达式所产生的任何错误信息都被存放在变量$php_errormsg
中,此变量在每次出错时都会被覆盖,所以如果想用它的话必须尽早检查。
需要注意的是:错误控制前缀“@”不会屏蔽解析错误的信息,不能把它放在函数或类的定义之前,也不能用于条件结构例如if和foreach等。
语言结构
顺序结构
顺序结构就像一条直线,按着顺序一直往下执行。我们编写的代码默认都是按照顺序结构执行的。
条件结构
PHP中的“if…else…”语法
1 |
|
PHP中的“if…else if…”语法
1 |
|
PHP条件结构之if…else if…else…
1 |
|
PHP条件结构之switch…case…
使用 switch 语句可以避免冗长的 “if..else if..else”代码块
break的作用是阻止代码进入下一个case 中继续执行。
1 |
|
循环结构
在PHP中,while循环语句如下:
1 |
|
do…while循环语句语法如下:
1 |
|
while与do…while循环语句的区别是,while先判断条件是否成立,后执行循环,do...while先执行一次任务,再判断是否继续执行循环,也就是说do...while至少会执行一次任务。当条件为FALSE时,while中的任务会一次也不执行,do...while中的任务会执行1次
1 | //A例子 |
1 | A例子的结果:10 |
while和do…while可以根据具体情况选用。假设有一种棋类游戏,首先掷骰子,若不为6,前进骰子的点数的步长;若为6,前进骰子的点数的步长,并可以再掷一次。
1 |
|
for循环语句结构如下:
1 |
|
在PHP中foreach循环语句,常用于遍历数组,一般有两种使用方式:不取下标、取下标。
(1)只取值,不取下标
1 |
|
(2)同时取下标和值
1 |
|
函数
函数的定义
实现特定功能的,可以重复执行的代码段
函数分为内置函数和用户函数
内置函数
是指PHP本身提供的各类库函数,如字符函数库/数学函数库等
用户函数
是指用户在程序中自定义的函数或方法
函数名定义规则:用正则表示:[a-zA-Z_\x7f-\xff] [a-zA-Z0-9_\x7f-\xff]
1 | function testa() { |
函数的参数
1 | function testa($i) { |
函数的默认值
给参数里的变量复制,就是参数的默认值
function testa($a=1, $b=2){
}
值传递
在函数内部修改变量的值的情况下,在函数调用时调用函数外部的变量,值不变
引用传递
在函数内部修改变量的值的情况下,在函数调用时,函数的参数前面加一个&符号,值发生改变
可变参数列表
func_num_args(); 参数个数
func_get_arg(); 返回一个参数,加数组的索引
func_get_args(); 返回参数数组
参数的类型
array 对象 callable
函数返回值
1 | function testa($i) { |
函数的变量
局部变量
局部动态变量
变量旨在函数内部执行,执行完毕后被销毁
1 | function testa() { |
局部动态变量
在函数内部设置static,执行完毕后不被销毁
1 | function testa() { |
全局变量
使用global在函数内部定义全局变量
1 | $i = 1; |
复杂函数
可变函数
通过变量改变函数的名字并调用
1 | function test1(){ |
函数的嵌套
在一个函数内在定义一个函数,调用时先嗲用外面的函数在调用里面的函数,注意变量的作用域,内部函数不可以执行外部函数内的变量
递归调用
自己调用自己,递归里面要有跳出这个递归的判断条件
1 | function fbnq($n){ |
匿名函数
使用变量代替函数名,调用时也用变量加小括号来进行调用
声明一个匿名函数,用来以后做回调函数使用
1 | $a = function ($str){ |
系统函数库
字符函数库
字符串长度
strlen
字符串大小写转换
strtoupper 全转换成大写
strtolower 全转换成小写
ucfirst 句子首字母转换成大写
ucwords 每个单词首字母转换成大写
字符串替换函数
str_replace
str_ireplace 不区分大小写
字符串转换实体函数
1 | $str = "a<b'\""; |
删除空格函数
ltrim rtrim trim函数
字符串位置获取相关函数
strpos
返回一个字符在另一个字符第一次出现的位置
stripos
同上,忽略大小写
strrpos
返回一个字符串在另一个字符串最后一次出现的位置
strripos
同上,忽略大小写
字符串截取函数
substr($str, 0, 4)
$str字符串
0 开始位置
4 截取长度
strstr
搜索一个字符串在另一个字符串中第一次出现的位置,返回字符串的其余部分
stristr
不区分大小写
strrchr
搜索字符串在另一个字符串中最后一次出现的位置,返回其余部分
使用场景
对于上传文件,如何获取文件名后缀,如 jpg
1 | $filename = 'ab.cd.ef.jPg'; |
反转字符串
strrev
字符串加密函数
md5
打乱字符串
str_shuffle
使用场景
验证码生成
1 | $cap = 'abcdefghigklmnopqrstuvwxyz'; |
字符串分割
拆分
explode
合并
implode
1 | $cap = 'a|b|c|d'; |
格式化字符串
sprintf
函数 是可以重复执行/封装好的程序代码段
数学函数库
进一/舍一取整
floor
舍一取整
ceil
进一取整
幂运算/平方根
pow幂运算
pow(2, 3) -> 8
sqrt 平方根
sqrt(4) -> 2
最大值/最小值
max
min(至少需要2个或2个以上参数)
随机数
rand
mt_rand
四舍五入
round
1 | $num = '15.9015'; |
数字格式化
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 | $start = microtime(true); |
生成唯一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 | $arr=[ |
1 | $arr=[ |
foreach 用来遍历数组和对象,通过@符号无法抑制错误
1 | if(is_array($arr)){ |
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
http协议是一种无状态的协议,同一客户端的本次请求和上次请求没有对应关系,http服务器并不知道这两个请求来自同一个客户端
优点:在于减轻服务器的压力
缺点:每次请求会传输大量重复的内容信息session提供在PHP脚本中定义全局变量的方法,是的这个全局变量在同一个会话周期内对于所有的PHP脚本文件都有效,所以,session是基于http服务器的用户保持状态的方法
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会话
cookie
用途:
- 会话状态管理(如用户登陆状态/购物车等)
- 个性化设置(如用户自定义设置)
- 浏览器行为追踪(如跟踪分析用户行为)
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 | class MyClass{ |
两个冒号(::)是对类中的方法的静态引用
也就是不需要实例化对象,直接直接使用MyClass::PI 来取得PI的值
静态方法调用也同理MyClass::S(5); 直接调用静态方法S()
->
先实例化这个对象
在使用->调用里面的方法
可变参数列表
自定义函数接受自定义个数的参数列表
1 | function foo(){ |
对象序列化
1 | class A{ |
mysql相关操作
php操作MySQL的三种方式:
- MySQL:非永久连接,性能比较低,PHP5.5以后被废弃
- MySQLi:永久连接,减轻服务器压力
- PDO:能实现MySQLi的常用功能,支持大部分数据库
php扩展查看函数:phpinfo()
MySQL方连接数据库
连接数据库
mysql_connect($server, $username, $password)
等同于数据库操作mysql -uroot -p123456;选择数据库
mysql_select_db($database_name)
等同于use db;设置字符集
mysql_set_charset($charset)
等同于 set names utf8;
MySQL执行SQL语句
mysql_query($query)
对insert/update/delete/drop之类进行操作,执行成功返回true失败返回false
数据库操作
1 | #连接数据库 |
数据表操作
1 | 数据表由行(row)和列(column)组成 |
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
41. 在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务
2. MySQL命令行默认设置下,事物都是自动提交的,即对于独立的每条sql语句,MySQL都是自动commit或者回滚
3. 如果要执行多条sql语句组成的事务,使用命令begin或者start transaction开始事务,使用commit或rollback结束事务
4. 在innodb存储引擎的事务中,对于update、delete和insert语句,会自动给涉及数据行加排他锁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 | header('content-type:text/html;charset=utf-8'); |
MySQLi面向过程方式操作数据库
连接数据库
$connect=mysqli_connect(‘host’,’username’,’password’,’database’);执行SQL语句
$result=mysqli_query($connect,$sql);获取结果集
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);