php基础知识
date_default_timezone_set("Asia/Shanghai");
date_default_timezone_set("PRC");//设置时区 PRC 中华人民共和国
Eclipse快捷键:
alt+shift+r:重命名
ctrl-/:对一行或多行注释或取消注释
ctrl+o:快速outline
ctrl+shift+r:打开资源
屏蔽警告:error_reporting(E_ALL & ~E_NOTICE);// ~ 除了
“select * from user where username=’$username’”
Mysql修改密码:mysql>SET PASSWORD FOR root@localhost=PASSWORD(‘newpassword’);
header("Content-type: text/html; charset=utf-8");
修改php配置文件位置:在Apache配置文件中输入PHPIniDir "D:/Appserv/php5/php.ini"
Iconv(string in_charset,string out_charset,string str)转换字符串字符集
Js跳转
echo '<script language=javascript>window.location.href="login.php"</script>';
//0.5s后跳转
echo "<meta
http-equiv=\"refresh\" content=\"0.5;url=$url\">";
指令分隔符“分号”
语句分两种:一种是功能执行语句:后面一定要加分号
与?>最近一条语句可以不加分号,建议都加分号
一种是结构定义语句:后面一定不要加分号
程序中的注释
1.//单行注释
2. /* */多行注释,多行注释中不能再包含多行注释
3. #脚本注释
4. /** */文档注释
作用:写过不适合的代码注释
写帮助文档
调试程序
注意:注释要写在代码的上面或右边
Php语言标记
<?php ?> 推荐使用这个,如果?>之后就是脚本结束可以不加,建议不要加
<? ?>
<?=$var?>
<%%>
<script language=”php”></script>
变量的声明
如果在用到数据时,需要用到多次就声明为变量使用
$变量名=值
强类型语言中(C,Java)声明变量一定要先指定类型;php是弱类型语言,变量的类型由存储的值决定
isset()判断变量是否存在;unset()删除一个变量
eg:字符串声明:1.单引号和双引号都可以声明字符串
2.声明的字符串没有长度限制
3.在双引号的字符串中,既可以直接解析变量,又可以直接使用转义字符
4.在单引号的字符串中,不可以直接解析变量,也不可以使用转义字符(可以转义单引号本身,也可以转义转义字符”\”)
5.在双引号中不能再使用双引号,在单引号中不能使用单引号
6.最好使用单引号
7.定界符声明 可以使用双引号 声明大量字符串
变量的命名
- 变量前一定要使用“$”,声明和使用都要有这个符号
- 不能以数字开头
- 不能使用php的运算符号+ - * / % &
- Php可以使用系统关键字作为变量名
- 注意:php变量区分大小写(只有变量和常量区分大小写,其他不区分)
- 变量名称一定要有意义,可以使用英文单词,也可以使用汉语拼音(变量的命名风格:$aaaBbbCcc)
可变变量
一个变量的变量名可以动态设置和使用
eg:$one=”###”;
$two=”one”;
echo $two.”<br>”;//输出one
echo $$two.”<br>”;//输出###,$two是one
变量的引用赋值
使用一个“&”符号加到将要赋值的变量前面(原变量)
Eg:$one=10;
$two=&$one;//two的值为10
$one=100;//two的值也变为100
变量的类型
Php中共有8种类型:4种标量:整型:int integer(整数的最大值,2的32次方)
布尔型:bool boolean(false的情况:false、0、0.000、””、” ”、null、”0”、array())
浮点型:float double real
字符串:string
2种复合类型:
数组:array
对象:object
2种特殊类型:
资源类型:resource
空类型:null
Var_dump(变量或值);//既可以查看变量或值得类型,又可以看数据
常量的声明与使用
- 常量是一个简单值的标识符
- 常量定义后不能再改变它的值,也不能使用unset()取消
- 常量可以不用理会变量范围的规则而在任何地方都可以定义和访问
- 常量使用define(”常量名”,值)
- 常量声明时在声明和使用都不用“$”
- 常量名称习惯都使用大写
- 常量的值只能用标量类型(int,float,bool,string)
- 常量一定要在声明时就给值
- Define(“常量”);
预定义常量和魔术常量(常量值不固定)
魔术常量:__FILE__(本文件) __LINE__(行数) __FUNCTION__(使用哪个函数) PHP__VERSION__(php版本)eg:echo __FILE__.”<br>”;
类型之间的相互转换
强制转换:settype(变量,类型);//类型int integer float double real bool boolean string array object
这个函数将原变量的类型改变,在赋值前使用(类型)的形式,不会改变原变量的
类型
$变量=intval(变量或值);
$变量=floatval(变量或值);
$变量=stringval(变量或值);
注意:整型在内存中占4个字节,浮点型在内存中占8个字节(可能会出现溢出)
自动转换:最常用方式,因为这种开发时不用去管理类型,变量会根据运行环境自动转换
与变量和类型有关的一些常用函数
isset();判断一个变量是否存在,值如果是null,也表示空
unset();删除一个变量
empty();// “ “ null
setType();设置类型
getType();得到类型
变量类型测试函数
is_bool();
is_int() is_integer() is_long()
is_string()
is_float() is_double() is_real()
is_array()
is_object()
is_resource()
is_null();
is_scalar();//判断是否为标量
is_numberic();//判断是否是任何类型的数字或数字字符串
is_callable();//是否是有效的函数名
print_r();//输出数组
Php的运算符
一元运算符:!true;//一个操作数前有一个运算符
二元运算符:$a+$b;
三元运算符:true?1:0;
按运算符号的功能分类:
- 算术运算符 + - * / % ++ --
- 字符串运算符 .
- 赋值运算符 = += -= *= /= %= .=
- 比较运算符(条件运算符/关系运算符) > < >= <= ==(只比较内容) === (类型也比较) <> != !==
- 逻辑运算符 &&/and ||/or !/not 异或
- 位运算符 & | ^(按位异或,相同为0不同为1) ~(按位取反) << >> >>>(无符号右移 统统补零)
- 其他运算符 ? : `` @ => -> :: & $
用%有两个目的:整除运算;控制范围 不要用小数或负数取余,%会把两边的数转为整数后再进行整除
逻辑运算符只能操作bool型值,返回的也是bool型值
&和|既可以作为逻辑运算符又可以作为位运算符
短路问题:&&和||会发生短路,&&在做运算时,如果前面的数为false,则后面是否为true,整个表达式都是false,不再执行后面的操作数;||在做运算时,如果前面的数为true,则后面是否为false,整个表达式都是true,不再执行后面的操作数。&或|在运算时,两边都会被执行
``,执行运算符,引号中执行操作系统命令,尽量不要用,可能会影响跨平台
@,错误控制符,屏蔽错误、警告提示
优先级:不用记优先级,使用括号改变优先级
流程控制
一、顺序结构
二、分支结构/条件结构/选择结构
- 单路分支
if(条件)//条件bool,true或false,< > == != & || ! isset()
- 双路分支
使用else从句
if(条件){
一条或多条代码
}else{
一条或多条代码
}
- 多路分支
可以使用if else if 和switch case
\\这是一种互斥的关系
if(条件){
}else if(){
}elseif(){
}else{
}
switch(变量){//变量只用整型和字符串,尽量不要用其他类型
case 值:
代码;
Break;//退出switch的语句,可以不要,不退出switch匹配多个值执
行同一段代码
case 值1:
代码;
Break;
default://可选的,可有可无,不用再加break
代码;
}
如果是判断一段范围使用elseif;如果是单个值匹配使用switch case
- 嵌套分支
尽量不要超过五层
if(){
if(){
}else{
if(){
}
}
}else{
if(){
}else{
switch(){
}
}
}
三、循环结构
- while循环
先判断条件,成立则执行
- do-while循环
先执行再判断条件
- for循环
for(初始化;条件表达式;增量){
循环体
}
根据循环条件不同有两种类型的循环:一种是计数循环 合适for
一种是条件型循环 合适while do-while foreach
几个和循环有关的语句:break continue exit return(可以用break2,退出两层循环)
函数的定义:
- 函数是一个被命名的
- 独立的代码段
- 它执行特定任务(功能)
- 并可以给调用它的程序返回一个值
函数的优点:
- 提高程序的重用性
- 提高程序的可维护性
- 提高软件的开发效率
- 提高软件的可靠性
- 控制程序的复杂性
函数的声明:
function 函数名(){
函数体
}
function 函数名(参数1,参数2,参数3……){//参数列表,如果有多个就用“,”分开
函数体
}
function 函数名(){
函数体
返回值
}
function 函数名(参数列表){
函数体
返回值
}
函数必须调用才能执行,可以在声明之前调用,也可以在函数声明之后调用
函数名命名和变量一样 aaaBbbCccc 函数名称一定要有意义,函数名可以:调用函数,开始执行函数;向函数中传递数据;函数名就是返回的值
函数在声明时不能重名
可以通过向函数传递参数,改变函数的行为,参数越少越好
参数分为:形参:在声明函数时声明的参数,参数就是变量,多个参数用“,”分开
实参:调用函数时传递给形参的值(数据,也可以是变量)
如果没有返回值则称为过程
通过使用return语句返回数据,函数执行到return语句就结束,所以不要在这个语句后写代码,也可以使用return结束函数的执行
Php的变量的范围
局部变量:在函数中声明的变量就是局部变量,只能在自己的函数内部使用
全局变量:在函数外声明,在变量声明以后,直到整个脚本结束前都可以使用,包括在函数中和{}中都可以使用
Php的变量分不出是声明还是使用
在php中使用全局变量,要通过global关键字将这个全局变量包含到函数中才能使用到,在global声明之后才是使用全局的变量
参数就是局部变量,这个局部变量可以调用时赋值
Php的静态变量
静态变量只能声明在函数中(类中),不能在全局声明
使用static在变量前
作用:一个变量可以在同一个函数在多次调用中共用
- 静态变量在静态代码段中保存
- 一个函数多次调用之间共用,但只在第一次调用函数时声明到内存,以后再调用时就不再声明,而直接使用
变量函数
如果一个变量后面有括号$var=hello $var(),就将寻找与变量值同名的函数hello();
函数需要知道的信息:1.函数的功能--------决定是否使用这个函数
2.函数的参数--------决定函数怎么调用(几个参数,传什么类型的值…)
3.函数的返回值-----调用后怎么处理这个函数
一定要先使用系统函数(比自定义函数效率高),如果系统函数没有你想要的功能,再去自己定义函数
函数调用方法:1.常规函数 bool copy ( string source, string dest)
2.带有mixed的函数,mixed表示可以传任何类型的数据
bool chown ( string filename,mixed user )
3.带有&参数的函数,表示引用赋值,这个函数不能传值,只能传一个变量,然后函数将变量的值改变,我们在使用这个变量时,值也是变化的
bool arsort ( array &array [, int sort_flags])
4.默认函数(实参可以比形参少) 带有[ ]的函数,表示这个参数是可选的,如果你传值了就使用你传的值,如果没有传值则使用默认值。直接在声明函数时,就为函数赋初值。可选值和必须值,必须从后向前设置
bool arsort ( array &array[ ,int sort_falgs])
5.带有…的参数函数,…表示可以传任意多个参数(实参可以比形参多)
int array_unshift ( array &array, mixed var [, mixed …])
6.回调函数 带有callback,就是调用这个函数时需要我们传一个函数进来(函数名、函数名字符串)
array array_filter ( array input [, callback callback])
函数的使用
- 内部函数 php可以在函数内部再声明函数,目的就是在函数内部使用,用来帮助外部函数完成一些子功能
- 递归函数 :就是在自己内部调用自己的函数名
- 重用函数(使用自己定义的函数库)
系统指令,两种用法 既可以做函数又可以做系统指令
require 用于静态包含,确定包含哪个文件了
include 用于动态包含,根据不同的条件去找哪个文件要包含
eg:if($classname==”action”){include “action/”.$classname.”.php”;}
require_once 会自动判断文件是否被包含过,包含过就不再包含
include_once
echo
break
exit
include(文件名); 文件包括 .txt .html .php 相当于解释过的php文件
include “文件名”; 系统指令
- 一些系统函数的使用
is_dir()判断是不是目录(当前脚本目录下)
数组的概述
- 数组的本质:管理和操作一组变量,成批处理
- 数组是复合类型
- 数组中可以存储任意长度的数据,也可以存储任意类型的数据
- 数组就可以完成其他语言数据结构的功能(链表、队列、栈、集合类)
数组中存有多个单元,单元称为元素,每个元素(下标【键】和值),单访问元素时,都是通过下标(键)来访问元素
数组的分类
- 一维数组 二维数组 。。。 多维数组(数组的数组,就是在数组中存有其他的数组)
- Php中有两种数组:
索引数组:就是下标是顺序整数的索引
关联数组:下标是字符串作为索引 下标只有整数和字符串两种类型
一般有规律的数组定位索引数组,无规律性用关联数组
数组的多种声明方式
- 直接为数组元素赋值声明
如果索引下标不给出,就会从0开始顺序索引;如果给出索引下标,下一个就会是从最大的开始增1;如果后面出现前面的下标,如果是赋值就是为前面的元素重新赋值
索引和关联混合声明时,不互相影响(不影响索引下标的声明)
- 使用array()函数声明
默认是索引数组
如果为关联数组和索引数组指定下标,使用 键=>值
$user=array(1,”zhangsan”,10,”nan”);
$user=array(“id”=>1,”name”=>”zhangsan”,”age”=>10,”sex”=>”nan”);
多个成员间使用“,”分隔
$user=array(
array(1,”zhangsan”,10,”nan”),
array(2,”lisi”,20,”nv”), //$user[1][1]访问lisi
array(3,”wanger”,30,”nan”)
);
- 使用其他函数声明
数组的遍历
- 使用for语句循环遍历数组
其他语言常用的方式(基本只有这一种方式)
Php中这种方式不是我们首选的方式
数组必须是索引数组,而且下标还必须是连续的(php中索引下标可以不连续
数组还有关联数组)
- 使用foreach语句循环遍历数组
foreach(数组变量 as 变量值){
循环体
}
循环次数由数组的元素个数决定
每一次循环都会将数组中的元素分别赋值给后面的变量
$user=array(1,”zhangsan”,10,”nan”);
foreach($user as $val){ //$val是自定义变量
echo $val.”<br>”;
}
foreach(数组变量 as 下标变量=>值变量){ //下标变量和值变量都是自定义的
循环体
}
- while() list() each()组合循环遍历数组
each()函数:
a.需要一个数组作为参数
b.返回来的也是一个数组
c.返回来的数组是0,1,key,value四个下标(固定的)
0和key下标是当前参数数组元素的键;1和value是当前参数数组元素的值
d.默认当前元素就是第一个元素
e.每执行一次后就会将当前元素向后移动
f.如果到最后的元素再执行这个函数,则返回false
list()函数:
a. list()=array(); 需要将一个数组赋值给这个函数
b.数组中的元素个数,要和list()函数中的参数个数相同
c. 数组中的每个元素值会赋值list()函数中的每个参数,list()将每个参数转
变为变量
d. list()只能接收索引数组
e.按索引下标的顺序
使用数组内部指针控制函数
next(数组);//指针下移
prev(数组);//向上移
reset(数组);//指针移动到第一个
end(数组);//最后一个
current(数组);//取走指针位置的内容资料(当前元素内容值)
key(数组);//获取当前元素键值
预定义数组
自动全局变量---超全局数组
- 包含了来自web服务器,客户端,运行环境和用户输入的数据
- 全局范围内自动生效,都可以直接使用这些数组
- 用户不能自定义这些数组,这些数组是已经存在的数组,可以直接用,和我们自定义的数组操作方式一样
- 用户定义数组时,应避免数组名称和预定义数组名称相同
$_GET //经由URL请求提交至脚本的变量 地址栏最大8092个字节(有密码或
大数据不适宜用get请求)
$_POST //经由HTTP POST方法提交到脚本的变量
$_REQUEST //经由GET,POST 和COOHIE机制提交到脚本的变量,因此该数组并
不值得信任,尽量不去使用
$_FILES //经由HTTP,POST文件上传而提交至脚本
$_COOKIE //会话控制
$_SESSION //会话控制
$_ENU //执行环境提交至脚本的变量
$_SERUER //变量由WEB服务器设定的,或直接和当前脚本的执行环境相关联
URL,IP地址等
$GLOBALS //只要是当前脚本有效的变量都在这里,数组键名为全局变量的名称
$_GET[“hello”]=”#######”;
print_r($_GET);
5.在函数中直接使用这些数组
数组的相关处理函数
一.和数组键/值操作有关的函数
- array_values(array input);//返回input数组中所有的值并给其建立数字索引 返回元素值,返回的也是一个数组,数组为顺序索引
- array_keys(array input[,mixed search_value[,bool strict]]);//返回数组中所有的键名,第二个参数返回指定该值的键名,第三个参数设为true进行全等比较(即也比较类型)
- in_array(mixed needle,array haytack[,bool stract]);// 搜索数组 检查给定的元素值是否存在于数组中(在haytack中搜索needle),返回布尔型值,第三个参数表示是否进行全等比较,mixed代表任意类型数据
- array_key_exits(mixed key,array search);//检查给定的键名是否存在于数组中
- array_flip(array trans);//交换数组中的键和值,返回数组 值可以重复下标不能重复,当有相同的值进行交换时,后面的会覆盖前面的下标
- array_reverse(array array[,bool preserve_keys]);//返回一个单元顺序相反的数组
二.统计数组元素的个数和唯一性的相关函数
- count(mixed var[,int mode]); sizeof();//统计数组长度 两个函数功能一样,只是叫 法不同,计算数组中的单元数目或对象中的属性个数 第二个参数为‘1’递归检测多维数组中元素个数,为‘0’不检查
- array_count_values(array input);//统计数组中所有的值出现的次数 返回一个数组,该数组用给定数组的值作为键名,该值在给定数组中出现的次数作为值
- array_unique(array array);//移除数组中重复的值
三.使用回调函数处理数组的函数(允许在函数的参数列表中传入用户自定义的函数)
1.array_filter(array input[,callback callback]);//过滤 用回调函数过滤数组中的单元 两个
参数,一个数组,一个用户自定义函数 有返回真值的留下,假值不保留
2.array_walk(array &array,callback funcname[,mixed usedata]);//对数组中每个成员应用用户函数 成功返回TRUE失败返回FALSE 两个参数,第一个是被指定的回调函数处理的数组,第二个为回调函数,典型情况下回调函数funcname接收两个参数,数组的值作为第一个,键名作为第二个,若提供可选参数userdate
3.array_map(callback callback,array arr1[,array…]);//将回调函数作用在给定的数组单元上,callback为回调函数,后面参数使用多个数组时,数组长度保持相同
四.数组的排序函数
1.简单的数组排序函数(对数组元素的值进行排序,但原始键名会被忽略换为数字索引顺序排列)
Sort(array &array[,int sort_flage])由小到大排序,第一个参数为引用参数,则排序后数
组原型会改变,第二个参数值使用下列常量:SORT_REGULAR正常比较单元(不改变类型)SORT_NUMERIC 单元被作为数字来比较SORT_STRING单元被作为字符串来比较
Rsort()由大到小排序
2.根据键名对数组排序
Ksort() krsort()
3.根据元素的值对数组排序(保留原有键名和值的关系)
Asort() arsort()
4.根据“自然数排序”法(即0-9,a-z)对数组排序
Natsort() natcasesort()不区分大小写
5.根据用户自定义规则对数组排序
Usort() uasort()保持索引关联 uksort()按照键名对数组排序,并保持索引关系
6.多维数组排序
Array_multisort()
五.数组的拆分、合并、分解、接合函数
1.arrary_slice(array array,int offset[,int length[,bool preserve_keys]])从数组中取出一段,即是在array中从offset开始取length长度的一段,若offset为负则序列将从array中距离末端这么远的地方开始,若length为负则序列将终止在距离数组末端这么远的地方,若length省略则序列将从offset开始到array末端,第四个参数为true保留原有下标
2.array_splice()与第一个类似但不返回而是删除它们并用其他的值代替(被第四个参数指定的数组取代)
3.array_combine()合并两个数组来创建一个新的数组,其中一个数组是键名(第一个参数)另外一个数组的值为键值,若其中一个数组为空或两个数组长度不同就会返回假
4.array_merge()把一个或多个数组合并为一个数组,若键名有重复则键值为最后一个的键值,若键名为数字索引则键名会与连续的重复索引合并在一起
5.array_intersect()计算数组的交集,取出两个或多个数组相同的部分
6.array_diff()返回两个数组的差集
六.数组与数据结构的函数
1.使用数组实现堆栈的功能
栈空间 后进先出 入栈出栈又称做压入弹出
入栈 Array_push($arr,”hello”,”hi”),在$arr中压入值hello,可连续调用多次
出栈 Array_pop($rr) 弹出栈顶数据
2.使用队列
队列 先进先出
Array_unshift() 压入,在第一个显示
Array_shift() 从队头弹出数据(即数组中第一个元素),删除队列中的元素
Unset()删除变量、数组中元素(删除以后那个元素的下标也不存在)、对象中的成员
七.其他与数据操作有关的函数
Array_rand()随机从数组中取出一个或多个元素的下标并返回,两个参数,第一个是数组,第二个是随机取的个数(默认为1,取的是下标,取值:$arr[array_rand($arr)])
Shuffle($arr)随机调度,把数组中元素按随机顺序重新排列,成功返回真,传递的是引用,原数组发生变化
Array_sum($arr)求数组所有元素成员和,返回和
range()创建并返回一个包含指定范围元素的数组,三个参数,第一个参数是必选项规定
数组元素的最小值,第二个规定最大值,规定数组元素从哪到哪,第三是可选项规定数组元素之间的步长(默认为1)
面向对象概述
数组和对象都属于PHP中的复合类型(一个变量可以存储多个单元),对象比数组更强大,不仅可以存储多个数据,还可以将函数存在对象中,但对象操作不如数组灵活
对象的三大特性:封装 继承 多态
面向对象编程(oop)
面向对象和面向过程的区别:
面向过程:最小单位:函数
面向对象:最小单位:对象
对象 类:对象中包含两样 成员属性=变量 定义对象的外观和状态 成员方法=函数 定义对象的功能。声明类->实例化对象(创建对象)->用对象,声明类时,类中的内容就是成员属性和成员方法,通过类创建的对象中的内容就是类中声明的内容
类的声明与对象实例化
类的声明
1.确定写什么类
2.类中的成员一定要属于这个类,即跟类无关的东西不要写
[修饰类的关键字] class 类名{
成员属性;
成员方法;
}
在类中声明成员属性时,前面必须有修饰词,[private protected public static const var …]$bianLiang=’’;,不确定用什么时,可以用var或public。类中的成员属性,如果创建对象时,每个对象有不同的属性值时,不要直接给初值,创建好对象之后再给值
一个文件只保存一个类,文件名中包含类名(不包含的话没法自动加载),推荐使用:类名.class.php
变量名:aaaBbbCcc
函数名:aaaBbbCcc
常量名:AAABBBCCC
类名:AaaBbbCcc
注意:不管任何名称,一定要有意义
可以有空类,不包含任何内容
实例化对象
通过类来实例化对象
1.使用new新建一个对象,加上类名,就是创建那个类的对象
$对象引用=new 类名; eg:$p=new Person;
2.只要有一个new关键字就是创建一个对象,创建一个对象就在内存中分配了一个空间,只有对象才在内存有存储空间
对象的使用
对象中成员必须通过对象的引用来访问
对象->成员属性=新值
Echo 对象->成员属性
对象->成员方法
对象在内存中的分配情况
内存:分四段
数据段(初始化静态段)存静态信息,在程序中公用的东西(eg:静态变量、常量)
栈内存 空间小、CPU访问速度快,存放空间大小不变的数据(整数占4个字节、布尔型占1字节、double型占8字节、浮点型占4字节)
堆内存 空间大,CPU不能直接访问,需要通过栈中的引用访问,存放长度不固定、比较大的数据(eg:字符串、数组、对象)
代码段 存程序结构(eg:函数、方法)
面向对象的构造与析构方法
1.对象中成员的访问(就是在一个对象的内部方法中,去访问本对象中的其他方法和成员属性)
2.在对象中的方法中都默认有一个$this关键字,这个关键字代表调用这个方法的对象
构造方法(又叫构造器)
1.是对象创建完成以后,第一个自动调用的方法
2.构造方法的定义,方法名固定
在PHP4中,和类名相同的方法就是构造方法
在PHP5中,构造方法选择使用魔术方法__construct()所有类中声明构造方法都使用这个名称,它的优点是在改变类名时构造方法不用改变
Function Person($a,$b,$c){}
$p=new Person(1,5,6)
魔术方法:在类中写出了某个魔术方法,这个方法对应的功能就会添加上。方法名称都是固定的(由系统提供),没有自己定义的。每一个魔术方法都是在不同时刻为了完成某一功能自动调用的方法,不同的魔术方法有不同的调用时机,方法名都是以__开头
__construct();构造方法
__destruct();析构方法
__set();封装时用
__get(); __isset(); __unset();
__clone(); __call(); __sleep(); __weakup(); __toString();
类外也有魔术方法 __autoload();自动加载
作用:为成员属性初始化
析构方法
- 当对象被垃圾回收器释放(当对象前面的引用没了时释放)之前最后一个自动调用的方法
使用垃圾回收器 析构方法作用:关闭一些资源,做一些清理工作
释放顺序,栈内存,后进先出
面向对象的三大特性
一、封装性
1.就是把对象的成员(成员属性、成员方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节
属性和方法都可以封装
使用的关键字有public protected private
Private私有的,用这个关键字修饰的成员,只能在对象内部访问(只有用$this访问),不能在对象外部使用
作用:使用private修饰使用其只能在内部使用
属性封装:只要一个变量,需要在多个方法使用,就将这个方法声明为成员属性,可以直接在这个对象中的所有方法中使用。成员属性就相当于这个对象中的全局变量,成员属性都会在方法中使用,其值的变化其实就是在改变方法的执行行为,也就是改变了对象的功能。成员属性的值如果不正常,方法执行的功能也就不正常了
属性封装作用:不需要在对象外部改变或读取它的值。封装然后再提供一个公有的方法,经过方法对成员属性进行赋值和取值就可以控制
和封装有关的魔术方法:
__set(); 是直接设置私有成员属性值时,自动调用的方法
__get();是直接获取私有成员属性值时,自动调用的方法
__unset();直接使用isset查看对象中私有属性是否存在时自动调用这个方法
__isset();直接使用unset删除对象中私有属性时,自动调用的方法
二、继承性
相关名词:父类--基类 子类—派生类
使建立的软件具有开放性和可扩充性,增加代码的重用性
继承就是用子类去扩展父类,C++属于多继承,同一个类可以有多个父类,PHP和JAVA属于单继承,同一个类只能有一个父类,但是多继承和单继承都可以有多个子类
(一)类继承的应用
1.声明一个子类,使用extends关键字去继承(扩展)一个父类
2.子类可以从父类继承所有内容,包括成员属性、成员方法、构造方法等等,在子类中都可以直接使用
(二)访问类型控制
虽然子类可以从父类中继承所有内容,但是父类中的私有成员只能在本类中使用,不能再子类中使用,将private改为protected就可以实现,封装时既可以让自己类的内部访问,也可以让子类访问,但是类的外部不能访问
Private 本类
Protected 本类、子类
Public 本类、子类、类外部(默认)
(三)子类中重载父类的方法
其实PHP中没有重载这一说法 函数名相同,参数类型或个数不同
- 子类可以声明和父类相同的方法名,即子类覆盖了父类中同名的方法,子类方法对父类方法的扩展。
对象->成员 类::成员
在子类中调用父类中被覆盖的方法:父类名::方法名() 或parent::方法名()
在子类中编写构造方法,如果父类中也有构造方法一定要调用一次父类中被覆盖的那个构造方法
注意:子类中重载的方法,不能低于父类中访问权限,子类可以放大权限不能缩小权限
Php常用的关键字
Final
- final不能修饰成员属性(类中的常量不是用这个关键字声明)
- final只能修饰类和方法
作用:使用final修饰的类不能被子类继承
使用final修饰的方法不能被子类覆盖
用来限制类不被继承,方法不被覆盖
Static
- 使用static可以修饰成员属性和成员方法,不能修饰类。
- 使用static修饰的成员属性可以被同一个类的所有对象共享,内存中只有一份,存在数据段中
- 静态的数据是存在内存中的数据段中(初始化静态段)
- 静态的数据是在类第一次加载时分配到内存中的,以后再用到类时直接从数据段获取
- 类被加载:只要在程序中使用到这个类(有这个类名出现)
注意:静态的成员都要使用类名去访问,不用创建对象,即使有对象也不用对象去访问
类名::静态成员 如果在类中使用静态成员,可以使用self代表本类($this代表本对象)
- 静态方法不能访问非静态成员,非静态方法可以访问静态成员,非静态成员必须使用对象访问,访问内部成员使用$this,而静态方法不使用对象调用,$this也就不能代表任何对象,所以就不能使用非静态成员。如果能确保一个方法不使用非静态成员,则可以将这个方法声明为静态方法
Const
- 只能修饰成员属性
PHP中声明常量:define(‘HOST’,’www.xsphp.com’);
- 类中声明常量属性使用const,命名方式和define是一样的效果,但是访问方式和static静态成员属性一样(在类外部使用 类名::常量,在类内部使用 self::常量),常量一定要在声明时就给初值,常量值只能是标量(整型、字符串、布尔型、浮点型),常量不允许改值
PHP中常用的魔术方法
__call()
作用:在调用对象中不存在的方法时就会出现系统报错,然后程序退出
什么时候自动调用:在调用一个对象中不存在的方法时自动调用
处理一些不存在方法的错误调用
有两个参数,一个是不存在方法的方法名,一个是不存在方法的参数(数组)
__toString()
快速读取对象字符串表示的最佳方法
直接输出对象引用时自动调用,用来获取对象字符串表示的最便捷的方式
__autoload($classname)
自动加载类的方法
注意:其他的魔术方法都是在类中添加起作用,这是唯一一个不在类中添加的方法
只要在页面中使用到一个类,只要用到类名就会自动将类名传给这个参数
Eg: function __autoload($className){
Include “./”.$className.”.class.php”;
}
$o=new One();
__clone()
克隆对象 使用clone处理 原本(原来的对象) 复本(复制出来的对象)
克隆对象时自动调用的方法
只要一个对象一诞生就要有初始化的动作,和构造方法__construct作用相似
__clone()方法中的$this关键字,代表的是复本,$that代表原本对象
对象串行化(序列化):将一个对象转为二进制串(对象存储在内存中)
- 将对象长时间存储在数据库或文件中时使用(二进制可以长期储存)
- 将对象在多个PHP文件中传输时使用
Serialize() 参数是一个对象。返回来的就是串行化后的二进制串
Unserialize() 反序列化 参数就是对象的二进制串,返回来的就是新生成的对象
__sleep()
在序列化时自动调用的方法
作用:可以将一个对象部分串行化 只要这个方法中返回一个数组,数组中有几个成员属性就序列化几个成员属性,如果不加这个方法,则所有成员都被序列化
Function __sleep(){
Return array(“name”,”age”);
}
__wakeup()
在反序列化时自动调用的方法
也是对象重新诞生(需要初始化)的一个过程
Function __wakeup(){
$this->name=”sanzhang”;//$this指新诞生的对象
$this->age=$this->age+1;
}
抽象类和抽象方法、接口的应用
抽象类是一种特殊的类,接口是一种特殊的抽象类(作用和抽象类相同),而多态就要使用到抽象类或接口
抽象类
抽象方法 如果一个类中的方法没有方法体(就是一个方法没有使用{}而直接使用分号结束abstract function test();)的方法就是抽象方法
抽象方法必须使用abstract修饰
抽象类 如果一个类中有一个方法是抽象的则这个类就是抽象类(其他不变,可以在抽象
类中声明成员属性,常量,非抽象的方法)
抽象类必须使用abstract修饰,抽象类不能实例化对象(不能通过抽象类去创建
一个抽象类的对象)
作用:要想使用抽象类必须使用一个类继承抽象类,而要想使用这个子类就子类必须不能再是抽象类,子类可以重写父类的方法给抽象方法加上方法体。就是在定义一些规范,让子类按这些规范去实现自己的功能。目的就是将你自己写的程序加入到原来已经写好的程序中去(别人写好的程序,不可能等你开发完一个小模块,根据你的小模块继续向后开发)
接口
PHP是单继承的,如果使用抽象类,子类实现完抽象类就不能再去继承其他的类,如果既想实现一些规范又想继承一个其他类,就要使用接口
接口和抽象类对比:
- 作用相同,都不能创建对象,都需要子类去实现
- 接口的声明和抽象类不同
Interface 接口名{}
- 接口被实现的方式不一样
- 接口中所有方法必须是抽象方法,只能声明抽象方法(不用使用abstract修饰)
- 接口中的成员属性,只能声明常量,不能声明变量
- 接口中的成员访问权限都必须是public,抽象类中最低的权限protected
- 使用类实现一个接口使用关键字implements,而不是extends。类—接口、抽象类—接口 implements 接口—接口 extends
可以使用抽象类实现接口中的部分方法,如果想让子类可以创建对象,则必须实现接口中的全部抽象方法。可以定义一个接口去继承另一个接口
一个类可以实现多个接口(按多个规范去开发子类),使用逗号分隔多个接口名称
一个类可以在继承一个类的同时实现一个或多个接口(先继承再实现)
使用implements的目的:
1.可以实现多个接口,而extends只能继承一个父类
2.没有使用extends,可以继承一个类,所以两个可以同时使用
多态
多态就是让具有继承关系的不同类对象,可以对相同名称成员函数调用,产生不同的反应效果。多态的功能可以让软件在开发和维护中达到充分的延伸性
PHP内置字符串处理函数
PHP中重要的一种数据类型
字符串处理函数比正则表达式处理字符串的效率要高,所以同时能用字符串处理函数和正则表达式处理时建议使用字符串处理函数
字符串特点:1.其他类型的数据用在字符串处理函数中,会自动将其转为字符串后再处理
2.可以将字符串视为数组,当做字符集合来看待。为与数组的区分,字符串使用大括号(也能使用中括号,只是为了好区分),$str{2}
Php中内置的字符串处理函数:
在php中所有字符串处理函数,都不是在原字符串上修改,而是返回一个新格式化后的字符串
- 常用的字符串输出函数
Echo() 既可以是函数,也可以是系统指令,echo ‘aaa’; echo(‘aaa’);,作为系统指令使用时可以输出多个,echo ‘111’,’222’,’333’,’444’,’<br>’,;,但函数没有这种用法
Print()功能和echo相同,但它有返回值,成功返回真,失败返回假,但执行效率没有echo高,所以一般都是用echo输出
Die() exit()的别名 exit; exit(“aaaaaaaaaaaaa”); die(“aaaaaaaaaaa”); exit(0); exit 1;
Exit后面加数字,表示退出的状态,数字从0到254,0表示成功退出程序,其余为失败,数字没有必要加
Printf()
Sprintf()
上两个函数用法完全一样,用于格式化字符串,字符串按什么格式输出,只是sprintf没有直接输出,而是返回一个字符串。有两个参数,第一个是输出的格式,如果没有要输出的变量,那第一个参数写要输出的字符串就行,可以把变量插入在字符串中,插入几个后面对应有几个参数
格式:%%按百分比输出 %b按二进制输出 %c按字符输出 %d按整数输出 %f按浮点数输出 %o按八进制输出 %x按十六进制输出 %s按字符串输出
Eg:$str=”100.6723abc”; printf(“%s-----------------%s-----”,$str,$str); %.2f保留两位小数
%’#20s 按字符串输出,长度为20,不够的部分用#补充(在左边补充,想要在右边的话将20换为-20)
- 常用的字符串格式化函数
Ltrim()去除左空白 空格在字符串中占一位
Rtrim()去除右空白 两个参数,第一个为字符串,第二个是指定要过滤的字符或字符串,
默认为空白
Trim()去除两边空白
Str_pad()把字符串填充成新的长度 str_pad($str,10);在字符串$str上补10个空字符
Str_pad($str,10,’-=’);用-=补充,补充默认在右边,可以加第四个参数STR_PAD_BOTH在两边补充LEFT左边补充
strtolower()把字符串转为小写
strtoupper()把字符串转为大写
ucfirst()把首字母转为大写
ucword()把字符串每个单词转为大写
和HTML标签相关的字符串格式化函数:
nl2br在字符串的每个新行之前插入HTML的换行符
htmllentities()把字符串转为HTML的实体
htmlspecialchars把一些预定义的字符串转为HTML的实体
stripslashes()删除表单提交的反斜杠
strip_tags()删除HTML、XML、php的一些标签,有两个参数,第一个是指定的字符串,第二个参数可以指定一些标签不被删除,strip_tags($str,’<b><p><h1>’);
number_format(float number[,int decimals[,string dec_point,string thousands_sep]])通过千位分组格式化一些数字,参数:浮点数[,保留几位[,小数点用什么表示,千分位用什么隔开]],$price=1234.345; number_format($price); number_format($price,2); number_format($price,2,’.’,’,’); 1,234 1,234.34
1,234.34
strrev()反转字符串 http://www.xsphp.com moc.phpsx.www//:ptth
md5()把字符串用md5计算
md5_file()对整个文件加密
- 字符串比较函数
按字节顺序比较(ASCII码):
Strcmp($str1,$str2)两个参数,三种返回结果1($str1>$str2)、0($str1==$str2)、-1($str1<$str2)
Strcasecmp()不考虑大小写,两个参数,三种返回结果1、0、-1
按自然数排列的比较:
Strnatcmp()
正则表达式在字符串处理中的应用
字符串处理函数对于一些复杂的字符串没有办法处理,需要使用正则表达式
正则表达式就是描述字符串排列模式的一种自定义语法规则。通过构建具有特定规则的模式,与输入的字符串信息比较,在进行分割、匹配、查找、替换等工作。如果可以使用字符串处理函数完成的任务就不要使用正则表达式
正则表达式特点:
正则表达式也是一个字符串,由具有特殊意义的字符组成的字符串,具有一定的编写规则,所以也是一种模式 例如:”/\<img\s*src=\”.*?\”\/\>/”验证图片
注意:正则表达式只有放在函数中才能发挥作用,否则它就只是一个字符串
Php提供两套正则表达式函数库:POSIX扩展正则表达式函数库(ereg_);Perl兼容正则表达式函数(preg_),两个函数库功能相同,找一个处理字符串效率高的,推荐使用Perl兼容正则表达式函数
一、正则表达式模式编写
语法:1.定界符号 起始和结束符号 // 但定界符不知局限于反斜线,除字母、数字、
正斜线\以外的任何字符都可以作为定界符
2.原子 eg:img \s .
只要一个正则表达式可以单独使用的字符,就是原子
1.所有打印(所有可以在屏幕上输出的字符,键盘上随意敲一个键都是打
印字符)和非打印字符(看不到的,比如回车、空格)
2. . * + ? (<>如果所有有意义的字符,想作为原子使用,统统使用“\”转义
字符转义。转义字符可以将有意义的字符转成没意义的字符,也可以将没意义的字符转成有意义的字符
3.在正则表达式中可以直接使用一些代表范围的原子
\d : 表示任意一个十进制的数字
\D : 表示任意一个除数字之外的字符
\s : 表示任意一个空白字符,空格、\n\r\t\f [\n\r\t\f ]
\S : 表示任意一个非空白 [^\n\r\t\f ]
\w : 表示任意一个字,即a-zA-Z0-9_ [a-zA-Z0-9_]
\W :任意一个非字,除了a-zA-Z0-9_以外的任意一个字符[^a-zA-Z0-9_]
4.自己定义一个原子表[],可以匹配方括号中的任何一个原子
例如:[1-5p-z] [^]表示取反,就是除了原子表中的原子,都可以表示(^必须在[]内的第一个字符处)例如:[^abc]除了abc其他都可以
所有大小写字母、数字、标点符号等
注意:原子是正则表达式最基本组成单位,而且必须至少要包含一个原子
3.元字符
元字符是一种特殊的字符,用来修饰原子,不可以单独使用。加上\可以作原子
* :表示其前面的原子可以出现0次、1次、多次 {0,}
+ : 表示其前面的原子可以出现1次或多次 {1,}
? : 表示其前面的原子可以出现0次或1次 {0,1}
{} :用于自定义前面原子出现的次数 {n}//n表示一个整数,{5}表示前面的原子出现5次,不能多,也不能少;{m,n}//m、n为整数,m小于n,表示前面原子出现次数在m到n范围内(包括m和n);{m,}//表示前面的原子最少出现m次,最多无限
| :表示或的关系,它的优先级别是最低的,最后考虑它的功能,所以/cat|dog/表示cat或dog而不是c或d,/d|g/表示d或g
. :默认情况下,表示除换行符外任意一个字符
^ :直接在一个正则表达式的第一个字符出现,则表达式必须以这个正则表达式开始
$ : 直接在一个正则表达式的最后一个字符出现,则表达式必须以这个正则表达式结尾
() :重点。1.作为大原子使用 /(abc)+/ 2.改变优先级,加上括号可以提高优先级别 /ca(t|d)og/ 3.作为子模式使用,正则表达式不光对一个字符串匹配一次,全部匹配作为一个大模式,放到数组的第一个元素中,每个()是一个子模式按顺序放到数组的其他元素中,eg:
$pattern=”/(\d{4}\W\d{2}\W\d{2})\s+(\d{2}\W\d{2}\W\d{2})\s+(am|pm)/”;
$string=”today is 2014-11-16 16:27:17 pm…”;
Preg_match($pattern,$string,$arr);
$arr: Array([0]=>2014-11-16 16:27:17 pm [1]=>2014-11-16 [2]=>16:27:17 [3]=>pm);4.可以取消子模式,就将()作为大原子或改变优先级使用,在括号中最前面使用“?:”就可以取消这个()表示的子模式eg:(?:am|pm)
5.反向引用,可以在模式中直接将子模式取出来,再作为正则表达式的一部分,如果是在正则表达式像替换函数preg_replace函数中,可以将子模式取出,在被替换的字符串中使用。\1取第一个子模式、\2取第二个子模式、……(注意是单引号还是双引号引起来的正则表达式,因为双引号可以解释任意转义字符,而单引号只能解释转义本身的单引号使用的转义字符)”\\1” ‘\1’
$pattern=”/\d{4}(\W)\d{2}\\1\d{2}\s+\d{2}(\W)\d{2}\\2\d{2}\s+(?:am|pm)/”;
$string=”today is 2014-11-16 16:27:17 pm…”;
Preg_match($pattern,$string,$arr);
$arr: Array([0]=>2014-11-16 16:27:17 pm [1]=> - [2]=>:)
\b :表示一个边界。/\bis\b/ this is island 匹配中间有两个边界的is
\B :表示一个非边界。/\Bis\b/ this is island 匹配this的is
元字符优先级:转义字符\
() (?:) []
* + ? {}
^ $ \b \B
|
4.模式修正符号 在定界符外使用 i u
模式修正符,就是几个字母,对整个正则表达式调优使用,也可以说是对正则表达式功能的扩展,每一个具有一定意义,可以一次使用一个,也可以连续使用多个
i:表示在和模式进行匹配时不区分大小写
m : 视为多行 默认情况,将字符串视为一行,加上m可视为多行,^ $ 视为多行后,任何一行都可以以正则开始或结束
s: 视为单行 如果没有使用这个修正符,元字符中的“.”默认不能表示换行符,将字符串视为单行,加上s,’.’可以表示任意一个字符,包括换行符
x: 表示模式中的空白忽略不计
e: 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用
A: 表示必须以什么开头,/abc/A,必须以abc开头
Z: 必须以什么结尾
?正则表达式特点就是比较“贪婪”(参考例子,xsphp 24.php),.* .+ 所有字符都符合这个条件,有两种解决办法,一种是使用模式修正符U,另一种是使用?,.*? .+?。如果两种方式同时出现,相当于开启了贪婪模式
/原子和元字符/模式修正符号
常用正则表达式:
用户名不能为空:/^\S+$/
URL:/(https?|ftps?):\/\/(www|mail|news)\.([^\.\/]+)\.(com|org|net|cn)/i
二、正则表达式处理函数
和字符串处理函数对比介绍
1.字符串匹配与查找
Perg_match(string pattern,string subject[,array matches[,int flags]]) 正则表达式匹配,在
subject中搜索与pattern给出的正则表达式匹配的内容放在matches中,flags
为匹配次数
Perg_match_all()匹配所有,flags默认为全模式PREG_PATTERN_ORDER PREG_SET_ORDER
字符串处理函数:如果只想查找字符串中包含某个字符串,建议使用strstr()或strpos()
如果只是简单的从一个字符串中取出一个子字符串建议使用substr()
Strstr()两个参数,eg:strstr(“this is a test”,”test”);,如果找到搜
索的字符串则从匹配点返回字符串的其余部分,否则返回假。该函数对大小
写敏感,如果想使用对大小写不敏感的函数,建议使用stristr()
数据库相关函数:
- mysql_num_rows() 获取select语句查询得到数据集的行数
- mysql_query() 对select、show、explain、describe语句返回一个资源标识符,如果查询不正确则返回false
- mysql_result($result,int $row[,”name”]) 返回结果集中一个列的值
- mysql_fetch_row() 从结果集中取得一行数据作为数字数组,循环调用该函数则返回结果集中的下一行,没有更多则返回false退出
- mysql_fetch_assoc() 根据结果集中的行生成关联数组,并返回该数组
- mysql_fetch_array($result[,int $result_type]) 从结果集取得一行作为关联数组、数字数组或两者兼有 第二个参数值:MYSQL_ASSOC 关联数组 MYSQL_NUM 数字数组 MYSQL_BOTH 默认,同时产生关联和数字数组
- mysql_num_fields(resource $result)返回结果集中字段的数目
- mysql_field_name(resource $result,int $field_index)取得结果中指定字段的字段名,field_index是该字段的数字偏移量
68_MySQL数据库管理系统概述
了解Mysql数据库管理系统,内容如下:
- 基于数据库的php项目
目前动态网站都是基于数据库的,将网站内容使用数据库管理系统去管理
用户、栏目、图片、文章、评论都存在数据库中
Xscms(库名)
Users(用户表)
Clumn(栏目表)
Pic(图片表)
Articles(文章表)
Commtents(评论表)…..
- 为什么要选择使用mysql(概述)
Oracle DB2 SQL Sever……
Php+MySQL 黄金搭档(都是开元免费的软件)
- Mysql的框架
c/s Client / Server
Mysql DBMS
客户端 服务器---数据库---数据表---(记录、字段)
- Php程序员主要学习那些数据库的操作
一、为你的项目设计表
二、使用sql语句(SQL编程)(增、删、改、查)
三、其余都可以使用工具完成
- MySQL的安装和启动过程
细说php配套视频
- Mysql的目录结构
My.ini(配置文件) bin/ (存在MySQL的所有命令) data/(MySQL的库)
- 了解数据库的sql语句操作
SQL(Structured Query Language)(结构化查询语言)
DDL:定义和管理数据对象,创建库,创建表
Create database 库名 create database if not exists xsphpdb;
Create table [库名.]表名 use 库名
Drop database 库名drop database if exists xsphpdb;
Drop table 表名
DML:用于对数据的操作,插入,删除,更新等
插入值时,所有的数据都按字符串处理
Insert into users(id,name) values(‘1’,’zhangsan’);
Update users set name=’lili’ ,age=’10’ where id=’1’;
Delete from 表名 where id=’1’;
DQL:用于查询数据
Select * from 表名
Desc 表名 (查看表中内容)
Use 库名(选择某个库为默认库)
DCL:数据控制语句
- 执行SQL语句,连接到数据库服务器
远程连接c:\>mysql –h 192.168.16.4\网址 –u root –p 123456
- 创建数据库nihao
- 选择一个库作为默认的数据库
帮助的使用:
? contents (查看帮助的内容)帮助提供的内容
? + 提供的功能,可以具体查看所有的功能
? int 查看int的功能,语法
? show 查看show命令
? + 关键字 查看其功能
\s查看状态
Show variables;查看配置文件中所有的变量,查看某一个,show variables like ‘time_zone’;查看时区
Show databases;
Desc users;查看表结构
创建数据表
一、什么是数据表
二、创建数据表的SQL语句模型
DDL
CREATE TABLE [IF NOT EXITS ]表名称(
字段名1 列类型 [属性] [索引]
字段名2 列类型 [属性] [索引]
…….
字段名n 列类型 [属性] [索引]
)[表类型] [表字符集];
表名称和字段名 需要我们自己定义名称
Users
Articles
SQL是不区分大小写的,但是表就是一个文件名,windows不区分大小写,Linux区分大小写
1、 一定要有意义(英文或英文组合和多个单词的缩写)
2、 自己定义的名称最好都小写
3、 SQL语句都大写
三、数据值和列类型
细分都是按空间大小来区分的
可以存下就可以
1、 数值型
整型(整数)
非常小的整型 1字节 -128--127 0—255(无符号) TINYINT
较小的整型 2字节 -32768—32767 0—65535 SMALLINT
中等大小的整型 3字节 0—16777215 MEDIUMINT
标准的整型 4字节 -2147483648—2147483647 INT
大整数型 8字节 BIGINT
浮点型(小数)
Float(M,D)一共可以占M位,保留D位小数 4字节
Double(M,D) 8字节
定点数
Decimal(M,D) M+2字节
注意:浮点数是近似值,不能用等号来比较
2、 字符型
“mysql” ‘mysql’\
Char(m) 255 固定长度
Varchar(m) 255 可变长度
Char(4) varchar(4)
‘’ 4 ‘’ 1字节
‘ab’ 4 ‘ab’ 3字节
‘abcd’4 ‘abcd’5字节
‘abcdefg’4 ‘abcdefg’5字节
Text 文本数据(文章)2 16- 1
MEDIUMTEXT
LONGTEXT
Blob 二进制数据(相片)
MEDIUMBLOB
LONGBLOB
ENUM 枚举 1或2字节
ENUM(“one”,“two”,“three”,“four”)--- 65535,一次只能有一个值
SET 集合 1,2,3,4,8字节 --- 64 一次可以用多个集合中的值,中间使用“,”分开
3、 日期型
DATE YYYY-MM-DD
TIME hh:mm:ss
DATETIME YYYY-MM-DD hh:mm:ss
TIMESTAMP YYYYMMDDhhmmss
YEAR YYYY
创建表时最好不要使用这些中的时间格式(php中时间 1970-1-1 0:0:0)是一整数
用整数保存时间 time();
四、数据字段属性
1、unsigned可以让空间增加一倍 -128—127 255
只能用在数值型字段
2、zerofill
只能用在数值型字段,前导0
该字段自动应用UNSIGNED
3、AUTO_INCREMENT
只能是整数,数据每增加一条就会自动增1,字段的值是不允许重复
Null 0 留空
每个表都最好有一个ID字段,设置为自动增涨,auto_increment
4、 NULL和NOT NULL
默认是空
建议:在创建表时每个字段都不要插入NULL
5、 default
五、创建索引
1、 主键索引
主要作用是确定数据库表里一条特定数据记录的位置
最好为每一张数据表定义一个主键
一个表只能指定一个主键
2、 唯一索引
都可以防止创建重复的值
每个表都可以有多个唯一索引
Unique
3、 常规索引
提升数据库的性能
可以提高查找的速度,减慢数据列上插入,删除,修改
和表一样是独立的数据对象
可以单独使用,也可以在创建表时创建
Index key是同义词
4、 全文索引
Fulltext类型索引,MyISAM表类型使用,只有在varchar char text文本字符串上使用,也可以多个数据列使用
Create table books(
Id int,
Bookname,varchar(30),
Price double,
Defail text not null,
Fulltext(detail,bookname),
Index ind(price),
Primary key(id)
);
select bookname, price from books where MATCH(detail) AGAINST(‘php’);
select match(detail) against(‘php’) from books;
六、数据表类型及存储位置
Mysql和大多数数据库不同,mysql有一个存储引擎概念。
Mysql可以针对不同的存储引擎需求可以选择最优的存储引擎。
引擎 数据表类型
查看MySQL默认使用的搜索引擎 show engines或show variables like ‘table_type’;
只学12种中的MyISAM 和 InnoDB;
一个数据库中可以存在多种数据表类型
create table t1(id int) type InnoDB; 有三个文件.frm(表结构).MYD(表数据) .MYI(索引)
create table t1(id int) engine InnoDB; 一个文件.frm
MyISAM 表类型是默认的
选择MyISAM还是选择InnoDB
注意: 在一个Mysql库中可以(创建表时)指定不同表类型
MyISAM 表类型
OPTIMIZE TABLE 表名
强调快速读取操作
也有缺点: 有一些功能不支持
InnoDB 表类型
支持一些MyISAM所不支持的功能
也有缺点:占用空间大,不支持全文索引,读取慢
功能 MyISAM InnoDB
事务处理 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
表空间占用 相对小 相对大 最大2倍
全文索引 支持 不支持
七、Mysql默认字符集
Show character set 查看MySQL支持的字符集
Desc information_schema.character_sets;字符集以及该字符集的校对规则
Show collation like ‘gbk’查看校对规则
ACSII
ISO-8859-1/latin1 西欧 常被用来转码
UTF-8 1—4字节 强烈推荐使用
GBK 2字节 name varchar(12)6个汉字 UTF8 3字节 name varchar(12)4个汉字 95年发布
GB180030 2000年发布 与gbk兼容 数据库支持不多
Mysql服务器,数据库,数据表,字段
*****数据库中的UTF-8 写为 UTF8
Mysql的字符集包括
字符集:是用来定义Mysql存储字符串的方式 36
校对规则:是对规则定义了比较字符串的方式 70
一对多的关系:1个字符集可以对应多个校对规则
Gbk_chinese_ci ci比较时不区分大小写
cs区分大小写
Gbk_bin bin二进制比较
客户端与服务器交互时
Character_set_client 客户端字符集
Character_set_connection 链接字符集
Character_set_results 结果字符集
set names 字符集 同时修改以上三个的值
create database xsdemo default character set_gbk collate gbk_chinese_ci;
create table t1(id int) type=InnoDB default character set gbk collate gbk_chinese_ci;
alter table t1 character set utf8;
备份数据库:
C:\document and settings\administrator>mysqldump –u root –p –default-character-set=gbk –d xsdemo1>c:/appserv/www/xsphp/createtab.sql
导入数据库:
C:\document and settings\administrator>mysql –u –p xsdemo (aa.sql)
八、修改表
Alter table t1 modify sex char(3);
Alter table t1 add sex varchar(10) not null after name;
Alter table t1 change name username varchar(30);
Change可以更改列类型和列名
Modify 只能更改列类型
Alter table t1 rename as users; 重新命名表名
Alter table users drop age;
Sql种类
DDL DML DQL DCL
对于程序员来说
创建表(为项目设计表)
增、删、改、查
插入表格insert
Insert into 表名(【字段列表】) values(值列表1),(值列表2),(值列表3)
特点:
- 如果在表名后没有给出字段列表,则值列表必须列出所有字段的值,必须按表中默认的顺序插入
- 所有需要写字段名的地方都不加单引号或双引号,但所有值建议都要以字符串(使用双引号或单引号)形式使用
- 建议在插入数据时,最好给出字段列表,则值要和字段列表对象对应即可,可以不按表中字段的顺序
Update 表名 set 字段=‘值’ 【,字段2=值2 【,/。。。。。】 】 【条件】 条件是确定要更改的记录,可以通过条件指定一条,也可指定多条
Delete from 表名【条件】
Where
Select
都可以使用各种运算符号(可以把字段当做一个变量)
只要你想更新、删除、查找,只要写对条件就能准确找到要管理的一条或多条语句
SELECT [ALL | DISTINCT]
{*|table.*| [table.]field1[as alias1][,table.]field2[as alias2][……..]}
FROM 表名【】
[WHERE……..]
[GROUP BY……]
[HAVING……..]
[ORDER BY……]
[LIMIT count]
使用SELECT查询语句,目的就可以按你的想法将数据查出来,将结果返回给你
1、 字段 要列出要查询的字段
2、 可以为每个字段起个别名 后面会用到(关键字,多表查询) 表也可以起别名(多表查询、关键字冲突) a as b或a b
3、 使用distinct作用整个查询列表,取消重复的数据,只返回一个,而不是单独的一列
4、 在SQL语句中使用表达式的列(算术运行符号,可以使用条件,逻辑运算符号) 1+1 4-1
5、 WHERE 可以在SELECT UPDATE DELETE
逻辑运算符号(多个条件组合)
&& || !
AND OR NOT
比较运算符
= 和程序中的 == 不一样
<=> 和 = 作用相同,但可以用于NULL比较
!= <>
< <= > >=
IS NULL
IS NOT NULL
BETWEEN AND
NOT BETWEEN AND
LIKE (任意一个字符)和%(0个或多个任意字符) 两个通配符号
NOT LIKE
IN
REGEXP RLIKE
正则查询:selct * from productswhere name regexp ‘s$’;查询名字中以s结尾的
6、 多表查询(连接查询)
7、 嵌套查询 子查询
8、 Order by 字段【asc正序】从低到高 desc倒序
Select * from user order by id;
Select * from user order by id desc;
Select * from user where id>5 order by id asc;
9、 Limit count
Select * from user limit 5;
Select * from user where id<10 order by id desc limit 5;
Select * from user where id<14 order by id desc limit 0,1;从0开始取,取一个。可用来取下一条记录
Group by 字段
count()
sum()
max()
min()
Mysql中的内置系统函数
用在SELECT语句,以及子句 where order by having 中 UPDATE DELETE
函数中可以将字段名作为变量来用,变量的值就是这个列对应的每一行记录
一、字符串函数
PHP中有的函数,mysql中大部分也提供
1、 CONCAT(s1,s2,……,sn):把传入的参数连接成一个字符串
select concat(name,” age is ”,age);
2、 INSERT(str,x,y,insert):将字符串x位置开始,y个字符串长度替换为字符串insert select insert(“abcdef”,2,3,’hello’);
3、 LOWER(str) UPPER(str):将字符串转为小写或大写
4、 LEFT(str,x) RIGHT(str,x):分别返回最左边的x字符,和最右边的x个字符,若第二个参数为NULL,则什么也不返回
5、 LPAD(str,n,pad), RPAD(str,n,pad):用字符串pad对str最左边和最右边进行填充,直到长度为n个字符长度
6、 TRIM(str), LTRIM(str) Rtrim(str):去掉字符串两边,左边和右边字符串的空格
7、 replace(str,a,b):用字符串b替换字符串str中的所有出现的字符串a
8、 strcmp(s1,s2):如果s1比s2小,则返回-1,大,返回1,相等,返回0
9、 substring(str,x,y):返回字符串中的第x位置起y个字符串长度的字符
二、数值函数
ABS(X):返回x的绝对值
ceil(x):返回大于x的最小整数
floor(x):返回小于x的最大整数
mod(x,y):返回x/y的模
rand() 0到1之间的随机 ceil(rand()*100)
round(x,y):返回参数x的四舍五入的有y位小数的值
truncate(x,y):返回数字x截断为y位小数的结果
三、日期函数
用PHP的时间戳来完成
curdate()返回当前日期 2014-12-21
curtime()返回当前时间 10:43:45
now()返回当前日期、时间
unix_timestamp(date()/now())返回时间戳
from_unixtime()
week()
year()
hour(curtime()/new())
minute()
monthname(now())
date_format(now(), “%Y-%m-%d %H:%i:%s”)
……….
四、流程控制函数(实现条件选择)
If(value ,t f) select id,salary,if(salary>3000,’hight’,’low’) from
Ifnull(value1,value2)
case when [value1] then[result1]…..else[default] end
selet case when salary<=3000 then ‘low’ else ‘high’ end from
五、其他函数
database()当前数据库名
version()当前数据库版本
user()当前用户
inet_aton(ip)数据表示IP地址 IP地址的网络字节顺序
inet_ntoa()返回数字(网络字节地址
password()将字符串加密 41位 设置系统用户密码
select * from mysql.user \G;
md5()对应用程序用户加密
php处理数据库
连接数据库 mysql_connect(); 主机 用户名 密码 返回连接的资源 mysql_pconnect持久连接,不能使用mysql_close关闭,建议使用
选择数据库 mysql_select_db(); 数据库名 资源(可选)
解决错误:if(!$result){
Echo “ERROR”.mysql.error().”:”.mysql_error();
Exit;
}
‘{$_GET[“name”]}’ ‘共{$total}条记录’
最后的ID mysql_insert_id()
影响的行数 mysql_affected_rows()
处理结果集
一、从结果集中将记录取出
Mysql_fetch_row()//返回索引数组
Mysql_fetch_assoc()//返回关联数组(下标,就是列表)
以上两个使用哪个都行,没有效率之分
Mysql_fetch_array()//返回索引和关联两个数组 不建议使用
Mysql_fetch_object()//将一条记录以对象的形式返回 不常用
参数都是结果集,用法一样,一次从结果集取出一条记录,将指针移到下一条记录(默认是第一条记录,使用Mysql_data_seek($result,row)可以改),再取就是下一条记录,如果到结尾则返回false
Mysql_data_seek($result,3)移动内部结果的指针
二、获取字段信息
共有列数、行数:mysql_num_fields($result) 列数mysql_num_rows($result)行数
字段名mysql_field_name() mysql_field_type()
释放结果集mysql_free_result()
使用mysqli扩展库操作mysql数据库(78)
从php4.1开始可以使用mysqli,是一种面向对象的技术(新加功能都会以对象形式添加),但也支持过程化的使用方式
i表示改进,功能增加,效率提高,更稳定,以后php项目改用mysqli
mysqli扩展中提供三个类:
- mysqli和连接有关的类
- mysqli_result表达了对数据库的查询所返回的结果集
以上两个类就可以完成mysql扩展功能
- mysqli_stmt
选择过程化编程还是面向对象技术:
就算是使用mysqli中过程化的编程方式也比使用mysql编程方式功能强、效率高、更稳定,但尽量不使用过程化方式,使用mysqli扩展就要使用面向对象的编程方式进行开发
面向对象方式:
- mysqli 和连接有关的类
连接数据库:
1.Mysqli_connect() 主机 用户名 密码 数据库名 端口
$mysqli=new mysqli(“localhost”,”root”,”123456”,”xsphpdb”);
If(mysqli_connect_errno()){
Echo “连接数据库失败:”.mysqli_connect_error();
$mysqli=null;
Exit;
} 建议使用这种连接方式
$mysqli->select_db(“xsphpdb”);
2.Mysqli_init()
$mysqli=mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT,5);//设置选项 选项名 选项值 设置连接的秒数
$mysqli->read_connect(“localhost”,”root”,”123456”,”xsphpdb”);
Eg:$mysqli=new mysqli(“localhost”,”root”,”123456”,”xsphpdb”);
If(mysqli_connect_errno()){
Echo “连接数据库失败:”.mysqli_connect_error();
$mysqli=null;
Exit;
}
Echo $mysqli->character_set_name().”<br>”;
Echo $mysqli->get_client_info().”<br>”;
Echo $mysqli->host_info.”<br>”;
Echo $mysqli->server_info.”<br>”;
Echo $mysqli->server_version.”<br>”;
$mysqli->close();
执行SQL语句(select语句、非select语句影响行数)
$mysqli->query($sql);
获取错误号、错误信息
Echo “ERROR”.$mysqli->errno.”|”.$mysqli->error;
影响行数
Echo $mysqli->affected_rows;
最后自动增长的ID/最后插入的ID
$mysqli->insert_id;
使用mysqli处理结果集(79)
结果集类mysqli_result
- 使用select语句后,得到的结果集的处理
一、处理记录
属性:num_rows
方法:data_seek()
$result->fetch_row() 索引数组
$result->fetch_assoc() 关联数组
$result->fetch_array() 两个数组都返回(MYSQLI_ASSOC,MYSQLI_NUM,MYSQLI_BOTH默认)
$result->fetch_object()
每次执行一次就会从结果集中取出当前记录(默认是第一行,可以使用data_seek(5)从第五行开始取),指针指向下一行,下次再取时就会取出下一行,当结果集中没有记录时,则返回false
二、处理字段信息
Field_count列数
Current_field当前列
Lengths所有列长度
$field=$result->fetch_field(); $field->name/orgname/max_length/;
$result->data_seek(40);//移动记录指针
$result->field_seek(2);//移动字段指针
$fields=$result->fetch_fields()取出所有列,作为数组
$result->current_field当前列列号
Eg:$mysqli->new mysqli(“localhost”,”root”,”123456”,”xsphpdb”);
If(mysqli_connect_errno()){
Echo mysqli_connect_error();
Exit;
}
$sql=”select * from shops”;//”desc shops”
$result=$mysqli->query($sql);
Var_dump($result);
$rows=$result->num_rows;
$cols=$result->field_count;//获取列的个数
Echo “表中{$rows}行,{$cols}列<br>”;
While($row=$result->fetch_assoc()){
Print_r($row);
Echo “<br>”;
}
$result->close();
$result->free();
$result->free_result();
$mysqli->close();
使用mysqli扩展完成事务处理和一次执行多条SQL语句(80)
一、使用mysqli执行多条语句
执行多条SQL语句,没有结果集
$sqls=”insert into shops(name,price,num,desc) values(‘xsphp’,’12’,’279’,’verygood’);update shops set name=’LAMP’ where id>40;delete from shops where id<30”;
$mysqli->multi_query($sqls)
执行多条SQL语句,有结果集
$sqls=”select current_user();desc shops;select * from shops;select current_date()”;
$mysqli->multi_query($sqls)
$result=$mysqli->store_result();获取第一个SQL语句结果集
$mysqli->next_result();获取下一个结果集
$mysqli->more_results();是否还有结果集
二、使用mysqli完成事务处理
事务处理,多个SQL要完成的任务看成是一个事务,有任何一个环节出错,都将整个事务撤销,如果都成功才提交。目前只有InnoDB和BDB才支持事务
把多条语句看成一个事务的时候才使用事务处理
Create table …type=InnoDB;
默认表都是自动提交的,插入数据不能回滚
- 关闭自动提交 set autocommit=0;
- 开启事务start transaction;
- 回滚 rollback;
- 手动提交 commit;
Eg:
$mysqli=new mysqli(“localhost”,”root”,”123456”,”xsphpdb”);
$mysqli->autocommit(0);关闭自动提交
$error=true;
$price=50;
$sql=”update zh set ye=ye-{$price} where name=’zhangsan’”;
$result=$mysqli->query($sql);
If(!$result){
$error=false;
Echo “从张三转出失败<br>”;
}else{
If($mysqli->affected_rows==0){
$error=false;
Echo “张三的钱没有变化<br>”;
}else{
Echo “从张三账号中转出成功<br>”;
}
}
$sql=”update zh set ye=ye+{$price} where name=’lisi’”;
$result=$mysqli->query($sql);
If(!$result){
$error=false;
Echo “从李四转入失败<br>”;
}else{
If($mysqli->affected_rows==0){
$error=false;
Echo “李四的钱没有变化<br>”;
}else{
Echo “向李四账号中转入成功<br>”;
}
}
If($error){
Echo “转账成功”;
$mysqli->commit();
}else{
Echo “转账失败”;
$mysqli->rollback();
}
$mysqli->autocommit(1);
$mysqli->close();
三、其他的mysqli类中成员的使用
$mysqli->query(“set names gbk”);
$mysqli->set_charset(“utf8”);
使用php中的mysqli扩展中预处理语句(81)
预处理类mysqli_stmt(推荐使用) 语句一样,值不相同时使用
优点(与mysqli和mysqli_result相比):
- mysqli和mysqli_result能完成的功能都可以使用mysqli_stmt完成
- 效率高,如果执行多次相同的语句,只有语句的数据不同,因为将一条语句在服务器端准备好,然后将不同的值传给服务器,再让这条语句执行。编译一次,执行多次
- 安全上,防止SQL注入(?占位符),后期传的值不会当成SQL语句
Select * from article where title like %select * from mysql.user%;
最后ID $stmt->inser_id
影响行数$stmt->affected_rows.”行<br>”;
Eg:
$mysqli=new mysqli(“localhost”,”root”,”123456”,”xsphpdb”);
//$stmt=$mysqli->stmt_init();//返回类mysqli_stmt的对象
准备一条语句放到服务器中,插入语句
$sql=”insert into shops(name,price,num,desn) values(?,?,?,?)”;
$sql=”update shops set name=?,price=?,num=?,desn=? Where id=?”;
//$stmt->prepare($sql);//为执行准备一个SQL语句
$stmt=$mysqli->prepare($sql);//mysqli中预处理方法,直接生成预处理对象
给占位符号每个?传值(绑定参数)
$stmt->bind_param(“sdis”,$name,$price,$num,$desn);// bind_param(类型,变量,变量,变量)参数类型 I整型 d double型s字符串 b二进制大数据
$name=”zhangsan”;
$price=”57748”;
$num=45;
$desn=”good”;
执行
$stmt->execute();
$name=”lisan”;
$price=”57748”;
$num=45;
$desn=”select *from”;//SQL语句在这里当做数据传送,并不作为语句执行
执行
$stmt->execute();
$stmt->close();
Eg:
$mysqli=new mysqli(“localhost”,”root”,”123456”,”xsphpdb”);
$sql=”select id,name,price,num,desn from shops where id>?”;
$stmt=$mysqli->prepare($sql);
$stmt->bind_param(“i”,$id);
$stmt->bind_result($id,$name,$price,$num,$desn);//绑定结果集
$id=99;
$stmt->execute();//返回布尔型真假,而不是结果集
$stmt->store_result();//一次性将结果都取出来
//字段信息
$result=$stmt->result_metadata();//返回结果集对象,但可以使用的方法很少都与字段有关,所以不能通过它来获取记录信息
While($field=$result->fetch_field()){
Echo $field->name.”--”;
}
Echo “<br>”;
$stmt->data_seek(2);//移动指针 受store_result()影响
While($stmt->fetch()){//返回布尔型真假
Echo “$id--$name--$price--$num--$desn<br>”;
}
Echo “记录总数:”.$stmt->num_rows; 受store_result()影响
$stmt->free_result();
$stmt->close();
Php中使用MySQL的视图
视图:视图是存放数据的一个接口,也可以说是虚拟表,这些数据可以使从一个或几个基表(视图)的数据,也可以是用户自己定义的数据,其实视图里不存放数据,数据还是存在基表里,基表数据发生变化,视图里数据变化,基表也会变化
视图作用:视图可以让查询变得很清楚(让复杂的SQL语句变得很简单);
保护数据库重要数据,给不同的人看不同的数据
创建视图:
Create [or replace][algorithm={merge|temptable|undefined}]
View view_name[column_list]
As select_statement
[with[cascaded|local] check option]
视图名不能与表名重复
视图类型:merge 组合 会将引用视图的语句的文本与视图的定义结合起来,使视图定义的某一部分取代语句的对应部分
Temptable 临时表
Undefined
With local check option 只要满足本视图的条件就可以更新
With cascaded check option 必须满足所有针对视图的条件才可以更新
Create view studeng_view as select name,age,sex,email from student;
更改视图alter view stuv…
删除视图 drop view stuv,stu4,…
查看视图 show tables show tables status like ‘’ \s show create view stu2 \G
Create view user_view(username,password) as select name,pass from users;
PDO(83、84)
Php data object
基于驱动(对外的接口一样) php_pdo_mysql.dll mysql驱动
Pdo在Linux下安装:--with-pdo-mysql=/user/local/mysql
Pdo提供了三个类:PDO类 和数据库连接有关的类(连接,执行SQL语句)
PDOSatement类 准备语句,处理结果集
PDOException类 异常类
很多常量,很多更能靠常量实现
创建PDO对象:
PDO__consruct(string dsn[,stringusername[,string password][,array driver_options]])
$pdo=new PDO($dsn,”root”,”123456”);
Dsn data source name 数据源 主机位置 库名 连接哪种数据库的驱动
$pdo=new PDO(“oci:dbname=//localhost:1521/xsphpdb”,”root”,”123456”);
$pdo=new PDO(“mysql:host=localhost;dbname=xspgpdb;port=3306”,”root”,”123456”);
$pdo=new PDO(“mysql:host=localhost;dbname=xspgpdb”,”root”,”123456”);
$pdo=new PDO(“uri:dsn”,”root”,”123456”);//dsn为文件名 远程连接文件
也可以把dsn写到php配置文件中,只需写入下面的代码:
[PDO]
Pdo.dsn.mysqlpdo=mysql:host=localhost;dbname=xsphpdb
$pdo=new PDO(“mysqlpdo”,”root”,”123456”);
第四个参数[,array driver_options],对pdo对象调优用的或底层驱动的设置
PDO执行SQL语句的三种方法:1.exec() 用来执行有影响行数的 update delete insert other 返回影响的行数
2.query() 执行有结果集的SQL语句 返回预处理的对象
3.prepare()
设置错误报告模式:pdo中提供三种错误处理模式 ERRMODE_SILENT/0 ERRMODE_WARNING/1 ERRMODE_EXCEPTION/2
常用模式:
<?php
try{
$pdo=new PDO("mysql:host=localhost;dbname=kaoshi","root","wen");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$pdo->setAttribute(PDO::ATTR_ERRMODE, 2);
}catch(PDOException $e){
echo "数据库连接失败:".$e->getMessage();
exit;
}
try{
$affected_rows=$pdo->exec("insert into veling_drive_adminuser(name,password) values('zhangsan','abc')");
echo "最后插入的自动增长的ID: ".$pdo->lastInsertId();
}catch(PDOException $e){
echo $e->getMessage();
}
事务处理:InnoDB
set autocommit=0;
start transaction;
使用PDO进行SQL语句预处理和操作结果集(85)
PDOStatement类
准备一个语句 和在PDO中对象的exec()以及query()相比执行效率高、安全性高
处理结果集
PDO中有两种占位符号:?参数 索引数组,按索引顺序使用
$stmt=$pdo->prepare(“insert into zhanghao(name,price) values(?,?)”);
名字参数 关联数组,按名字使用,和顺序无关
$stmt=$pdo->prepare(“insert into zhanghao(name,price) values(:name,:price)”);
$stmt=$pdo->prepare(“update zhanghao set name=:name,price=:price”);
绑定参数
$stmt->bindParam(1,$name,PDO::PARAM_STR);//类型 PDO::PARAM_BOOL PDO::PARAM_NULL
PDO::PARAM_LOB PDO::PARAM_INPUT_OUTPUT
$stmt->bindParam(:price,$price,PDO::PARAM_INT);
提供不提供可选类型,都会自动转类型,所以类型不必要写
最后插入的ID:$pdo->lastInsertId()
简单的方式:
try{
$pdo=new PDO("mysql:host=localhost;dbname=kaoshi","root","wen");
}catch(PDOException $e){
echo $e->getMessage();
}
$stmt=$pdo->prepare("insert into zhanghao(name,price) values(:name,:price)");
//$stmt->execute($_POST);
$stmt->execute(array(":name"=>"wetrn",":price"=>"89079"));
$stmt->execute(array(":name"=>"weytn",":price"=>"85479"));
$stmt->execute(array(":name"=>"wehn",":price"=>"89789"));
获取结果:fetch()默认返回关联和索引两种数组,传递常量PDO::FETCH_ASSOC返回关联数组,PDO::FETCH_NUM返回索引数组 fetchAll()
Memcached的安装及管理
Memcached内存对象的缓存系统
一、Memcache概述
Memcache ( 内存 缓存):是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个巨大的hash表 hash表是由键-值对(key=value)
Memcache 就是一个软件(服务软件) c/s软件 用来维护内容,是将数据在内存中使用,减少I/O 开源
服务器端软件,也需要监听IP地址(129.121.11.111),也有默认端口(11211)
二、Memcache工作原理
Memcache 软件;Memcached 进程,是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作
客户端使用各种语言编写,比如:php、java、c、c++等
三、Memcache安装
基于libevent事件
Windows下的安装
在appserv下新建文件夹mem,在cmd中进入mem目录,键入dir回车,键入memcached.exe –d install回车,把memcache安装到系统服务中,键入memcached.exe –d uninstall回车可以卸载,键入memcached.exe –d start回车(memcached.exe –d –m 50 –l 127.0.0.1 –p 11211 start,-m指定内存大小,默认64M,-l指定监听IP地址,默认为127.0.0.1,-p指定端口号,端口范围1024-65535),启动。默认IP为本机IP地址,端口为11211
启动后,在任务管理器中就有一个memcached.exe进程,监听IP为本机IP,监听端口为11211
会话控制:
会话控制
网页跟踪用户需要使用会话控制完成
HTTP协议是一种无状态协议
- 变量只能在一个页面中使用
- Get和post方法两个页面之间传递(不适合大量数据)
- 将变量存在文件或数据库中(所有人共用变量)
File_put_contents(“var.txt”,$var);//一个PHP文件
Echo file_get_contents(“var.txt”);//另一个PHP文件
- 跟踪用户 cookie session
Cookie技术
服务器给客户端(浏览器)的礼物 就是借助客户端电脑的一个文件来保存这个用户信息,再访问同一个网站的各个页面都会带这些信息过去,服务器 在每个页面只要通过这些信息就能区分用户
Cookie是通过头信息发送的,服务器向客户端发送数据时先是状态再是头信息再是内容,所以在设置cookie之前不要有任何输出包括空格
Setcookie(变量名,变量值,保存时间,[服务器端指定路径可以使用cookie]…)
Session技术
在服务器端保存用户信息
每一个用户有一个Sessionid可以唯一确认用户信息,sessionid保存在客户端,有两种方式,一种基于cookie,另一种基于URL
会话控制高级用法(session)
PHP中常用配置文件选项:
Session.name
Session.use_trans_sid 是否启用SID的支持,默认值为0,禁用
Session.save_path
Session.use_cookies
Session.cookie_path
Session.cookie_domain
Session.cookie_lifetime
Session.save_handler
Session.gc_maxlifetime gc,garbage collection的缩写,垃圾回收,指定过多少秒之后数据就会被视为垃圾并被清除,但并不会自动清除文件
下面两个合起来就是启动垃圾进程管理概率的,初始化时(session_start())启动,即用Session.gc.probability/ Session.gc_divisor(例如:1/100,即是百分之一的概率启动gc)
Session.gc.probability
Session.gc_divisor
Ajax介绍和引擎对象的创建
Ajax Asynchronous 异步传输 JavaScript and XML
一、Ajax的介绍和优点
Ajax采用异步交互过程
使用Ajax的地方:
局部刷新
按需取数据
二、创建Ajax对象
Var request=new XMLHttpRequest();
创建对象过程比较复杂,但这些代码是固定的
将创建XMLHttpRequest对象的过程写到一个函数中
主要把浏览器分成两种,一种是IE系列的浏览器,一种是非IE浏览器(都是按W3C标准)
创建对象:
function createAjax1(){
var request=false;
//window对象中有XMLHttpRequest存在就是非IE,包括(IE7,IE8)
if(window.XMLHttpRequest){
request=new XMLHttpRequest();
if(request.overrideMimeType){
request.overrideMimeType("text/xml");
}
//window对象中有ActiveXObject属性存在就是IE
}else if(window.ActiveXObject){
var versions=['Microsoft.XMLHTTP','MSXML.XMLHTTP','Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP'];
for(var i=0;i<versions.length;i++){
try{
request=new ActiveXObject(versions[i]);
if(request){
return request;
}
}catch(e){
request=false;
}
}
}
return request;
}
var ajax=createAjax1();
使用Ajax对象中的属性和方法完成对服务器的请求和响应(94)
请求服务器:Open() method: GET POST 服务器地址
如果使用get将数据传给服务器,则服务器就使用$_GET接收 直接通过URL将数据传给服务器 使用POST时一定要使用:
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
使用Ajax请求服务器,使用Ajax中的方法实现
通过Ajax获取服务器发送的数据,是用Ajax的属性实现