学习php语言笔记
第一章、学前准备
1地址
格式:http://host[:port][abs_path]
- http://表示要通过HTTP协议来定位网络资源
- host表示合法的internet主机域名或者ip地址
- port指定一个端口,可与省略默认为80
- abs_path被请求资源的位置
2需要安装的软件
- web服务器 apache
- php应用服务器 解释,执行我们编写的PHP程序 PHP
- 数据库管理软件 数据库服务器 MSSQL (微软rrs)
- PHP运行环境安装:Apache+php+MYSQL=wampsever
- 安装好后127.0.0.1== localhost 本机默认的地
3目录
- www是站点根目录访问文件夹会自动访问这个文件夹下的*.php
- 只有放在F:\WAMP\WWW目录下的文件才会被我们访问到默认访问*.php文件,没有会去访问*.html
第二章、php基本语法
- 初识PHP脚本程序
1.php语言标记
开始:<?php 结束:?> 脚本程序
1)<?php ?>这之间就表示进入PHP模式,在开始和结束标记之外的内容都会被PHP解析器忽略。 文件末尾的?> 可以省略不写
2)可以直接嵌入到HTML代码中,并且可以嵌入到HTML代码中任何地方;在一个HTML文档中可以嵌入任意多个php标记!
3)文件末尾的php代码段结束标记可以不要,在一些情况下省略掉更好!
2.指令分隔符”分号”
1)php语句分为两种:一种是在程序中使用结构定义语句,另外一种是在程序中使用功能执行语句,其中前者结尾不需要使用分号,后者必须使用分号结尾!
2)结束标志 ?>就隐含一个分号,所以php代码最后一行可以不用加分号!
3)页面最终是通过html,css,js来展示出一个炫丽的界面的
3注释
1)/*这是一个多行注释
可以有多行文字*/
//这是单行注释
4遇空白的处理
- 空白符包含空格、tab制表位、换行,(注:都是英文输入法下输入的)可以将一个语句展开成任意行或者紧缩成一行,合理利用空格与空行行可以增强代码的清晰性与可读性。
二、变量 :不需要像c语言一样要事先定义,php可以直接使用
定义:变量是用来临时存储的容器。变量在任何编程语言中的地位都是核心地位!另外PHP脚本语言是一种弱类型语言,和其他语言不用的是变量或者常量的数据类型有程序的上下文决定。 只有在程序运行过程中才存在变量
- 变量的声明
1)PHP的特性之一就是它不要求在使用变量之前声明变量,当第一次给一个变量赋值时,你才建了这个变量,变量存储如数字、文本字符串或者数组。一旦设置了某个变量,我们就可以在脚本中重复地使用它。PHP中变量必须使用一个美元符号$后面跟变量名来表示,使用赋值操作符(=)给一个变量赋值。
2)$变量名=数据(值)
2.变量的释放:
1)Unset($变量名称)函数释放指定的变量
3.变量命名:
1)变量名是严格区分大小写的。
2)$name $NAME $Name 都是不同变量
4.变量名:
1)由字母或下划线开头,后面可以跟上任意数量的字母,数字,或者下划线。
注:任意名的标识符一定不要以数字开头,中间不可以使用空格,不能使用点分开!
变量名只能包含字母 数字 下划线 并且必须以字母或者下划线开头!!
2)PHP中有一些标识符是系统定义的,也称关键字,是PHP语言的组成部分,因此不能使用他们中的任何一个作为常量函数名或类名。但和其他语言不同的是可以在PHP中作为变量名称使用,不过这样容易混淆,最好不要用PHP关键字作为变量名称。
5.可变变量:一个变量的名字可以动态的设置和使用
$name=’dyh’;
$$name’代应豪’; //$dyh=’代应豪
Echo $dyh;//输出变量dyh的值代应豪’
echo$name;
echo$sunshengli
$a=1000;
$b=$a;//相当于把$a的值,复制一份再赋值给$b这个变量
$b=20;
Echo $b;//输出为20
6.变量引用赋值:引用赋值可以简单的理解为给变量起了一个别名
$a=1000;
$b=$a;//相当于把$a的值,复制一份再赋值给$b这个变量
$b=&$a;//相当于给$a起了一个别名
$b=20;
Echo $b;//输出为20
Echo $B;//输出为20,操作其中一个,都会影响另一个值
三、变量的类型:变量类型是指保存在该变量中的数据类型 6
PHP 对变量的类型看的比较淡
- 变量类型简介;使用var_dump(变量名)
- bool(布尔型);
这个是最简单的类型,布尔型表达了true或false,即真假。
以下值认为false,其他都认为是true。注往变量里存true或false时变量就变成布尔型
- 布尔值false 或true
- 0
- 浮点型0.0
- 空白字符串和字符串0
- 没有成员的数组
- NULL
- int(整型)
- 存储整数
- float(浮点型,也称double)
- 浮点型是指含小数的数(往里面存小数,那么就是浮点型数据了)
- $a=1.1
- Var_dump($a); //输出的是float类型
- string(字符串)
注:在单引号括起来的字符串中不能再包含单引号,如果实在要用单引号那么就需要用反斜杠(\)转义。单引号字符串中出现的变量不会被变量的值替代,即PHP不会解析单引号中的变量,因此在定义简单字符串的时候,使用单引号会效率更高,因此没有特别的要求,应使用单引号定义字符串!
-
- 字符串是一系列的字符,使用单引号、双引号、定界符三种方法定义!
- $b=1;
- $a=’test$bsdsf\’wewew’; //$b在单引号内不会被替换
- Var_dump($a);
- Echo $a;
- 字符串是一系列的字符,使用单引号、双引号、定界符三种方法定义!
5)双引号
-
-
- <?PHP
- $b=100;
- $a=”te{$b}st….”; //字符串内的变量(会被转换)要输出要加花括号
- Var_dump($a);
- Echo $a;
- ?>
-
6)定界符
- <<<之后提供一个标示符开始,字符串内容,结束以标示符
- 注:结束标识符之后必须接,不可以接其他任何字符
- 标识符命名规则:字母数字下划线,并且不能以数字开头
- <?php
- $a=<<<aaa
- Zhilishineirong //输出内容为这个里面接单引号双引号都没事
- aaa;
- var_dump($a);
- ?>
7)array(数组) 未
定:数组事php中一种重要的符号数类型。前面介绍的类型只能存入一数据,而数组可以存放多个数据,并且可以存入任何类型数据。
Array(“name”=>”sunshengli”,sex=>”男”);
打印数组 print_r() 使用下标访问数组内容
8)object(对象) 未
9)NULL
Null表示一个变量没有值,表示空,
将变量直接赋值为null
声明的变量尚未被赋值
被unset($函数名)函数销毁的变量
$a=111;
Unset($a); //销毁变量a
Var_dump($a);
- 变量类型相互转换
1)自动类型转换
a)有布尔值参与运算时,true将转化为整形1,false将转化为整形0
b)有null值参与运算时,null值转化为整形0,再进行运算
c)有int型和false数据参与运算时,先把int转变为float类型后再进行运算有字符串和数字型(int或者float)参与运算时的情况
注:这些在程序的运行中不好控制的部分,所以在编写代码时最好不要涉及
2)强制类型转换
a)在要转换的类型前面加上括号括起来目标类型
(int) (boot) (float) (string) (array) (object)
转变并不会改变被转变量本身的类型
3)变量类型的测试函数
Is_bool()
Is_int()
Is_array()等等
四、常量 7
1.概念:
常量是(用于临时的)一个简单值的标识符,如其名称所暗示的,在我们php脚本执行期间一个常量一旦被定义,就不能被改变或者取消定义,常量的作用于是全局,常量只能包含bool,float,string类型数据!
.
2.定义和使用
-
-
-
- Define()
- define(常量名称,常量值)
- define(’常量名称’,常量值)或者define(”常量名称”,常量值)
-
-
命名规则:和变量一样只能包含字母数字和下划线并且必须以字母或者下划线开头;常量的命名于变量类似,也遵循php标识符的命名规则,按照惯例常量标识符总是大写的 自己定义的常量是严格区分大小写的
Define(‘MY_NAME’,’代应豪’)
Defined()函数来检查是否定义了某个常量
- 常量和变量的区别
- 常量前面没有美元符号($)
- 常量只能用define()函数定义,不能通过赋值语句
- 常量可以不用理会变量范围的规则而在任何地方定义和使用
- 常量一旦被定义就不能重新定义或者取消定义
- 常量的值只能是bool,int,float,string类型
- 预定义常量
注:预先定义好的常量,就是程序中可以直接使用来完成一些特殊功能!
常量名//魔术常量
_FILE_//输出所在地址
_LINE_ //输出它所在的行号
_FUNCTION_
_CLASS_
_METHOD_
PHP_OS
PHP_VERSION
DIRECTORY_SEPARATOR等….
常量值
当前的文件名
当前行数
当前的函数名
当前的类名
当前对象的方法
UNIX或WINNT等
当前PHP服务器的文本
\或/ 根据操作系统决定目录的分隔符
Print_r(get_defined_constants())://系统预定义常量
其中有的预定义常量是以_开头的,这些预定义常量我们又叫魔术常量,代码所在位置不同他的值也不同的,所以叫他 魔术常量 _FILE_
魔术8常量:http://php.net/manual/zh/language.constants.predefined.php
预定义常量是不区分大小写的
五、运算符 8
定义:运算符对一个或多个操作数(变量或者数值)执行某个运算符,也称操作符!
例:
!true
!是运算符true是操作数
$a+$b
+是运算符 $a,$b是操作数
True?1:0
?和:是运算符 true,1,0是操作数
根据操作数的个数分为 一元运算符、二元运算符、三元运算符
一些场合下在操作符两边加上空格增加美观以及可读性
1.算数运算符
+、-、*、/、%、++、——
例子 名称 结果
-$a 取反 $a的负值
$a+$b 加法 $a和$b的和
$a-$b 减法 $a和$b的差
$a*$b 乘法 $a和$b的积
$a/$b 除法 $a除以$b的商
$a%$b 取模 $a除以$b的余数
++$a 前加 $a的值加一,然后返回$a
$a++ 后加 返回$a,然后将$a加一
--$a 前减 $a值减一,然后返回$a
$a-- 后减 返回$a,然后将$a的值减一
Echo’<br />’ //换行
注:自增自减是针对变量而言的
2.字符串运算符 9
定义:PHP中的字符串运算符只有一个英文的句号(.) 也叫连接运算符
3.赋值运算符
定义:二元运算符(需要两个操作数 $a=1),左边的操作数必须是变量,右边也可以是一个表达式,也可以是一个值,一个变量等等!
作用:将右边(值)表达式的值赋给左边变量
=、+=($a+=$b,//$a=$a+$b)、-=、*=、/+、%=、.=、
4.比较运算符 10
定义:也称运算符,又称条件运算符,用于对运算符两边的操作数进行比较,比较的结果只能是布尔值(满足为true真否则是false假)
PHP规定:使用echo输出布尔类型值的时候
Echo true;他在页面中输出1
Echo false;它在页面中什么都不输出
如果要输出布尔类型值时候使用var_dump()来输出更精确
$a==$b 等于 $a===$b 全等(值类型也要相等)
$a!=$b不等 $a<>$b 不等
$a!==$b不全等 $a<$b小于
$a>$b大于 $a<=$b小于等于
$a>=$b大于等于
5.逻辑运算符 11
注:运算结果是布尔类型的值,(true或false),如果参与运算的值不是布尔类型的值会被自动转换成布尔类型值,然后参与运算
! not (逻辑非) And && (逻辑与 *)
|| or (逻辑或 +) xor (逻辑异或相同为0)
$a and $b and(逻辑与) !$a not(逻辑非)
$a or $b or(逻辑或) $a && $b and (逻辑与)
$a xor $b xor(逻辑异或) $a || $b or(逻辑或)
只要逻辑运算符(逻辑与,逻辑或)那么运算结果就是一个人true或false
那么运行过程就不重要了。 只看最终的结果是true,false
$a=false;
$b=1;
$a && ++$b; //$a为false时程序就不往后执行了,所以$b还是1,这是”短路”问题
6.位运算符 12
定义:位运算符用于对操作数中的每一位二进制位进行运算,由于PHP主要用于网站开发方面,所以运算在PHP中使用较少。
7.其他运算符
1)?:(三元运算符)格式:表达式1 ?表达式2 :表达式3
如果表达式1的值为true,那么就执行表达式2,否则就执行表达式3
10>3 ? 20 : 30//输出为20
2)`` (esc下方)可以把系统命令放在这里执行
$a=`ipconfig`;
Var_dump($a); //输出系统网络配置;涉及跨平台问题
3)@ 屏蔽表达式可能发生的错误(在表达式前面加@符号)
Echo @$a
4)=>
5)->
7)instanceof
8.运算符优先级
优先级的概念:谁优先级别高,就先算谁
结合方向:
结合方向 运算符 附加信息
无 ++-- 递增/递减运算符
右结合 ! 逻辑非
左 * / % 乘,除,取余
左 + - . 加,减,串连接符
左 < < > > 位运算
无 < < = > > = < > 包含大于号或小于号的运算符
无 == != === !== 不包含大于号小于号运算符
左 && 逻辑与
左 || 逻辑或
左 ? : 三元运算符
右 = += -= *= /= .= %= &= |= ^= <<= >>= 赋值运算符
左 xor 逻辑异或
圆括号的作用:用圆括号可以把里面的某一块看做一个整体!使用圆括号可以增强代码的可读性
第三章、流程控制 13
注:对PHP程序执行的过程进行控制
- 顺序执行
自上而下执行,对程序没有控制!
二、分支执行
可以根据条件是否满足来执行某些代码,PHP主要通过 (if,switch)来实现
- if语句
注:if语句控制的语句最好用花括号括起来,if语句可以使用嵌套
-
- 单条件
if(表达式)语句;
注:通过复合语句(代码块),if语句可以控制执行多条语句。代码块用一对{花括号括起来的多条语句。}
-
- 双向条件
if(表达式){
语句块;
}Else{
语句块;}
C) 多向条件
if(表达式){
语句块;
}Elseif{
语句块;}
{····
}Elseif{
语句块;
}Else{
语句块;}
2) switch语句(多向条件) 14
Switch(表达式){
Case 值1://case相当于==
语句块1;
Break;//跳出,满足之后就跳出,不往后执行了
Case 值2:
语句块2;
Break;
·····
Default://一个都没匹配就执行default后面的
语句块n;
}
注:1表达式最好使用整型或者字符串!
2不要忘记break语句来跳出,不然往后就全部执行了。
3如果某个case语句后面没有接语句块,那么就说明这个语句块的内容是同下!
4case后面的语句是不需要用花括号括{}起来的
三、循环执行 15
注:计算机最擅长的功能之一就是按照规定的条件,重复执行某些操作,这是程序设计中最能发挥计算机特长的程序结构
- while语句
while(表达式){
各种语句···
}
当表达式的值为true,那么就执行下面的语句块执行结束之后继续返回上面来判断表达式的值是true还是false,如果还是true,那么就继续执行,如果为false,那么这个语句就结束了。
<?php
$i=0;
while($i<10){
echo $i++.'<br />'; //’<br />’换行,直到为假才结束
}
echo 'zhixingjieshu';
2) do···while语句
do{
各种语句
}while(表达式);
与while语句的区别就是,do··while语句至少执行一次。
<?php
$i=10;
do{
echo $i++.'<br />';
}while($i<10);//后判断
?>
3) for语句
for(表达式a;表达式b;表达式c){
各种语句
}
表达式a:会放一些初始化语句,$i=0,多个表达式用逗号隔开
表达式b:会放一些用来判断true或false的表达式!,也可以放多个表达式中间用逗号隔开
表达式c:会放一些对初始化的变量进行自增的语句。放多个表达式用逗号隔开。
<?php
for($a=0;$a<10;$a++){
echo "执行到{$a}遍了<br />";
}
?>
或
<?php
for($i=0,$j=0;$i<10,$j<10;$i++,$j++){
echo"{$j}执行第{$i}遍了<br />";
}
?> //输出0执行第0遍了····等到9结束
4、特殊的流程控制语句 16
- break语句
作用:用于switch语句,for,while,do···while,foreach,用于终止或中断、后面加数字就表示跳出几层循环,默认跳出当前循环语句
<?php
/*
for($i=0;$i<10;$i++){
if($i==5){
break 1;//中断循环语句,后面的数字表示跳出第几层!
}
echo"执行到{$i}遍!<br />";
}
*/
for($i=0;$i<10;$i++){
echo "执行到第{$i}遍了<br />";
for ($j=0;$j<10;$j++){
if($j==5){
break 2;//跳出当前循环,默认为1,跳出几层循环语句
}
echo"--执行到第{$j}遍了!<br />";
}
}
echo'执行结束!';
?>
2)continue语句
作用:只能用在循环语句。跳出本次循环,并不是中断或结束。
<?php
for($i=0;$i<10;$i++){
if($i==5){
continue;//跳出本次循环
}
echo"执行到{$i}遍!<br />";
}
?>
3)exit()语句 (dre和exit一样)
作用:结束整个程序的执行
<?php
echo'执行到第1步!<br />';
exit('结束了');//结束整个php的运行
echo'执行到第2步!<br />';
?>
第四章、函数 17
注:从功能上讲函数可以看做是现实生活中的一个人或一个公司里面的一个部门,可以接受我们的指令为咋们完成某项固定工作!
- 自定义函数
- 函数定义
function函数名([参数名1,参数名2,··参数名n]){
函数体;//任何有效的PHP代码都可以作为函数体使用
Return表达式;//可以从函数中返回一个值,也可以不返回,则返回null
}
- 函数的调用
不管是自己定义的函数还是系统提供的函数,如果函数不被调用就不会执行!一一对应
调用:函数被调用后开始执行函数体中代码,执行的过程是相对独立的,执行完毕返回调用的位置向下执行!
- 函数参数
形式参数由零个、一个或者多个变量组成。
实际参数数由零个、一个或者多个参数组成,每个参数是一个表达式,用逗号分隔。
- 函数的返回值 return 默认返回null
函数的返回值是将函数执行后的结果返回给调用者!
默认如果不写返回则函数返回值为null
<?php
function add($a,$b){// 形式参数没有具体值
return $a+$b; //返回值给调用的地方,结束这个函数运行
echo'函数已经结束运行,已经返回到调用处,这里已经不输出了;
}
add(10,20);
var_dump(add(10,20));//输出int(30)
?>
二PHP变量的范围 18
- 局部变量
局部变量也称为内部变量。局部变量是在函数内定义的,其作用域仅限于函数内部,离开该函数后再使用这种变量就是非法错误的!
<?php
function text(){
$a=1;//局部变量$a,仅在函数内部有效
}
echo $a;//外部无法使用
?>
- 全局变量
全局变量也称为外部变量,在函数的外部定义,它的作用域为从变量定义处开始,到本程序文件为的末尾。
在PHP函数中无法直接使用全局变量,如果使用必须使用global声明变量!
<?php
$i=10;//全局变量,也叫外部变量
define('MY_NAME', '岁生日');
function text(){
echo MY_NAME;//常量可以不用理会变量的范围的规则而在任何地方定义和使用
global $i;//声明$i为全局变量,然后再在这个函数内部就可以使用$i
echo $i;
$a=1;
}
text()
?>
- 静态变量
静态变量是指在函数内部定义变量的时候使用static关键字来定义变量
特点:函数执行完毕后变量不会立即消失,但在此调用函数时,静态变量保存的值依然存在,并且仅在第一次执行函数的时候会初始化值。
执行结束后静态变量就没有了!!
<?php
function text(){
static $a=10;//静态变量$a初始化(就是之前没有这个变量)静态变量,仅在第一次调用时候执行
echo ++$a;//当第二次执行这个函数时候$a这个变量依然存在并且里面的值依然存在!在原有基础上加1
}
text();//输出11
echo'<br />';
text();//输出12
?>
三、参数的传递 可变函数 19
- 按值传递参数
默认的,我们在传递参数的时候默认使用的就是这个方式!
对形式参数的操作,根本不是影响到实际参数(变量)的值,两者相当于没有联系
<?php
Function text($a){
Echo ++$a;
}
$i=10;
Text($i);
Echo’<br />’.$i;
- 按引用传递参数
按引用传递参数,相当于形式参数和实际参数指的是同一个人,只是名字不一样,对于形式参数的操作会直接影响到实际参数(变量)
Function text(&$a){
Echo ++$a;
}
$i=10;
Text($i);
Echo’<br />’.$i;
?>
- 函数的默认值
可以给形式参数设置默认值,设置方法很简单直接赋值即刻
给形式参数加默认值的时候是重右往左加的,右边的必须有,才能够给给左边的!
Function text($a){ //参数的默认值
Echo ++$a;
}
Text(20);
?>
- 可变长度参数列表
PHP提供给我们的,可以直接使用
Func_get_args();
Func_get_arg();
Func_num_args();
这三个函数可以使用在我们的自定义函数内部,能够返回给我们一些关于参数的信息。
Function text( ){
//var_dump(func_get_args()); //然后做一些其他的操作
//Var_dump(Func_get_arg(0));//l里面的数字表示获取参数的地址。调用这个函数的时候可以传入一个值表示获取第几个实数参数(从0开始)
//Var_dump(func_num_args());//返回传入所在函数的参数个数
}
Text(21,3232,4343,’单位取得完全’,’dsfsadfds’);
?>
四、可变函数(变量函数)
直接把函数赋值给变量
可变函数不能用于例如echo,print,unset(),isst(),empty,include,require以及类似的语言结构。需要自己的包装函数来将这些结构用作可变函数。
Function text(){
Echo ’我是text函数!’;
}
$a=’text’;//把函数数名字加上引号,赋值给变量即可
$a();//text();
$b=’echo’;
$b(‘dfssfddfds’);
?>
五、递归函数 20
递归函数即在函数内部自己调用自己的函数
1)递归函数:函数在被调用的执行过程中会在内存里分配空间用于存储临时数据,那么函数在执行过程中默认之间时没有联系的(除了静态变量,按引用,全局变量).里面的变量默认都是全局变量,相互之间没有影响!
2)递归函数,在函数内部需要有适时结束函数运行的条件!
<?php
function text($n){
echo $n.'$nsp;';
if($n>0){
text($n-1);//自己内部调用自己,即递归函数
}else {
echo '<-->'; //执行到这时,要返回前一个调用的地方
}
echo $n.'$nbsp;';
}
text(3);
输出:3$nsp;2$nsp;1$nsp;0$nsp;<-->0$nbsp;1$nbsp;2$nbsp;3$nbsp;3
$n是局部变量,在分配的内存空间里相互独立,没有联系
六、内部(内置)函数 21
PHP有很多提供给我们现成的函数或结构。在开发中可以直接使用。
如:echo()、include()、include_once()、require()、require_once()
以上是可以省略括号使用,严格意义上讲不是函数,所以这些不可以赋值给另一个变量,当然不管是不是函数都不是重点,对于我们的实际开发没有什么影响。
还有一些函数需要开启特定的PHP扩展模块,否则使用它们是致命的“未定义函数”错误。
第五章、数组 复合数据类型
一、数组分类
- 索引数组
索引值为整数的数组
2)关联数组
索引值为字符串的数组,使用字符串作为索引,这使得编程更加人性化!这在其他编程语言中非常少见,但是在PHP中会被大量的使用在开发过程中使用起来及其方便!
二、数组创建
PHP中创建数组非常灵活,与其他许多编程语言不同的是PHP不需要在创建数组时,指定数组的大小,甚至不需要在使用数组之前声明,也可以在同一个数组中存储任何类型数据。
直接为数组元素赋值既可以创建数组
使用array()语言结构创建数组。
- 直接为数组元素赋值即可创建数组。
$变量名[索引值]=数据内容;
索引值可以是整数也可以是字符串,也可以写(默认为索引数组)
<?php
//$atudent[索引值]=具体值
//如果省略索引值不写,那么默认索引值就是整数,并从0开始,以次增加
$student[0]=10;
$student[1]='代应豪';
$student[2]=true;
$student[3]=60.5;
//需要使用print_r()输出数组
//print_r($student);
var_dump($student);
?>
输出:array(4) { [0]=> int(10) [1]=> string(9) "代应豪" [2]=> bool(true) [3]=> float(60.5) }
- 使用array()语言结构创建数组 多维数组
$变量名=array(key1=>valuel,….);//key1表示具体显示的序号=>value表示显示的值
<?php
//$stdunt=array(索引值=>具体值,....)
$student=array( //一维数组
0=>10,
1=>'代应豪',
3=>true,
4=>60.5
);
var_dump($student);
echo $student[1];
//数组里面具体数据的方法
//数组变量名称[索引值];
?>
一个数组里还可以再放数组、二维数组
<?php
$students=array(//数组里面可以还有数组
0=>array(1,'代应豪',true,60.5),
1=>array(2,'王二',false,80.5)
);
var_dump($student);
echo $students[0][1];表示输出第0个数组的第二个元素。
?>
输出变量名称[索引值][索引值]…..
三、数组的遍历 23
Php中很少需要自己动手将大量的数据赋值到数组变量中,而是通过调用其他函数返回结果集,使用数组类型返回的目的是将多个相互关联的数据,组织在一起形成集合,以便我们的批量处理的目的,
遍历数组:每个都经历一遍
1)for循环 用比较少,有缺陷
2)foreach语句来实现遍历数组的目的
格式: Foreach(数组的变量名 as 变量1=>变量2){ //变量1是索引值(可以不写)变量2自己写的变量,
//每次循环执行的语句,变量1代表当前正在经历(访问)的数据的索引值;变量2代表当前正在访问的数据
}
例$arr1=array(
'name'=>'代应豪',
'num'=>10
);
/*
foreach($arr1 as $value){//遍历数组,比较常用,专门为遍历数组的
echo $value.'<br />' ;
}
*/
foreach($arr1 as $key=>$value){//遍历数组,比较常用,专门为遍历数组的
echo $key.'=>'.$value.'<br />' ;
}
输出:name=>代应豪
num=>10
<?php
$arr=array(
'a',
'b',
'c',
'd',
array(
1,2,3,4,5
)
);
foreach($arr as $val){
var_dump( $val.'<br />');//echo不能输出数组
}
<?php
/*
count(数组变量[,])返回数组里的个数,还可以获取多维数组的个数,我们值传递一个数组进去就可以了
使用for循环可以遍历数组
*/
$arr=array(
'a','b','c','e'
);
//echo count($arr[,]);
for($i=0;$i<10;$i++){
//echo $i.'<br />';
echo $arr[$i];
}
/*
$arr1=array(
array(1,2,3),
array(4,5,6)
);
echo count($arr1,1);//2.+6=8
*/
<?php
//总结的例子
$students=array(
array('代应豪',1,true,60.5),
array('忘二',2,false,50.4),
array('w二',3,false,80.4)
);
echo '<table border=1>';
foreach ($students as $val){
if($val[2]===true){
$val[2]='男';
}else {
$val[2]='女';
}
echo "<tr><td>{$val[0]}</td><td>{$val[2]}</td><td>{$val[3]}</td></tr>";
}
echo '</table>';
?>
代应豪 | 男 | 60.5 |
忘二 | 女 | 50.4 |
w二 | 女 | 80.4 |
输出:
四、预定义超全局数组变量 24
已经定义好的(存在)的变量(存放的是数据的类型是数组)
超全局:超全局变量,作用域:(有效区域)
1)$GLOBALS
2)$_SERVER
服务器变量,不同的web服务器可能会有不同的一些内容
3)$_GET 传少量数据
获取HTTP GET方式传递的参数比如URL或者表单GET递过来的参数
<?php
var_dump($_GET);
;浏览器地址栏中输入:localhost/123/index.php?代应豪=好人
输出:array(1) { ["代应豪"]=> string(6) "好人" }
?参数名=参数值&参数名=参数值…….//后面可以传递多个值
在服务器端(请求的php文件这边)可以通过$_GET来获取
$_GET索引值为参数名,索引值对应的数据就是参数值
4)$_POST
获取HTTP POST方式传递的参数比如表单POST方式传递过来的参数
比如表单 post发送过来 可以通过$_post来获取到
<?php
var_dump($_POST);//$_GET会传递到地址栏中去$_POST不会在地址栏中输出
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<form method="post">//GET会传递到地址栏中去
姓名:<input type="text" name='username'/><br />//数组索引值
性别:<input type="text" name='sex'/><br />
<input type="submit" value='提交'/>
</form>
</body>
</html>
输出:array(2) { ["username"]=> string(9) "代应豪" ["sex"]=> string(3) "男" }
窗体顶端
姓名:
性别:
输出表单
窗体底端
5)$_FILES
HTTP变量
6)$_COOKIE
7)$_SESSION
8)$_REQUEST
包含了$_get,$_post和$_coolik中的全部内容。
9)$_ENV
环境变量,和php所运行的环境有关
若没有数据可能与phpini配置项variables配置项有关
五、处理数组的相关函数详见php手册 25
- array_count_values
$array=array(1,”hello”,1,”world”,1,”hello”);
$arr=array_count_values($array);//函数返回数组型数据
Print_r($array);//原来数组不受影响
- array_key_exists
$search_array=array(‘first’=>1,’second’=>4);
Var_dunp(array_key_exists(‘second’,$search_array));
- mixedarray_search
- count
- in_array
- list
- assort
- array_filter
第六章、字符串处理 26
一、去除空白或其他字符函数
1)trim($函数名[,指定去除左右两边]):去除字符串首尾空白字符
/*
$str=' abc ';
var_dump($str);
var_dump(trim($str));
*/
$str='abababbabhjhjhjababba';
var_dump($str);
var_dump(trim($str,'abc'));//如果去除多个字符,可以连接写返回一个新的字符串
- ltrim:去除左边的字符
- rtrim:去除右边的字符
二、大小写转换函数
1)strtoupper
$str='test';
var_dump($str);
var_dump(strtoupper($str));
输出:将$str函数转换为大写
2)strtolower()
输出:将转换为小写
三、字符串查找函数
1)substr_count($函数,‘查找‘,偏移数从哪开始计算,到哪里结束)
$str='testtest';
var_dump(substr_count($str,'te'));//计算te在字符串中出现的次数
注:不会重叠计算如’desdesdes’,’desdes’。区分大小写
2)strpos()查找字符串首次出现的位置
$str='testtest';从0开始
var_dump(strpos($str,'t'));//因为字符串是从0开始算的
/*if(strpos($str,'1')===false){
echo '没找到!';
}else {
echo'没找到!';
}*/
3)strstr()//查找字符第一次出现的位置
$str=’testteste’;
Var_dump($str);
Var_dump(strstr($str,’s’));
Var_dump(strstr($str,’s’,true));
四、字符串替换函数
1)str_replace(‘要替换’,’替换为’,被替换函数)
$str=’textedth’;
Var_dump($str);
Var_dump(str_replace(‘t’,’T’,$str));
输出:string(8) "textedth" string(8) "TexTedTh"
$str=’abc123’;
Var_dump($str);
$str=str_replace(array(‘1’,’2’,’3’),array(‘一’,’二’,’三’),$str);
Var_dump($str1);
输出:abc123 abc一二三
五、与html标签相关的函数 27
- htmlspecialchars()
$str=<<<start
<p style="color:red;font-size:28px;">单位确定为取得完全</p>
start;
echo $str;
echo"\n";
echo htmlspecialchars($str);
- strip_tags()去除html有关的标签
$str=<<<start
<p style="color:red;font-size:28px;">单位确定为取得完全</p>
start;
echo strip_tags($str,”<div><p>”);//保留一些标签
六、字符串截取函数
- substr($函数字符串,+-截取位数)//字符串截取
$str=’text’
Echo substr($str,-3,2)
输出:ex
七、字符串分隔函数
- explode()//使用一个字符串分割另一个字符串
$str=’text,text1,tet2,text3’;
Var_dump(explode(‘,’,$str,2));//用逗号分割,分成了四个数组
- str_split()//将字符串转换为数组
$str=’text’;
Var_dump(str_split($str,1));//表示将字符串里的几个字符放在一起变成一个数组
第七章、正则表达式 28 从
- 正则表达式语法规则
定:正则表达式描述了一类字符串的特征,通过这个特征与特定的函数配合,对其它字符串进行匹配、查找、替换、及分割操作!
这一类字符的特征是由一个或多个
- 普通字符(比如a到z)
- 元字符(有特殊功能的字符比如*、+、?等)
等组成的一类字符串!
例如‘/a/’,a就是普通字符,/是定界符(表示正规表达式的开始或结束)
$Ppattern=’/text/’;
$str=’abctextdsfstextdfss’;
Var_dump(preg_match_all($pattern,$str,$arr));
Vsr_dump($arr);//打印数组
输出:int 2
- 定界符
习惯使用斜线’/’作为定界的字符,除了字母数字反斜线以外
还可以使用#、{}、|、!
- 普通字符
如:a-z、A-Z、0-9、双引号、单引号,他们没有特殊含义
- 元字符
元字符指是在正则表达式中有特殊含义的字符 \n换行符
\d 匹配任意一个十进制数字等价于[0-9]
\D 匹配任意一个除十进制数字以外字符等价于[^0-9]
\s 匹配任意一个空白字符,比如换页符、换行符、回车符制表符、垂制表符
\S 匹配除空白字符以外的任一个字符
\w 匹配任意一个数字或字母下划线
\W 匹配除数字、字母、下划线以外的任意一个字符
\. 匹配除换行符以外的任意一个字符,如果要匹配一个点,就写要转义\.就可以了
.* 贪恋匹配,尽可能多的去匹配
.*? 懒惰匹配只匹配一个
\* 匹配0次或1次或多次前面的字符
+ 匹配1次或多次其前面的字符
? 匹配0次或1次其前面的字符
{n} 表示其前面字符恰好出现n次
{n,} 表示其前面字符出现不少于n次
{n,m} 表示其前面的字符至少出现n次,最多出现m次
^或\A 匹配字符串开始位置
$或\Z 匹配字符串的结束位置
| 匹配两个或多个模式
[] 匹配方括号中的任意一个字符
[^] 匹配除方括号中字符以外的任意一个字符
() 将括号中作为一个整体以便于将其中的内容获取到
\r 回车符
\n 换行符
五、模式修正符 30
是在正则表达式的定界符后使用的,可以调整正则表达式的解释,扩展正则表达式在匹配、替换等操作的某些功能,增强正则表达式的处理能力。
1)i 在和模式进行匹配时不区分大小写
2)m 多行匹配,如果目标字符串中没有“\n“字符,或者模式中没有出现^或者$,设置这个修饰符不产生任何影响
注:目标字符串中必须包含”\n”换行符,就表示新的一行开始了
正则表达式中必须要出现^或$
3)s 如果设定了此修正符,那么将匹配多有字符包含换行符。\n
4)U 禁止贪婪匹配
- 与正则表达式配合的函数 31
- preg_match()
说明:第一个参数:正则表达式
第二个参数:目标字符串
第三个变量:执行完成之后,里面会有匹配到的部以及等一些数据
第四个参数:可以传PREG_OFFSET_CAPURE进入,默认0
- preg_math_all()
- preg_replace()
第八章、日期与时间 32
- 日期与时间相关函数
- 设置时区
默认时区UTC
date_default_timezone_set(‘Asia/Shanghai’);//设置时区
- 获取当前Unix时间戳
Unix时间戳:
从Unix纪元(格林威治时间1970年1月1日00时00分00秒)从始到当前的秒数。 Time();
- 获取指定时间的unix时间戳
Mktime()
Date_default_timezone_set(‘asia/shanghai’);//设置时区
$nowtime=time();
$time1=mktime(0,0,0,10,1,2014);//获取一个日期的Unix时间戳
Echo’距离2014年国庆还有’.(($time1-$nowtime)/60/60/24).’天’
- 从Unix时间戳取得时间日期信息
Date()//格式化一个本地时间/日期
第一个参数:必填,写上你所需要的时间日期的格式,把format字符放在第一个参数里面会被转换成对应的信息,其他字符还是原来的
Date(’Y-m-d G:i:s’)
自定义格式化Unix时间戳 为指定的时间格式
- 获取Unix时间戳和微妙数
Microtime()
第九章、图像处理 33
- 创建图像的基本步骤 GD扩展库
学前了解:
在PHP中通过GD库处理图像的操作,都是先在内存中处理,操作完成以后再以文件流的方式,输出到浏览器或保存在服务器的磁盘中。
学前需求:
开启GD库扩展
创建一个图像应该完成如下所示的四个基本步骤
1)创建图像
所有的绘图设计都需要在一个图像上完成,以后的操作都将基于这个图像。
1.创建新的
imagecreatetruecolor()//新建一个真彩色图像
2.打开服务器或网络文件中已经存在的GIF,JPEG,PNG,WBMP格式图像
imagecreatefromjpeg()
imagecreatefrompng()
imagecreatefromgif()
imagecreatefromwbmp()
创建或者打开失败的时候会返回空字符串,并且输出一条错误信息。
imagesx()//输出画布宽度
imagesy()//输出画布高度
getimagesize()//取得图像大小
2)绘制图像
图像创建完成以后,就可以通过这个图像资源,使用各种画像函数设置图像的颜色、填充画布、画点、线段、各种几何图形,以及向图像的添加文本等。
1.imagecolorallocate()//分配颜色
2.imagefill()//区域填充
3.imagesetpixel()//画一个单一像素
4.imageline()//画一条线段
5.imagerectangle()//画一个矩形
6.imagestring()//水平地画一行字符串
7.imagettftext()//用 TrueType 字体向图像写入文本
8.imagettfbbox()//计算 TrueType 文字所占区域
9.imagecopy()//拷贝图像的一部分
10.imagecopymerge()//拷贝并合并图像的一部分
11.imagecopyresampled()//重采样拷贝部分图像并调整大小
3)输出图像
完成整个图像的绘制之后,需要将图像以某种格式保存到服务器的文件中,或者将图像直接输出到浏览器上显示给用户。但在图像输出之前,一定要使用header()函数发送Content-type通知浏览器,这次发送的是图片不是文本
header()
imagegif()
imagejpeg()
imagepng()
imagewbmp()
4)释放资源
imagedestroy()
5)图形验证码
6)水印 35
Imagecopymerge($img,$waterMark,100,100,0,0,$waterMarkidth,$waterMarkheight,0)
参数说明:$img: 目标图像资源
$watermark:水印图像资源
100:所要拷贝到目标图像资源上面的坐标(x轴位置)
100:所要拷贝到目标图像资源上面的坐标(y轴位置)
0:从水印的图像资源的x坐标为0的位置开始拷贝
0:从水印的图像资源的y坐标为0的位置开始拷贝
$watermarkwidth:所要拷贝的水印图像的长度
$watermarkheight:所要拷贝的水印图像的高度
0:表明透明度,数值越小就越透明,最大值100和imagecopy这个函数一样
- 缩放与裁剪
第十章、文件与目录操作 37
任何数据类型变量所存储的数据,都是在程序运行时才加载到内存中,而不能持久保存,那么如果需要将数据长久的保存起来,主要有两种办法,保存到普通文件中或者保存到数据库中。我们的PHP可以在我们的服务器上生成目录,创建、编辑、删除、修改文件属性等操作!
- 判断普通文件和目录
1)is_file()//判断给定文件名是否为一个正常的文件
2)is_dir()//判断给定文件名是否是一个目录
二、文件的属性
1)file_exists()//检查文件目录是否存在
2)filesize()//取得普通文件大小
3)is_readable()//判断给定文件名是否可读
4)is_writable()//判断给定的文件名是否可写
5)filectime()//获取文件的创建时间
6)filemtime()//获取文件的修改时间
7)fileatime()//取得文件的上次访问时间
08)stat()//获取文件大部分属性值
三、目录的基本操作
1)basename()//返回路径中的文件名部分
2)dirname()//返回路径中的目录部分
3)pathinfo()//返回文件路径的信息
4)opendir()//打开目录句柄
5)readdir()//从目录句柄中读取条目,返回目录中下一个文件的文件名
6)rewinddir()//倒回目录句柄
7)closedir()//关闭目录句柄
8)mkdir()//新建目录
9)rmdir()//删除指定的空目录
10)scandir()//列出指定路径中的文件和目录
四、文件的基本操作
1)fopen()//打开文件或者 URL
2)fread()//读取文件
3)fgets()//从文件指针中读取一行
4)feof()//测试文件指针是否到了文件结束的位置
5)fwrite()//写入文件
6)rewind()//倒回文件指针的位置
7)flock()//轻便的咨询文件锁定
8)ftruncate()//将文件截断到给定的长度
9)fclose()//关闭一个已打开的文件指针
10)file() //把整个文件读入一个数组中
11)copy()//拷贝文件
12)unlink()//删除文件
13)file_get_contents()//将整个文件读入一个字符串
14)file_put_contents()//将字符串写入文件中
15)rename()//重命名一个文件或目录
- readfile()//读入一个文件并写入到输出缓冲
五、文件的上传 上
一、html标签需要做的上传设置
1) form标签属性设置
1>method设置为post
2>enctype设置为multipart/form-data
3>form表单中设置隐藏类型的input,其中name值设置为MAX_FILE_SIZE,VALUE值设置为需要限制的上传文件的大小(单位为字节)
二、在服务器段通过PHP处理上传文件,涉及到下面的几条信息
1)设置 php配置文件(php.ini)
配置项 默认值 功能描述
file_uploads ON 确定服务器上的PHP脚本是否可以接受HTTP文件上传
memory_limit 8M 设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存
upload_max_filesize 2M 限制PHP处理上传文件的最大值,此值必须小于post_max_size值
post_max_size 8M 限制通过POST方法可以接受的信息最大量upload_tmp_dir NULL 上传文件存放的临时路径,可以是一个绝对路径。这个目录对于拥有此服务器进程用户必须
是可写的。上传的文件在处理之前必须成
功传输到服务器,所以
2)$_FILES多维数组:用于存储各种与上传有关的信息
$_FILES['file']['name'] 客户端机器文件的原名称,包含扩展名
$_FILES['file']['size'] 已上传文件的大小,单位为字节
$_FILES['file']['tmp_name']文件上传之后,在服务器端存储的临时文件名
$_FILES['file']['error'] 文件上传时产生的错误
0:表示没有发生任何错误,文件上传成功
1:表示上传文件的大小超出了再PHP配置文件中upload_max_filesize选项限制的值
2:表示上传文件大小超出了HTML表单中MAX_FILE_SIZE选项所指定的值
3:表示文件只被部分上传
4:表示没有上传任何文件
$_FILES['file']['type'] 获取客户端上传文件的MIME类型,MIME类型规定了各种文件格式的类型。每种MIME类型都是由/分隔的主类型和子类型组成
3)PHP的文件上传处理函数:用于上传文件的后续处理
1>is_uploaded_file()判断指定的文件是否通过HTTP POST上传的
2>move_uploaded_file()文件上传后,首先会存储于服务器的临时目录中,可以使用该函数将上传的文件移动到新位置
六、文件的下载
1)发送指定的文件MIME类型的头信息
header('Content-type:MIME类型');
2)指定下载文件的描述
header('Content-Disposition:attachement;filename=文件名称');
3)指定下载文件的大小
header('Content-Length:文件大小');
4)读取文件内容至输出缓冲区
readfile();
第十一章、会话控制
当我们在浏览网页时,访问每一个web页面都需要使用"HTTP协议"实现,但是HTTP协议是无状态协议,就是说HTTP协议没有一个内建机制来维护两个事务之间的状态。当一个用户请求一个页面以后,在请求同一个网站上的另外一个页面时,HTTP协议并不能告诉我们两个请求是来自同一个用户,而不能将这两次访问联系到一起!
那有怎么解决方法呢?
Cookie
Session
一、cookie
Cookie是用来将网站的资料记录在客户端的技术,这种技术让Web服务器能将一些资料,存放于客户端(用户的电脑)之中。比如:当通过验证,成功登录网站后,在”网页一“的PHP脚本中,会把这个用户有关的信息,设置到客户端电脑的Cookie中,当再次访问同一个网站中的其他脚本时,就会自动携带Cookie中的数据一起访问,在服务器中的每个脚本中都可以接受Cookie中的数据,不需要每访问一个页面就重新输入一次登录者的信息。
- 向客户端电脑中设置Cookie
setcookie ();
- 在服务器端上读取Cookie的内容
$_COOKIE
- 将多维数组应用于Cookie中
setcookie("member[name]",'孙胜利');
setcookie("member[email]",'1205429372@qq.com');
- 删除Cookie
setcookie("member",'',time()-1);
二、session
Session技术与Cookie相似,都是用来存储使用者的相关资料,但是最大的不同之处在于Cookie是将资料存储在客户端电脑中,而Session则是将数据存放于服务器上。把保存的资料比喻成超市里面的会员卡,Cookie技术就相当于需要用户自己保存会员卡,每次去超市必须要持有会员卡才能代表自己的身份,那么Session技术就相当于会员卡由超市方保存,每次来超市的时候只需要报出会员卡的卡号(我们可以称为Session ID,客户端的cookie中只需要保存Session ID)即可!
- 开启session
session_start();//开启一个会话,或者返回已经存在的会话
- 使用session存储数据
session_start();
$_SESSION['username']='sunshengli';
$_SESSION['email']='1205429372@qq.com';
- 注销变量与销毁session
unset($_SESSION['username']);
unset($_SESSION['email']);
或者$_SESSION=array();
setcookie(session_name(),"",time()-3600);
第十二章、MySQL快速入门 44
- 数据库基本概念
动态网站开发离不开数据存储,数据存储离不开数据库,数据库技术是计算机技术中的重要部分,在软件开发等领域起着至关重要的作用。所谓数据库,可以理解为用来存储信息的仓库。而信息就是要存储下来的一些数据,比如用户的姓名、年龄、产品的价格、简介,某一个日期时间甚至图像等等,总之一切可以在计算机中存储下来的数据都可以通过各种方法存储到数据库中,并且数据库也不仅仅是简单的仓库,他提供了一系列科学的存数据,取数据,等等其他的管理措施。比如我们要学习的MySQL数据库,信息并不是杂乱无章的直接放在MySQL数据库中的,可以形象的看成是以二维表的形式组织起来的,一条一条存储于表中,这和日常生活中经常用到的各种表格形式上是一致的。表中的每一条信息称为称为一条记录。一个数据库中可以有若干张表,每张表中又可以存放若干条记录。每张表都有自己的“表头”。比如设计一张表格,用来统计学生信息,那么把要收集的学生的信息分成几个栏目,这些栏目就是“表头”,在数据库技术中,称为字段。表中横向的多个字段值组成了一条记录,多条记录构成了一张数据表。上面简明说明了数据库、表、字段和字段值这几个概念。
数据库系统其实就是一个软件系统,通过这个软件系统可以对大量数据进行 存储和管理。当前市场上的数据库有几十种。对于网站开发而言,MySQL就是当前 web开发中尤其是PHP开发中使用最广泛的数据库。
二、MySQL支持的数据类型 数值类型、日期类型、字符串类型
为了对不同性质的数据进行区分,以提高数据查询和操作的效率,数据库系统将 可以存入的数据分为多种类型。比如 姓名、性别之类的信息为字符串类型,年龄 、价格、分数之类的信息为数字型,日期等为日期时间型。数据类型是针对字段 来说的。有的资料中称为“列类型”或“字段类型”。一个字段一旦设置为某种类型,那么这个字段中只能存入该类型的数据。MySQL数据库中的数据类型分为
3大类:数值类型、日期类型、字符串类型。
详见下面的详细说明TXT文件
三、(My)SQL使用入门
1.SQL语言简介
当面对一个陌生的数据库时,通常需要一种方式与它进行交互,以完成用户所需要的各种工作,这时候就需要使用SQL语言了。SQL(Structured Query Language)结构化查询语言,最早是由IBM在20世纪70年代开发出来,为的是IBM的关系数据库管理系统SYSTEM R开发的一种查询语言。SQL结构简洁,功能强大,简单易学,所以自从其出现,SQL得到了广泛的应用。20世纪80年代初,美国国家标准局(ANSI)开始着手定制SQL标准,当前的SQL标准已经几经修改,更趋完善!正是由于SQL语言的标准化,所以大多数关系型数据库系统都支持SQL 语言,它已经发展成为多种平台进行交互操作的底层会话语言前面加My为的是 在介绍标准SQL的同时,也将一些MySQL在标准SQL上的扩展一同介绍!
2.SQL分类
1)DDL(Data Definition Languages)语句
数据定义语句,通过这类语言可以对数据库进行创建删除更改
2)DML(Data Manipulation Language)语句
数据操纵语句,用于添加、删除、更新和查询数据库记录并检查数据完整性
3)DCL(Data Control Language)语句
数据控制语句,通过此类语句可以对数据库的相关权限进行设置
3.DDL语句
对数据库内部的对象进行创建、删除、修改等操作的语言,DDL语句更多的是由数据库管理员(DBA)使用,开发人员一般很少使用登录mysql之后就可以使用sql语句对数据库进行各种操作啦!
show databases; 查看数据库列表
1)创建数据库
1>create database 数据库名;
2>选择要操作的数据库:USE 数据库; 对于要操作的数据库我们需要使用use来选择一下!
3>查看数据库中所有的数据表show tables;
2)删除数据库
drop database 数据库名称;
3)创建表(在哪个数据库里面创建表需要先使用use选择到那个要操作的数据库)
1>创建表
create table 表名(
字段1名 字段1类型 列的约束条件,
字段2名 字段2类型 列的约束条件,
...
)
2>创建完表之后可以查看表的定义
desc 表名;
3>查看创建表的SQL语句
show create table 表名 \G, \G选项使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录,\G后面无需再加分号
4)删除表
drop table 表名;
5)修改表
1>修改表的字段类型
alter table 表名 modify [column] 字段定义 [first|after 字段名];
2>增加表字段
alter table 表名 add [column] 字段定义 [first|after 字段名];
3>删除表字段
alter table 表名 drop [column] 字段名;
4>字段改名
alter table 表名 change [column] 旧的字段名 字段定义 [first|after 字段名];
注:change与modify都可以修改表的定义,不同的是change后面需要接两次列名,不方便,但是优点是change可以修改字段名称
5>修改字段排列排序
前面介绍的字段增加和修改语法(add/change/modify)中,都有一个可选项first|after 字段名,这个选择可以用来修改
字段在表中的位置新增的字段默认是加载在表中最后位置,而change/modify 默认都不会改变字段的位置
alter table t1 modify id2 tinyint first;
alter table t1 modify id2 tinyint after id1;
注意:change/first|after 字段名 这些关键字都是属于MySQL在标准SQL上的扩展,在其他的数据库上不一定适用
6)更改表名
alter table 表名 rename [to] 新的表名;
详见下面的详细说明
4.DML语句
DML操作是指对数据库中表记录的操作,主要包括表记录的插入、更新、删除、和查询,是开发人员日常使用最频繁的操作。
查询 select * from 表名;
1)插入记录
1>插入记录
insert into 表名(字段1,字段2,字段3,...,字段n) values(值1,值2,值3,...,值n);
也可以不用指定字段名,但是values后面的顺序应该和字段的排序一致
2>一次插入多条记录
insert into 表名(字段1,字段2,字段3,...,字段n)
values
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n)
;
2)更新记录
1>更新一个表
update 表名 set 字段1=值1,字段2=值2,...字段n=值n [where 条件];
2>更新多个表中数据
update 表1,表2,...表n set 表1.字段1=表达式1,表n.字段n=表达式n [where 条件];
注:多表更新更多的用在根据一个表的字段来动态的更新另外一个表的字段
简单实例:
update t1,t2 set t1.age=2000,t2.age=3000 where t1.id=1 and t2.id=1;
3)删除记录
1>删除单表中的数据
delete from 表名 [where 条件];
2>删除多个表中的数据
delete 表1,表2,...表n from 表1,表2,...表n [where 条件];不管是单表还是多表,不加where条件将会把表中的所有记录删除,所以操作时一定要小心。
3>排序和限制
排序:
asc:由低到高,也是默认值
select * from employee order by salary asc;
desc:由高到底
select * from employee order by salary desc;
多个字段排序
select * from employee order by salary desc,id desc;
限制:在语句的最后面 加上limit 数字1,数字2 来进行查询数量的限制。
limit 数字1,数字2 数字1代表从第几条记录开启取(是从0开始的),数字2代表取几条!
4>聚合
①sum求和
select sum(字段名) from 表名;
②count记录总数
select count(*|字段名) from 表名;
③max最大值
select max(字段名) from 表名;
④min最小值
select min(字段名) from 表名;
⑤GROUP BY分类聚合
select department,sum(salary) from employee group by department;
⑥WITH ROLLUP分类聚合后的结果进行再汇总
select sum(salary) from employee group by department with rollup;
⑦HAVING
注意:having和where的区别在于,having是对聚合后的结果进行条件过滤,而where是在聚合前就对记录进行过滤,应该尽可能的对记录进行先过滤!select sum(salary) from employee group by department having sum(salary)>1000; 在一起使用:select sum(id),max(id),min(id),count(*) from a1;
5>表连接
需求:显示多个表中的字段的时候即可使用表连接
连接分类
内连接:选取两张表中相互匹配的记录
外连接:不仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录
举例:
内连接:select 表.字段,.... from 表1名,表2名,... where [匹配的条件比如 表1.字段=表2.字段];
select 语句可以给字段起别名!直接写在需要查询显示的字段的后面就ok
给表起别名
外连接
1)左连接
概念:包含左边表中的所有记录(包括右表中没有和它匹配的记录)
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
2)右连接
概念:包含右边表中的所有记录(包括左表中没有和它匹配的记录)
左连接和右连接是可以相互转换的!
6>子查询
需求:一个查询需要另外一个查询的结果参与的时候
用于子查询的关键字:
in
语法:select * from employee where id in(select eid from employee_late);
in 在..里面
注意点 in后面的子语句必须只返回一个字段
若查询结果唯一(只有一条)可以使用=代替in
not in 与in相反 exists
语法:select语句 where exists(select 语句);
exists:后面那个子语句有没有查询出记录来,如果查询出记录来返回true,否则就是false
并且查询出来的记录的具体的值是NULL也是没有关系,也是返回true.
not exits 与exists相反
1)select * from emp where deptno in(select deptno from dept);
2)若查询结果唯一可以使用=代替in
select * from emp where deptno=(select deptno from dept limit 1);
7>记录联合
我们常常会碰到需要将两个表或者多个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示这是就需要用到记录联合多个select 语句用
UNION或者UNION ALL隔开即可实现
区别: 前者 会将多个查询结果合并后并且进行去除重复后返回后者 则直接合并并不去除重复
联合的条件:查询的列个数要相等
详见下面的整数类型的字段常见的属性设置:
1.UNSIGNED 无符号
2.auto_increment
自增(默认从1开始),用于整数类型和带索引的字段,比如:配合主键使用(其他类型的索引我们以后再说)
3.主键:
主键可以唯一标识某条记录的一个字段或者多个字段
一个字段设为主键
多个字段组合设为主键
注意点:
1)主键最好不要设置在某个与实际信息相关的字段上,主键的作用应该明确且单一
2)主键最好设置在整数类型的字段上面(处理或查询起来效率较高)
3)主键必须不同,并且不能为null
4)既然主键必须不同所以我们会配合 auto_increment属性
5)一个表只能有一个主键,最好只设置在一个字段上
6)根据主键的值来查询记录时可以获得极快的速度(因为设置了主键的字段已经创建了索引)!
设置方法:
在创建表的时候
primary key(字段)
primary key(字段1,字段2)
也可以直接写在需要创建主键的字段后面
如果忘了设置可以
alter table 表名 add primary key(字段名);
删除:
alter table 表名 drop primary key;
注意:如果字段具有auto_increment属性必须先删除auto_increment属性
4.规定字段的值是否可以为null not null即不可以为null,该属性也可用于其他类型的字段
5.设置默认值 default 值,该属性也可用于其他类型的字段
详细说明
5.DCL语句
DCL语句主要是DBA用来管理系统中的对象权限时使用的,一般开发人员很少使用。关于权限设置的更多内容我们在以后再做详细讲解!
注:数据库字符编码
一、MySQL支持的字符集
1.查看所有可用的字符集
show character set;
或者查看information_schema.character_sets,也可以显示所有的字符集和该字符集默认的校队规则
2.MySQL的字符集包括字符集(character)和校对规则(collation)两个概念。
1)字符集用来定义MySQL存储字符串的方式
2)校对规则用来定义 字符串比较的方式
3)字符集和校对规则是一对多的关系,一个字符集有多个校对规则供你选择!
校对规则命名约定:它们以相关的字符集名开始,通常包括一个语言名,并且以
_ci(忽略大小写)、
_cs(大小写敏感)或者
_bin(二元,即比较是基于字符编码的值而与language无关)结束。
查看字符集的校对规则:
show collation like '字符集前缀%';
二、MySQL内部的字符集和校对规则设置
1.服务器字符集和校对规则设置
暂时了解一下即可
2.数据库字符集和校对规则设置
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
查看当前数据库的字符集和校对规则:
show variables like 'character_set_database';
show variables like 'collation_database';
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
3.表字符集和校对规则设置
CREATE TABLE tbl_name (column_list)
[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name
[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
4.字段(列)字符集和校对规则
遇到这种情况概率比较小,这只是MySQL提供给我们一个灵活设置的手段
三、MySQL连接字符集设置
过程中要设置正确,诚实守信,这样子如果全部设置正常,服务器端会自动的去按照你设置的字符集转换,但是也要避免想换转换的过程,最好都设置成一样的编码!
连接字符集设置:客户端和服务器之间交互的字符集
1.对于客户端和服务器段的交互操作,MySQL提供了3个不同的参数:
1)character_set_client:客户端来源数据使用的字符集
2)character_set_connection:连接层字符集
3)character_set_results:返回结果字符集
知识拓展:数据在客户端和服务器之间交互的过程中字符集转换的大概过程
1) MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
2) 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,内部操作字符集的确定方法如下:
1>使用每个数据字段设定的字符集;
2>若上述值不存在,则使用对应数据表设定的字符集;
3>若上述值不存在,则使用对应数据库设定的字符集;
4>若上述值不存在,则使用服务器设定的字符集。
3) 将操作结果从内部操作字符集转换为character_set_results。
这3个参数设定的字符集应该相同,并且客户端使用的字符集确实是参数character_set_client的值,才可以确保用户的数据可以正确的返回且输出。
查看当前设置:show variables like 'character_set%';
修改:
set names 字符集,可以同时修改3个参数的值,对本次有效
也可以在配置文件中设置:
[mysql]
default-character-set=字符集
修改CMD命令行字符集:
chcp 65001 #换成utf-8代码页(设置为utf-8之后最好手动修改显示字体 )
chcp 936 #换成默认的gbk
客户端使用字符,连接层使用的字符集,内部使用的字符集,返回使用的字符集,最好都设置层一样的,并且客户端使用的字符集确实是character_set_client参数的值,这样就绝对不会出现问题!
四、MySQL中的常见运算符
运算符可以用在连接表达式
1.算数运算符
2.比较运算符
3.逻辑运算符
4.运算符的优先级
五、常用函数
1.字符串函数
CONCAT(S1,S2,...Sn) 连接S1,S2,...Sn为一个字符串
INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的字符串换位字符串instr
LOWER(str) 将字符串str中所有字符变为小写
UPPER(str) 将字符串str中所有字符变为大写
LEFT(str,x) 返回字符串str最右边的x个字符
RIGHT(str,x) 返回字符串str最右边的x个字符
LPAD(str,n,pad) 用字符串pad对str最左边进行填充,直到长度为n个字符长度
RPAD(str,n,pad) 用字符串pad对str最右边进行填充,直到长度为n个字符长度
LTRIM(str) 去掉字符串str左侧的空格
RTRIM(str) 去掉字符串str行尾的空格
REPEAT(str,x) 返回str重复x次的结果
REPLACE(str,a,b) 用字符串b替换字符串str中所有出现的字符串a
STRCMP(s1,s2) 比较字符串s1和s2
TRIM(str) 去掉字符串行尾和行头的空格
SUBSTRING(str,x,y) 返回从字符串str x位置起y个字符长度的字符串
LENGTH(str) 返回字符串长度
2.数值函数
ABS(x) 返回x的绝对值
CEIL(x) 返回大于x的最小整数值
FLOOR(x) 返回小于x的最大整数值
MOD(x,y) 返回x/y的模
RAND() 返回0-1内的随机值
ROUND(x,y) 返回参数x的四舍五入的有y位小数的值
TRUNCATE(x,y) 返回数字x截断为y位小数的结果
3.日期和时间函数
CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前的日期和时间
UNIX_TIMESTAMP(date) 返回日期date的UNIX时间戳
FROM_UNIXTIME() 返回UNIX时间戳的日期值
WEEK(date) 返回日期date为一年中的第几周
YEAR(date) 返回日期date的年份
HOUR(time) 返回time的小时值
MINUTE(time) 返回time的分钟值
MONTHNAME(date) 返回date的月份名
DATE_FORMAT(date,fmt) 返回按字符串fmt格式化日期date值
DATE_ADD(add,INTERVAL expr type) 返回一个日期或时间值加上一个时间间隔的时间值
DATEDIFF(expr,expr2) 返回起始时间expr和结束时间expr2之间的天数
4.流程函数
1)IF(value,t,f) 如果value是真,返回t,否则返回f
select if(field1>1000,'高薪','低薪');
2)IFNULL(value1,value2) 如果value1不为null,返回value1,否则value1该是什么还是什么select ifnull(name,'无名');
3)CASE WHEN [value1] THEN [result1]...ELSE[default]END 如果value1是真,返回result1,否则返回default
select case when 100>10 then '真' else '假' end; 和if语句比较像
4)CASE [expr] WHEN [value1] THEN[result1]...ELSE[default]END 如果expr等于value1,返回result1,否则返回default
select case 1 when 1 then '一' when 2 then '二' when 3 then '三' else '未知数字'end; 和switch语句比较像
5.其他常用函数
DATABASE() 返回当前数据库名
VERSION() 返回当前数据库版本
USER() 返回当前登录用户名
INET_ATON(IP) 返回IP地址的数字表示
INET_NTOA(num) 返回数字代表的IP地址
PASSWORD(str) 返回字符串str的加密版本
MD5() 返回字符串str的MD5值
六、图形化工具(phpMyAdmin)的使用
1.数据库管理
2.数据库对象管理
3.权限管理
4.导入导出数据
第十三章在PHP 中使用mysqli与MySQL交互 56
我们在PHP中可以使用mysqli扩展与MySQL数据库信息交流,i表示改进,增强,它
执行速度更快。mysqli扩展被封装到一个类中,它是一种面向对象的技术,不过
喜欢过程化编程的用户也不用担心,mysqli也提供了一个面向过程的接口,我们
可以像调用函数那样去使用mysqli扩展,所以我们现在学习mysqli扩展相当于就
是学习它提供给我们的一些函数!
- 使用mysqli
1.建立、关闭与MySQL服务器的连接
1)连接指定的mysql服务器
$mysqli_connect=@mysqli_connect($host, $user, $password,$database,$port);
2)连接错误时的提示
int mysqli_connect_errno ();//返回最后一次连接调用的错误代码
string mysqli_connect_error ();//返回一个字符串描述的最后一次连接调用的错误代码
3)设置默认字符编码
bool mysqli_set_charset ( mysqli $link , string $charset )
4)选择特定的数据库
bool mysqli_select_db ( mysqli $link , string $dbname);
5)关闭与mysql服务器的连接
bool mysqli_close ( mysqli $link );
2.执SQL语句
1)对数据库执行一条SQL语句
1>mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] );
①对于insert,update,delete等不会返回数据的SQL语句,在执行没有错误时将返回true。
②对于返回数据的SQL语句执行成功的时候会返回结果集对象可以使用操作结果集对象的函数来从中获取数据
③MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT决定了mysqli client和server之间取结果集的方式。
MYSQLI_STORE_RESULT:执行SQL时提取结果集返回给client,并分配内存,存储到用户程序空间中,之后mysqli_fetch_array()
相当于是从本地取数据;而MYSQLI_USE_RESULT方式下,mysqli_fetch_array()每次都要向server请求结果行。
MYSQLI_USE_RESULT:执行SQL的时候并没有从server将结果集取回
2>bool mysqli_real_query ( mysqli $link , string $query );
也可以使用本函数对数据库执行一条SQL语句,返回结果为布尔值,不返回结果集。
如果想获取结果集可以使用mysqli_store_result()获取结果集对象.
3>如果在执行SQL语句的时候发生错误,以上两个函数都将返回false,并且可以使用以下函数处理错误原因
int mysqli_errno ( mysqli $link );
string mysqli_error ( mysqli $link );
2)操作结果集对象的函数
1>从结果集对象中解析数据的常见函数
①以索引数组的方式获取一条记录的数据
mixed mysqli_fetch_row ( mysqli_result $result );
重复使用以获取下一条记录的数据
②以关联数组的方式获取一条记录的数据
array mysqli_fetch_assoc ( mysqli_result $result );
重复使用以获取下一条记录的数据
③以索引数组或关联数组的方式获取一条记录的数据
mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] );
重复使用以获取下一条记录的数据
④以索引数组或关联数组的方式获取全部记录的数据
mixed mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] );
⑤返回结果集中的下一个字段信息
object mysqli_fetch_field ( mysqli_result $result );
⑥返回一个代表结果集字段的对象数组
array mysqli_fetch_fields ( mysqli_result $result );
⑦获取结果中行的数量
int mysqli_num_rows ( mysqli_result $result );
注意:如果使用MYSQLI_USE_RESULT模式则必须在获取完结果集才可使用该函数。
2>释放与一个结果集相关的内存
返回的结果集在数据量很大的时候需要很多的内存支持,所以在操作完结果集的时候有必要立刻释放与一个结果集相关的内存,释放之后,结果集就不可用了
void mysqli_free_result ( mysqli_result $result );
3)其他常用函数
1>获取前一个Mysql操作的受影响行数
int mysqli_affected_rows ( mysqli $link );
2>返回最后一次操作自动生成并使用的id
mixed mysqli_insert_id ( mysqli $link );
3>转义用于SQL语句中的特殊字符防止SQL语句出错
string mysqli_real_escape_string ( mysqli $link , string $escapestr );
4)一次性执行多条SQL语句,多个SQL语句用分号隔开
bool mysqli_multi_query ( mysqli $link , string $query );
如果执行的每条SQL语句都会返回一个结果,那么想获取每一个结果集对象怎么办呢?
if(mysqli_multi_query($mysqli_connect,"select * from t1;select * from t2")){
$i=0;
do {
if($result=mysqli_store_result($mysqli_connect)){
echo '=========第'.++$i.'个结果集中的全部数据=========<br />';
var_dump(mysqli_fetch_all($result));
mysqli_free_result($result);
}
if(!mysqli_more_results($mysqli_connect)){
break;
}
}while (mysqli_next_result($mysqli_connect));
}
3.预处理语句机制
在编写PHP代码执行SQL语句的时候,很多情况下我们都是相似的语句,只是个别的参数不同,针对这种重复执行相似语句的情况,MySQL4.1
版本开始提供了一种名为预处理语句的机制,它可以将整个语句只向MySQL服务器发送一次,以后只有参数发生变化,MySQL服务器只需对
语句的结构做一次分析就够了。这既减少了需要传输的数据量,还提高语句的处理效率。
1)准备一个用于执行的SQL语句
mysqli_stmt mysqli_prepare ( mysqli $link , string $query );
2)将变量作为参数绑定到prepared语句上
bool mysqli_stmt_bind_param ( mysqli_stmt $stmt , string $types , mixed &$var1 [, mixed &$... ] );
参数string $types说明:表示后面多个可选参数变量的数据类型,一一对应.
i:int类型
d:double或者float类型
s:字符串类型
b:二进制数据类型(BLOB、二进制字符串)
3)执行一个prepared准本好的语句
bool mysqli_stmt_execute ( mysqli_stmt $stmt );
4)将查询出的数据绑定到PHP变量上
bool mysqli_stmt_bind_result ( mysqli_stmt $stmt , mixed &$var1 [, mixed &$... ] );
5)从一个prepared语句中抓取结果到指定变量中
bool mysqli_stmt_fetch ( mysqli_stmt $stmt );
6)从一个prepared语句返回结果集元数据,配合相关函数,可以用来获得字段的相关信息
mysqli_result mysqli_stmt_result_metadata ( mysqli_stmt $stmt );
①mysqli_fetch_field();
②mysqli_fetch_fields();
7)取回一个结果集
bool mysqli_stmt_store_result ( mysqli_stmt $stmt );
取回之后可以使用int mysqli_stmt_num_rows ( mysqli_stmt $stmt );返回语句结果集中的行数
8)释放给定语句处理存储的结果集所占内存
void mysqli_stmt_free_result ( mysqli_stmt $stmt );
9)关闭一个prepared语句
bool mysqli_stmt_close ( mysqli_stmt $stmt );
本文来自博客园,作者:JackieDYH,转载请注明原文链接:https://www.cnblogs.com/JackieDYH/p/17635073.html