php知识点大全【精心总结版】

<?php

SQlServer数据库知识

--创建数据库 school

create database school

--删除数据库

drop database school

go--可以派出先后执行顺序

--更改当前操纵的数据库

use school

go

--创建教师表-->主表

create table teacher

(

class_name varchar(20) primary key,

tea_name varchar(20) not null,

t_time datetime default(getdate())

)

go

--创建学生表-->从表

create table student

(

stu_id int identity(1,1) primary key, stu_name varchar(20) not null,

sex char(2) check(sex='男' or sex='女'), score int default(0),

class_name varchar(20) foreign key teacher(class_name)--class_name字段必须是teacher表的主键 )

go

--添加语句insert

insert into teacher(class_name,tea_name)values('s123','张老师') insert into teacher values('s456','郭老师','2008-1-2 15:51:30') insert into teacher(class_name,tea_name)values('t123','李老师') insert into teacher(class_name,tea_name)values('t456','赵老师') references

go insert into student(stu_name,sex,score,class_name)values('','男',68,'s123') insert into student(stu_name,sex,score,class_name)values('李小明','男',80,'t123') insert into student(stu_name,sex,score,class_name)values('李大刚','男',97,'t456') insert into student(stu_name,sex,score,class_name)values('王菲','女',100,'t123') insert into student(stu_name,sex,score,class_name)values('赵刚','男',90,'s123') insert into student(stu_name,sex,score,class_name)values('李宁','男',85,'t123') insert into student(stu_name,sex,score,class_name)values('赵姗','女',56,'s456') insert into student(stu_name,sex,score,class_name)values('郭蕊','女',78,'t456') insert into student(stu_name,sex,score,class_name)values('孙小旭','男',60,'s123') insert into student(stu_name,sex,score,class_name)values('孙津','女',72,'t123') insert into student(stu_name,sex,score,class_name)values('丁磊','男',23,'t456') --更新语句 update student set score=80 where stu_name='孙津' update student set score=81,class_name='t456' where stu_name='孙津' --删除语句 delete from student--清空表 truncate table student--清空表 不走日志 快 delete from student where stu_name='丁磊' delete from student where stu_name='丁磊' and stu_name='孙津' --查询语句 select * from teacher select * from student select * from student where stu_name='' select stu_name,score from student where stu_name='' select * from student where score!=60 select * from student where score<>60 select * from student where score>60 and sex='女' --排序 order by select * from student order by score --升序 select * from student order by score desc --降序 select * from student order by stu_name select * from student order by stu_name,score --desc 降序 排序的语法 select * from 表名 order by 字段名 +排序方式

--聚合函数 sum、avg、max、min、count --所有学生成绩总和 select sum(score) as 总和 from student --所有学生成绩平均分 select avg(score) as 平均分 from student --s123班级所有学生成绩的平均分 select avg(score) as 平均分 from student where class_name='s123' --最高分 select max(score) as 最高分 from student --最低分 select min(score) as 最低分 from student --参加考试学生人数 select count(*) as 总数 from student select count(*) as 总数 from student where score<>0 --分组函数 group by 配合着聚合函数一起使用 --注意:查询结果中出现的列,要么出现在聚合函数中,要么出现在group by中 --所有男生和女生的平均分 select avg(score)as 平均分,sex from student group by sex --查询所有学生的成绩总和,但是去掉不及格的学生成绩 select sum(score) from student where score>=60 --查询每个班级所有学生的平均分 select avg(score) from student group by class_name --查询班级的个数,平均分不小于60的班级的个数 select count(*) as 学生人数,class_name from student group by class_name having avg(score)>=60

--注意:where、having后边都可以跟条件

--where: 普通的条件查询

--having: 一般都是配合着聚合函数、分组函数 --模糊查询 like -- % 代表任意长度的字符 -- _ 代表任意一个字符 -- [] 代表任意一个位置,可以是多个字符 --查询所有姓李的学生 select * from student where stu_name like '李%' --查找所有姓李的学生,名字有两个字组成 select * from student where stu_name like '李_' --查找所有姓姓李的学生 select * from student where stu_name like '[李郭]%' --名字中代“小” select * from student where stu_name like '%小%'

--多表查询 --内联接 inner join...on (将多张表的字段合为一张表) --查询张老师班级所有的学生 select * from student inner join teacher on student.class_name=teacher.class_name and teacher.tea_name='张老师' --外联接 outer join...on --左外连接 left outer join...on (以左表为主) --查询张老师班级所有的学生 select * from student s left outer join teacher t on s.class_name=t.class_name and t.tea_name='张老师' --右外连接 right outer join...on (右表为主) select * from student s right outer join teacher t on s.class_name=t.class_name and t.tea_name='张老师' --全外联接 full outer join...on select * from student s full outer join teacher t on s.class_name=t.class_name and t.tea_name='张老师' --外键的关键字foreign key references涉及 外键的语法格式 字段名+类型+foreign key+ references +表名(字段)

create table student(stu_id int primary key identity(1,1) not null,stu_name varchar(20) not null,sex char(2) not null,score float not null,class_name varchar(10) foreign key references teacher(class_name))

--子查询 (在查询条件中还包含另外一个sql语句)

select * from student where class_name=(select class_name from teacher where tea_name='张老师')

select * from student where class_name != (select class_name from teacher where tea_name='张老师') select * from student where class_name not in select * from student where class_name in (select class_name from teacher where tea_name='张老师' or tea_name='李老师')

(select class_name from teacher where tea_name='张老师' or tea_name='李老师') --联合 union (把多张表的记录合为一张表) --去掉重复记录 select class_name from student union select class_name from teacher --所有记录全部显示 select class_name from student union all select class_name from teacher --多表查询 (相同的字段相等) select * from student,teacher where teacher.tea_name='张老师' and student.class_name=teacher.class_name --pubs案例数据库 图书作者 sp_tables --显示该数据库所有的表名 select * from authors --作者 select * from titles --图书 select * from titleauthor --图书作者 --查询Johnson作者的所有的图书 select a.au_id,b.title from authors a,titles b,titleauthor c where a.au_id=c.au_id and b.title_id=c.title_id and a.au_fname='Marjorie' --northwind 订单查询 sp_tables select * from customers --客户表 select * from orders --订单表 select * from products --产品表 select * from [order details] --订单明细表 --查询Alfreds Futterkiste订购的所有商品 select a.CustomerID,c.ProductName from Customers a,Orders b,Products c,[Order

where a.CustomerID=b.CustomerID and b.OrderID=d.OrderID and

c.ProductID=d.ProductID and a.CompanyName='Alfreds Futterkiste' Details] d

--视图 view 视图一旦创建,始终存在 ---表 --创建视图 create view myview

as

select a.CustomerID,c.ProductName from Customers a,Orders b,Products c,[Order Details] d

where a.CustomerID=b.CustomerID and b.OrderID=d.OrderID and

c.ProductID=d.ProductID and a.CompanyName='Alfreds Futterkiste'

delete from student where stu_id=1 update student set score=100 where stu_name='李小明' --存储过程 proc --创建 create proc myproc as go --修改视图 alter view myview as select * from orders go --删除视图 drop view myview select * from myview where productName='Spegesild' --触发器 trigger --创建 create trigger mytri on student for delete as select * from student go --修改 alter trigger mytri on student for insert,delete,update as select * from student go --删除 drop trigger mytri

select * from student go alter proc myproc @stuId int as select * from student where stu_id > @stuId go exec sp_tables --系统存储过程 exec myproc myproc 6 --创建数据库 的语法 create +database+自己起的名字 create database school --切换数据库 use school --在school中创建学生表 的语法 create+table+自己起的表名字(字段名 数据类型(长度)设置是否为空,字段名 数据类型(长度)设置是否为空 )

--主键字段语法 stu_id int identity(1,1) primary key not null identity(1,1)自曾长 primary key主键

create table student(stu_id int identity(1,1) primary key not null,stu_name varchar(10) not null,stu_age int not null )

三级联动 --插入数据的语法 insert into +表名(字段名)values(字段如是varchar加,,) insert into student(stu_name,stu_age)values ('孟刚',18) insert into student values('杨艳广',23) --查询表里的记录 select * from student --删除数据库(不能以数字开头的数据库名字) drop database school --删除表 drop table student --更改数据库的名字 sp_renamedb sp_renamedb 'school','schoola'

<?php header('content-type:text/html;charset=utf-8'); include 'dao.class.php'; $dao = new dao(); $sql = "select * from ep_area where parent_id= 0"; $p = $dao->query($sql); ?> 省: <select onchange="selectCity(this);"> <option value="-1">--请选择--</option> <?php foreach ($p as $v) { ?> <option value="<?php echo $v['id'] ?>"><?php echo $v['name'] ?></option> <?php } ?> </select> 市: <select id="city" onchange="selectxian(this);"> <option value="-1">--请选择--</option> </select> <script src="jquery-1.2.6.js"></script> <!-- 市级设置 --> <script> //清空option数据 function selectCity(obj) { var id = obj.value; var city = document.getElementById("city");//取市菜单项 for (var i = city.options.length; i > 0; i--) { city.options[i] = null; } //发送Ajax请求 $.get( 'getArea.php?'+Math.random(), {'pid':id}, function (data) { //alert(data); c = eval("("+data+")");//转换json数据格式 for (i = 0; i < c.length ; i++) { var op = document.createElement('option'); op.innerHTML = c[i].name; op.value = c[i].id;

} ); } } city.appendChild(op); </script> 县:<select id="xian" > <option value="-1">--请选择--</option> </select> <!-- 县级设置 --> <script> //清空option数据 function selectxian(obj) { var id = obj.value; var xian = document.getElementById("xian");//取市菜单项 for (var i = xian.options.length; i > 0; i--) { xian.options[i] = null; } //发送Ajax请求 ); 'getArea.php?'+Math.random(), {'pid':id}, function (data) { } //alert(data); c = eval("("+data+")");//转换json值 for (i = 0; i < c.length ; i++) { } var op = document.createElement('option'); op.innerHTML = c[i].name; op.value = c[i].id; xian.appendChild(op); $.get( } </script><?

魔术方法

__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。构造函数 __destruct() 当删除一个对象或对象操作终止的时候,调用该方法。析构函数

__get() 当试图读取一个并不存在的属性的时候被调用。

MVC

** MVC的概念是什么?

MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。 M指模型层,V是指视图层(显示层或者用户界面),C是指控制层。 使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。 C存在的目的则是在M和V之间起到调节作用,确保M和V的同步,一旦M改变,__set() 当试图向一个并不存在的属性写入值的时候被调用。 __call() 当试图调用一个对象并不存在的方法时,调用该方法。 __toString() 当打印一个对象的时候被调用 __clone() 当对象被克隆时,被调用 __isset() 检测变量是否设置 __unset() 资源销毁时 __autoload($classname) __sleep() 延长时间 V应该能同步更新。

将M和V分离,就可以做到同一个网页,在不同节日到来的时候能显示不同的页面风格,这只需要提前制作多个视图层模板页面,

而无需更改M层程序。 MVC做到了编程中的分工合作,代码的可重用性得到最大化体现, 程序逻辑更加清晰而富有条理,便于后期维护管理。

系统常量

__FILE__ 当前文件名

__LINE__ 当前行数

__FUNCTION__ 当前函数名

__CLASS__ 当前类名

__METHOD__ 当前对象的方法名

PHP_OS 当前系统

PHP_VERSION php版本

DIRECTORY_SEPARATOR 根据系统决定目录的分隔符 /\

PATH_SEPARATOR 根据系统决定环境变量的目录列表分隔符 ; :

E_ERROR 1

E_WARNING 2

E_PARSE 4

E_NOTICE 8

M_PI 3.141592

$_SERVER

$_ENV 执行环境提交至脚本的变量

$_GET

$_POST

$_REQUEST传递参数同时满足$_POST和$_GET

$_FILES

$_COOKIE

$_SESSION

$_GLOBALS

输出

echo //Output one or more strings print //Output a string print_r() //打印关于变量的易于理解的信息。 var_dump() //打印变量的相关信息 var_export() //输出或返回一个变量的字符串表示

printf("%.1f",$num) //Output a formatted string

sprintf() //Return a formatted string

错误处理

@1/0 error_reporting(E_ALL) 显示所有错误

error_reporting(0)

trigger_error("Cannot divide by zero", E_USER_ERROR);

try

{ throw new Exception("执行失败"); } catch (Exception $ex)//异常 { } error_reporting(E_ERROR | E_WARNING | E_PARSE); 用来配置错误信息回报的等级 @屏蔽本行错误 echo $ex;

常用字符串

string trim("eee ") trim ('ffffe','e') //ltrim rtrim array explode(".", "fff.ff.f") 按指定字符切割 string implode(".", $array) 别名:join 把数组值数据按指定字符连接起来 str_split — 将字符串转换为数组

array split("-","fff-ff-f") 按指定字符切割

int strlen('ffffffff') 取字符长度

string substr ( string $string , int $start [, int $length ] )

substr($a,-2, 2) 截取字符

string mb_substr(string str, int start [, int length [, string encoding]]) int substr_count($text, 'is') 字符串出现的次数 string strstr($text, 'h') 第一次出现h后的字符串 //别名:strchr int strpos($text, 'h') 第一次出现h的位置 strrpos();最后一次出现h的位置

strrchr('aa.jpg','.'); //.jpg

str_replace('a', 'ttt', $t) 把$t里的'a'替换为'ttt'

strtr($t,'is','pef') 把$t中i替换成p,s替换成e,f被忽略

strtr("hi all, I said hello", array("hello" => "hi")) 把'hello'转换成'hi'

string md5_file('1.txt',false) 文件数据md5加密

string md5() int strcmp(string str1, string str2) 字符串比较

int strcasecmp(string str1, string str2) 忽略大小写

string str_pad($i, 10, "-=", STR_PAD_LEFT) 在原字符左边补'-=',直到新字符串长度为10

STR_PAD_RIGHT

STR_PAD_BOTH

string str_repeat('1', 5) 重复5个1

void parse_str('id=11'); echo $id; 将字串符解析为变量

array preg_grep("/^(\d+)?\.\d+$/", array(11.2,11,11.2)) 匹配数据 array preg_split ("/[\s,]+/", "hypertext language,programming"); 按指定的字符切割 array pathinfo(string path [, int options]) 返回文件路径的信息 string basename ( string path [, string suffix] ) 返回路径中的文件名部分 string dirname ( string path ) $_SERVER[PHP_SELF] 返回路径中的目录部分 string nl2br("foo isn't\n bar") "foo isn't<br> bar" 把换行转成<br> string chr ( int ascii ) chr(97) ---> a int ord('a') 97 mixed str_word_count ( string string [, int format [, string charlist]] ) str_pad — 使用另一个字符串填充字符串为指定长度 string str_shuffle ('abc') 打乱字符串顺序 string strrev($str) * 翻转一个字符串 string strtolower($str) * 将字符串 $str 的字符全部转换为小写的 string strtoupper($str) * 将字符串 $str 的字符全部转换为大写的 string ucfirst ($str) * 将字符串 $str 的第一个单词的首字母变为大写。 string ucwords($str) * 将字符串 $str 的每个单词的首字母变为大写。

string addslashes("I'm") I\'m 使用反斜线引用字符串 这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)

get_magic_quotes_gpc() string stripcslashes("I\'m") I'm 将用addslashes()函数处理后的字符串返回原样 strip_tags("<p>tt</p>", '<p>') 去除html、xml、php标记,第二个参数用来保留标记 string urlencode(string str)

string urldecode(string str)

string htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES) 转换特殊字符为HTML字符编码<a href=&#039;test&#039;>Test</a>

ENT_COMPAT –对双引号进行编码,不对单引号进行编码 ENT_QUOTES –对单引号和双引号进行编码

ENT_NOQUOTES –不对单引号或双引号进行编码

string htmlentities('<p>ff</p>', ENT_QUOTES) 转换特殊字符为HTML字符编码,中文会转成乱码

常用数组

$a = array();

$a = array(1,2,3);

$a = array('name'=>'zhangsan');

int count( mixed var [, int mode] ) 别名:sizeof() 取数组长度

string implode(".", $array) 别名:join 把数组值数据按指定字符连接起来

array explode(".", "fff.ff.f") 按指定字符切割 array range(0, 6, 2) 返回数组 array(0,2,4,6) 第一个参数为起使数,第二个参数为结束void unset ( mixed var [, mixed var [, ...]] ) array array_pad ($a, 5, 's')用's'将数组填补到指定长度 bool shuffle ( array $array ) 将数组打乱 mixed array_rand ( array input [, int num_req] )从数组中随机取出一个或多个单元的索引数,第三个参数为数据增加步长 或键名

array array_count_values ( array input )统计数组中所有的值出现的次数

array array_combine ( array keys, array values ) 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值

bool array_key_exists ( mixed key, array search )检查给定的键名或索引是否存在于数组中

mixed array_search ( mixed needle, array haystack [, bool strict] )在数组中搜索给定的值,如果成功则返回相应的键名

bool is_array ( mixed var ) bool in_array ( mixed needle, array haystack [, bool strict] )检查数组中是否存在某个值 number array_sum ( array array )计算数组中所有值的和 array array_unique ( array array )移除数组中重复的值 mixed array_shift ( array &array )将数组开头的单元移出数组 int array_unshift ( array &array, mixed var [, mixed ...] )在数组开头插入一个或多个单元 int array_push($a, "3", 1) 把'3'、'1'压入$a,将一个或多个单元压入数组的末尾(入栈),第二个参数开始就是压入的数据

mixed array_pop ( array &array )将数组最后一个单元弹出(出栈)

mixed reset ( array &array )将数组的内部指针指向第一个单元 mixed current ( array &array ) 返回数组中的当前单元 值 mixed next ( array &array ) mixed prev ( array &array ) mixed end ( array &array ) 返回数组中的最后一个单元 值 mixed key ( array &array ) 返回数组中的当前个单元 键 array array_keys ( array input [, mixed search_value [, bool strict]] ) 返回数组中所有的键名

array array_values ( array input ) 返回数组中所有的值

array array_splice ( array $input, int offset [, int length [, array replacement]] ) 把数组中的

一部分去掉并用其它值取代

array array_merge ( array array1 [, array array2 [, array ...]] )合并一个或多个数组 array array_flip ( array trans )交换数组中的键和值

int extract( array var_array [, int extract_type [, string prefix]] ) 从数组中将变量导入到当前的符号表

array compact ( mixed varname [, mixed ...] ) 建立一个数组,包括变量名和它们的值 bool sort ( array &array [, int sort_flags] )从最低到最高重新安排 bool natsort($a) 用“自然排序”算法对数组排序 bool asort ( array &array [, int sort_flags] )对数组进行排序并保持索引关系 bool arsort ( array &array [, int sort_flags] ) 对数组进行逆向排序并保持索引关系 bool ksort ( array &array [, int sort_flags] )对数组按照键名排序 bool krsort ( array &array [, int sort_flags] )对数组按照键名逆向排序 usort(array array, callback cmp_function) 使用用户自定义的比较函数对数组中的值进 bool rsort ( array &array [, int sort_flags] )对数组进行逆向排序(最高到最低) 行排序

回调函数返回值作用:

0 不做操作

-1 将$a所在单元先前移动 1 位置不发生变化

如果usort($a ,"cmp"); 中的$a数组只有2个值的情况下,很简单,cmp()第一个参数为$a[1],cmp()第二个参数为$a[0]; 通过cmp比较,返回1则$b>$a , $a[0],$a[1]按原序列排; 返回-1 则反之,$a[0], $a[1]互换位置;返回 0则表示两个数字大小一样,如果是文字的按照第一个字母的ASCII值比较.

如果usort($a ,"cmp"); 中的$a数组超过2个值的情况, 则需要通过递归完成排序

array array_filter ( array input [, callback callback] ) 用回调函数过滤数组中的单元

bool array_walk ( array &array, callback funcname [, mixed userdata] ) 对数组中的每个成员应用用户函数

array array_map ( callback callback, array arr1 [, array ...] )将回调函数作用到给定数组的单元上

array array_fill ( int start_index, int num, mixed value ) 用给定的值填充数组

array_fill(5, 3, 'a')-->array(5=>'a',6=>'a',7=>'a')

array array_chunk ( array input, int size [, bool preserve_keys] )将一个数组分割成多个

json

json对于php和ajax都支持的一种数据字符串格式.还有一种就是xml.

在ajax接受加入 dataType:'JSON', $arr=array( $this->cart->getNumber(),

$this->cart->getTotal() ); echo json_encode($arr);//对变量进行 JSON 编码

smarty

模板引擎将不分析

<!--{literal}--> <script> function t() { } </script> <!--{/literal}--> 读取配置文件 <!--{config_load file="config.s"}--> <!--{#site_url#}--> <!--{$smarty.config.site_url}--> 引入文件 <!--{include file="index2.html"}--> <!--{include_php file="/path/to/load_nav.php"}--> $trusted_dir 指定目录下的文件 <!--{capture name='eee'}--> 捕获模板输出的数据 fffffffff <!--{/capture}--> <!--{$smarty.capture.eee}--> 循环 <{section name=loop loop=$News_IN}> <{$News_IN[loop].NewsID}> <{/section}> <!--{section name=t loop=$data}--> <tr> <td><!--{$data[t].username}--></td> </tr> <!--{/section}--> <{foreach from=$newsArray item=newsID key=k}> 新闻编号:<{$newsID.newsID}><br> 新闻内容:<{$newsID.newsTitle}><br><hr> <{/foreach}> 判断 <!--{if true}--> 1111 <!--{else}--> 222222

<!--{/if}-->

smarty局部不缓存【1.页面源更改时进行 2.定时进行清除缓存】

1. html: <!--{cacheless a="aaa" b="bbbb"}--> <!--{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}--> <!--{/cacheless}--> php: $smarty->register_block('cacheless', 'smarty_block_dynamic', false);//true:缓存,false:不缓存

function smarty_block_dynamic($param, $content, &$smarty)

{

return $content;

}

php:

function insert_kk()//方法名前必须有"insert"

{

return date('Y-m-d H:i:s');

}

html:

<!--{insert name="kk"}-->

2.用smarty中的load方法,在页面执行之后对页面局部进行局部加载

3.ajax对页面进行获取和更新

自定义方法

注册方法

php

$smarty->register_function('test1', 'test');

function test($p)

{

return 'ffffffffff';

}

html:

<!--{test1 name="ff"}-->

------------------------------------------------

方法自定义

插件文件方式定义方法

function.test.php 文件存在plugins目录下,

smarty_function_test($params, &$smarty)

function smarty_function_test($params, &$smarty)

{

return 'fff';

} 方法名:

html调用:

<!--{test name='aa' p='ff'}-->

----------------------------------------------------

插入方法

插件文件:insert.kk.php文件存于plugins目录下 function smarty_insert_kk()

{

return date('Y-m-d H:i:s');

}

php:

function insert_kk()//方法名前必须有"insert" {

return date('Y-m-d H:i:s');

}

html:

<!--{insert name="kk"}-->

-------------------------------------------------

管道符自定义方法

插件文件方式定义方法

modifier.test.php 文件存在于plugins目录下,smarty_modifier_test($str, $str2)

function smarty_modifier_test($str, $str2) {

return $str.$str2;

}

html调用:

<!--{'ff'|test:'tt'}-->

php:

function eee($a)

{

return 'ffffffffffffff';

}

html:

<!--{''|@eee}-->

if语句

eq相等,==

ne、neq不相等,

gt大于

gte、ge大于等于,

lte、le 小于等于,

not非, mod求模。

is [not] div by是否能被某数整除,

is [not] even是否为偶数, 方法名: function

$a is [not] even by $b 即($a / $b) % 2 == 0 is [not] odd是否为奇 $a is not odd by $b即($a / $b) % 2 != 0 PHP的运算符:

算术运算符、逻辑运算符、、比较运算符、字符串运算符、递增或递减运算符、位运算符、执行运算符、错误控制运算符&、三元操作运算符。

1、 算术运算符: +加法 -减法 *乘法 /除法 %取余数 2、 字符串运算符: 只有一个,即“ . ”,它将两具字符串连接起来,结合到一起形成一个新的字符3、 赋值运算符: = 赋值 +=加 -=减 *=乘 /=除 %=取余数 .=连接字符 4、 递增或递减运算符: ++递增 --递减 5、 逻辑运算符:优先级(先符号后字母,非与或) &&或and(逻辑与) ||或or(逻辑或) !(逻辑非) 6、 比较运算符: 串。

<小于 >大于 <=小于等于 >=大于等于 ==相等(只判断数值不判断类型) !=不等 ===恒等(既判断数值又判断类型) !==非恒等

7、 三元运算符(三目运算符): (表达式1 ?表达式2 :表达式3 )

PHP的算法与流程控制

1、程序结构概述: 顺序结构、条件分支结构、循环结构 (1)If(条件){ 语句; } (2)If(条件){ 语句; }else{ 语句; } (3)if(条件){ 语句; }elseif(条件){ 语句; }else{ 语句;

}

If分支语句对给定的条件进行判断,若条件成立,执行一个分支,若条件不成立,则执行另一个分支。

2、Switch语句: (1)switch(){ Case常量表达式1:语句1;break; Case常量表达式2:语句2;break; Case常量表达式3:语句3;break; Default :语句4; } Switch分支语句和if语句相似,都是分支语句。在很多情况下, 需要将一个变量(或者表达式)与不同的值进行比较,根据不同的值分别执行不同3、流程控制的代替语法: <?php if(条件) : 八、PHP循环控制 1、循环语句: For循环语句 While循环语句 Do??while循环语句 Foreach循环语句 跳转语句 Break语句 Continue语句 的代码,此时使用switch语句将使程序更简洁易读。 2、While循环语句 特点:先判断表达式,后执行语句。 例:while(条件){语句}; 3、while和do?while语句之间是有区别的:do?while语句是先执行后判断,无论表达式是否为true,都将执行一次循环;而while语句则是首先判断表达式的值是否为true,如果为true则执行循环语句,否则将不执行循环语句。

语法: Do{语句}while(条件) 4、for循环语句 例: For(表达式1;表达式2;表达式3){语句} 5、foreach循环语句: 主要用于处理数组,是遍历数组的一种简单的处理方法。如果将该语句用于处理其他的数据类型或者初始化的变量,将会产生错误。

(1) foreach(遍历数组 as 数组的值){语句}

(2) foreach(遍历数组 as 数组键名=>数组的值){} 6、break跳转语句 Break语句用于结束当前条件控制语句if、switch或者循环控制语句while、do??while、for、foreach的执行。Break语句可以接受一个可选参数决定跳出语句的操作。 例:

$i=1; While($i<=10){ If($i>3){

Break; }echo $i.”<br>”; $i++; }最后输出的内容是123 7、contnue跳转语句的应用

Contnue跳转语句用来跳出本次循环中指定条件的语句,并且继续执行其他的循环语句。

例: $i=1; While($i<=10){ If($i==3){ Continue; }echo $i.”<br>”; }最后输出的内容是2---11 8、 嵌套 嵌套语句是在流程控制语句中又嵌入控制语句,就是在大圈中套中圈 中圈中套小圈,没有限制的嵌套。 例:这是同一种类型语句的嵌套,还有不同控制语句的嵌套,最为长用 $a=1; $b=2; $c=3; If($a==1){ If($b==2){ If($c==3){ Echo “a”; }else{ Echo “b”; } }else{ Echo “d”; } }else{ Echo “e”; } 9、 rand 产生随机数 语法: Int rand([int min],[int max]) php常见系统函数的使用 Error_log:送出一个错误信息 Error_reporting:配置错误信息回报的等级 Getenv:取得系统的环境变量 Get_cfg_var:取得PHP的配置选项值 Get_current_user:取得PHP行程的拥有者名称

Get_magic_quotes_gpc:取得PHP环境变量magic_quotes_gpc的值 Get_magic_quotes_runtime:取得PHP环境变量magic_quotes_runtime的值 Getlastmod:返回该网页的最后修改时间 Getmyinode:返回该页面的inode值 Getmypid:返回PHP的行程代号 Getmyuid:返回PHP的用户代码 Getrusage:返回系统资源使用率 Phpinfo:返回PHP所有相关信息 Phpversion:返回PHP版本信息 Putenv:配置系统环境变量 Set_magic_quotes_runtime:配置magic_quotes_runtime值 Set_time_limit:配置该页最久执行时间 php中文件的处理 创建文件 fopen创建文件 fopen(‘带路径的文件名’,打开方式); 判断文件是否存在 exists(文件名) 删除文件 unlink(文件名) 创建文件夹 mkdir(名字) 判断文件夹是否存在 is_dir 删除文件夹 rmdir(文件名) 关闭文件 fclose <?php $f_open=fopen(“text.txt”,”r”); fclose($f_open); ?> 写入文件 <?php $str=”写入数据”; $fopen=fopen(“text.txt”,”a”); fwrite($fopen,$str); fclose($fopen); ?> 上传文件 move_uploaded_file(“文件名“,”包含路径的文件名“) 下载文件 <?php

echo <a href=”upload/text.txt”>下载文件</a> ?> header下载 <?php header(“location:http://localhost/upload/text.txt”);

XML

应用:1.存储数据2.web服务3.博客和其他数据联合 语法:1.标签成对出现 并且合理包含

2.区分大小写 3.只有一个根元素 4.属性值必须使用引号"" 5.注释<!-- 这是一个注释 --> 元素:命名必须遵守下面的规则: 元素的名字可以包含子母,数字和其他字符。 元素的名字不能以数字或者标点符号开头。 元素的名字不能以XML(或者xml,Xml,xMl...)开头。 元素的名字不能包含空格。 <--?xml version="1.0" encoding="utf-8"?--> <books> <book> <author>Jack Herrington</author> <title>PHP Hacks</title> <publisher>Reilly</publisher> </book> <book> <author>Jack Herrington</author> <title>Podcasting Hacks</title> <publisher>OReilly</publisher> </book> <book> <author>作者</author> <title>标题</title> <publisher>出版者</publisher> xml: </book> </books> php: $g_books = array(); $g_elem = null; function startElement( $parser, $name, $attrs ) {

global $g_books, $g_elem; if ( $name == 'BOOK' ) $g_books []= array(); $g_elem = $name; } function endElement( $parser, $name ) { } function textData( $parser, $text ) { global $g_books, $g_elem; } $parser = xml_parser_create(); xml_set_element_handler( $parser, "startElement", "endElement" ); xml_set_character_data_handler( $parser, "textData" ); $f = fopen( '1.xml', 'r' ); while($data = fread( $f, 4096 )) { xml_parse( $parser, $data ); } xml_parser_free( $parser ); foreach( $g_books as $book ) { echo $book['TITLE']." - ".$book['AUTHOR']." - "; } echo $book['PUBLISHER']."<br>"; if ( $g_elem == 'AUTHOR' || $g_elem == 'PUBLISHER' || $g_elem == 'TITLE' ) { $g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text; } global $g_elem; $g_elem = null;

DomDocument() xml:

<--?xml version="1.0" encoding="utf-8"?-->

<books> <book> <author>Jack Herrington</author> <title>PHP Hacks</title> <publisher>O'Reilly</publisher> </book> <book> <author>Jack Herrington</author> <title>Podcasting Hacks</title> <publisher>O'Reilly</publisher> </book> <book> <author>作者</author> <title>标题</title> <publisher>出版者</publisher> </book> </books> php读取: $doc = new DOMDocument(); $doc->load( "1.xml"); $books = $doc->getElementsByTagName( "book" ); foreach( $books as $book ) { $authors = $book->getElementsByTagName( "author" ); $author = $authors->item(0)->nodeValue; $publishers = $book->getElementsByTagName( "publisher" ); $publisher = $publishers->item(0)->nodeValue; $titles = $book->getElementsByTagName( "title" ); $title = $titles->item(0)->nodeValue; echo "$title - $author - $publisher<br>"; } php生成: $books = array(); $books [] = array( 'title' => 'PHP Hacks', 'author' => 'Jack Herrington', 'publisher' => "O'Reilly" ); $books [] = array( 'title' => 'Podcasting Hacks',

'author' => 'Jack Herrington', 'publisher' => "O'Reilly" ); $doc = new DOMDocument(); $doc->formatOutput = true; $dom->encoding = 'utf-8'; $r = $doc->createElement( "books" ); $doc->appendChild( $r ); foreach( $books as $book ) { } $b = $doc->createElement( "book" ); $author = $doc->createElement( "author" ); $author->appendChild($doc->createTextNode( $book['author'] )); $b->appendChild( $author ); $title = $doc->createElement( "title" ); $title->appendChild($doc->createTextNode( $book['title'] )); $b->appendChild( $title ); $publisher = $doc->createElement( "publisher" ); $publisher->appendChild($doc->createTextNode( $book['publisher'] )); $b->appendChild( $publisher ); $r->appendChild( $b );

echo $doc->saveXML();

echo $doc->save('222.xml');

SimpleXML

xml: <books> <book> <author>Jack Herrington</author> <title>PHP Hacks</title> <publisher>O'Reilly</publisher>' </book> </books> php: $xml = new SimpleXMLElement('1.xml', NULL, TRUE); echo

$xml->book[0]->author."___".$xml->book[0]->title."___".$xml->book[0]->publisher;

以DOM方式解析XML[适合读取小型文档,占内存大]

DOM(Document,object,model); DOMDocument DOMNodelist DOMElement DOMNode 以SAX方式解析XML[只能顺序读数据,不能对数据进行处理] 1.建立XML解析器 $xml_parser = xml_parser_create('utf-8'); 2.针对标签和数据建立解析器 xml_set_element_handler(); function start_element() function end_element() 3.设置xml解析器 xml_parser_set_option — 为指定 XML 解析进行选项设置 4.开始解析xml文档 xml_parse — 开始解析一个 XML 文档 xml_get_error_code — 获取 XML 解析器错误代码 xml_get_current_line_number — 获取 XML 解析器的当前行号 xml_get_current_column_number — 获取 XML 解析器的当前列号 xml_get_current_byte_index — 获取 XML 解析器的当前字节索引 5.关闭xml解析器,释放资源

xml_parser_free($xml_parser);

正则

正则特殊字符

. \ + * ? [ ^ ] $ ( ) { } = ! < > | :

由原子(普通字符,如英文字符)、

元字符(有特殊功用的字符)

模式修正字符

一个正则表达式中,至少包含一个原子

[]匹配一个字符

{}匹配数量

\d 匹配一个数字字符。等价于 [0-9]。

\D 匹配一个非数字字符。等价于 [^0-9]。

\f 匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于 \x0a 和 \cJ。

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t 匹配一个制表符。等价于 \x09 和 \cI。

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.

\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。

\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 \nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

例子

/\b([a-z]+)\b/i 单词数量

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 将一个URL解析为协议、域、端口及相对路径 /^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位置

/[-a-z]/ A至z共26个字母再加一个-号。 /ter\b/ 可匹配chapter,而不能terminal /\Bapt/ 可匹配chapter,而不能aptitude /Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。

^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$ Email 合法格式检查

^[0-9]+$ 纯数据检查

^[0-9a-z]{1}[0-9a-z\-]{0,19}$ 用户名检查,字母和数字开始,只能含字母、数字、横杠

模式修正符

i 忽略大小写

s 如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符 e 只用在preg_replace(),在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

如:

$p = '/\[colorFont\](.+?)\[\/colorFont\]/ie';

$t = '"<img src='color.php?t=".urlencode("\1")."\'/>"';"

ecoh preg_replace($p,$t,$string);

这里必须加上e修正,才能将匹配到的内容用urlencode处理

U 贪婪模式,最大限度匹配

如:/a[\w]+?e/U匹配abceadeddd中的abceade而不是abce,如果不加U修正,则匹配abce

A 强制从字符串开头匹配,即自动在模式开头加上^

m 当设定了此修正符,“行起始” ^ 和“行结束” $ 除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

D 模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了 m 修正符则忽略此选项 例子

匹配中文 preg_match_all('/[^\x00-\x80]+/', '中华s人s民', $a) 如果你的文件是gb2312的,用/[\xa0-\xff]{2}/ 如果是utf8的,用/[\xe0-\xef][\x80-\xbf]{2}/ utf8编码下中文的范围在4e00-9fa5之间 $pattern = '/[\x{4e00}-\x{9fa5}]+/u'; 匹配邮箱地址 preg_match('/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/', 'shao@gmail.com') 替换空白字符 $s = preg_replace('/[\s\v]+/','',' 替换 $string = "April 15, 2003"; $pattern = "/(\w+) (\d+), (\d+)/i"; $replacement = "\${1}1,\${3}1-$2"; sss sdd ss '); echo preg_replace($pattern, $replacement, $string); 匹配帐号是否合法(字母开头,允许5-6字节,允许字母数字下划线) preg_match('/^[a-zA-Z][a-zA-Z0-9_]{4,5}$/', 'a011a') 匹配数字 /^-\d*$/ 匹配负整数 /^-?\d*$/ 匹配整数 匹配浮点数2011/7/25 preg_match("/^-?(\d*.\d*|0.\d*|0?.0+|0)$/", "11") 匹配电话号码 preg_match("/^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7}){1,1}(\-[0-9]{1,4}){0,1}$/","0511-2234567

匹配手机号码

preg_match("/^1(3|5)\d{9}$/","137xxxxxxxx") 8-11")

文件处理

文件属性 file_exists('1.php') 文件或目录是否存在 filesize() 取得文件大小 is_readable() 判断给定文件名是否可读 is_writable() 判断给定文件名是否可写 is_executable() 判断给定文件名是否可执行 filectime() 获取文件的创造时间

filemtime() 获取文件的修改时间

fileatime() 获取文件的访问时间

stat() 获取文件大部分属性值

解析目录

basename() 返回路径中的文件名部分

dirname() 返回目录

pathinfo() 返回目录名、基本名和扩展名的关联数组

遍历目录

opendir() 打开指定目录

readdir() 读取指定目录

closedir() 关闭指定目录

rewinddir() 倒回目录句柄

$dir_handle=opendir('.');

while($file=readdir($dir_handle))

{

echo filesize($file).'___'.$file.'<br>';

}

closedir($dir_handle);

建立和删除目录

mkdir() 创建目录

rmdir() 删除空目录

文件操作

fclose — 关闭一个已打开的文件指针

fwrite() 写入文件

fputs() fwrite的别名

file_put_contents($文件名,$内容) 把内容存成文件

file_get_contents() 从文件读出内容

文件读取

fread — 读取文件(可安全用于二进制文件)

stream_get_contents() 和 file_get_contents()一样,但需要先fopen() 者 URL

fgets() 从文件指针中读取一行

feof() 测试文件指针是否到了文件结束的位置

fgetc() 从文件指针中读取字符

file() 把整个文件读入一个数组中

readfile() 输出文件

ftell()返回文件指针的当前位置

fseek() 移动文件指针到指定的位置

rewind() 移动文件指针到文件的开头

flock() 文件锁定

copy() 复制文件

unlink() 删除文件

ftruncate() 将文件截断到指定的长度 打开文件或

rename() 重命名文件或目录 文件控制 chgrp — 改变文件所属的组 chmod ( string $filename , int $mode )改变文件模式 chown 改变文件的所有者 保存读取文件 -----------把内容存成文件 $cache_file = fopen('f:\1.txt', 'w+'); fwrite($cache_file, $t); -----------把内容存成文件 $s = "内容"; file_put_contents('f:/2.txt',$s); -----------把文件内容读成字符串 $s = file_get_contents('f:/2.txt'); echo $s; -----------把文件内容按行读成字符串 $handle = @fopen("f:/2.txt", "r"); if ($handle) { } while (!feof($handle)) { } $buffer = fgets($handle, 4096); echo $buffer.'<br>'; fclose($handle);

fsockopen

resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

$fp = fsockopen("", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { //$out = "GET / HTTP/1.1\r\n"; //$out = "GET /2.php?id=333 HTTP/1.1\r\n"; $out = "POST /2.php HTTP/1.1\r\n"; //header结束是两个换行 $out .= "Host: \r\n";

$out .= "Connection: Close\r\n"; $out .= "Referer: \r\n";//来源地址

$out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n";//伪造浏览器

$out .= "Cookie: username=admin; password=admin\r\n"; $out .= "Content-type: application/x-www-form-urlencoded\r\n";//post请求,添加此行,get不需要

$str = "id=ffff&id2=eeeeeeee";//post传递的参数

} $out .= "Content-Length: ".strlen($str)."\r\n\r\n";//post请求,添加此行,get不需要 $out .= $str;//post的内容,get不需要 fwrite($fp, $out);//写入文件(可安全用于二进制文件) //fputs($fp, $out);//写入文件(可安全用于二进制文件) //读取请求地址设置的cookie值 //下面的判断,读到空行时,说明头已经结束了,接下来是内容。 while( ($line=trim(fgets($fp))) != "" ) { $header.=$line; /* */ if(strstr($line,"Set-Cookie:")) { list($coo,$cookieLine)=explode(" ",$line); $cookieStr[] = $cookieLine; //所有setcookie的值 } } var_dump($cookieStr); //读取返回的内容项 $str = ''; while (!feof($fp)) {//测试文件指针是否到了文件结束的位置 } $str .= fgets($fp, 128);//从文件指针中读取一行并过滤掉 HTML 标记 var_dump($str); fclose($fp);//关闭一个已打开的文件指针

output buffer 输出缓冲

ob_start 打开输出缓冲 php.ini中output_buffering = on; 打开输出缓冲(或者设置成大小就可以控制大小) ob_clean 清除输出缓冲 ob_get_contents 返回缓冲区内容 ob_flush 刷新缓冲区的内容,并清空缓冲区

flush 刷新输出缓冲 ob_get_length 返回内部缓冲区的长度(字节) ob_end_flush 发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区

session/cookie

setcookie("MyCookie[foo]", 'Testing 1', time()+3600) session_start() ini_set('session.cookie_lifetime',0); session对应cookie存活时间 ini_set('session.save_path', 'dir'); ini_set('session.save_path', '2;session');session分两级存放

ini_set('session.name','SNS');

客户端禁用Cookie

session.use_trans_sid = 1 开启url传递sessionId php.ini

开启session

session_start();

$_SESSION['name']='aaa';

session销毁

A.可以使用unset删除单个session;

B.使用$_SESSION=array()和session_unset();的方式,一次注销所有的会话变量; C.使用session_destroy()函数来彻底销毁session unset($_SESSION['arr']); $_SESSION = array(); SESSION_destroy(); SESSION_unset(); 输出session print_r($_SESSION);

session入库

数据存储在数据库和session的区别

session是一种会话技术,他可以通过session_id就可以连续与服务器进行会话,文件存储于服务器端的tmp缓存目录下

存在数据库是通过http这种无状态协议进行的,下次提取不到上次的信息。 session存入数据库【php.ini】

session.save_handler = files //以文件方式保存session(默认) session.save_handler = user //以自定义方式保存session(可以存入数据库) //session.save_path = "d:/wamp/tmp"//保存路径

ini_set('session.save_handler','user') 设置一个配置选项的值(在php文件中设置配置选项)

数据库表 create database session; create table session (id char(100) primary key,data varchar(5000)); 调用数据库存储session include("session_user_start.php");

session_start();//开启session,同时把session文件的数据(已经被序列化)读取至$_SESSION["xingming"] = "eee"; //销毁session $_SESSION = array(); session_destroy();//销毁session文件 setcookie(session_id(),'',time()-1); echo $_SESSION["xingming"]; session_user_start.php $con =mysql_connect("localhost","root" , ""); $_SESSION这个超全局数组变量 mysql_select_db("session"); mysql_query('utf8'); 完全删除cookie 1.session_destroy();//删除session文件 2.$_SESSION = array();//unset($_SESSION);//置空session 3.setcookie(session_name);//删除cookie里面的session_id 让cookie失效 setcookie('name','',time()-1); 设置cookie的变量,(键,值,时间,根目录,二级域名) setcookie('name',xiaogou,time()+1200,'/'); 输出cookie

print_r($_COOKIE);

session_set_save_handler('open','close','read','write','destroy','gc')【设置用户级别的session的存储方法】

mysql

$link = mysql_connect('localhost','root','root') or die(mysql_errno());

mysql_select_db('test') or die (mysql_errno()); mysql_query('SET NAMES utf8'); $sql = "SELECT * FROM test LIMIT 0,20"; $result = mysql_query($sql) or die(mysql_errno()); while($msg = mysql_fetch_array($result)){ } print_r($msg); open 打开 (连接数据库) close 关闭 read 读 write 写入 destroy 销毁(删除一条数据) gc 垃圾回收(删除数据库过期的数据)

mysql_free_result($result);

mysql_close($link);

连接数据库

$connec=mysql_connect("localhost","root","root") or die("不能连接数据库服务器: ".mysql_error());

mysql_select_db("liuyanben",$connec) or die ("不能选择数据库: ".mysql_error());

mysql_query("set names 'gbk'"); 查询 -------------------------------过程 $db_host="localhost"; //连接的服务器地址 $db_user="root"; //连接数据库的用户名 $db_psw="root"; //连接数据库的密码 $db_name="test"; //连接的数据库名称 $mysqli=mysqli_connect($db_host,$db_user,$db_psw,$db_name); mysqli_query($mysqli,'SET NAMES utf8'); $query="select * from users"; $result=mysqli_query($mysqli,$query); while($row =mysqli_fetch_array($result)) //循环输出结果集中的记录 { echo ($row['id'])."<br>"; echo ($row['username'])."<br>"; echo ($row['password'])."<br>"; echo "<hr>"; } mysqli_free_result($result); mysqli_close($mysqli); -------------------------------对象 $db_host="localhost"; //连接的服务器地址 $db_user="root"; //连接数据库的用户名 $db_psw="root"; //连接数据库的密码 $db_name="test"; //连接的数据库名称 $mysqli=new mysqli($db_host,$db_user,$db_psw,$db_name); $mysqli->query('SET NAMES utf8'); $query="select * from users"; $result=$mysqli->query($query); if ($result) { if($result->num_rows>0) //判断结果集中行的数目是否大于0 { while($row =$result->fetch_array()) //循环输出结果集中的记录 { } echo ($row[0])."<br>"; echo ($row[1])."<br>"; echo ($row[2])."<br>"; echo "<hr>";

} } else { echo "查询失败"; } $result->free(); $mysqli->close(); 增、删、改 $mysqli=new mysqli("localhost","root","root","sunyang");//实例化mysqli $query="delete from employee where emp_id=2"; $result=$mysqli->query($query); if ($result){ echo "删除操作执行成功"; }else{ echo "删除操作执行失败"; } $mysqli->close(); 绑定结果 $mysqli=new mysqli("localhost","root","root","test"); //实例化mysqli $query="select * from users"; $result=$mysqli->prepare($query); //进行预准备语句查询 $result->execute(); //执行预准备语句 $result->bind_result($id,$username,$password); //绑定结果 while ($result->fetch()) { echo $id.'_'; echo $username.'_'; echo $password; echo "<br>"; } $result->close(); //关闭预准备语句 $mysqli->close(); //关闭连接 绑定参数 $mysqli=new mysqli("localhost","root","root","test"); //实例化mysqli $query="insert into users (id, username, password) values ('',?,?)"; $result=$mysqli->prepare($query); $result->bind_param("ss",$username,$password); //绑定参数 I:integer D:double $username='sy0807'; $password='employee7'; $result->execute(); //执行预准备语句 S:string B:blob

$result->close(); $mysqli->close(); 绑定参数、绑定结果 $mysqli=new mysqli("localhost","root","root","test"); //实例化mysqli $query="select * from users where id < ?"; $result=$mysqli->prepare($query); $result->bind_param("i",$id); //绑定参数 $id=10; $result->execute(); $result->bind_result($id,$username,$password); //绑定结果 while ($result->fetch()) { echo $id."_"; echo $username."_"; echo $password; echo "<br>"; } $result->close(); $mysqli->close(); 多条查询语句 $mysqli=new mysqli("localhost","root","root","test"); //实例化mysqli $query = "select id from users ;"; $query .= "select id from test "; if ($mysqli->multi_query($query)) { //执行多个查询 do { if ($result = $mysqli->store_result()) { while ($row = $result->fetch_row()) { echo $row[0]; echo "<br>"; } $result->close();

间的分割线

} if ($mysqli->more_results()) { echo ("-----------------<br>"); //连个查询之} } while ($mysqli->next_result()); } $mysqli->close();//关闭连接 setAttribute $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); //设置属性

PDO::ATTR_CASE: 强制列名变成一种格式,详细如下(第二个参数): PDO::CASE_LOWER: 强制列名是小写. PDO::CASE_NATURAL: 列名按照原始的方式 PDO::CASE_UPPER: 强制列名为大写. PDO::ATTR_ERRMODE: 错误提示. PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码. PDO::ERRMODE_WARNING: 显示警告错误. PDO::ERRMODE_EXCEPTION: 抛出异常. PDO::ATTR_ORACLE_NULLS (不仅仅是ORACLE有效,别的数据库也有效): ) PDO::NULL_NATURAL: 不变. PDO::NULL_EMPTY_STRING: Empty string is converted to NULL. PDO::NULL_TO_STRING: NULL is converted to an empty string. 指定数据库返回的NULL值在php中对应的数值。 setFetchMode(PDO::FETCH_ASSOC) PDO::FETCH_ASSOC -- 关联数组形式 PDO::FETCH_NUM -- 数字索引数组形式 PDO::FETCH_BOTH -- 两者数组形式都有,这是缺省的 PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object() sql注入【sql injection】

通过改变sql语句行为对数据库或者页面的其他信息进行修改。 (例如运用‘ , /等进行登录)

解决方法:屏蔽或转义特属字符

1.mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集

2.php.ini自带的方法mysql_quotes_gpc = off 3.get_magic_quotes_gpc [魔术引号](gpc:get,post,cookie) 注意

1,永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或对单引号,双引号和SQL注释符等在SQL语句中有特殊字符进行转换。转义的方法有:mysql_resl_escape_string,addslashes, 和使用PHP的魔术引号机制。

2,永远不要用户看到服务器的错误信息和错误调试代码,当出现错误时给用户一个友好的错误提示页面。

3,对一些机密数据,比如说密码等做加密保存,md5或者其他加密手段。

事务 增、删、改、事务开启【INNODB】 数据库中的事务是什么? 答:事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

事务的四个特性 1.原子性 2.一致性 3.隔离性 4.持久性 事务内部所有操作都能不出错 完成事务前所有数据状态一直 多个事务同时执行互不影响 被完成后效果持久 1.开启事务startTransaction/beginTransaction mysql_query("autocommit=1");//自动提交sql语句 mysql_query("autocommit=0");//不自动提交sql 2.执行sql 3.判断(a.【成功】commit执行 b【失败】.rollback回滚) try { $db = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); $db->beginTransaction();//开启事务start Transaction //this->db->query(start transaction); mysql_query("autocommit=0");//不自动提交sql

$a = $db->exec("insert into users (id, username, password) values ('', 'Joe', 'Bloggs')"); //执行sql语句

} if($a == false) { throw new Exception("sql1执行失败"); } $b = $db->exec("insert into users (id, username, password,kkk) values ('', 'Joe', if($b == false) { throw new Exception("sql2执行失败"); } $db->commit(); $db = null; 'Bloggs')");

catch (Exception $ex) { echo $ex; $db->rollback();//回滚 } 预处理 插入 $db = new PDO('mysql:host=localhost;dbname=test', 'root', '');

$stmt = $db->prepare("INSERT INTO user (username, password) VALUES (:name, :value)");

$stmt->bindParam(':name', $name);

$stmt->bindParam(':value', $value); //插入一行 $name = 'one'; $value = '1'; $stmt->execute();//使用不同的值插入另一行 $name = 'two'; $value = '2'; $stmt->execute(); 预处理 查询 $db = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $stmt = $db->prepare("select * from user where username = :name"); $stmt->bindParam(':name', $name); $name = 'one'; $stmt->execute(); var_dump($stmt->fetchAll()); oracle $pdo= new PDO("oci:dbname=//172.19.36.13:1521/o9i",shao,shao); $sql="select table_name as tname from user_tables"; $query = $pdo->prepare($sql); $query->execute(); for($i=0; $row = $query->fetch(); $i++){ #print_r($row); echo $i." - ".$row[0]."<br/>"; echo $i." - ".$row['TNAME']."<br/>"; }

缓存

Memcache

是一个软件(memcached),用来管理内存空间,可以利用php的memcache扩展来操作这个软件而管理内存空间。可以同时连接多台服务器。

优点:操作简单,分布式 启动memcache的服务 1.下载memcached, /memcached/ ; 2.解压,比如放在 D:\memcached-1.2.1 ; 3.DOS下输入‘D:\memcached-1.2.4\memcached.exe -d install’,进行安装(注意‘’不要输入);

4.再次输入‘D:\memcached-1.2.4\memcached.exe -d start’启动memcached。 注意:memcached以后会随机启动。这样memcached就已经安装完毕了。

$memcache = new Memcache; $memcache->addServer('172.19.5.199',11211); $memcache->addServer('172.19.5.13',11211);

//$memcache->connect('localhost', 11211) or die ("Could not connect"); //$version = $memcache->getVersion(); //echo "Server's version: ".$version; $memcache->set('key3',array(1,2,3)); var_dump($memcache->get('key3')); Memcached::add — 向一个新的key下面增加一个元素 Memcached::addByKey — 在指定服务器上的一个新的key下增加一个元素 Memcached::addServer — 向服务器池中增加一个服务器 Memcached::addServers — 向服务器池中增加多台服务器 Memcached::append — 向已存在元素后追加数据 Memcached::appendByKey — 向指定服务器上已存在元素后追加数据 Memcached::cas — 比较并交换值 Memcached::casByKey — 在指定服务器上比较并交换值 Memcached::__construct — 创建一个Memcached实例 Memcached::decrement — 减小数值元素的值 Memcached::delete — 删除一个元素 Memcached::deleteByKey — 从指定的服务器删除一个元素 Memcached::fetch — 抓取下一个结果 Memcached::fetchAll — 抓取所有剩余的结果 Memcached::flush — 作废缓存中的所有元素 Memcached::get — 检索一个元素 Memcached::getByKey — 从特定的服务器检索元素 Memcached::getDelayed — 请求多个元素 Memcached::getDelayedByKey — 从指定的服务器上请求多个元素 Memcached::getMulti — 检索多个元素 Memcached::getMultiByKey — 从特定服务器检索多个元素 Memcached::getOption — 获取Memcached的选项值 Memcached::getResultCode — 返回最后一次操作的结果代码 Memcached::getResultMessage — 返回最后一次操作的结果描述消息 Memcached::getServerByKey — Map a key to a server Memcached::getServerList — Get the list of the servers in the pool Memcached::getStats — Get server pool statistics Memcached::getVersion — Get server pool version info Memcached::increment — Increment numeric item\'s value Memcached::prepend — Prepend data to an existing item Memcached::prependByKey — Prepend data to an existing item on a specific server Memcached::replace — Replace the item under an existing key Memcached::replaceByKey — Replace the item under an existing key on a specific Memcached::set — Store an item Memcached::setByKey — Store an item on a specific server Memcached::setMulti — Store multiple items Memcached::setMultiByKey — Store multiple items on a specific server server

Memcached::setOption — Set a Memcached option memcache分布式两种方法 memcache的类【memcached-client.php】 1.在php.ini中修改以下配置 session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211" 2.引入+实例化+方法【memcached-client.php】

采集

简述信息采集原理,以及常用的函数。 原理: 要获取其他网站的数据首先要获取网页内容,然后在网页内容中提取我们需要的数

要获取网站数据可以通过程序获取网站源码,然后通过正则表达式匹配出所需数据据。

保存到数据库中。

1.file系列函数:函数file_get_contents(),fsockopen(),fopen(),curl系列函数等。 preg_match_all — 进行全局正则表达式匹配

2.snoopy

fetch($URI)

这个方法是抓取网页的内容,$URI 是要抓取网页的网址,抓取过来结果存储到 $this->results。如果你抓取的是框架,这每个 frame 都会被抓取,结果会保存到一个数组中。

fetchtext($URI) 这个方法和 fetch() 是大致相同,只是它的结果是文本,除去 HTML 标签和其他fetchform($URI) 这个方法只返回抓取的网页上 form 元素。 fetchlinks($URI) 这个方法只返回抓取的网页上的链接,默认返回的链接都是含有域名的链接。 submit($URI,$formvars) 这个方法提交一个表单到指定的 $URI。$formvars 是要传递的 form 变量数组。 submittext($URI,$formvars) 这个方法和 submit() 基本一致,但是它返回的是文本,除去了 html 标签和其他submitlinks($URI) 这个方法返回的是链接。 无关信息。 无关数据。

<form action=""><input type="submit" name="name1"><input type="submit" name ="name2"></form>

区分两个submit的方法

include 'Snoopy.class.php'; $snoopy = new Snoopy();

$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; //伪装浏览器

$snoopy->referer = ""; //伪装来源页地址

$snoopy->fetch('/news/index.html');//抓取指定的网页 $snoopy->cookies = array('c'=>'cvvvv');//提交cookie值 //$snoopy->fetchtext($url); //除去 HTML 标签和其他无关信息 //$snoopy->fetchform($url); //返回抓取的网页上 form 元素 //$snoopy->fetchlinks($url); //抓取的网页上的链接 $snoopy->_submit_method = 'GET';//表单提交方式 $snoopy->submit('/3.php',array('user'=>'admin'));//提交表单到$url。$formvars是要传递的变量数组,例:array('user' =>'admin','pwd' => 'admin');

//$snoopy->submittext('/3.php',array('user'=>'admin'));//同submit,只是去除HTML标签和无关信息

//$snoopy->submitlinks('/3.php',array('user'=>'admin'));//返回链接

$data = $snoopy->results; echo $data;//打印取到的所有结果 3.curl(fsockopen也可以模拟登录哦。。) 它是一个模仿浏览器发出请求的工具,浏览器能做什么它基本就能做什么 function_exists('curl_init');//判读curl扩展是否打开 利用curl如何实现模拟登录 header('content-type:text/html;charset=utf-8'); $ch = curl_init(); $post_data = array( 'user_name' => 'bawei', 'user_psd' => '123456a',

CURLOPT_URL, ); //curl_setopt($ch,

'/easyphp/index.php?c=user&a=login');

curl_setopt($ch, CURLOPT_URL, '/easyphp/index.php?c=personal&a=order');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置curl的选项

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); if (isset($_COOKIE['cookie_jar']) && is_file($_COOKIE['cookie_jar'])) { //curl会话从指定的文件读取cookie信息 } curl_setopt($ch, CURLOPT_COOKIEFILE, $_COOKIE['cookie_jar']);

else{

//在指定目录创建一个唯一的文件,并将该文件的路径名返回使用$cookie_jar变量接收

$cookie_jar = tempnam('d:\wamp\www\vo', 'cookie');

//将cookie文件名作为变量传递给curl会话,这样curl产生cookie的信息自动存入该文件

} $content = curl_exec($ch); curl_close($ch); echo $content; curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar); //将cookie文件作为变量存入cookie setcookie('cookie_jar', $cookie_jar);

页面静态化

ob_start(); $static_file = '1.html';//静态页面 $php_file = basename(__FILE__);//当前动态页面 if (!file_exists($static_file) || ((filemtime($static_file)+10) < time()) || //缓存固定时间 filemtime($php_file) > filemtime($static_file)) //源文件已修改 { echo '静态页面示例'; echo 'erer'; $c = ob_get_contents(); ob_clean(); file_put_contents($static_file, $c);//将一个字符串写入文件 } $s = file_get_contents($static_file);//将整个文件读入一个字符串 echo $s;

-------------------------------------------------

ob_implicit_flush($p) $p:0:关闭 1:开启(每次输出后都自动刷新,而不再需要去调用flush())

ob_list_handlers 列出所有使用的输出句柄 output_add_rewrite_var output_add_rewrite_var('var', 'value'); echo '<a href="file.php">link</a>'; 输出:<a href="file.php?var=value">link</a> output_add_rewrite_var('var', 'value'); echo '<a href="file.php">link</a>';//输出:<a href="file.php?var=value">link</a> ob_flush(); output_reset_rewrite_vars(); echo '<a href="file.php">link</a>';//输出:<a href="file.php">link</a> output_reset_rewrite_vars

伪静态【伪静态是apache的重写技术与php无关】

首先:

必须要空间支持 Rewrite (Apache的重写技术)以及对站点目录中有 .htaccess 的文件解析,才有效.

如何让空间支持Rewrite 和 .htaccess 的文件解析呢 往下看

第一步:在apache的主配置文件httpd.conf中加载mod_rewrite模块

#LoadModule rewrite_module modules/mod_rewrite.so 改为 LoadModule rewrite_module modules/mod_rewrite.so 第二步: 使.htaccess分布式配置文件其作用 在虚拟主机的配置文件中加入如下 <Directory "d:\wamp\www\test"> AllowOverride All//允许用分布式配置文件(.htaccess)修改主配置文件的信息 </Directory>

第三步:保存重启apache。

ok。 其次是.htaccess的书写规则【分布时配置文件】:

(.htaccess是Apache允许在浏览器端得设置,只对本目录和子目录有效【最近原

则】)

<IfModule mod_rewrite.c> #重写机制的开关 RewriteEngine On #重写url的规则 RewriteRule index.html index.php </IfModule> .htaccess加入以下内容 RewriteEngine On//打开重写机制

RewriteBase /

RewriteRule ^(.*)list-id([0-9]+)\.html$ $1/company/search.php?sectorid2=$2 //重写规则,用**代替**

RewriteRule ^(.*)cominfo-([a-z0-9]+)\.html$ $1/member/index.php?uid=$2&type=cominfo RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1/plus/list.php?typeid=$2&PageNo=$3 RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.lujin\.com$ RewriteCond %{HTTP_HOST} !^(www|bbs)\.lujin\.com$ RewriteRule ^/?$ /%{HTTP_HOST} RewriteRule ^/([a-z0-9\-]+)\.lujin\.com/?$ /member/index.php?uid=$1 [L] 对上面的一些解释 RewriteRule ^(.*)list-id([0-9]+)\.html$ $1/company/search.php?sectorid2=$2 这条是把企业库的分类进行伪静态处理 原先假设访问地址为/company/search.php?sectorid2=1 现在地址为/list-id1.html

优点:1、伪静态处理加速搜索引擎收入 2、地址映射到根目录,增加权重,提高排名

RewriteRule b/([0-9]*).html$ b.php?id=$1 /b/11.html --> htpp:///b.php?id=11

RewriteEngine on RewriteCond %{HTTP_HOST} !^ [NC] RewriteRule ^/(.*) / [L] -------- RewriteEngine on RewriteRule ^/test([0-9]*).html$ /test.php?id=$1 RewriteRule ^/new([0-9]*)/$ /new.php?id=$1 [R] 3、mod_rewrite 规则修正符 1) R 强制外部重定向 2) F 禁用URL,返回403HTTP状态码。 3) G 强制URL为GONE,返回410HTTP状态码。 4) P 强制使用代理转发。 5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。 6) N 重新从第一条规则开始运行重写过程。 7) C 与下一条规则关联8) T=MIME-type(force MIME type)强制MIME类型 9) NS 只用于不是内部子请求 10) NC 不区分大小写 11) QSA 追加请求字符串 12) NE 不在输出转义特殊字符 \%3d$1 等价于 =$1 RewriteRule b/([a-z]*)/([0-9]*).html$ b.php?name=$1&id=$2

ThinkPHP2.0

入口文件配置

define('STRIP_RUNTIME_SPACE', false);生成的~runtime.php文件是否去空白和注释

define('NO_CACHE_RUNTIME', true);不生成核心缓存文件 查询 按照id排序显示前6条记录 $Form $list = = M("Form"); $Form->order('id desc')->limit(6)->select(); 取得模板显示变量的值 $this->assign('tt', 'vvvvvvvvvvvv'); echo $this->get('tt')

成功失败提示页 if(false !==$Form->add()) { $this->success('数据添加成功!'); }else{ $this->error('数据写入错误'); }

实例化model

1.$brand_model = new model();

调用框架里的model

2.$brand_model = common::getmodel('brand');//可以防止多次实例化一个模型 自动验证 array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间) 验证规则:require 字段必须、email 邮箱、url URL地址、currency 货币、number

Model:: MODEL_INSERT 或者1新增数据时候验证

Model:: MODEL_UPDATE 或者2编辑数据时候验证

Model:: MODEL_BOTH 或者3 全部情况下验证(默认)

protected $_validate = array(

array('verify','require','验证码必须!'), //默认情况下用正则进行验证 数字

array('name','','帐号名称已经存在!',0,’unique’,1), // 在新增的时候验证name字段是否唯一

array('value',array(1,2,3),'值的范围不正确!',2,’in’), // 当值不为空的时候判断是否在一个范围内

array('repassword','password','确认密码不正确',0,’confirm’), // 验证确认密码是否和密码一致

array('password','checkPwd','密码格式不正确',0,’function’), // 自定义函数验证密码格式

);

apache多域名配置

NameVirtualHost *:80 Alias /php/ "f:/php/" <Directory "f:/php/"> Options Indexes Order allow,deny 配置虚拟主机 1.在C:\Windows\System32\drivers\etc\hosts中增加一个域名解析 2.在D:\wamp\bin\apache\apache2.2.8\conf\httpd.conf中配置apache的虚拟主机 Allow from all </Directory> <VirtualHost *:80>

DocumentRoot F:/php ServerPath F:/php ServerAlias ServerName </VirtualHost> <VirtualHost *:80> ServerName ServerAlias ServerPath F:/php2 DocumentRoot F:/php2 <Directory "F:/php2"> Options Indexes Order allow,deny Allow from all </Directory> </VirtualHost>

文件上传

/* $_FILES['pic']['error'] 0:上传成功 1:上传文件大小超出upload_max_filesize大小 2:上传文件超出页面MAX_FILE_SIZE元素设置大小 3:表示文件只上传了一部分 4:表示没有上传任何文件 */ is_uploaded_file();//判断当前文件是否是上传文件 $touxiang = $_FILES['touxiang']; 1.建html

<form action="" method="post" enctype="multipart/form-data" name="form1">//注意

1.post 2.enctype3.type=“file”4.提交name

<input name="MAX_FILE_SIZE" type="hidden" id="pic" value=""> <input name="pic" type="file" id="pic"> <input type="submit" name="Submit" value="提交">

<input name="action" type="hidden" id="action" value="uppic">

</form>

2,提交表单将文件上传到服务器,提交完表单时,上传到服务器的文件会先放置在临时目录中,同时会生成代表当前文件信息的$_FILES数组。

3.//判断合法性并存放到到指定位置 if($touxiang['error'] == 0) {//是否上传成功【0-5】

//允许的类型数组,可以自行增减 $types = array('image/jpeg', 'image/gif', 'image/pjpeg', 'image/png'); //允许的最大文件尺度,单位是字节 $max_size = 2000000;//2048kb//2M //如果类型和大小都匹配,则移动上传文件到指定的目录 if(in_array($touxiang['type'], $types) && $touxiang['size'] < $max_size) { //生成新的文件名,防止重名和乱码 $new_name = time().'_'.mt_rand(1000,9999).strrchr($touxiang['name'], '.'); //移动上传的文件,有临时目录,移动的指定目录 $result = move_uploaded_file($touxiang['tmp_name'], 'biaodan/'.$new_name);

//如果移动成功,则是文件名为新文件名,否则文件名为空

上传大文件 php.ini修改 upload_max_filesize = 100M //允许上传的最大文件大小 post_max_size = 100M //PHP可以接受的最大的POST数据大小 max_execution_time = 130 //每个脚本最大执行秒数 max_input_time = 130 //每个脚本用来分析请求数据的最大时间 memory_limit = 128M //每个脚本能够使用的最大内存数量 <form action = "file_upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="img[]"> <input type="file" name="img[]"> <input type="submit"> </form> <?php var_dump($_FILES); > 输出内容 if($result) { $filename = $new_name; } else { $filename = ''; } } } is_uploaded_file判断一个文件是否是post上传的文件 move_uploaded_file移动上传的文件到指定目录 多文件上传

array[img]{array[name]=>array(filename1,filename2), } array[size]=>array( , ), array[error]=>array( , ), array[tmp_name]=>array( , ), array[type]=>array( , ),

php优化

如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。 echo is faster than print. echo 比 print 快。 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。 注销那些不用的变量尤其是大数组,以便释放内存。 尽量避免使用__get,__set,__autoload。 require_once()代价昂贵。 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。 str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。 用@屏蔽错误消息的做法非常低效。 数据库连接当使用完毕时应关掉。 $row[‘id’]的效率是$row[id]的7倍。

尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。 递增一个全局变量要比递增一个局部变量慢2倍。 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。 仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码(OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它

们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

gd(对图片的处理)【校验码,缩略图,水印】

打开gd库(在php.init 中)

打印文字 Header('Content-type: image/png'); $height = 300; $width = 300; //新建一个真彩色图像 $im = ImageCreateTrueColor($width, $height); //为一幅图像分配颜色 $white = ImageColorAllocate ($im, 255, 255, 255); $blue = ImageColorAllocate ($im, 0, 0, 64); //区域填充 (即与 x, y 点颜色相同且相邻的点都会被填充) ImageFill($im, 0, 0, $blue); //划一条线 ImageLine($im, 0, 0, $width, $height, $white); //输出字符 ImageString($im, 4, 80, 150, '', $white); //输出中文 $font="C://WINDOWS//Fonts//simhei.ttf"; imagettftext($im,15,0,10,20,$white,$font,'中华人民共和国'); ImagePng ($im); ImageDestroy($im); 水印文字 header("Content-type: image/jpeg"); $pic=imagecreate(80,30);// 新建一个基于调色板的图像 $black=imagecolorallocate($pic,255,0,0);//为一幅图像分配颜色 $white=imagecolorallocate($pic,255,255,255); $font="simhei.ttf";//文字类型 $str ='水印文字??'; imagettftext($pic,10,0,10,20,$white,$font,$str);//用 TrueType 字体向图像写入文本 $filename='photo.jpg'; $im=imagecreatefromjpeg($filename); imagecopymerge($im,$pic,0,0,0,0,80,30,50);//并且可以设置透明度。 imagejpeg($im);//输出 imagejpeg($im,路径)//保存图片 ImageDestroy($im);//销毁图片资源 水印图片

缩略图 header("Content-type: image/jpeg"); $ia = getimagesize('photo.jpg');//取得图像大小 var_dump($ia); $image_p = imagecreatetruecolor(20, 20);//新建一个真彩色图像 $image = imageCreateFromJpeg('photo.jpg');//从 JPEG 文件或 URL 新建一图像 //合并缩略图 imagecopyresampled($image_p, $image, 0, 0, 0, 0, 20, 20, 209, 130); /*

bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

$dst_x 目标x坐标

$dst_y 目标y坐标

src_x 源图像x坐标 src_y 源图像y坐标 dst_w 目标图像宽度 dst_h 目标图像宽度 src_w 源图像宽度 src_h 源图像高度 */ imageJpeg($image_p, 'temp.jpg', 100);//以 JPEG 格式将图像输出到浏览器或文件 ImageDestroy($image);//销毁图像资源

FCKedit

默认的FCK设置是会去掉<HTML></HTML><BODY></BODY>标签,而且会给你加上<P></P>标签的,如果需要保留的话,只要更改下设置可以了。

在fckconfig.js里面有

FCKConfig.FullPage = false ; 改为 FCKConfig.FullPage = true; 如果想去掉自动添加<P>的代码就可以在这里设置 默认是 FCKConfig.EnterMode = 'p' ; // p | div | br FCKConfig.ShiftEnterMode = 'br' ; // p | div | br \editor\filemanager\connectors\php\config.php 配置文件 $Config['Enabled'] = true ; 开启文件上传 \editor\filemanager\connectors\php\io.php 按日期产生新文件名,修改方法 SanitizeFileName() $s = $sNewFileName;

$ext = strrchr($s,'.'); $fn = date('YmdHis').$ext;//新文件名 return $fn; php include("./fckeditor.2.6/fckeditor.php") ;//引入文件 $oFCKeditor = new FCKeditor('FCKeditor1') ;//实例化fck $oFCKeditor->BasePath = '/fckeditor.2.6/' ;//设置属性 $oFCKeditor->Width = 500; $oFCKeditor->Height = 300; $oFCKeditor->Value = '' ;//默认文本框的文字 $oFCKeditor->Create() ;//直接输出 echo $oFCKeditor->CreateHTML() ;//返回输出 javascript <script type="text/javascript" src="./fckeditor.2.6/fckeditor.js"></script> <script> var oFCKeditor = new FCKeditor( 'FCKeditor2' ) ; oFCKeditor.BasePath = '/fckeditor.2.6/'; //oFCKeditor.Config['CustomConfigurationsPath'] = sBasePath + '_samples/html/sample14.config.js' ; oFCKeditor.Height = 300 ; oFCKeditor.Value = 'aaaaaaaaaaaaaa' ; oFCKeditor.Create() ; </script>

Sphinx/Coreseek

特性

高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);

高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒); 可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可处理100 M 文档);

提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;

支持分布式搜索; 提供文档片段(摘要以及高亮)生成功能; 可作为MySQL的存储引擎提供搜索服务; 支持布尔、短语、词语相似度等多种检索模式; 文档支持多个全文检索字段(缺省配置下,最大不超过32个); 文档支持多个额外的属性信息(例如:分组信息,时间戳等); 支持单一字节编码和UTF-8编码,以及对GBK和BIG5的完善支持; 支持英语、俄语词词干化和Soundex,以便进行词形学处理; 原生的MySQL支持(同时支持MyISAM 和InnoDB ); 原生的PostgreSQL 支持;

支持直接模拟为MySQL服务端运行; 支持MMSeg分词引擎,用户可自定义词典; Python数据源支持 发布包包含功能 indexer: 用于创建全文索引; search: 一个简单的命令行(CLI) 的测试程序,用于测试全文索引; searchd: 一个守护进程,其他软件可以通过这个守护进程进行全文检索; sphinxapi: 一系列searchd 的客户端API 库,用于流行的Web脚本开发语言(PHP, Python, Perl, Ruby, Java).

spelldump: 一个简单的命令行工具,用于从 ispell 或 MySpell (OpenOffice内置绑定) 格式的字典中提取词条。当使用 wordforms 时可用这些词条对索引进行定制.

indextool: 工具程序,用来转储关于索引的多项调试信息。 此工具是从版本Coreseek 3.1(Sphinx 0.9.9-rc2)开始加入的。

if ( $result === false ) { echo "Query failed: " . $cl->GetLastError() . ".\n"; } else { 建立索引 indexer -c sphinx.conf --all 启动服务 searchd -c sphinx.conf 检索 search -c sphinx.conf number //检索所有数字 search --filter group_id 2 //限定group_id 为2 返回一条记录 mmseg: 工具程序和库,Coreseek用于提供中文分词和词典处理。 php检索 include('sphinxapi.php'); $cl = new SphinxClient(); //设置sphinx服务器地址与端口,如果是本机则可以为localhost $cl->SetServer( "192.168.16.6", 9312 ); //以下设置用于返回数组形式的结果 $cl->SetArrayResult ( true ); //$cl->SetMatchMode( SPH_MATCH_ANY );//匹配模式 //$cl->SetFilter( 'group_id', array( 2 ) ); $result = $cl->Query( '研究生创业', 'test1' ); //参数 关键字 索引名

if ( $cl->GetLastWarning() ) { } echo "WARNING: " . $cl->GetLastWarning() . ""; } echo '<pre>'; print_r( $result ); sphinxse CREATE TABLE t1 ( id INTEGER UNSIGNED NOT NULL, weight INTEGER NOT NULL, query VARCHAR(3072) NOT NULL, group_id INTEGER, INDEX(query)

) ENGINE=SPHINX CONNECTION="sphinx://127.0.0.1:9312/indexName";

select d.id,d.title,d.content from t1 join documents as d on t1.id = d.id and t1.query = '研究生创业';

错误: 建立索引时报错:FATAL: failed to open var/data/mysql.spl: No such file or directory, will not index. Try --rotate option

原因:把csft.conf里的路径改成绝对路径就可以啦

抓取页面数据 $str = file_get_contents('/news/index.html'); $p = "/<ul class=\"new_ul55\">.*<\/ul>/sU"; preg_match_all($p, $str, $a); var_dump($a); 常用函数 日期 Date date_default_timezone_set("PRC"); date("Y-m-d H:i:s"); time(); date('t',strtotime(2006-02-21))//返回月份的天数 date("Y-m-d H:i:s",time()+3600) ini_set('date.timezone', 'PRC'); msec sec microtime() 以秒返回时间戳 explode(' ', microtime())

$mtime = explode(' ', microtime()); $s = $mtime[1] + $mtime[0]; number_format($s,5);//保留5位小数 getDate()函数:返回日期的"日"部分,值为1~31。

getDay()函数:返回星期几,值为0~6,其中0表示星期日,1表示星期一,...,6表示星期六。例:

getFullYear() 返回四位数年份值 2010 getHouse() 函数:返回日期的"小时"部分,值为0~23。 getMilliseconds() 取得毫秒数 getMinutes函数:返回日期的"分钟"部分,值为0~59。 getTime(); 返回自19xx年1月1日至今毫秒数 getTimezoneOffset() 返回当前时区 以分钟计 -getTimezoneOffset()/60 getUTCDate() 返回utc(世界标准时间)日期值 getUTCDay()返回utc(世界标准时间)星期值 getUTCFullYear()返回utc(世界标准时间)四位数年份值 getUTCHours() 返回utc(世界标准时间)小时值 getUTCMilliseconds() utc毫秒数 getUTCMinutes() utc分 getUTCMonth()utc月 getUTCSeconds()utc秒 getYear()返回年份 parse 返回自1970.1.1号至解析的日期的毫秒数 Date.parse('Thu Sep 29 16:47:39 UTC+0800 2010')

setDate 设置日期

setFullYear 设置年份 setHours 设置小时 setMilliseconds 设置毫秒 toGMTString 返回utc字符串描述Thu, 30 Sep 2010 08:55:06 UTC toLocaleDateString() 返回日期的本地系统字符串描述,只返回日期 20xx年9

toLocaleString() 返回日期的本地系统字符串描述,日期和时间 20xx年9月30月30日

日 16:57:27

toLocaleTimeString() 返回时间的本地系统字符串描述,只显示时间,16:58:20

toString 返回日期时间的字符串描述Thu Sep 30 16:59:27 UTC+0800 2010 toTimeString 返回时间的字符串描述 toUTCString 返回日期时间的UTC字符串描述,等同于toGMTString

UTC 返回自1970.1.1日至解析的日期的毫秒数,必须跟参数 Date.UTC(2005,7,8)

valueOf 返回自1970.1.1日至解析的日期的毫秒数 1285837416531

{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"} %Y年%m月%d日 乱码 <!--{$smarty.now|date_format:"%Y年%m月%d日 %H时%M分%S秒"}-->

修改插件:plugins/modifier.date_format.php $format = mb_convert_encoding($format,'gbk','utf-8'); return mb_convert_encoding(strftime($format, $timestamp),'utf-8','gbk'); 数组:【重点1】 implode(分隔,str) 把数组值数据按指定字符连接起来 explode([分隔],arr)按指定规则对一个字符串进行分割,返回值为数组 count(arr) 计算数组中的单元数目或对象中的属性个数 is_array(arr) 检测变量是否是数组 sort(arr) 对数组排序 array_unique(arr)移除数组中重复的值 array_push(arr,str) 将一个或多个单元压入数组的末尾(入栈) array_flip(arr) 交换数组中的键和值 key(arr)返回数组中当前元素的键名 reset(arr)数组的内部指针指向第一个单元 array_chunk() 将一个数组分割成多个 array_search() 在数组中搜索给定的值,如果成功则返回相应的键名 array_merge()合并一个或多个数组 array_combine() 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值

array_values()返回数组中所有的值

array_keys() 返回数组中所有的键名 字符串:【重点2】 explode(分隔,str)按指定规则对一个字符串进行分割,返回值为数组 implode(分隔,str) 把数组值数据按指定字符连接起来 trim(str) 消除字符串两边的空格 substr(str,start,length) 截取指定字符串中指定长度的字符 str_replace(search,replace,str) 字符串替换 ucfirst(str) 将字符串第一个字符大写 ucwords(str) 将字符串每个字的第一个字母大写 strpos(str,search) 查找字符串中某字符第一次出现的位置 strchr 取某字符最后出现的位置 strlen(str) 取字符串长度 strcmp(str1,str2)函数用来对两个字符串进行比较 strstr(str,search)函数用于获取一个指定字符串在另一个字符串中首次出现的位置到后者末尾的子字符串。

substr_count()函数检索子串出现的次数

implode() 一维数组变字符串 serialize()数组序列化 unserialize()反序列化

file_exists ()判断一个文件是否存在 file_exists — 检查文件或目录是否存在 file_get_contents — 将整个文件读入一个字符串 file_put_contents — 将一个字符串写入文件 serialize — 产生一个可存储的值的表示 ( 序列化数据成为字符串) unserialize — 从已存储的表示中创建 PHP 的值(对字符串反序列化) mkdir 自动创建目录 is_dir 判断文件名是否是一个目录 date — 格式化一个本地时间/日期 append() 追加所有匹配的元素。 remove() 删除所有匹配的元素。 array_key_exists — 检查给定的键名或索引是否存在于数组中 isset() 变量是否存在 empty() 检查一个变量是否为空 method_exists($obj, $method) 判断对象的方法是否可用 file_exists($file) 判断文件是否存在 class_exists($class_name);检查类是否已定义 gettype();获取数据类型 set_magic_quotes_runtime() 0 for off, 1 for on 当遇到反斜杆、单引号,将会自动加上一个反斜杆,保护系统和数据库的安全

string getcwd ( void ) 取得当前工作目录

mb_internal_encoding('utf-8')

DIRECTORY_SEPARATOR win \, Linux /

spl_autoload_register(array('Common','autoload'));注册Common类的autoload为__autoload功能相同的方法

随机取一个中文 $str = '中华人民共和国'; $length = mb_strlen($str,'utf-8'); $rand = mt_rand(0, $length)-1; echo mb_substr($str,$rand,1,'utf-8'); smarty保留变量 iteration 总是从 1 开始,每执行一次增加 1 intval获取变量的整数值 smarty内建函数 capture config_load foreach,foreachelse include include_php insert if,elseif,else ldelim,rdelim

literal php section,sectionelse strip 数据库:【重点3】 mysql_connect(主机,用户名,密码) 打开一个到 MySQL 服务器的连接 mysql_select_db(数据库,连接数据库资源) 选择 MySQL 数据库 mysql_query("set names utf8");设定字符集 mysql_close(连接数据库资源) 关闭 MySQL 链接 mysql_query(语句) 发送一条 MySQL 查询 mysql_fetch_row(结果资源)从结果集中取得一行结果(索引数组) mysql_fetch_assoc(结果资源)从结果集中取得一行结果(关联数组) mysql_fetch_array(结果资源)从结果集中取得一行结果(索引/关联数组) mysql_fetch_object(结果资源)从结果集中取得一行结果(对象数组) mysql_free_result(结果资源)释放结果集 mysql_num_rows(结果资源)用于计算查询结果中所得行的数目 mysql_affected_rows()获得受影响的结果数目【insert,update,delete】 mysql_insert_id()传回最后一次使用 INSERT 指令产生的自动增长 ID 值 mysql_result(结果集,记录数,栏位名称)

php初级知识点

第一单元【php入门】

1.php简单概述

2.b/s与c/s简单比较,区别:

--a、运行环境不同(广域网、局域网) --b、安全级别不同(低/高) --c、用户群不同(全部用户/局部用户) --d、系统升级不同(无缝升级/整体升级) --e、用户开启不同(浏览器/特制软件) --f、软件界面特点不同(信息流/用户体验) 比如:b/s就是网上的微博、博客;c/s就是在网吧打的网络游戏(奇迹、传奇等) 3.php是什么:运行在服务器端的脚本语言 --Hypertext Preprocessor --personal home page 4.php语言能做什么 --图形化用户界面程序 --服务器端运行脚本程序 5.简单特点: --a、大小写(自己定义的类名和函数名是不区分的) --b、分号 --c、程序的注释 6.wamp集成环境安装

******************************************************************************

******************************************************************************

第二单元【php语法基础】

1.变量的定义

--美元符号"$"加上变量名称,例如$str。 --变量名称命名规则:是由字母和下划线开始,后接任意数量的字母、数字、下划线 --变量名是区分大小写的。 2.可变变量 例如: $a = "hello"; 则$$a 和 $hello 同理0 九大超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量 $GLOBALS — 引用全局作用域中可用的全部变量 $_SERVER — 服务器和执行环境信息 $_GET — HTTP GET 变量 $_POST — HTTP POST 变量 $_FILES — HTTP 文件上传变量 $_REQUEST — HTTP Request 变量 $_SESSION — Session 变量 $_ENV — 环境变量 $_COOKIE — HTTP Cookies 3.数据类型: 四个标量类型(int,string,float,boolean) 两个复合类型(array,object) 两个资源类型(resource,NULL) 4.什么是常量 常量的值是固定的,不能随便变化的,例如圆周率、系统里边的用户名、密码等

5.常量名的命名规则

没有美元符号"$",名字的命名规则和变量名一样,按照习惯都是大写的

6.常量的定义

define('CIRCLE',3.14159);

defined('CIRCLE');//判断是否有定义常量CIRCLE

7.常量的使用,直接引用

例如可以这样使用上边的变量echo CIRCLE;

还可以使用php系统里边自带的常量例如

echo __FILE__;

echo __LINE__;

8.变量和常量的区别

a.常量前面没有美元符号($);

b.常量只能用 define( ) 函数定义,而不能通过赋值语句; 等。

c.常量可以不用理会变量范围的规则而在任何地方定义和访问; d.常量一旦定义就不能被重新定义或者取消定义; e.常量的值只能是标量类型。 php中变量的来源 1。函数分配 2.conf配置文件加载的 3.$smarty.保留变 {$smarty.now} {$smarty.const} {$smarty.capture} {$smarty.config} {$smarty.section}, {$smarty.foreach} {$smarty.template} 9.php外部变量$_POST[]、$_GET[],$_cookie; 13.代码重用(include,require,include_once,require_once) 15.运算符(算术、递增/递减、比较、逻辑、位、其他) 特殊运算符 '.' 是连接符 ".=" 是连接赋值 "@" 屏蔽错误信息 $link=@mySQl_connect(主机,用户名,密码) 'image' => "@d:\web\test\ss.php";@表示下面是一个文件而不是字符串 "?:" 三目运算符 16.流程控制(顺序、选择、循环) 17.修饰变量常用的方法和说明 capitalize 首字母大写

count_characters:true/false 变量中的字符串个数。如果后面有参数true,则空格也被计算。否则忽略空格

cat:"characters" 将擦头离得字符串加到制定字符串后面

函数

认值 date_format:"%Y-%M-%D" 格式化日期和时间。等同于php中的strftime()default:"characters" 设置默认值。当变量为空时,将使用default后面的默

escape:"value" 用于字符串转码。value可以为:html,htmlall,url,quotes,hex,hexentity,和javascript。默认为html

lower

n12br 将变量字符串小写 所有的换行符将被替换成<br/>,功能与php中的n12br()

函数一样

regex_replace:"parameter1":"value2" 正则替换。用value2替换所有符合parameter1标准的字串

string_format:"value" 使用value来格式化字符串。例如value为%d则字符串被格式化为十进制数

strip 使用一个空格或指定字符串来替换所有的重复空白符

upper 将变量改变为大写

******************************************************************************

第三单元【数组】

定义:具有相同类型和名称的变量的集合。 1.数组按照键名分索引和关联 2.数组赋值方式(一维、二维) 3.遍历数组方式: 遍历定义:沿着一定的路线,依次对数组里边的每个元素做一次且仅做一次访foreach while/list/each while(list(键名变量,值名变量)=each(数组)){ } $_arr[] = "a"; $_arr[] = "b"; $_arr[] = "c"; $_arr[] = "d"; for($i=0; $i<count($_arr); $i++){ echo $_arr[$i]; 问。 } 4.数组和栈的操作 array_push(目标数组,字符串)将字符串压入数组的最后 array_pop(目标数组)将数组最后的元素弹出并返回 5.数组和队列的操作 array_unshift(目标数组,字符串)将字符串放到数组的开始位置 array_shift(目标数组)删除数组的第一个元素并返回 6.数组和指针的操作key() current() next() prev() reset() end() 7.数组常用函数count()、array_sum()、in_array()、extract()、 array_unique()、sort()、rsort()、array_flip() print_r() is_array() isset()检查变量是否被定义 empty()检查变量是否为空 unset()删除变量 8.了解函数 array_change_key_case(目标数组,型态常数)

会将目标数组索引值中所有字符串索引的英文字母转换为大写或小写CASE_UPPER/CASE_LOWER

array_chunk()分隔数组 以指定的个数分割

array_count_values()计算目标数组中各值出现次数

array_filter()利用指定的函数挑选数组元素 数组的合并 array_merge() Array_merge_recursive() 差集Array_diff() Array_diff_assoc()

交集array_intersect() Array_intersect_assoc() 9.预定义数组($_GET $_POST $_FILES $_COOKIE $_SESSION) 第四单元【字符串】 字符串:由0个或多个字符组成的有限序列。 1.字符串的三种定义方式(单引号、双引号、定界符) ---单引号定义(转义\'和\\) ---双引号定义(转义\n \r \t \$ \\ \") ---定界符方法,< < <eof 2.函数部分 explode/implode substr()** str_replace/trim/ltrim/rtrim strchr(str, search)获得指定字符串最开始出现到最后的内容 strrchr(str, search)获得指定字符串最后出现到最后的内容 strpos(str, search)获得指定字符串最开始出现的位置 strrpos(str, search)获得指定字符串最后出现的位置 ucfirst(str)将字符串第一个字母大写 ucwords(str)将字符串的每个单词的第一个字母大写 strlen(str)获得字符串长度 strcmp(str1, str2)比较两个字符串大小, 返回负数表示 str1 小于 str2; 返回正数表示 str1 大于 str2; 返回零表示二字符串相同 strtr()字符串翻译 --strtr(str, mode, replace) --strtr(str,array) strtolower 将字符串转化为小写 strtoupper 将字符串转化为大写 parse_url(str)解析完整的url转变为为数组 parse_str(str,out)解析请求字符串转变为数组 htmlspecialchars()转换html代码为实体代码 printf/sprintf %b %d %c %x %s %f %X printf(格式化内容,具体信息); printf("%d%b%c",10,20,10) – b 整数转成二进位。 – c – d – f – o – s 整数转成对应的 ASCII 字符。 整数转成十进位。 ** 单倍精确度数字转成浮点数。 ** 整数转成八进位。 转成字符串。 **

– x – X 整数转成小写十六进位。 整数转成大写十六进位。 第七单元【php连接mysql】 *mysql_connect(主机,用户名,密码) 打开一个到 MySQL 服务器的连接 *mysql_select_db(数据库,连接数据库资源) 选择 MySQL 数据库 *mysql_query("set names utf8");设定字符集 *mysql_close() 关闭 MySQL 链接 *mysql_query(语句) 发送并执行一条sql语句 *mysql_fetch_array(结果资源)从结果集中取得一行结果(索引/关联数组) mysql_fetch_row(结果资源)从结果集中取得一行结果(索引数组) mysql_fetch_assoc(结果资源)从结果集中取得一行结果(关联数组) mysql_fetch_object(结果资源)从结果集中取得一行结果(对象) mysql_errno()返回错误号码 *mysql_error()返回错误信息 *mysql_affected_rows()获得受影响的结果数目【增、删、改、查】 *mysql_num_rows(结果资源)用于计算查询结果中所得行的数目【查】 *mysql_insert_id()传回最近一次使用 INSERT 指令产生的自动增长 ID 值 mysql_result(结果集,索引行,字段)指定获取结果 mysql_free_result(结果资源)释放结果集 mysql_num_fields(结果资源)用于计算查询结果中所得列的数目 mysql_fetch_field(结果资源)从结果集中取得列的结果,以对象形式返回 mysql_pconnect(主机,用户名,密码)永久连接数据库 第八单元【留言板】 学习留言板目的: a、复习之前学习的表单知识 b、复习之前数据库知识 c、可以对php编程有一个整体认识 本章重点: a、表单使用<form> b、数据库操作 c、post和get方式传值,$_POST $_GET d、隐藏域传值 e、外键使用 本章难点: a、外键使用 b、post和get方式传值 知识点: a、form

b、$_POST $_GET使用 c、hidden d、html标签使用 f、javascript语言应用 g、表单验证 具体实现步骤: 1.建立数据库shop,建立两张表rg_leave_word和rg_back_word(留言表和回复

rg_leave_word: 字段 数据类型 id int 主键、自增 title varchar(20) 标题 content text 内容 itime datetime 添加时间 rg_back_word: id int 主键、自增 leave_id int 外键(留言id) content text 内容 btime datetime 回复时间 2.制作添加留言表单,实现留言的添加 表)

3.留言明细页面,逐条显示留言信息

4.修改留言,对需要修改(get方式传递被删除留言id值,再利用隐藏域方式传递给接收页面)

5.留言详细显示功能,有的留言内容比较多,在明细页面不可能全部显示出来(这时利用get方式传递留言id)

6.在详细页面可以实现回复功能和回复留言展示,步骤:制作一个回复表单和接收数据页面

7.(自己实现)删除留言,对无效、无用的留言实现删除功能(这时需要用get方式传递被删除留言id值)

**************************************************************** 第九章 面向对象 为什么要用面向对象编程: 1.是一门流行语言 2.程序思想 3.框架的使用 4.模块化---易于维护 5.框架要使用面向对象 OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。 A 1.理解面向对象思想 2.理解类和对象(实例化对象) 3.类的成员属性和方法 4.对象访问成员属性和方法

类:车、灯、鱼、人、学生 对象: 车(学生甲、乙、丙、丁等)车撞树 灯(灯甲、乙、丙、丁等)灯坏了 鱼(鱼甲、乙、丙、丁等)鱼吐泡 人(张三、李四、王五、赵六、田七等)人打架 学生(学生甲、乙、丙、丁)学生迟到 B 1.实例化对象在内存中如何分配 2.对象中成员属性和方法的访问、"$this"关键字使用 3.构造方法和析构方法 构造函数:实例化对象首先第一个需要做的事情就是构造函数。一个小孩出生到5岁之前,所有的事情都是父母帮助做的,包括起名字、穿衣服、吃饭等等。__construct 析构函数:一个对象被使用完后需要做一些善后工作,这些善后工作是不需要人为干预的,例如资源释放、变量删除等。例如:一个小狗死后,主人非常爱惜它,就把它埋在了家后园的一颗树下。小狗被埋这件事情是主人做的,不是狗做的。这就是析构函数。__destruct

C 1.类的继承:

子类和父类之间的事情 B类的对象拥有A类的全部属性与行为,称作B对A类的继承 车(汽车、卡车、小轿车、客车等) 灯(台灯、灯管、路灯、灯塔等) 鱼(金鱼、鳄鱼、鲨鱼、鲸鱼、鲤鱼、刀鱼等) 人(黑人、白人、黄种人、中国人、美国人、男人、女人等) 2.oop的三大特性

1. 封装性:

也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。

于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖, 实现代码模块间松藕合。

2. 继承性:

就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。

php只支持单继承,也就是说一个子类只能有一个父类。 3. 多态性: 子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。 于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。

多态性增强了软件的灵活性。 3.类的重写

子类和父类之间的事情,就是说父类有的方法,子类不但可以直接使用,还可以在子类中

重新定义具体内容,例如有一个父亲会驾驶汽车,那么他的儿子也会驾驶汽车,但他的儿子

可以不驾驶汽车,而驾驶飞机,这就是类方法的重写。

4.类中的修饰符:public、protected、private public:类成员访问没有限制,内部外部成员都可以访问

protected:受保护的,不能被类外部成员访问,该类的子类可以访问,可以实现对成员属性的读、写操作

private:私有的,只能类里边的成员自己访问,类外部的成员都不能访问 var :相当于public 5.了解内容__get()、__set()

一个属性被修饰为私有的(private),那么这个属性在类的外部是不可以读取和修改的,现在有一种方法

function __get($key_name){ return $this -> $key_name;//$key_name泛指调用的私有属性名 } function __set($key_name, $key_value){ } $this -> $key_name = $key_value; 可以设置该属性既是私有的,还可以被类的外部成员读取即__get()和__set() D 1.final(最后的)关键字使用 该关键字修饰的类不能被继承 该关键字修饰的方法不能被重写 2.static(静态)关键字使用(类的内部、外部、子类)

实例化对象在内存中的分配有讲到大的数据在内存被分配到堆空间里边。现在有一个例子:有一个

"学生"这个类,里边有一个成员属性是"国家",标识该对象是属于哪个国家的,比如美国、英国、德国等

,这个类在实例化对象时候,每个对象在内存中都会分配一个空间用于存放国家这个成员属性,如果

有100个对象,那么在内容中会分配100个相应的空间。如果这个类的使用对象是在"中国"境内,那么

每个对象的国家属性就会是一样的,即"中国",相应的在内存中会有100个空间存放100个相同的内容

这会造成空间浪费,其实到这里我们可以知道100个相同的内容用一个空间存放就可以,反正都是一样的,

这就产生了静态化概念"static"。 用static修饰的成员属性,该属性就不是对象的,而是类的。

3.self和parent关键字使用

在类的内部访问类中的成员(属性和方法),可以用"$this",该关键字泛指对象,这是访问一般的类

成员,如果访问的成员是用static关键字修饰的,就不能用"$this"了,因为用static修饰的类

成员是被类本身拥有,不属于任何对象了,这时候需要用"self"关键字修饰 self::成员

在类的外部访问类本身拥有的成员可以这样 类名::成员属性。

在子类中访问父类拥有的成员可以用parent关键字 parent::成员属性 4.const(常量)关键字使用 在php中可以定义常量,类外部用define定义,类内部用const定义。 常量的拥有者是类本身,类内部访问常量用 self::常量 类外部访问常量用 类名::常量 子类访问常量 parent::常量 5.类成员的访问self、类名、parent 6.魔术方法【在特定的环境中自动调用】__clone、__call、__autoload使用

clone:在一个项目里边我们有时候需要两个或多个完全一样的初始化对象,这时候可以使用clone技术不用clone技术也可以,不过每个新的对象都需要初始化属性值,这样比较繁琐,也容易出错,使用clone就比较简单,克隆出来的多个对象彼此是独立的,互不相干。

$p2 = clone $p1; public __clone(){ $this// 指的是新对象$p2

}

__call:在类的使用过程中,如果一个对象调用的方法不在类里边,那么这时候程序要报错,然后程序退出不能继续运行。这样做用户体验非常不好,如果有一种方法可以使得程序报错完后可以继续运行,这样的程序给人更智能、用户体验更好的感觉,这时候就可以用__call

public function __call($method_name,$args){ echo "你访问的方法:"; echo $method_name; echo "参数:";

print_r($args);

echo "不存在";

}

__autoload:开发一个软件系统,往往里边会有很多类,在初始化类对象之前需要先include这个对象对应的类文件。所有的类不能都放到一个文件(文件臃肿,不易维护),这样就会在程序开始处有很多的include列表,这样做非常繁琐,出现一个新的类就需要被include,有没有一种方法可以使得被include的类文件在实例化对象时候才引入,否则不动作, 答案是有的,这时候可以用魔术方法__autoload

function __autoload($className){ include($className.'.php'); } 8.子类重写父类成员方法修饰符限制,子类的修饰级别大于父类。例如父类的修

饰符是protected,

则子类修饰级别是protected或public。父类是public的,子类也必须是public 9.php里边只能单继承,一个父类可以有多个子类,一个子类不可以有多个父类 E 1.抽象类 在类里边定义的没有方法体的方法就是抽象方法,有抽象方法的类被称为抽象类。抽象类不能实例化对象。

所谓没有方法体就是方法在声明时候没有花括号和里边的内容。

作用之处: 例如:我有一个类"动物",里边有方法"吃食"(还可以有许多其他的方法) 动物这个类可以有许多子类例如:狗、鱼、鸟等,这些子类有一个共性就是都有吃食这个方法

一般的解决方法是:定义3个类,里边都有吃食方法。这样实现没有问题的,但是如果其中一个

类没有吃食方法,这时候程序是不给报错的。我们现在要做的就是3个类中任何一个没有吃食方法

系统就要报错。这时候就需要用到抽象类了。

抽象类按照字面意思理解就是对3个类的进一步抽象。抽象出来吃食方法。

抽象类技术特性: a、抽象类不能实例化 b、类的成员方法是抽象的,则这个类也是抽象的 c、抽象方法体内没有实现细节,具体实现留给子类实现 d、继承抽象类的子类必须实现父类的抽象类,除非自己也是抽象类。 2.接口 打个比方,每个用电器都有插头,我们不可能用电器时都直接把零线火线直接绑到插头上,所以我们按一定

规格制定了插座,并要求用电器的插头都要符合这个规格,以方便使用。这个插座就是接口。

当一个抽象类里边的全部方法都是抽象方法时候,这个抽象类就是"接口"。 接口技术特性: a、interface声明 b、全部接口方法是public的,因此可以省略 c、接口只定义方法,没有具体方法实现 d、实现类用implements实现接口,全部接口方法都要实现,多个接口的实现不能出现同名方法

e、接口可以多实现,中间用逗号分开

f、接口是对抽象类的抽象,抽象类是对类的抽象,类是对事物的抽象。 g、接口不能实例化 (1)、抽象类和接口有什么不同 抽象类只能单继承,接口可以多实现 抽象类里面可以有抽象方法和普通方法,而接口里面只有抽象方法。

抽象类里面可以有自己的属性,而接口里面只能有常量

接口里面的方法必须是public的,而抽象类不同

(2)、抽象类和接口的相似之处

抽象类里面的抽象方法在继承的时候必须都要重写(实现),接口里面的方法也必须都要实现。

抽象类和接口都不能直接实例化, 抽象类需要继承(extends),接口需要实现(implements)。 抽象类和接口都体现了多态的特性。 3. 接口的使用 继承性简化了对象、类的创建,增加了代码的可重用性。但PHP只支持单继接口通过interface关键字来声明,并且接口中只能包含未实现的方法和一些成承。如果想实现多重继承,就要使用接口。PHP可以实现多个接口。 员变量,格式如下:

interface interfaceName{

function interfaceName1(); function interfaceName2(); …… }

子类可以通过implements关键字来实现接口,如果要实现多个个接口之间使用逗号“,”连接,而且所有未实现的方法需要在现,否则PHP将会出现错误。 class SubClass implements InterfaceName1,InterfaceName2{ function interfaceName1(){} function interfaceName2(){} 接口,那么每 子类中全部实

} 例子: <?php interface MPopedom{ function popedom(); } interface MPurview{ function purview(); } class Member implements MPurview{ function purview(){ echo '会员拥有的权限'; } }

class Manager implements MPurview,MPopedom{ function purview(){ echo '管理员拥有会员的全部权限'; } function popedom(){ echo '管理员还有会员没有的权限'; } } $member=new Member(); $manager=new Manager(); $member->purview(); echo "<p>"; $manager->purview(); $manager->popedom(); 乱码情况执行步骤: (1)文件保存时(文件本身编码utf-8) (2)header("content-type:text/html; charset=utf-8") 或者在html中: <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> (3)写数据库设定字符集 mysql_query("set names utf8") (4)建立数据库和表时编码要统一成utf-8

php如何跳转

方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。

Header("Location: 网址"); //直接跳转 header("refresh:3;url="); //三秒后跳转 方法二:利用meta echo "<meta http-equiv=refresh content='0; url=网址'>"; 对于分配关联数组、索引数组以及对象变量 assign分配时怎么用。(重点讲) 对于分配数组及对象变量,assign 时和分配普通字符串变量一样,但模板的引用方式

关联数组 {$arrname.key} key----表示键值

索引数组 {$arrname[key]} key---表示下标

对象的{$obj->attr} 表示创建的对象中的属性 不同

PHP新手面试题总100分

简述题(50分) 1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) echo date('Y-m-d H:i:s', strtotime('-1 day')); 2、echo(),print(),print_r()的区别(3分) echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)

print只能打印出简单类型变量的值(如int,string)

print_r可以打印出复杂类型变量的值(如数组,对象) echo -- 输出一个或者多个字符串 3、能够使HTML和PHP分离开使用的模板(1分) smarty,Heyes Template Class等 5、使用哪些工具进行版本控制?(1分)

VS Server on Apache作服务端,WinCVS作客户端;Subversion on Apache/DAV 做服务端,TortoiseSVN做客户端,或者Subclipse做客户端.

6、如何实现字符串翻转?(3分) strrev() --------------------------------------------------------------- 7、优化MYSQL数据库的方法。(4分,多写多得) (1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。

(2).使用连接(JOIN)来代替子查询(Sub-Queries)

(3).使用联合(UNION)来代替手动创建的临时表

(4).尽量少使用 LIKE 关键字和通配符

(5).使用事务和外键【innodb】 8、PHP的意思(送1分) Hypertext Preprocessor 9、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分) now(), DATE_FORMAT(date,format) 10、实现中文字串截取无乱码的方法。(3分) mb_substr() --------------------------------------------------------------- 11、您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?(1分) TortoiseSVN-1.2.6 svn-1.2.3 12、您是否用过模板引擎? 如果有您用的模板引擎的名字是?(1分) smarty 13、请简单阐述您最得意的开发之作(4分) 14、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分) 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量

第六,使用流量分析统计软件。 ----------------------------------------------------------------- 15、用PHP写出显示客户端IP与服务器IP的代码1分) function get_client_ip() {# if(getenv('HTTP_CLIENT_IP')) { $client_ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR')) { $client_ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR')) { $client_ip = getenv('REMOTE_ADDR'); } else { $client_ip = $HTTP_SERVER_VAR['REMOTE_ADDR']; } return $client_ip; } 16、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (2分)

require()和include()除了怎样处理失败之外在各方面都完全一样。include()产生一个警告而require()则导致一个致命错误。

换句话说,如果你想在丢失文件时停止处理页面,用require()。include() 就不是这样,脚本会继续运行。

require()无论如何都会包含文件,而include()可以有选择地包含. 代替用 include_once require_once 17、如何修改SESSION的生存时间(1分). $savePath = "./session_save_dir/"; $lifeTime = 24 * 3600; session_save_path($savePath); session_set_cookie_params($lifeTime); session_start(); 18、有一个网页地址, 比如PHP开发资源网主页: /index.html,如何得到它的内容?($1分)

file_get_contents($url)

19、在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?);(2分)

未授权(Unauthorized) Header("http/1.0 403 Forbidden"); 12、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分) 跟起始的一样,且结束标志前也要一个换行,后面加上分号 13、谈谈asp,php,jsp的优缺点(1分) 14、谈谈对mvc的认识(1分) ------------------------------------------------------------------- 15、写出发贴数最多的十个人名字的SQL,利用下表:

members(id,username,posts,pass,email)(2分)

select members.username from members order by posts DESC limit 10 16. 请说明php中传值与传引用的区别。什么时候传值什么时候传引用?(2分) 按值传递:函数范围内对值的任何改变在函数外部都会被忽略 按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这按引用传递则不需要复制值,对于性能提高很有好处。 17. 在PHP中error_reporting这个函数有什么作用? (1分) 用来配置错误信息回报的等级 18. 请写一个函数验证电子邮件的格式是否正确 (2分) //if the email address is valid, return true,else return false function validateEmail($email) { if(eregi('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$',$email) ){ return true; }else{ return false; 将会是一个代价很大的操作。 } } 19. 简述如何得到当前执行脚本路径,包括所得到参数。(2分) echo $_SERVER['scrīpt_FILENAME']."?".$_SERVER['QUERY_STRING']; 20.如何修改SESSION的生存时间. (1分) setcookie() 或 session_set_cookie_params($lifeTime) -------------------------------------------------------------------- 21、JS表单弹出对话框函数是?获得输入焦点函数是? (2分) alert(),prompt(),confirm() focus() 22、JS的转向函数是?怎么引入一个外部JS文件?(2分) window.location.href <scrīpt src=""/> 24、如何声明一个名为”myclass”的没有方法和属性的类? (1分) class myclass{}; 25、如何实例化一个名为”myclass”的对象?(1分) $newmyclass = new myclass(); 26、你如何访问和设置一个类的属性? (2分) 通过-〉 $newmyclass = new myclass();

$temp=$newmyclass->testvalue; $newmyclass->testvalue="a"; 27、mysql_fetch_row() 和mysql_fetch_array之间有什么区别? (1分) mysql_fetch_row -- 从结果集中取得一行作为枚举数组 mysql_fetch_array -- 从结果集中取得一行作为关联数组,或数字数组,或二者兼 -------------------------------------------------------------------- 28、GD库是做什么用的? (1分) GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成片。 报表。

29、指出一些在PHP输入一段HTML代码的办法。(1分)

print("<table></table>"); 30、下面哪个函数可以打开一个文件,以对文件进行读和写操作?(1分)(c) (a) fget() (b) file_open() (c) fopen() (d) open_file() 31、下面哪个选项没有将 john 添加到users 数组中? (1分) (c)(d) (a) $users[] = ?john?; (b) array_add($users,?john?); (c) array_push($users,?john?); (d) $users ||= ?john?; 32、下面的程序会输入是否?(1分) <?php $num = 10; function multiply(){ $num = $num * 10; } multiply(); echo $num; 局部变量 33、使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来 (2分) 表名User Name Tel Content Date 张三 133xxxxxxxx 大专毕业 2006-10-11 张三 136xxxxxxxx 本科毕业 2006-10-15 张四 021-55665566 中专毕业 2006-10-15 请根据上面的题目完成代码: $mysql_db=mysql_connect("local","root","pass"); @mysql_select_db("DB",$mysql_db); $result=mysql_query("select * from User where Name='张三'"); while($row=mysql_fetch_array($result))

{ echo $row['Name'].$row['Tel'].$row['Content'].$row['Date']; echo "<br>"; } 34、如何使用下面的类,并解释下面什么意思?(3) class test{ function Get_test($num){ $num=md5(md5($num)."En"); return $num; } } 双重md5加密 $testObject = new test(); $encryption = $testObject->Get_test("xiaotian_ls"); ---------------------------------------------------------------------------- 35、写出 SQL语句的格式 : 插入 ,更新 ,删除 (4分) 表名User Name Tel Content Date 张三 133xxxxxxxx 大专毕业 2006-10-11 张三 136xxxxxxxx 本科毕业 2006-10-15

张四 021-55665566 中专毕业 2006-10-15

(a) 有一新记录(小王 132xxxxxxxx 高中毕业 2007-05-06)请用SQL语句新增至 INSERT INTO User('Name','Tel','Content','Date') VALUES('小王','132xxxxxxxx','高 表中

中毕业','2007-05-06')

(b) 请用sql语句把张三的时间更新成为当前系统时间

UPDATE User SET Date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE Name='张三'

(c) 请写出删除名为张四的全部记录

DELETE FROM User WHERE Name='张四' 36、请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别(2分)

int 数值类型 char 固定长度字符串 varchar 可变长字符串 datetime 日期时间型 text 字符字符串

char列的长度固定为创建表时声明的长度.varchar列中的值为可变长字符串.

37、MySQ自增类型(通常为表ID字段)必需将其设为(?)字段(1分) AUTO_INCREMENT 38、写出以下程序的输出结果 (1分) <? $b=201; $c=40; $a=$b>$c?4:5; echo $a;

39、检测一个变量是否有设置的函数是否?是否为空的函数是?(2分) isset() empty() ----------------------------------------------------------------------------- 40、取得查询结果集总数的函数是?(1分) mysql_num_rows 41、$arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值 (1分) echo $arr[0]; 42、请将41题的数组的值用','号分隔并合并成字串输出(1分) implode(',',$arr); 43、$a = 'abcdef'; 请取出$a的值并打印出第一个字母(1分) echo $a{0}; 44、PHP可以和sql server/oracle等数据库连接吗?(1分) 可以 45、请写出PHP5权限控制修饰符(3分) private protected public __construct __destruct ------------------------------------------------------------------------------ 47、以下请用PHPMYADMIN完成 (一)创建新闻发布系统,表名为message有如下字段 (3分) id 文章id title 文章标题 content 文章内容 category_id 文章分类id hits 点击量 CREATE TABLE 'message'( 'id' int(11) NOT NULL auto_increment, 'title' varchar(200) default NULL, 'content' blob, 'category_id' int(11) default NULL, 'hits' int(11) default NULL, PRIMARY KEY('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 (二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下 (4分) comment_id 回复id id 文章id,关联message表中的id comment_content 回复内容 现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复

最高的排在最前面

category_id int(4) not null auto_increment; categroy_name varchar(40) not null; 用户输入文章时,通过选择下拉菜单选定文章分类 写出如何实现这个下拉菜单 function categoryList() { $result=mysql_query("select category_id,categroy_name from category") or die("Invalid query: " . mysql_error()); print("<select name='category' value=''>\n"); while($rowArray=mysql_fetch_array($result)) { 文章id 文章标题 点击量 回复数量 用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0 SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) FROM message LEFT JOIN comment ON message.id=comment.id GROUP BY message.`id` (三)上述内容管理系统,表category保存分类信息,字段如下 (3分) hits,IF(comment.`id` is NULL,0,count(*)) number

print("<option

value='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option>\n");

}

print("</select>");

} 1.php如何跳转

方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。

Header("Location: 网址"); //直接跳转

header("refresh:3;url="); //三秒后跳转 方法二:利用meta echo "<meta http-equiv=refresh content='0; url=网址'>"; 2.设置cookies bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )

参数说明: Cookie 的名字,Cookie的值,过期时间,Cookie 在服务器端的有效路径,该 cookie 有效的域名,指明 cookie 是否仅通过安全的 HTTPS 连接传送。当设成 TRUE 时,cookie 仅在安全的连接中被设置。默认值为 FALSE

$value = 'something from somewhere'; setcookie("TestCookie", $value); setcookie("TestCookie", $value,time()+3600); /*有效期为一小时 */

setcookie("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);

PHP常用代码

1、连接MYSQL数据库代码 $connec=mysql_connect("localhost","root","root") or die("不能连接数据库服务器: ".mysql_error());

mysql_select_db("liuyanben",$connec) or die ("不能选择数据库: ".mysql_error()); mysql_query("set names 'gbk'");

?> 2、读取数据库,并实现循环输出 <?php $sql="select * from liuyan order by ly_id desc"; $conn=mysql_query($sql,$connec); while($rs=mysql_fetch_array($conn)){ ?> 循环的内容......... <?php } ?> 3、如何实现分页,包括两个函数,两个调用 1)两个函数 <? //分页函数 function genpage(&$sql,$page_size=2)//引用传值 } //显示分页 function showpage() { global $prepage,$nextpage,$pages,$sums; //out param $page = $_GET["page"]; $eachpage = $page_size; $pagesql = strstr($sql," from "); $pagesql = "select count(*) as ids ".$pagesql; $conn = mysql_query($pagesql) or die(mysql_error()); if($rs = mysql_fetch_array($conn)) $sums = $rs[0]; $pages = ceil(($sums-0.5)/$eachpage)-1;//ceil 向上取整 $pages = $pages>=0?$pages:0; $prepage = ($page>0)?$page-1:0; $nextpage = ($page<$pages)?$page+1:$pages; $startpos = $page*$eachpage; $sql .=" limit $startpos,$eachpage ";//limit用来提取数据

{

global $page,$pages,$prepage,$nextpage,$queryString; //param from genpage

$shownum =10/2;

$startpage = ($page>=$shownum)?$page-$shownum:0;

$endpage = ($page+$shownum<=$pages)?$page+$shownum:$pages; function

echo "共".($pages+1)."页: "; if($page>0)echo "<a href=$PHP_SELF?page=0$queryString>首页</a>"; if($startpage>0)

<b><a echo " ...

href=$PHP_SELF?page=".($page-$shownum*2)."$queryString>?</a></b>";

for($i=$startpage;$i<=$endpage;$i++) { if($i==$page) echo " <b>[".($i+1)."]</b> "; else echo " <a href=$PHP_SELF?page=$i$queryString>".($i+1)."</a> ";

}

if($endpage<$pages)

echo "<b><a href=$PHP_SELF?page=".($page+$shownum*2)."$queryString>?</a></b> ... "; if($page<$pages) echo "<a href=$PHP_SELF?page=$pages$queryString>尾页</a>"; } //显示带分类的分页 function showpage1() {

$fenlei=$_GET["fenleiid"];

global $page,$pages,$prepage,$nextpage,$queryString; //param from genpage function

$shownum =10/2; $startpage = ($page>=$shownum)?$page-$shownum:0; $endpage = ($page+$shownum<=$pages)?$page+$shownum:$pages; echo "共".($pages+1)."页: "; if($page>0)echo "<a href=$PHP_SELF?fenleiid=$fenlei&page=0$queryString>首 if($startpage>0) echo 页</a>"; " ... <b><a href=$PHP_SELF?fenleiid=$fenlei&page=".($page-$shownum*2)."$queryString>?</a></b>"; for($i=$startpage;$i<=$endpage;$i++) { if($i==$page) echo " <b>[".($i+1)."]</b> "; else echo " <a

href=$PHP_SELF?fenleiid=$fenlei&page=$i$queryString>".($i+1)."</a> ";

}

if($endpage<$pages)

echo "<b><a href=$PHP_SELF?fenleiid=$fenlei&page=".($page+$shownum*2)."$queryString>?</a></b> ... ";

页</a>";

} ?> 2)两个调用 第一个 <?php $sql="select * from liuyan order by ly_id desc"; genpage($sql); //只需要正常代码加上这一行就ok。 $conn=mysql_query($sql,$connec); while($rs=mysql_fetch_array($conn)){ ?> 第二个 <?php } ?> <?php showpage(); //显示页 ?> <?php mysql_close(); ?> 4、服务器端包含 <?php require_once('conn.php'); ?> 5、如何将一条记录写入数据库,然后提示并跳转页面 <?php $ly_title=$_POST["ly_title"]; $ly_content=$_POST["ly_content"]; $ly_time=$_POST["ly_time"]; $ly_author=$_POST["ly_author"]; $ly_email=$_POST["ly_email"]; $sql="insert into liuyan(ly_title,ly_content,ly_time,ly_author,ly_email) if($page<$pages) echo "<a href=$PHP_SELF?fenleiid=$fenlei&page=$pages$queryString>尾values('".$ly_title."','".$ly_content."','".$ly_time."','".$ly_author."','".$ly_email."')"; mysql_query($sql,$connec); echo("<script type='text/javascript'> alert('添加成功!');location.href='index.php';</script>");

?> 6、弹出对话框,并发生页面跳转 <?php echo("<script type='text/javascript'> alert('添加成功!');location.href='index.php';</script>"); ?> 7、信息查看页面(有条件读取数据库) 1)有条件读取数据库 <?php $sql="select * from liuyan where ly_id=$_GET[id]"; $conn=mysql_query($sql,$connec); $rs=mysql_fetch_array($conn); ?> 2)将某个字段输出 <?=$rs[ly_title]?> 3)关闭数据库 <?php mysql_close(); ?> 8、对数据库中某一条记录进行更新操作,并作提示跳转 <?php $ly_title=$_POST["ly_title"]; $ly_content=$_POST["ly_content"]; $ly_time=$_POST["ly_time"]; $ly_author=$_POST["ly_author"]; $ly_email=$_POST["ly_email"]; $sql="update liuyan set ly_title='$ly_title',ly_content='$ly_content',ly_time='$ly_time',ly_author='$ly_author',ly_email='$ly_email' where ly_id=$_GET[id]";

mysql_query($sql,$connec);

echo("<script type='text/javascript'> alert('更新成功!');location.href='../index.php';</script>");

?> 9、如何删除数据库中的一条记录 <?php $sql="delete from liuyan where ly_id=$_GET[id]";

alert('删除成功! mysql_query($sql,$connec); echo("<script type='text/javascript'>

');location.href='../index.php';</script>");

?> 10、如何进行会员登录验证 <?php session_start(); $username=$_POST["username"];

$password=$_POST["password"];

where username='".$username."' && $sql="select * from admin

password='".$password."'";

$result=mysql_query($sql,$connec);

if($row=mysql_fetch_array($result)){

session_register("admin");

$admin=$username;

echo("<script type='text/javascript'>

');location.href='admin.php';</script>");}

else alert('登录成功!{ echo("<script type='text/javascript'> alert('你输入的用户名或密码错误,请重新输入!');location.href='login.php';</script>");

}

mysql_close(); ?> 11、如何对SESSION进行检验(后台检查页面的制作) <?php session_start(); if(!isset($_SESSION["admin"])){ header("location:login.php"); exit; } ?> 12、验证用户名及密码是否填写(javascript) <SCRIPT language=javascript> <!-- function confirmlogin() { if (document.frmmain.username.value.length<4 || document.frmmain.username.value=="")

{

} if (document.frmmain.password.value.length<4) { } document.frmmain.password.focus(); document.frmmain.password.select; window.alert("请输入你的密码!"); return false; document.frmmain.username.focus(); document.frmmain.username.select; window.alert("请输入你的用户名!"); return false;

return true;

}

//-->

</SCRIPT>

13、在PHP中调用编辑器的方法

1)将编辑器文件夹放置后台管理文件夹内。

2)利用以下语句进行引入操作。

<input name="content" type="hidden" value=''> <IFRAME

src="eWebEditorPHP38/ewebeditor.htm?id=content&style=coolblue" scrolling="no" width="550" height="350"></IFRAME>

注:eWebEditorPHP38编辑器文件夹的名称。 id=content中content为上面隐藏域的名称

14、循环输出(能够实现分列)

1)首先插入一行一列表格

<?php

$i=1;

?>

<table>

<tr>

<?php

while($rs=mysql_fetch_array($conn)){

?>

<td>

被循环的其它表格和输出

</td>

<?php

if ($i % 2==0) {

echo "</tr><tr>";

}

$i++;

}

?>

</tr>

</table>

15、给下拉列表框绑定数据(并且在修改时默认选中) <select name="fenleiid">

<?php

$sql="select * from fenleibiao";

$conn=mysql_query($sql,$connec);

while($rs1=mysql_fetch_array($conn)){ ?>

<option value="<?=$rs1["fenleiid"]?>" ID="eWebEditor1" frameborder="0"

<?

if ($rs["fenleiid"]==$rs1["fenleiid"]){ echo "selected" ;

}

?>>

<?=$rs1["flname"]?>

</option>

<?php>

}

?>

</select>

16、获取字符长度函数

strlen($c)>12

17、定义一个字符截取函数

用法:<?=substrgb($rs["title"],10)?

function substrgb($in,$num){

$pos=0;

$out="";

while($c=substr($in,$pos,1)){

if($c=="\n") break;

if(ord($c)>128){

$out.=$c;

$pos++;

$c=substr($in,$pos,1);

$out.=$c;

}else{

$out.=$c;

}

$pos++;

if($pos>=$num) break;

}

if($out!=$in) $out = $out . "...";

return $out;

}

18、判断是否是数字

!is_numeric(qq)

19、PHP技术中获取当前日期

$ptime=date("y-m-d");

26.男女问题或单选带选择的

<input type="radio" name="hy_zhuangtai" ($rs["hy_zhungtai"]==="男") { echo "checked";}?>> 男 value="男" <?php if

<input type="radio" name="hy_zhuangtai" value="女" <?php if ($rs["hy_zhuangtai"]==="女") { echo "checked";}?>>

27.单选不带单选框的

<?php if ($rs['hy_zhuangtai']=='锁定'){?>

$rs['hy_id'];?>">锁定</a>

<a href="Userzt.php?action=yes&id=<?php echo <?php } else{ ?><a href="Userzt.php?id=<?php echo $rs['hy_id'];?>&action=no">解锁</a> <?php }?> 它的 save页是 <?php require_once('../../conn.php'); ?> <?php $hy_id=$_GET['id']; $action=$_GET['action']; if ($action=='yes'){ $sql="update hybiao set hy_zhuangtai='锁定' where hy_id='$id'"; $query=mysql_query($sql,$connec); echo("<script type='text/javascript'>location.href='UserManage.php';</script>"); } else{ $sql="update hybiao set hy_zhuangtai='正常' where hy_id='$id'"; $query=mysql_query($sql,$connec); echo("<script type='text/javascript'>location.href='UserManage.php';</script>"); } mysql_close(); ?> 28.如果文字过长,则将过长的部分变成省略号显示

<DIV STYLE="width: 120px; height: 50px; border: 0px solid blue;overflow: hidden; text-overflow:ellipsis">

<NOBR>就是比如有一行文字,很长,表格内一行显示不下.</NOBR> </DIV>

29. 禁止复制,鼠标拖动选取 <body ondragstart=window.event.returnValue=false oncontextmenu=window.event.returnValue=false onselectstart=event.returnValue=false>

30.大 中 小 文字的变化

<script type="text/javascript"> function doZoom(size) {document.getElementById('zoom').style.fontSize=size+'px';} </script> <span id="zoom">需要指定大小的文字</span>

<a href="javascript:doZoom(16)">大</a> <a href="javascript:doZoom(14)">中</a> <a 30. 添加到收藏夹和设为首页 <a href=# href="javascript:doZoom(12)">小</a> onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('/lanren/');">设为首页</a>

<a href="javascript:window.external.AddFavorite('/lanren/','懒人图库')">收藏本站</a>

31. 记录并显示网页的最后修改时间 <script language=JavaScript> document.write("最后更新时间: " + document.lastModified + "") </script> 32. 节日倒计时 <Script Language="JavaScript"> var timedate= new Date("October 1,2002"); var times= "国庆节"; var now = new Date(); var date = timedate.getTime() - now.getTime(); var time = Math.floor(date / (1000 * 60 * 60 * 24)); if (time >= 0) document.write( "现在离"+times+"还有: "+time +"天") </Script> 33. 打开窗口即最大化 <script language="JavaScript"> <!-- Begin self.moveTo(0,0) self.resizeTo(screen.availWidth,screen.availHeight) // End --> </script> 34. 加入背景音乐 <bgsound src="mid/windblue[1].mid" loop="-1"> 只适用于IE <embed src="music.mid" autostart="true" loop="true" hidden="true"> 对Netscape ,IE 都适用

35.

滚动

<marquee direction=up height=146 onmouseout=start() onmouseover=stop() scrollAmount=2>

滚动信息

</marquee>

36. 防止点击空链接时,页面往往重置到页首端 代码“javascript:void(null)”代替原来的“#”标记 37. 不能点右键,不用CTRL+A,不能复制作! <body oncontextmenu="window.event.returnValue=false" onkeypress="window.event.returnValue=false" onkeydown="window.event.returnValue=false" onkeyup="window.event.returnValue=false" ondragstart="window.event.returnValue=false" onselectstart="event.returnValue=false"> </body> 37. 随机变换背景图象(一个可以刷新心情的特效) <Script Language="JavaScript"> image = new Array(4); //定义image为图片数量的数组 image [0] = 'tu0.gif' //背景图象的路径 image [1] = 'tu1.gif' image [2] = 'tu2.gif' image [3] = 'tu3.gif' image [4] = 'tu4.gif' number = Math.floor(Math.random() * image.length); document.write("<BODY BACKGROUND="+image[number]+">"); </Script> 38. 划过链接 手型鼠标 style="cursor:hand" 39. 如何关闭层 <div id="Layer1"></div> <a href="#" onClick="Layer1.style.display='none'">关闭层</a> 40. <a href=javascript:close()>[关闭窗口]</a> 41. 凹陷文字背景为灰色 <div

style="width:300px;padding:20px;overflow:hidden;word-wrap:break-word;word-break:break:all; font-size:12px; line-height:18px; background-color:#eeeeee;">

<font disabled>

怎么样,我凹下去了吧?<br>

你不想试试吗?<br>

<a href="/"></a></font> </div> 42.

给表格做链接

<table width="100%" onclick="window.open('/', '_blank')" style="CURSOR:hand">

<tr>

<td height="100" bgcolor="f4f4f4"> </td>

</tr> </table> 43. 后退&关闭窗口 后退:javascript:history.back(1) 关闭:javascript:window.close(); 44. 如果文字过长,则将过长的部分变成省略号显示 <DIV STYLE="width: 120px; height: 50px; border: 0px solid blue;overflow: hidden; text-overflow:ellipsis">

<NOBR>就是比如有一行文字,很长,表格内一行显示不下.</NOBR>

</DIV> 45. 禁止复制,鼠标拖动选取 <body ondragstart=window.event.returnValue=false oncontextmenu=window.event.returnValue=false onselectstart=event.returnValue=false> <?

js总结

<script> JavaScript <script type="text/javascript" src="js/common.js"></script> 前身是 Live Script

正式名称:ECMAScript

ECMAScript-262是JavaScript标准,基于网景(Netscape)公司提出JavaScript语言和微软公司提出的JScript语言

ECMA开始于19xx年,在19xx年7月,采纳了首个版本,19xx年,该标准成为了国际ISO标准

javascript基于对象和事件驱动 javascript语言特点: 1.简单性 2.动态性 3.跨平台性 4.节省CGI的交互时间 5.安全性 <script language="javascript" type="text/javascript"></script> language 老版本 type 推荐写法 <script>

常用关键字 innerHTML innerText id.style.display = 'dispaly'; id.style.display = 'none'; setInterval("fun()",1000);//一秒钟执行一次函数fun() 数据类型转换: Number -----> String var str = String(num); //使用构造函数 var str = num.toString(); String -----> Number var num = Number(str); //使用构造函数 var num = str * str; //自动转换 var num = str - 0; //但是+0则不行

var num = parseInt(str); //默认第二参数为基数10,以数字开头的字符均可提取数字,失败返回NaN

parseFloat(str); Boolean -----> Number、String Number: true --> 1; false --> 0 String: true --> "true"; false --> "false" Number、String -----> Boolean Number: 0、NaN --> false; 其他数字 --> ture String: 空值和未定义 --> false; 未空(对象、叔组、函数) --> ture var bool = Boolean(x); //构造函数 var bool = !!x; 将字符串转换为整数 var int=parseInt("字符串") 将字符串转换为浮点数 var float=parseFloat("字符串") 将数值转化成字符串 toString(11); 数值与字符串相加:将数值强制转换为字符串。 布尔值与字符串相加:将布尔值强制转换为字符串。 数值与布尔值相加:将布尔值强制转换为数值。 常规函数 document.write("");输出信息到页面 javascript常规函数: (1)alert函数:显示一个警告对话框,包括一个OK按钮。

(2)confirm函数:显示一个确认对话框,包括OK、Cancel按钮。 (3)escape函数:将字符转换成Unicode码。 (4)eval函数:计算表达式的结果。 (5)isNaN函数:测试是(true)否(false)不是一个数字。 (6)parseFloat函数:将字符串转换成符点数字形式。 (7)parseInt函数:将符串转换成整数数字形式(可指定几进制)。 (8)prompt函数:显示一个输入对话框,提示等待用户输入。例如: <script language="javascript"> <!-- alert("输入错误"); prompt("请输入您的姓名","姓名"); confirm("确定否!"); //--> script> (9)unescape函数:解码由escape函数编码的字符。

typeof() 返回一个用来表示表达式的数据类型的字符串

返回值有六种可能:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。

Error try x = y // 产生错误。 catch(e){ // 创建局部变量 e。 document.write(e) // 打印 "[object Error]". document.write(e.number & 0xFFFF) // 打印 5009。 document.write(e.description) // 打印 "'y' is undefined". }//try catch 错误捕获 函数声名 function t() { } t(); function a() { for(var i = 0; i < arguments.length; i++) { } alert(arguments[i]); } a(1,2,3);

var f = function() { alert(111); } f(); (function() { alert('aaa'); })(); window.onload = function() { } alert(1); 数组 声明 var a1 = new Array(); var a2 = new Array(3); var a3 = new Array(1,2,3); var a4 = [1,2,3]; javascript数组函数包括以下4个函数: (1)join函数:转换并连接数组中的所有元素为一个字符串。例: function JoinDemo() { var a, b; a = new Array(0,1,2,3,4); b = a.join("-");//分隔符 return(b);//返回的b=="0-1-2-3-4" } (2)length函数:返回数组的长度。例: function LengthDemo() { var a, l; a = new Array(0,1,2,3,4); l = a.length; return(l);//l==5 } (3)reverse函数:将数组元素顺序颠倒。例: function ReverseDemo() {

var a, l; a = new Array(0,1,2,3,4); l = a.reverse(); return(l); } (4)sort函数:将数组元素重新排序。例: function SortDemo() { var a, l; a = new Array("X" ,"y" ,"d", "Z", "v","m","r"); l = a.sort(); return(l); } 事件处理 绑定事件 <input type="button" onclick="test();"/> <input id="btn" type="button" value="按扭" /> <script type="text/javascript" for="btn" event="onclick"> alert(111); </script> <input id="btn" type="button" value="按扭" /> <script type="text/javascript"> function f() { alert(11); } btn.onclick = f; </script> <script> window.event 保存事件的内容信息 onchange 改变事件 打开窗口 window.open() 非模式对话框 oNewWindow = window.open( [sURL] [, sName] [, sFeatures] [, bReplace])

window.open("Sample.htm",null,"height=200,width=400,status=yes,toolbar=no,menubar=no,location=no",true);

showModelessDialog 和open一样 window.showModalDialog() 打开模式对话窗口 xml 方法 xmlDoc.getElementsByTagName( "from ")[0].childNodes[0].nodeValue; xml特点 xml只有一个根元素 大小写敏感 文档元素必须正确嵌套 必须要有结束标记 属性值必须有引号 多个连续空格不会被忽略 xml声明必须放在文档的最前部 解析xml <?xml version="1.0" encoding="gb2312"?> <book> <title>CSS</title> <author>isaac</author> <email>demo@demo.com</email> <date>20070624</date> </book> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("name.xml"); //调用数据 var nodes = xmlDoc.documentElement.childNodes; alert(nodes.item(0).text); alert(nodes.item(1).text); alert(nodes.item(2).text); 创建xml解析对象 xml文件 js <r> <a>ff</a> </r> var xmlDoc = createXmlDoc('x.xml'); //ie firefox <a>ggd</a> alert(xmlDoc.getElementsByTagName("a")[0].childNodes[0].nodeValue); //ie

//var nodes = xmlDoc.documentElement.childNodes; //alert(nodes.item(1).text); function createXmlDoc(xmlFilePath) { if(window.ActiveXObject) {

msXMLdom = new var

ActiveXObject('Microsoft.XMLDOM');

} } msXMLdom.async = false; msXMLdom.load(xmlFilePath); return msXMLdom; } else // code for Mozilla, Firefox, Opera, etc { var oXMLHttp = new XMLHttpRequest(); oXMLHttp.open("GET",xmlFilePath,false); oXMLHttp.send(null); return oXMLHttp.responseXML; cookie cookie存储写法

document.cookie = "key=value; domain=; path=\user; expires=2010-1-1";

//存储cookie方法

function setCookie(sName, sValue, date) { //var date = new Date(); //date.setYear(date.getYear()+2); if (date) { alert(1); document.cookie = sName + "=" + sValue + "; expires=" + date.toGMTString(); } else { } alert(2); document.cookie = sName + "=" + sValue;

} //取cookie方法 function getCookie(cName) { var c = document.cookie; var cs = c.split('; '); for(var i = 0; i < cs.length; i++) { } if(cs[i].indexOf(cName)==0) { } return cs[i].split('=')[1];

}

数学

javascript数学函数其实就是Math对象,它包括属性和函数(或称方法)两部分。其中,属性主要有下列内容。

Math.e:e(自然对数)、Math.LN2(2的自然对数)、Math.LN10(10的自然对数)、Math.LOG2E(e的对数,底数为 2)、Math.LOG10E(e的对数,底数为10)、Math.PI(π)、Math.SQRT1_2(1/2的平方根值)、Math.SQRT2 (2的平方根值)。

函数有以下18个:

(1)abs函数:即Math.abs(以下同),返回一个数字的绝对值。

(2)acos函数:返回一个数字的反余弦值,结果为0~π弧度(radians)。

(3)asin函数:返回一个数字的反正弦值,结果为-π/2~π/2弧度。 (4)atan函数:返回一个数字的反正切值,结果为-π/2~π/2弧度。 (5)atan2函数:返回一个坐标的极坐标角度值。 (6)ceil函数:返回一个数字的最小整数值(大于或等于)。 (7)cos函数:返回一个数字的余弦值,结果为-1~1。 (8)exp函数:返回e(自然对数)的乘方值。 (9)floor函数:返回一个数字的最大整数值(小于或等于)。 (10)log函数:自然对数函数,返回一个数字的自然对数(e)值。 (11)max函数:返回两个数的最大值。 (12)min函数:返回两个数的最小值。 (13)pow函数:返回一个数字的乘方值。 (14)random函数:返回一个0~1的随机数值。 (15)round函数:返回一个数字的四舍五入值,类型是整数。 (16)sin函数:返回一个数字的正弦值,结果为-1~1。 (17)sqrt函数:返回一个数字的平方根值。 (18)tan函数:返回一个数字的正切值。 正则表达式 function test()

{ var regExp = /\D*/gi; //var reg2 = /(\D*))/gi; var str = "faf4444fffsf"; //alert(regExp.exec(str));//用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组。

//alert(regExp.test(str));//返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。

//alert(str.match(regExp));//使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。

} //原子表,如[ABC].一个正则至少包含一个原子 /* 原子 说明 //regExp.compile() alert(str.replace(regExp,'')); ------------------------------------------------------------- \d 匹配一个数字;等价于[0-9] \D \w \W 匹配除数字以外任何一个字符;等价于[^0-9] 匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_] 匹配除英文字母、数字和下划线以外任何一个字符;等价于

匹配一个空白字符;等价于[\f\n\r\t\v]

匹配除空白字符以外任何一个字符;等价于[^\f\n\r\t\v]

匹配一个换页符等价于 \x0c 或 \cL

匹配一个换行符;等价于 \x0a 或 \cJ

匹配一个回车符等价于\x0d 或 \cM

匹配一个制表符;等价于 \x09\或\cl

匹配一个垂直制表符;等价于\x0b或\ck

匹配一个八进制数字

匹配一\cC 匹配一个控制字符个十六进制数字 [^0-9a-zA-Z_] \s \S

\f \n \r \t \v \oNN \xNN ------------------------------------------------------------- */ //元字符 /* 元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上”\”进行转义

说明 元字符

* + ? 0次、1次或多次匹配其前的原子(任意次) 1次或多次匹配其前的原子 0次或1次匹配其前的原子

. 匹配任何一个字符 匹配两个或多个选择 匹配字符串串首的原子 匹配字符串串尾的原子 匹配单词的边界 匹配除单词边界以外的部分 匹配方括号中的任一原子 匹配除方括号中的原子外的任何字符 整体表示一个原子 表示其前原子恰好出现m次 表示其前原子至少出现m次,至少出现n次(n>m) 表示其前原子出现不少于m次 | ^或\A $或\Z \b \B [] [^] () {m} {m,n} {m,} 元字符“.”匹配除换行符外任何一个字符,相当于[^\n](Unix系统)或*/ /* 模式修正符 */ 中文匹配 //var str = '中华人民共和国'; //alert(str.match(/[\u4e00-\u9fa5]*/)); i g M s 说明 [^\r\n](windows系统)。 可同时匹配大小写字母 全文 将字符串视为多行 将字符串视为单行,换行符做为普通字符看待 模式中的空白忽略不计 当一个模式将被使用若干次时,为加速匹配先对其进行分析 匹配到最近的字符串 将替换的字符串作为表达使用 X S U e 字符串 javascript字符串函数完成对字符串的字体大小、颜色、长度和查找等操作,共包括以下20个函数:

(1)anchor函数:产生一个链接点(anchor)以作超级链接用。anchor函数设定的链接点的名称,另一个函数link设定的URL地址。

(2)big函数:将字体加到一号,与...标签结果相同。

(3)blink函数:使字符串闪烁,与...标签结果相同。 (4)bold函数:使字体加粗,与...标签结果相同。 (5)charAt函数:返回字符串中指定的某个字符。

(6)fixed函数:将字体设定为固定宽度字体,与...标签结果相同。 (7)fontcolor函数:设定字体颜色,与标签结果相同。 (8)fontsize函数:设定字体大小,与标签结果相同。 (9)indexOf函数:返回字符串中第一个查找到的下标index,从左边开始查找。 (10)italics函数:使字体成为斜体字,与...标签结果相同。

(11)lastIndexOf函数:返回字符串中第一个查找到的下标index,从右边开始

(12)length函数:返回字符串的长度。(不用带括号)

(13)link函数:产生一个超级链接,相当于设定的URL地址。

(14)small函数:将字体减小一号,与...标签结果相同。

(15)strike函数:在文本的中间加一条横线,与...标签结果相同。

(16)sub函数:显示字符串为下标字(subscript)。

(17)substring函数:返回字符串中指定的几个字符。

(18)sup函数:显示字符串为上标字(superscript)。

(19)toLowerCase函数:将字符串转换为小写。

(20)toUpperCase函数:将字符串转换为大写。

split切割 "aa,bb".split(','); 查找。

面向对象 <script type="text/javascript"> //创建一个站点的构造函数,name与url是其参数 function Site(name, url) { this.url = url; this.name = name; } //为Site增加一个方法,用于显示网址 Site.prototype.show = function() { return this.name+"的网址为:"+this.url; }; //创建一个站点集合构造函数,sites是其参数 function Sites(sites) { this.sites = sites; } //为Sites增加一个方法,用于显示网址 Sites.prototype.show = function() { var retstr = ""; for(var i=0;i<this.sites.length;i++) { } retstr+=this.sites[i].show()+"<br />";

return retstr; }; //新建一个站点集合,包括梦之都,百度,谷歌

var mySites = new Sites([new Site("dream du", "www.dream du.com"), new Site("baidu", ""), new Site("google", "")]);

Ajax

什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么? //打印站点网址 document.write(mySites.show()); </script><? ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。 '$'是jQuery的别名. 页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回给这个ajax引擎,最后由这个ajax引擎来决定将返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。

这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,

度。 减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程

Ajax的优点是:

1. 减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;

2. 在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。

Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求

ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。

<script language="JavaScript" type="text/javascript">

//创建XMLHttpRequest的函数

function createXMLHttp(){

var request; //得到当前浏览器 var browser=navigator.appName; //如果是IE浏览器 if(browser=="Microsoft Internet Explorer"){ request=new ActiveXObject("Microsoft.XMLHttp"); return request; } //非IE浏览器 else{ request=new XMLHttpRequest(); 的内容。

} } return request; //定义XMLHttpRequest变量 var xhr=createXMLHttp(); function HelloSunyang(){ //跳转路径 var url="hello.php?name=shao&"+Math.random(); //跳转 xhr.open("GET",url,true); //POST请求必须设置编码 //xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //设置回调函数为getHello xhr.onreadystatechange=getHello;//状态改变 } function getHello(){ //判断XmlHttpRequest状态 if(xhr.readyState==4){ //取值 描述 //0 描述一种"未初始化"状态;此时,已经创建一个//将请求发送 xhr.send(null); //post传值name //xhr.send("name=ttttttt"); XMLHttpRequest对象,但是还没有初始化。

//1 描述一种"发送"状态;此时,代码已经调用了XMLHttpRequest open()方法并且XMLHttpRequest已经准备好把一个请求发送到服务器。 //2 描述一种"发送"状态;此时,已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应。

//3 描述一种"正在接收"状态;此时,已经接收到Http响应头部信息,但是消息体部分还没有完全接收结束。

} </script> } //4 描述一种"已加载"状态;此时,响应已经被完全接收。 //设置变量helloStr的值为响应返回值 var helloStr = xhr.responseText; alert(helloStr); //将响应返回值显示在名为hello的div标签中 //document.getElementById("hello").innerHTML=helloStr;

<script type="text/javascript"> <!-- function test() { $.get("1.php", { name: "John", time: "2pm" }, function(data){ alert(data); } JQuery ajax onreadystatechange 手机状态变化 <script type="text/javascript" src="jquery-1.4.2.min.js"></script> <script type="text/javascript"> <!-- function test() { } $.ajax({ //async:false;//非移步传输 type: "POST", url: "1.php", data: "name=John", success: function(msg){ alert(msg); } }); //--> </script> ); } //--> </script> <script type="text/javascript"> <!-- function test() { $.post("1.php",{ name: "John", time: "2pm" }, ); function(data){ alert(data); } } //--> </script>

<script> JSON JavaScript Object Notation宿写 格式 function showJSON() { } var user = { } alert(user.username); alert(user.age); alert(user.info.cellphone); alert(user.address[0].city); alert(user.address[0].postcode); "username":"andy", "age":20, "info": { "tel": "123456", "cellphone": "98765"}, "address": [ ] {"city":"beijing","postcode":"222333"}, {"city":"newyork","postcode":"555666"} 字符串转成JSON数据 var j ="{'a':'aaaaaa','b':'bbbbbbbbb'}"; i = eval("("+j+")");//需要用一对"()"先将该字符串包住 alert(i.b); select option var s = document.getElementById("prov2"); //清除所有option while(s.options.length) s.options[s.options.length-1] = null; var str = result.responseText; //追加数据 str="a,a;b,b;c,c;" var str1 = str.split(";"); for (var i = 0; i < str1.length-1; i++) { str2 = str1[i].split(","); var option_node = document.createElement("OPTION");

} option_node.innerText=str2[1]; option_node.value=str2[0]; document.getElementById("prov2").appendChild(option_node); var s = document.getElementById("s"); var index = s.selectedIndex; // 选中索引 var text = s.options[index].text; // 选中文本 var value = s.options[index].value; // 选中值 s.options[2].selected = "selected"; //选中某一个option s.options[2].selected = true; //选中某一个option js 代码 // 1.判断select选项中 是否存在Value="paraValue"的Item function jsSelectIsExitItem(objSelect, objItemValue) { } var isExit = false; for (var i = 0; i < objSelect.options.length; i++) { if (objSelect.options[i].value == objItemValue) { isExit = true; break; } } return isExit; // 2.向select选项中 加入一个Item function jsAddItemToSelect(objSelect, objItemText, objItemValue) { //判断是否存在 } // 3.从select选项中 删除一个Item function jsRemoveItemFromSelect(objSelect, objItemValue) { //判断是否存在 if (jsSelectIsExitItem(objSelect, objItemValue)) { for (var i = 0; i < objSelect.options.length; i++) { if (objSelect.options[i].value == objItemValue) { if (jsSelectIsExitItem(objSelect, objItemValue)) { alert("该Item的Value值已经存在"); } else { } var varItem = new Option(objItemText, objItemValue); objSelect.options.add(varItem); alert("成功加入");

} objSelect.options.remove(i); break; } } alert("成功删除"); } else { alert("该select中 不存在该项"); } // 4.删除select中选中的项 function jsRemoveSelectedItemFromSelect(objSelect) { var length = objSelect.options.length - 1; } // 5.修改select选项中 value="paraValue"的text为"paraText" function jsUpdateItemToSelect(objSelect, objItemText, objItemValue) { //判断是否存在 } if (jsSelectIsExitItem(objSelect, objItemValue)) { for (var i = 0; i < objSelect.options.length; i++) { if (objSelect.options[i].value == objItemValue) { } objSelect.options[i].text = objItemText; break; for(var i = length; i >= 0; i--){ if(objSelect[i].selected == true){ } } objSelect.options[i] = null; } alert("成功修改"); } else { alert("该select中 不存在该项"); } // 6.设置select中text="paraText"的第一个Item为选中 function jsSelectItemByValue(objSelect, objItemText) { //判断是否存在 var isExit = false; for (var i = 0; i < objSelect.options.length; i++) { if (objSelect.options[i].text == objItemText) { objSelect.options[i].selected = true;

isExit = true; break; } } //Show出结果 if (isExit) { alert("成功选中"); } else {

alert("该select中 不存在该项");

}

}

// 7.设置select中value="paraValue"的Item为选中 document.all.objSelect.value = objItemValue;

// 8.得到select的当前选中项的value

var currSelectValue = document.all.objSelect.value;

// 9.得到select的当前选中项的text

var currSelectText

document.all.objSelect.options[document.all.objSelect.selectedIndex].text; // 10.得到select的当前选中项的Index

var currSelectIndex = document.all.objSelect.selectedIndex; // 11.清空select的项

document.all.objSelect.options.length = 0;

checkbox

//必须选中一条

<input type=checkbox name='nID' value='1'>

<input type=checkbox name='nID' value='2'>

<input type=checkbox name='nID' value='3'>

<input type="button" onclick="test()"/>

function test()

{

var obj = document.getElementsByName("nID"); var len = obj.length;

var checked = false;

for (i = 0; i < len; i++)

{

if (obj[i].checked == true)

{

checked = true;

break;

} =

} } if (!checked) { alert("请至少选择一条数据!"); } return false; //全选/取消全选 <input type="checkbox" name="checkAll" onclick="javascript:SetAllChecked('productCustomerId',this);" /> 全选 <input type="checkbox" name="productCustomerId" value="1" onclick="javascript:CheckAllChecked('productCustomerId','checkAll');"/> <input type="checkbox" name="productCustomerId" value="1" onclick="javascript:CheckAllChecked('productCustomerId','checkAll');"/> <input type="checkbox" name="productCustomerId" value="1" onclick="javascript:CheckAllChecked('productCustomerId','checkAll');"/> <hr /> <input type="checkbox" name="checkAll" onclick="javascript:SetAllChecked('productCustomerId',this);" /> 全选 <script language="javascript"> function isAllChecked(oName) { var oCtl = document.getElementsByName(oName); //eval("oCtl = " + oForm + ".elements[\"" + oName + "\"];"); if (oCtl) { } if (oCtl.length) { } else { } return oCtl.checked; var isChecked = true; for(i=0;i<oCtl.length;++i) { } return isChecked; isChecked = isChecked && oCtl[i].checked;

} { } else { } return false; function SetAllChecked(sName,oSelf) var oCtl = document.getElementsByName(sName); //eval("oCtl = " + sForm + ".elements[\"" + sName + "\"];"); if (oCtl) { if (oCtl.length) { for(i=0;i<oCtl.length;++i) { oCtl[i].checked = oSelf.checked; } } else { oCtl.checked = oSelf.checked; } } //使所有的全选按扭选中 var c = document.getElementsByName(oSelf.name); for (var i = 0; i < c.length; i++) { } c[i].checked = oSelf.checked; function CheckAllChecked(sName,oAllCtlName) { var oAllCtl = document.getElementsByName(oAllCtlName); //eval("oAllCtl = " + sForm + ".elements[\"" + oAllCtlName + "\"];"); if (oAllCtl) { var c = isAllChecked(sName); if (oAllCtl.length) { } for(i=0;i<oAllCtl.length;++i) { } oAllCtl[i].checked = c;

} } else { } oAllCtl.checked = c; frameset parent.frames['m'].location.href = ''; parent.document.getElementsByTagName("FRAMESET").item(1).cols = '20,*'; parent.document.getElementById("framesetter").cols = "40%,60%"; jquery常用函数 nextall 查找当前元素之后所有的同辈元素。 $(function(){alert('jquery中onload实现')});onload事件的实现,也可以测试jquery是否加载成功

$('#mydiv')通过id获得元素对象

$('.mydiv')通过class获得元素对象

$('mydiv')直接获得元素对象 $('#mydiv').val()获得对象的value值 $('#mydiv').val(内容)改变对象value值 $('#mydiv').html()获得对象html内容 $('#mydiv').html(内容)改变对象html内容 $('#mydiv').attr()获得对象属性信息【attribute属性、特性】 $('#mydiv').attr('checked')查看单、复选框的选定情况 $('#mydiv').css();获得对象样式属性信息 $('#mydiv').css(样式,值);给对象赋予样式 $('#mydiv').css({样式1:值,样式2:值??}); $('#mydiv').addClass('trbgA');//给元素class属性赋值trbgA $('#mydiv').removeClass('trbgA');//使得元素失去class属性 $('#mydivarr').each(function(){})遍历数组对象 $('#mydiv').click(function(){});鼠标点击事件【要写在onload事件里边】 $('#mydiv').hover(function(){},function(){});鼠标移动到对象事件

siblings 取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合。可以用可选的表达式进行筛选。

ajax 1.填写数据 2.发送请求 3.响应回执(回调函数) 4.本地机操作服务器资源(js操作) 清空缓存

1.在URL上加"$r="+Math.random()随机函数 2.在执行之后请空缓存

上机题

5. 请简述数据库设计的范式及应用。

一般第3范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了SQL语句过于庞大所造成系统效率低下。

第一范式:一个字段不能存储多类数据 一类数据也不能分为多个字段来存储 第二范式:所有非主键完全依赖与主键 第三范式:不能传递依赖 6.一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记存储过程: [php] DELIMITER // create procedure proc_countNum(in columnId int,out rowsNo int) begin select count(*) into rowsNo from member where member_id=columnId; end call proc_countNum(1,@no); select @no; [/php] 视图: create view v_countNum as select member_id,count(*) as countNum from member 录数,用SQL语句及视图、存储过程分别实现。 group by member_id

select countNum from v_countNum where member_id=1

11 两张表 city表和province表。分别为城市与省份的关系表。 city: id City Provinceid 1 广州 1 2 深圳 1 3 惠州 1 4 长沙 2 5 武汉 3 ???. 广州 province: id Province 1 广东 2 湖南 3 湖北 ………. (1) 写一条sql语句关系两个表,实现:显示城市的基本信息。?

(2) 显示字段:城市id ,城市名, 所属省份 。 如: Id(城市id) Cityname(城市名) Privence(所属省份) 。。。。。。。。。 。。。。。。。。。 (2)如果要统计每个省份有多少个城市,请用group by 查询出来。? 显示字段:省份id ,省份名,包含多少个城市。 ANSWER: 1.select A.id,A.Cityname,B.Province from city A,province B where A.provinceid=B.id 2.select B.id,B.Province,count(*) as num from city A,province B where

A.provinceid=B.id group by B.id

12. 按照你的经验请简述软件工程进行软件开发的步骤。以下工具Rational Rose、PowerDesigner、Project、VSS或CVS、TestDirector使用过那种,有缺点是什么? 公司用dbdesigner及cvs,测试管理工具用的是Mantis

14. 请使用伪语言结合数据结构冒泡排序法对以下一组数据进行排序 10 2 36 14 10 25 23 85 99 45。

[php]function bubble_sort(& $arr){ $number=count($arr); for($i=0;$i<$number-1;$i++){ for($j=0;$j<$number-1-$i;$j++){ if($arr[$j]>$arr[$j+1]){ $tmp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$tmp; } } } } $str="10 2 36 14 10 25 23 85 99 45"; $arr=explode(" ",$str); bubble_sort($arr); echo "<pre>"; var_dump($arr); [/php]

面试题

1. 变量如何定义?如何检查变量是否定义?如何删除一个变量?判断一个变量是否为空的函数?

$+变量名 isset() unset() empty()

2. 什么是可变变量? 一个变量的变量名可以动态的设置和使用。 $a = 'hello' , $$a = 'world', 3. 变量赋值方式有哪几种? 1)直接赋值 ${$a}=hello world

2)变量间赋值

3)引用赋值

4. 引用和拷贝有什么区别?

拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。

引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。

5. php中变量有哪些基本数据类型? php支持8种原始数据类型。 包括: 四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string) 两种复合类型(数组array , 对象object) 两种特殊类型(资源resource,NULL) 6. 其它类型转换为boolean类型时,哪些被认为是false?

布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串'0', 空数组,特殊数据类型NULL, 没有设定的变量。

7. empty()函数在哪些情况下返回true? 布尔值false, 整型值0, 浮点型值0.0, 空白字符串, 字符串'0', array()空数组, 特殊数据类型NULL, 没有任何属性的对象, 没有赋值的变量。 如果定义了一个变量$a ,但是没有赋初始值 那么$a==0吗? $a==false吗? $a==''吗? $a==NULL吗? $a===NULL吗? 答:echo=>什么都没有 , var_dump=>NULL empty($b)==true吗?———————————— echo=>1 , var_dump=>bool(true) 此时如果输出$a++是多少?——————— echo=>什么都没有 ,

echo=>1 , var_dump=>int(1) var_dump=>NULL 如果输出++$a又是多少?—————————

8. 字符串怎么转成整数,有几种方法?怎么实现? 强制类型转换: (整型)字符串变量名; 直接转换:settype(字符串变量,整型); intval(字符串变量); 10. 常量如何定义? 如何检测一个常量是否被定义?常量的值只能是哪些数据类型? define()//定义常量 , defined()//检查常量是否定义 常量的值只能是标量类型的数据。 11. 常量分为系统内置常量和自定义常量。请说出最常见的几个系统内置常量? __FILE__ , __LINE__ , PHP_OS , PHP_VERSION 12. 如果定义了两个相同的常量,前者和后者哪个起作用?

13. 前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。 常量和变量有哪些区别? 1)常量前没有$符号; 2)常量只能通过define()定义,而不能通过赋值语句定义; 3)常量可以在任何地方定义和访问,而变量定义的反问有固定的规则;

4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定

5)常量的值只能是标量数据,而变量的数据库类型有8中原始数据类型。 义;

17. 如何定义一个函数?函数名区分大小写吗? 1)使用 function 关键字; 2)函数命名规则和变量一样,以字母或者下划线开头,而不能以数字开头; 3)函数名不区分大小写; 4)函数名不可以使用已经声明过的或者系统自建的函数名称。 20. global关键词如何使用?预定义的全局变量数组$GLOBALS如何使用? $GLOBALS[] 包含正在执行脚本所有超级全局变量的引用内容

即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据, 因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数 据有:程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据,其中最常用的就是使用“global”关键字 申明,

使用“global”关键字来申明全局数据的唯一缺点就是它事实上是一 种非常差的编程方式,而且经常在其后导致程序中出现更大的问题, 因为全局数据把你代码中原本单独的代码段都联系在一起了,这样的 后果就是如果你改变其中的某一部分代码,可能就会导致其他部分出 错。所以如果你的代码中有很多全局的变量,那么你的整个 程序 必然是难以维护的。

面向对象时可以在项目中指定一个类做为常量类,在这个类中将项目 中所用到的一些常量信息定义好,用satic final进行定义

21. 什么是静态变量?

如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。 一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时,

该变量会在函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量

不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。

22. php中函数传递参数的方式有哪些?两者有什么区别? 按值传递和按地址传递(或按引用传递) (1)按值传递: 待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对

该变量值做的修改,不影响原本的变量值。

(2)按地址传递: 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存中是同一个。函数体做的修改,直

接影响到函数体外部的该变量的值。

23. 什么是递归函数?如何进行递归调用? 递归函数其实就是调用自身的函数,但是必须满足以下两个条件: 1)在每一次调用自身时,必须是更接近于最终结果; 2)必须有一个确定的递归终止条件,不会造成死循环。 举例说明: 在实际工作中往往会在遍历文件夹的时候使用。

如果有个例子是希望获取到目录windows下所有的文件,那么先遍历windows目录,如果发现其中还有文件夹,那么就会调用自身,继续往下寻找,依次类推,

直到遍历到再也没有文件夹为止,这也就是意味着遍历出来了所有的文件。 function_exists( string $function_name ) 如果存在,返回true, 不存在则返回 false。 24. 判断一个函数是否存在? 25. func()和@func()之间有什么区别? 第二个函数调用失败不会报错,第一个会报错 26. include()和require()函数的用法和区别是什么?include_once()和require_once()呢? include和require出现错误后的错误级别不一样 include_once()和require_once()在加载之前要判断是否已经导入 27. 说出前置++和后置++的区别? 前置++是先将变量增加1,然后在将值赋值给原来的变量; 后置++是先返回变量的当前值,然后再将变量的当前值增加1. 28. 字符串运算符“.”与算术运算符“+”有什么区别?

当“a”“b”之间使用.时认为是连字符。如果两者间是+的时候php会认为是一次运算。

1)如果+号两边的字符串是数字组成的,那么会将字符串自动转为整型;

2)如果+号两边是纯粹的字母,那么会输出0;

3)如果+号两边的字符串是以数字开头的,那么会截取字符串开头的数字,然后进行运算。

29. 简述一下$_REQUEST、$_GET、$_POST、$_COOKIE 的关系和区别。

1. $_REQUEST包含了$_GET、$_POST、$_COOKIE的所有内容,是它们的集合体。

2.$_GET、$_POST、$_COOKIE在$_REQUEST中都有一个副本。改变$_REQUEST的值不影响$_GET等,反之亦然。

3,受PHP配置变量variables_order的影响,可以改变GET,POST和COOKIE的有效顺序,默认是如果get,post,cookie中有相同下标的变量,在request中会保留cookie的值,其次是post的值,最后是get的值。

29.流程图 圆 开始结束 正方形 处理 菱形 条件

30. 控制流程语句有哪些? 1:三种程序结构 顺序结构、分支结构、循环结构 2:分支: if/esle/esleif/ switch/case/default 3: switch 需要注意的:

case子句中的常量可以是整型、字符串型常量、 或者常量表达式,不允许是

同一个switch子句中,case的值不能相同,否则只能取到首次出现case中的 变量。

值。

4: 循环 for while do...while do...while 后面必须加入分号结尾。 while 和 do...while 的区别 5:break 和 continue 的区别。 break可以终止循环。 continue没有break强大,只能终止本次循环而进入到下一次循环中。

31. 数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种?

数组是一个可以存储一组或一系列数值的变量(复合型变量) 索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值) 数组的赋值方式有哪两种? 数组的声明方式主要有两种。 1.通过array()函数声明数组;

可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。

2.直接为数组元素赋值,不需要调用array()函数。例如: $arr[0] = 1; $arr[1] = 2; 特别注意: 数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。

例如: $array[3] 与 $array['3'] 引用的是相同的一个元素,而 $array['03'] 引用的则就是另外的一个元素了。

32.数组如何遍历?

①for循环 ②foreach循环 ,这是最常用的遍历方式。用法如下:foreach($arr as $key=>$value){}

③list each 和while 配合起来循环

33. foreach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢?

当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。

而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset().

reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。

34. 如何计算数组长度(或者说计算数组中所有元素的个数)?字符串怎么取长度? count() -- 计算数组中的元素个数。 可以使用count(数组名)或者count(数组名,1),如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。

如果第二个参数是数字0,则等同于只有一个参数的count()函数。

sizeof() -- count() 的别名 字符串:strlen()、mb_strlen(); 35. 数组中相关的常用函数有哪些?

1) count --(sizeof别名)— 计算数组中的单元数目或对象中的属性个数 例如:int count ( mixed $var [, int $mode ] ) $var 通常都是数组类型,任何其它类型都只有一个单元。 $mode 默认值为0. 1为开启递归地对数组计数

2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 检查数组中是否存在某个值。

如果 needle 是字符串,则比较是区分大小写的。 如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。

3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。

特别注意:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引 4) 数组与字符串之间的转换

(1)explode ( string $separator , string $string [, int $limit ] ) 使用一个分隔字符来分隔一个字符串。

(2)implode ( string $glue , array $arr ) 使用一个连接符将数组中的每个单元连接为一个字符串。

join 为 implode 的别名

5) sort(array &$array [, int $sort_flags ]) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。

36. 数组合并函数array_merge()和数组加法运算$arr + $arr2 的区别是什么?

array_merge()->使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是

后者附加到前者后面。

"+"->使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃,

也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。

37. 字符串定义的时候单引号和双引号有什么区别?

定义没有区别,注意在单引号和双引号中如有变量,一个输出变量值,一个输出变量名,还有一个是在写sql时,尽量将变量用''扩起来。

双引号所包含的变量会自动被替换成变量变量实际的值,而单引号中包含的变量则按普通的字符串输出。另一个不同之处是对转义字符的使用,单引号只要对“ , ”进行转义就可以了,但使用双引号时,还要注意对”” ”/”$”等字符的使用,这些特殊字符都要通过转义符”/”来显示。

38. echo(),print(),print_r()的区别? (1)echo 是语法,Output one or more strings,没有返回值; (2)print 是函数,不能输出数组和对象,Output a string,print有返回值; (3)print_r 是函数,可以输出数组。print_r是个比较有意思的函数,可以输出stirng、int、float、

array、object等,输出array时会用结构表示,print_r输出成功时返回true;而且print_r可以通过print_r($str,true)来,使print_r不输出而返回print_r处理后的值。此外,对

于echo和print,基本以使用echo居多,因为其效率比print要高。

39. 按照功能分类说说都有哪些字符串处理函数?这些函数的作用是什么? A. 字符串输出函数 (1)echo $a,$b,$c......; 是一个语言结构,而不是一个真正的函数。 (2)print($a) 本函数输出字符串。若成功则返回 1,失败返回 0 (3)print_r($a) (4)var_dump($a); 能输出类型、长度、值

B. 去除字符串首尾空格的函数: trim ltrim rtrim(别名:chop) 使用第二个参数,还可以去除指定的字符。

C. 转义字符串函数:addslashes() D. 获取字符串长度的函数:strlen() E. 截取字符串长度的的函数:substr() F. 检索字符串函数: strstr() , strpos() G. 替换字符串函数:str_replace() 41.页面字符出现乱码,怎么解决?

1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是

在header()函数中指定了charset;

例如: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

header(“content-type:text/html;charset=utf-8”);

2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致,

两者必须保持统一;

3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一,

例如:mysql_query(“set names utf8”)。

42. 正则表达式是什么?php中有哪些常用的跟正则相关的函数?请写出一个email的正则,中国手机号码和座机号码的正则表达式?

式。

正则表达式是用于描述字符排列模式的一种语法规则。正则表达式也叫做模式表达网站开发中正则表达式最常用于表单提交信息前的客户端验证。 比如验证用户名是否输入正确,密码输入是否符合要求,email、手机号码等信息的输入是否合法。

在php中正则表达式主要用于字符串的分割、匹配、查找和替换操作。

preg系列函数可以处理。具体有以下几个: string preg_quote ( string str [, string delimiter] ) 转义正则表达式字符 正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。

preg_replace -- 执行正则表达式的搜索和替换

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] ) preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换 mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int

limit] )

preg_split -- 用正则表达式分割字符串

array preg_split ( string pattern, string subject [, int limit [, int flags]] ) 43. 如果想过滤掉某个字符串中所有的html标记使用哪个函数? strip_tags(string) 这样就可以过滤掉所有的html标签了。

44. preg_replace()和 str_ireplace()两个函数在使用上有什么不同?preg_split()和split()函数如何 使用?

45. 获取当前时间戳的函数主要有哪些?用PHP打印出今天的时间,格式是2010-12-10 22:21:21?

用PHP打印出前一天的时间格式是2010-12-10 22:21:21?如何把2010-12-25 echo date ("Y-m-d H:i:s" ,strtotime(?-1,days?)); 10:30:25变成unix时间戳? date('Y-m-d H:i:s',time()); $unix_time = strtotime("2009-9-2 10:30:25");//变成unix时间戳 echo date("Y-m-d H:i:s",$unix_time);//格式化为正常时间格式 46. 在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码? 用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入<script>alert(111);),php端接收数据的时候,应该如何处理?

使用urlencode()对中文进行编码,使用urldecode()来解码。

使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。

47. 连接数据库操作的步骤是什么?每一步的返回值是什么数据类型?尤其是mysql_query()返回什么数据类型?

1.mysql_connect 连接数据库,返回资源类型

2.mysql_select_db — 选择 MySQL 数据 ,返回boolean

3.mysql_query('set names utf8') 指定字符集 4.写sql,用mysql_query()去执行

mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE

48. 说说mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之间有什么区别?

第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个既可以返回索引数组也可以返回关联数组,取决于它的第二个参数 MYSQL_BOTH MYSQL_NUM MYSQL_ASSOC 默认为MYSQL_BOTH

$sql =”select * from table1”; $result = mysql_query($sql);

mysql_fetch_array($result, MYSQL_NUM);

51. 文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名?

1.首现要在php.ini中开启文件上传; 2.在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改; 3.上传表单一定要记住在form标签中写上enctype="multipart/form-data";

4. 提交方式 method 必须是 post;

5. 设定 type="file" 的表单控件;

6.要注意上传文件的大小MAX_FILE_SIZE、文件类型是否符合要求,上传后存放的路径是否存在。

可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名,这样就避免了重名。

可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成

将文件保存到指定目录。

52. $_FILES 是几维数组?第一维和第二维的索引下标分别是什么?批量上传文件的 二维数组,第一维是上传控件的name而为下标分别为时候需要注意什么? name/type/tmp_name/size/error.

53. header()函数主要的功能有哪些?使用过程中注意什么?

答1.指定客户端编码方式,防止乱码 2.下载时指定文件类型,验证码时指定文件类型为图片 3.获取很多有用的服务器方面的信息 4.页面的跳转重定向 54. 文件下载的时候如果使用header()函数?

答:header("content-type: application/octet-stream;charset=UTF-8"); //在这里加utf-8和在上面定义有什么区别?、??

header("accept-ranges: bytes"); header("accept-le1ngth: ".filesize($filedir.$filename)); header("content-disposition: attachment; filename=".$filedir.$filename); 59. 使用cookie的注意事项有哪些? 1) setcookie()之前不可以有任何页面输出,就是空格,空白行也不可以;

2) setcookie()后,在当前页面调用$_COOKIE['cookiename']不会有输出,必须刷新或到下一个页面才可以看到cookie值;

3) 不同的浏览器对cookie处理不同,客户端可以禁用cookie,浏览器也可以闲置cookie的数量,一个浏览器能创建的cookie数量最多300个,并且每个不可以超过4kb, 每个web站点能设置的cookie总数不能超过20个。

4) cookie是保存在客户端的,用户禁用了cookie,那么setcookie就不会起作用了。所以不可以过度依赖cookie。

60. 使用session的时候,通过什么来表示当前用户,从而与其他用户进行区分? sessionid,通过session_id()函数可以取得当前的session_id。

61. session和cookie的使用步骤分别是什么?什么是sesssion和cookie的生命周期?session和cookie的区别是什么?

cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则

cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,

当再次打开浏览器时cookie值依然有效。

session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,

其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是

哪个用户的。

两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。session自动序列化,cookie用函数serialize进行序列化

session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份

访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作则不分配session空间,即便输入了 权限。

使用session的步骤:

1. 启动session: 使用session_start()函数来启动。 2. 注册会话: 直接给$_SESSION数组添加元素即可。 3. 使用会话:

4.

判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即删除会话: 1.可以使用unset删除单个session; 2.使用$_SESSION=array()的方式,一次注销所有的会话变量; 3.使用session_destroy()函数来彻底销毁session。 可。

cookie怎么使用? 1. 记录用户访问的部分信息 2. 在页面间传递变量 3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。 创建cookie: setcookie(string cookiename , string value , int expire); 读取cookie: 通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。 删除cookie:有两种方法 1.手工删除方法: 右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删2.setcookie()方法: 跟设置cookie的方法一样,不过此时将cookie的值设置为空,有效时间为0除。 或小于当前时间戳。

62. 如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效?

一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少? setcookie(?username?,?jack?,time()+7*24*3600); 最多可以产生20个cookie,每个最多不超过4K

63. 设置或读取session之前,需要做什么? 64. 可以直接在php.ini中开启session.auto_start = 1或者在页面头部用session_start(); 开启session,session_start()前面不能有任何输出,包括空行。 在实际开发中,session在哪些场合使用? session用来存储用户登录信息和用在跨页面传值。 1)常用在用户登录成功后,将用户登录信息赋值给session; 2)用在验证码图片生成,当随机码生成后赋值给session。 65. 注销session会话的形式有几种? unset() $_SESSION=array(); session_destroy(); 66. 什么是OOP?什么是类和对象?什么是类属性? OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是世间万物都具有自身的属性和方法,通过这些属性和方法可以区分出不同的物质。 属性和方法的集合就形成了类,类是面向对象编程的核心和基础, 通过类就将零散的用于实现某个功能的代码有效地管理起来了。 类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就类和对象。 是需要对类进行实例化,

类在实例化之后就是对象。★类是对象的抽象概念,对象是类的实例化。 OOP具有三大特点:1. 封装性(又叫做隐藏性);2. 继承性; 3. 多态性。

OOP的优点:1、代码重用性高(省代码) 2、使程序的可维护性高(扩展性)3、灵活性 67. 常用的属性的访问修饰符有哪些?分别代表什么含义? private,protected,public。 类外:public ,var 子类中:public,protected ,var 本类中:private,protected,public ,var 如果不使用这三个关键词,也可以使用var关键字。但是var不可以跟权限修饰词一起使用。var定义的变量,子类中可以访问到,类外也可以访问到,相当于public 类前面:只能加final,abstract

属性前面:必须有访问修饰符(private,protected,public,var)

方法前面:static,final,private,protected,public ,abstract 68. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用? $this 当前对象 self 当前类 parent 当前类的父类 $this在当前类中使用,使用->调用属性和方法。 self也在当前类中使用,不过需要使用::调用。 parent在类中使用。 69.类中如何定义常量、如何类中调用常量、如何在类外调用常量。 类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。 定义常量使用关键字const. 例如:const PI = 3.1415326; 无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象, 访问常量的格式都是类名加作用域操作符号(双冒号)来调用。

70. 即:类名 :: 类常量名; 作用域操作符::如何使用?都在哪些场合下使用? 调用常量 调用静态方法 self::本类的静态方法 parent::父类的静方法 ::也可以访问静态方法和属性。 请看项目中cartModel->baseModel->baseSql->DBConnect 72. 什么是构造方法和析构方法? 构造方法就是在实例化一个对象的同时自动执行的成员方法,作用就是初始化对 php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()象。 就是构造方法。

如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数,

没有任何操作。 构造方法的格式如下: function __construct(){} 或者:function 类名(){} 构造方法可以没有参数,也可以有多个参数。

析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。

析构方法的定义方法为:__destruct();

因为php具有垃圾回收机制,能自动清除不再使用的对象,释放内存,一般情况下可以不手动创建析构方法。

73. __autoload()方法的工作原理是什么?

使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。 当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。

这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后

就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

使用自动载入的魔术函数可以不必要写很多个include或者require函数。 74. 什么是抽象类和接口?抽象类和接口有什么不同和相似的地方? 抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。 抽象类是通过关键字 abstract 来声明的。 抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,

抽象方法没有方法体,该方法天生就是要被子类重写的。

抽象方法的格式为:abstract function abstractMethod(); 因为php中只支持单继承,如果想实现多重继承,就要使用接口。也就是说子类可以实现多个接口。

接口类是通过interface关键字来声明的,接口类中的成员变量和方法都是public的,方法可以不写关键字public,

接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。

抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。

子类继承抽象类使用extends,子类实现接口使用implements。

抽象类至少有一个抽象方法吗??????

答:如果一个类声明成抽象类,里面可以没有抽象方法 如果一个类中有抽象方法,这个类必须是抽象类 75. __call的参数有几个,类型是什么,意义是什么? 魔术方法__call()的作用是当程序调用一个不存在或不可见的成员方法时,php会先 将那个不存在的方法的方法名和参数都存储下来。 __call()包含两个参数, 第一个参数是那个不存在的方法的方法名,是个字符串

第二个参数是那个不存在的方法的所有参数,是个数组类型。 调用__call()方法, 类型;

本人认为__call()方法的意义更多在于调试,可以定位到错误。同时可以捕捉异常,如果某个方法不存在,

则执行其它可替代方法。 76. smarty模板技术的用途是什么? 为了php与html分开,美工和程序员各司其职,互不干扰。 77. smarty配置主要有哪几项? 1. 引入smarty.class.php; 2. 3. 4. 5. 实例化smarty对象; 重新修改默认的模板路径; 重新修改默认的编译后文件的路径; 重新修改默认的配置文件的路径; 6. 重新修改默认的cache的路径。 7. 可以设置是否开启cache。 8. 可以设置左侧和右侧定界符。 78. smarty在使用过程中需要注意哪些细节? Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,

也就是说smarty技术将用户UI与php代码分离开。

这样程序员和美工各司其职,互不干扰。 smarty运用过程中要注意以下几个问题: 1.正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径; 2.php页面中使用assign赋值 和 display显示页面; 3.smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。

A.{} B. foreach C. if else D. include E. literal

80. oop中的多态性跟方法重写有什么关系?

答:多态是指同一个方法名,却可以完成不同的工作。在Java中有,在PHP没有多态,因为php不允许同名方法。在一个类去写多个同名方法,通过参数不同来调用。 重写:子类对从父类中继承来的方法不够用时,要重写父类中该方法。

81. java语言中方法重写和重载分别代表什么意思?准确说php支持方法的重载吗?很多参考书中提到的php重载实际上该如何正确理解?

答:php不支持方法的重载,很多书里提到的PHP‘重载’应该是‘重写’

82. final关键字能定义类中的成员属性吗?

答:不能,类的成员属性只能有public ,private , protected ,var 来定义

83. final关键字定义的类能够被继承吗? 答:final定义的类不能被继承 84. 说说static关键字的使用场合?static能用在class前吗? static可以跟public,protected,private一起使用吗?构造方法可以是static的吗? 答: static可以在属性和方法前面使用,调用static属性或者方法时,只要将类载入就可用,不用实例化 static不能用在class的前面 static可以跟public,protected,private一起使用,在方法的前面 ▲构造方法不能是static 85. 接口可以实例化吗?抽象类能实例化吗? 答:接口和抽象类都不能被实例化

86. class前面能加访问修饰符吗?如果能加,只能是哪几个访问修饰符?可以是权限访问修饰符public,protected,private吗?

答:class前面可以加final,static;

★class前面不能加public,protected,private 87. 类中属性前可以不加访问修饰符吗?成员变量前的修饰符只能是public,protected,private吗?还可以是哪几个?

答:类中的属性必须加修饰符,除了那3个以外,还可以加var

88. 如果echo一个数组,页面输出什么?echo一个对象呢?print一个数组或者对象呢? 答:页面只能输出“Array”;echo一个对象会出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php on line 33”

print一个数组时也只是输出“Array”,print一个对象出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php ”

▲print和echo是一样的

89. __tostring()魔术方法在什么时候被自动执行? __tostring()魔术方法必须要return返回值吗?

当echo或者print一个对象时,就是自动触发。而且__tostring()必须要返回一个值

90. 什么是抽象方法? 答:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有 91. 如果一个类中有一个方法是抽象方法,而这个类没有定义成抽象类,会报错吗?

答:会,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"

92. 如果一个类是抽象类,而类中的方法都是非抽象的方法,会报错吗?

答:不会报错,如果一个类是抽象类,其中可以没有抽象方法,但是一个类中有个方法是抽象方法,那么这个类一定是一个抽象类

94. final 关键字的应用应注意的问题?

使用final关键字定义的类,禁止继承。

95. 96. 使用final关键字定义的方法,禁止重写。 如果一个类既要继承一个父类,又要实现多个接口,该如何写? 书写格式例如: class MaleHuman extends Human implements Animal,Life { ... } 什么是单点入口呢? 所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来

比如说在上面我们就使用index.php作为程序的单点入口,当然这个是可以由转发,

你自己任意控制的。

单点入口有几大好处:

第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面

第二、程序的架构更加清晰明了。 97. PHP提供了2套正则表达式函数库,分别是哪两套?【 (1) PCRE Perl兼容正则表达式 preg_ 为前缀 (2) POSIX 便携式的操作系统接口 ereg_ 为前缀 98. 正则表达式的组成? 由原子(普通字符,如英文字符)、 元字符(有特殊功用的字符) 99. 模式修正字符 一个正则表达式中,至少包含一个原子 不常用魔术方法的触发时机? __isset() __unset()的触发时机 __sleep()、 __wakeup() 在对对象进行串行化的时候调用 如果序列化对象的时候,不写__sleep()方法,则所有的成员属性都会被序列化,而定义了__sleep()方法,则只序列化指定数组中的变量。

因此,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

100. OOP的三大特性是什么? 1. 封装性: 也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。

于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,

实现代码模块间松藕合。 2. 继承性:

就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。

php只支持单继承,也就是说一个子类只能有一个父类。

3. 多态性:

子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。

于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。

多态性增强了软件的灵活性。

101.常见框架 thinkPHP yii ZendFramework CakePhp sy 102. 常用魔术方法的触发时机?

1)__autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行__autoload()。程序希望通过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。__autoload()方法的工作原理是什么?当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。

2)__construct() :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果有参数,那么new这个对象的时候要记得写上相应的参数。在php5以前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。如果一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起作用,普通构造方法不起作用。反之,在php5以前版本中,不认识魔术构造方法,只是把该方法当做普通的方法。

3)__destruct() :这个是魔术析构方法。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。析构方法没有参数。

4)__call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行__call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。

5)__get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行__get()。它有一个参数,表示要调用的属性的名称。

6)__set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行__set()。它包含两个参数,分别表示属性名称和属性值。

7)__tostring() :当程序使用echo或print输出对象时,会自动调用该方法。目的是希望通过该方法将对象转化为字符串,再输出。__tostring() 无参数,但是该方法必须有返回值。

8)__clone() :当程序clone一个对象的时候,能触发__clone()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。

103. MVC的概念是什么?

MVC(即模型-视图-控制器)是80年代发明的一种软件设计模式或者说编程思想。 M指模型层,V是指视图层(显示层或者用户界面),C是指控制层。 使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户

界面。

C存在的目的则是在M和V之间起到调节作用,确保M和V的同步,一旦M改变,V应该能同步更新。

将M和V分离,就可以做到同一个网页,在不同节日到来的时候能显示不同的页面风格,这只需要提前制作多个视图层模板页面,

而无需更改M层程序。 MVC做到了编程中的分工合作,代码的可重用性得到最大化体现,程序逻辑更加清晰而富有条理,便于后期维护管理。

104、 访问权限修饰符有哪几种,对比解释

答:1、public 表示公共的,在本类中和子类中以及类外,可以对其调用 2、protected表示受保护的,可以在本类中和子类中调用 3、private表示私有的,只能在本类中调用 4、var,效果等同于public 105、 Class关键词前可以有哪些修饰词 a) Final修饰,表示该类是最终的,无法继承 b) Abstract修饰,表示该类是抽象类 106、 作用域操作符在那些场合下使用 答:作用于操作符的使用场合 a) 本类中: b) i. self::类常量 ii. self::静态属性 iii. self::方法() parent::方法() 子类中: i. parent::类常量 ii. parent::静态属性(public或者protected) iii. parent::方法()(public或者protected) c) 类外: i. 类名::类常量 ii. 类名::静态属性(public) iii. 类名::静态方法(public) 107、 $this,self, parent分别代表什么?哪些场合下使用 答:$this代表的是当前对象 self代表的是当前的类 parent代表的是当前类的父类 使用场合: $this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法; self只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;

parent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法。

108、 说明是接口、抽象类二者有何相同和不同的地方?

1、接口是帮助php实现功能意义上的多继承的,用interface来声明,其方法没有方法体,使用implemens关键词来实现接口。

接口中只能包含抽象方法和类常量,不可以包含成员属性。

2、抽象类是一种不能被实例化的类,只能作父类,用abstract class来定义,抽象类和普通类可以没有区别,类中可以包含成员属性、类常量、方法。

子类得用extends来继承,而且只能是单继承。

两者相同点是都不可以被实例化,都是需要被继承才可以使用。

两者的最大区别是接口可以实现多继承,而抽象类只能是单继承。

接口中不能包含成员属性,而抽象类中可以有成员属性。 接口中的抽象方法必须是public或者无访问修饰词,接口中的抽象方法不能用abstract来修饰。

抽象类中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract来修饰。

109、解释PHP中单例模式?(三私一公) 又叫做单态模式、单元素模式、singleton pattern。

单例模式指在PHP的应用程序的范围内只对指定的类创建一个实例。使用单例模式的类称为单例类。(在脚本运行周期内只实例化一次类)。

在php中单例类必须要有一个私有的构造方法, 还要有一个私有的魔术克隆方法(该方法体中为空) 和一个私有的静态的成员属性 还必须要有一个公共的静态的方法getInstance()。该方法返回已经存储了实例对象的 私有(private)构造方法(__construct):防止类的外部来实例化它。 私有的方法体为空的克隆方法:防止该类被克隆。 私有的静态成员属性:只在类内部访问 公有的静态方法:类外部实例化 1.表单中 get与post提交方法的区别?

答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.

2.session与cookie的区别?

答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放

cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。

两者都可通过时间来设置时间长短

简述题:

1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分)

答:echo date('Y-m-d H:i:s', strtotime('-1 days')); 2、echo(),print(),print_r()的区别(3分)

答:echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)

print() 只能打印出简单类型变量的值(如int,string)

print_r() 可以打印出复杂类型变量的值(如数组,对象) echo 输出一个或者多个字符串 3、能够使HTML和PHP分离开使用的模板(1分) 答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate 5、使用哪些工具进行版本控制?(1分) 答:cvs,svn,vss; 6、如何实现字符串翻转?(3分) 答:echo strrev($a); 7、优化MYSQL数据库的方法。(4分,多写多得) 答: 1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM 2、使用连接(JOIN)来代替子查询: a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)

b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)

c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid

WHERE orderinfo.customerid IS NULL 3、使用联合(UNION)来代替手动创建的临时表 a.创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`

5、锁定表,优化事务处理:

a.我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。

包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前,

不会有其它的访问来对 inventory 进行插入、更新或者删除的操作 mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE"); mysql_query("SELECT customerid FROM `customerinfo` where id=".$id); mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id); mysql_query("UNLOCK TABLES"); 6、使用外键,优化锁定表 a.把customerinfo里的customerid映射到orderinfo里的customerid, 任何一条没有合法的customerid的记录不会写到orderinfo里 CREATE TABLE customerinfo ( customerid INT NOT NULL, PRIMARY KEY(customerid) )TYPE = INNODB; CREATE TABLE orderinfo

( orderid INT NOT NULL, customerid INT NOT NULL, PRIMARY KEY(customerid,orderid), FOREIGN KEY (customerid) REFERENCES customerinfo (customerid) ON DELETE CASCADE

)TYPE = INNODB;

注意:'ON DELETE CASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order

表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB; 7、建立索引: a.格式: (普通索引)-> 创建:CREATE INDEX <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段) 创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段)) (唯一索引)-> 创建:CREATE UNIQUE <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段) 创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段)) (主键)-> 它是唯一索引,一般在创建表是建立,格式为: CREATA TABLE tablename ([...],PRIMARY KEY[索引字段]) 8、数据库优化查询语句 a.最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作 例子1: SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢) SELECT * FROM order WHERE orderDate<"2008-01-01";(快) 例子2: SELECT * FROM order WHERE addtime/7<24;(慢) SELECT * FROM order WHERE addtime<24*7;(快) 例子3: SELECT * FROM order WHERE title like "%good%"; SELECT * FROM order WHERE title>="good" and name<"good"; 9、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分) 答:now(),date() 10、实现中文字串截取无乱码的方法。(3分) 答:function GBsubstr($string, $start, $length) { if(strlen($string)>$length){ $str=null; $len=$start+$length; for($i=$start;$i<$len;$i++){ if(ord(substr($string,$i,1))>0xa0){

$str.=substr($string,$i,2); $i++; }else{ $str.=substr($string,$i,1); } } return $str.'...'; }else{ return $string; } } 14、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分) 答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量

15、用PHP写出显示客户端IP与服务器IP的代码1分)

答:打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR');

打印服务器IP:echo gethostbyname("")

16、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (2分)

答:require->require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require

include->include有返回值,而require没有(可能因为如此require的速度比include快) 注意:包含文件不存在或者语法错误的时候require是致命的,include不是

17、如何修改SESSION的生存时间(1分). 答:方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache 方法2:$savePath = "./session_save_dir/"; $lifeTime = 小时 * 秒; session_save_path($savePath);

session_set_cookie_params($lifeTime);

session_start();

方法3:setcookie() and session_set_cookie_params($lifeTime);

18、有一个网页地址, 比如PHP开发资源网主页: /index.html,如何得到它的内容?($1分)

答:方法1(对于PHP5及更高版本): $readcontents = fopen("/index.html", "rb"); $contents = stream_get_contents($readcontents); fclose($readcontents); echo $contents; 方法2: echo file_get_contents("/index.html"); 19、在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用

header 函数,其语句为(?);(2分)

答:状态401代表未被授权,header("Location:www.xxx.php");

12、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分)

答:heredoc的语法是用"<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串

例子: $str = <<<SHOW my name is Jiang Qihui! SHOW; 13、谈谈asp,php,jsp的优缺点(1分) 答:ASP全名Active Server Pages,是一个WEB服务器端的开发环境, 利用它可以产生和运

行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script(Java script

)作为自己的开发语言。

PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法

, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝大多数数

据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点(http://www.php.ne

t)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。 JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病--

脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Jav

a 上的不凡造诣,将Java 从Java 应用程序 和 Java Applet 之外,又有新的硕果,就是Js

p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能强大的站点

程序。 三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。

但JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的

第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样式

,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 、PH

P、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到

HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP三者都是面向 Web 服务器的技术

,客户端浏览器不需要任何附加的软件支持。

14、谈谈对mvc的认识(1分)

答:由模型(model),视图(view),控制器(controller)完成的应用程序

由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;

15、写出发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)

答:SELECT * FROM `members` ORDER BY posts DESC limit 0,10; 16. 请说明php中传值与传引用的区别。什么时候传值什么时候传引用?(2分) 答:按值传递:函数范围内对值的任何改变在函数外部都会被忽略 按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这 按引用传递则不需要复制值,对于性能提高很有好处。 17. 在PHP中error_reporting这个函数有什么作用? (1分) 答:设置错误级别与错误信息回报 18. 请写一个函数验证电子邮件的格式是否正确 (2分) 答:function checkEmail($email)

= 将会是一个代价很大的操作。 { $pregEmail

"/([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?/i";

return preg_match($pregEmail,$email); } 19. 简述如何得到当前执行脚本路径,包括所得到参数。(2分) 答:$script_name = basename(__file__); print_r($script_name); 21、JS表单弹出对话框函数是?获得输入焦点函数是? (2分) 答:弹出对话框: alert(),prompt(),confirm() 获得输入焦点 focus() 22、JS的转向函数是?怎么引入一个外部JS文件?(2分) 答:window.location.href,<script type="text/javascript" src="js/js_function.js"></script> 23、foo()和@foo()之间有什么区别?(1分) 答:@foo()控制错误输出 24、如何声明一个名为”myclass”的没有方法和属性的类? (1分) 答:class myclass{ } 25、如何实例化一个名为”myclass”的对象?(1分) 答:new myclass() 26、你如何访问和设置一个类的属性? (2分) 答:$object = new myclass(); $newstr = $object->test; $object->test = "info"; 27、mysql_fetch_row() 和mysql_fetch_array之间有什么区别? (1分) 答:mysql_fetch_row是从结果集取出1行数组,作为枚举 mysql_fetch_array是从结果集取出一行数组作为关联数组,或数字数组,两者兼得

28、GD库是做什么用的? (1分)

答:gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。

在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。

29、指出一些在PHP输入一段HTML代码的办法。(1分)

答:echo "<a href='index.php'>aaa</a>";

30、下面哪个函数可以打开一个文件,以对文件进行读和写操作?(1分)

(a) fget() (b) file_open() (c) fopen() (d) open_file() [ c ] 31、下面哪个选项没有将 john 添加到users 数组中? (1分) (a) $users[] = ‘john’; (b) array_add($users,’john’); (c) array_push($users,‘john’); (d) $users ||= ‘john’; [ a , c ] 32、下面的程序会输入是否?(1分) $num = 10; function multiply(){ $num = $num * 10; } multiply(); echo $num; 输出:10 33、使用php写一段简单查询,查出所有姓名为“张三”的内容并打印出来 (2分) 表名User Name Tel Content Date 张三 133xxxxxxxx 大专毕业 2006-10-11 张三 136xxxxxxxx 本科毕业 2006-10-15 张四 021-55665566 中专毕业 2006-10-15 请根据上面的题目完成代码: $mysql_db=mysql_connect("local","root","pass"); @mysql_select_db("DB",$mysql_db); $result = mysql_query("SELECT * FROM `user` WHERE name='张三'"); while($rs = mysql_fetch_array($result)){ echo $rs["tel"].$rs["content"].$rs["date"]; } 34、如何使用下面的类,并解释下面什么意思?(3) class test{ function Get_test($num){ $num=md5(md5($num)."En"); return $num; } } 答:$testnum = "123"; $object = new test(); $encrypt = $object->Get_test($testnum); echo $encrypt;

类test里面包含Get_test方法,实例化类调用方法多字符串加密 35、写出 SQL语句的格式 : 插入 ,更新 ,删除 (4分) 表名User Name Tel Content Date 张三 133xxxxxxxx 大专毕业 2006-10-11 张三 136xxxxxxxx 本科毕业 2006-10-15 张四 021-55665566 中专毕业 2006-10-15

(a) 有一新记录(小王 132xxxxxxxx 高中毕业 2007-05-06)请用SQL语句新增至表中

mysql_query("INSERT INTO `user` (name,tel,content,date) VALUES ('小王','132xxxxxxxx','高中毕业','2007-05-06')") $nowDate = date("Ymd"); mysql_query("UPDATE `user` SET date='".$nowDate."' WHERE name='张山'"); (b) 请用sql语句把张三的时间更新成为当前系统时间 (c) 请写出删除名为张四的全部记录 mysql_query("DELETE FROM `user` WHERE name='张四'");

36、如果给定的数值超出了int 所能表示的最大的范围,将会被当作float 型结果,这种情况叫做整数溢出。

38、写出以下程序的输出结果 (1分)

$b=201; $c=40; $a=$b>$c?4:5; echo $a; 答:4 39、检测一个变量是否有设置的函数是否?是否为空的函数是?(2分) 答:isset($str),empty($str); 40、取得查询结果集总数的函数是?(1分) 答:mysql_num_rows($result); 41、$arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值 (1分) 答:echo $array[0]; 42、请将41题的数组的值用','号分隔并合并成字串输出(1分) 答:for($i=0;$i<count($array);$i++){ echo $array[$i].",";} 43、$a = 'abcdef'; 请取出$a的值并打印出第一个字母(1分) 答:echo $a{0} 或 echo substr($a,0,1) 44、PHP可以和sql server/oracle等数据库连接吗?(1分) 答:当然可以 45、请写出PHP5权限控制修饰符(3分) 答:public(公共),private(私用),protected(继承) 47、完成以下: (一)创建新闻发布系统,表名为message有如下字段 (3分) id 文章id title 文章标题

content 文章内容 category_id 文章分类id hits 点击量 答:CREATE TABLE 'message'( 'id' int(10) NOT NULL auto_increment, 'title' varchar(200) default NULL, 'content' text, 'category_id' int(10) NOT NULL, 'hits' int(20), PRIMARY KEY('id'); )ENGINE=InnoDB DEFAULT CHARSET=utf8; (二)同样上述新闻发布系统:表comment记录用户回复内容,字段如下 (4分) comment_id 回复id id 文章id,关联message表中的id comment_content 回复内容 现通过查询数据库需要得到以下格式的文章标题列表,并按照回复数量排序,回复最高的排在最前面

文章id 文章标题 点击量 回复数量

用一个SQL语句完成上述查询,如果文章没有回复则回复数量显示为0

hits,

IF(comment.`id` is NULL,0,count(*)) number FROM message LEFT JOIN comment ON message.id=comment.id GROUP BY message.`id`; (三)上述内容管理系统,表category保存分类信息,字段如下 (3分) category_id int(4) not null auto_increment; categroy_name varchar(40) not null; 用户输入文章时,通过选择下拉菜单选定文章分类 写出如何实现这个下拉菜单 答:function categoryList() { $result=mysql_query("select category_id,categroy_name from category") or die("Invalid query: " . mysql_error()); print("<select name='category' value=''>\n"); while($rowArray=mysql_fetch_array($result)) { print("<option } print("</select>"); 答:SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) value='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option>\n"); } 编程题: 1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名 例如: .cn/abc/de/fg.php?id=1 需要取出 php 或 .php 答案1:

function getExt($url){ $arr = parse_url($url); $file = basename($arr['path']); $ext = explode(".",$file); return $ext[1]; } 答案2: function getExt($url) { $url = basename($url); $pos1 = strpos($url,"."); $pos2 = strpos($url,"?"); if(strstr($url,"?")){ return substr($url,$pos1 + 1,$pos2 - $pos1 - 1); } else { return substr($url,$pos1);

}

}

2. 在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句

请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5

请注意:

1. 需要处理完整的 html 页面,即不光此 meta 语句

2. 忽略大小写 3. ' 和 " 在此处是可以互换的 4. 'Content-Type' 两侧的引号是可以忽略的,但 'text/html; charset=gbk' '两侧的不行 5. 注意处理多余空格 3. 写一个函数,算出两个文件的相对路径 如 $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php'; 计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上 答:function getRelativePath($a, $b) { $returnPath = array(dirname($b)); $arrA = explode('/', $a); $arrB = explode('/', $returnPath[0]); for ($n = 1, $len = count($arrB); $n < $len; $n++) { if ($arrA[$n] != $arrB[$n]) { break; } } if ($len - $n > 0) { $returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));

}

$returnPath = array_merge($returnPath, array_slice($arrA, $n));

return implode('/', $returnPath);

}

echo getRelativePath($a, $b);

14.简述论坛中无限级分类的实现原理。

答:

<?php

/*

数据表结构如下:

CREATE TABLE `category` (

`categoryID` smallint(5) unsigned NOT NULL auto_increment,

`categoryParentID` smallint(5) unsigned NOT NULL default '0',

`categoryName` varchar(50) NOT NULL default '',

PRIMARY KEY (`categoryID`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk;

INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES (0, '一级类别'),

(1, '二级类别'),

(1, '二级类别'),

(1, '二级类别'),

(2, '三级类别'),

(2, '333332'),

(2, '234234'),

(3, 'aqqqqqd'),

(4, '哈哈'),

(5, '66333666');

*/

//指定分类id变量$category_id,然后返回该分类的所有子类

//$default_category为默认的选中的分类

function Get_Category($category_id = 0,$level = 0, $default_category = 0) {

global $DB;

$sql = "SELECT * FROM category ORDER BY categoryID DESC";

$result = $DB->query( $sql );

while ($rows = $DB->fetch_array($result))

{

$category_array[$rows[categoryParentID]][$rows[categoryID]] = array('id' $rows[categoryID], 'parent' => $rows[categoryParentID], 'name' => $rows

[categoryName]);

}

if (!isset($category_array[$category_id])) =>

{ return ""; } foreach($category_array[$category_id] AS $key => $category) { if ($category['id'] == $default_category) { echo "<option selected value=".$category['id'].""; }else { echo "<option value=".$category['id'].""; } if ($level > 0) { echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . "</option>\n"; } else { echo ">" . $category['name'] . "</option>\n"; } Get_Category($key, $level + 1, $default_category); } unset($category_array[$category_id]); } /* 函数返回的数组格式如下所示: Array ( [1] => Array ( [id] => 1 [name] => 一级类别 [level] => 0 [ParentID] => 0 ) [4] => Array ( [id] => 4 [name] => 二级类别 [level] => 1 [ParentID] => 1 ) [9] => Array ( [id] => 9 [name] => 哈哈 [level] => 2 [ParentID] => 4 ) [3] => Array ( [id] => 3 [name] => 二级类别 [level] => 1 [ParentID] => 1 ) [8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 ) [2] => Array ( [id] => 2 [name] => 二级类别 [level] => 1 [ParentID] => 1 ) [7] => Array ( [id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2 ) [6] => Array ( [id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2 ) [5] => Array ( [id] => 5 [name] => 三级类别 [level] => 2 [ParentID] => 2 ) [10] => Array ( [id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5 ) ) */ //指定分类id,然后返回数组 function Category_array($category_id = 0,$level=0) { global $DB;

$sql = "SELECT * FROM category ORDER BY categoryID DESC"; $result = $DB->query($sql); while ($rows = $DB->fetch_array($result)) { $category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows; } foreach ($category_array AS $key=>$val) { if ($key == $category_id) { foreach ($val AS $k=> $v) { $options[$k] = array(

=> $v['categoryName'], 'level' => $level, 'id' => $v['categoryID'], 'name'

'ParentID'=>$v['categoryParentID']

); $children = Category_array($k, $level+1); if (count($children) > 0) { $options = $options + $children; } } } } unset($category_array[$category_id]); return $options; } ?> <?php class cate { function Get_Category($category_id = 0,$level = 0, $default_category = 0) { echo $category_id; $arr = array( '0' => array( ), '3' => array('id' => 3, 'parent' => 1, 'name' => '333333'), '5' => array('id' => 5, 'parent' => 1, 'name' => '555555') '1' => array('id' => 1, 'parent' => 0, 'name' => '1111'), '2' => array('id' => 2, 'parent' => 0, 'name' => '2222'), '4' => array('id' => 4, 'parent' => 0, 'name' => '4444') '1' => array(

), '3' => array( '6' => array('id' => 6, 'parent' => 3, 'name' => '66666'), '7' => array('id' => 7, 'parent' => 3, 'name' => '77777') ), '8' => array('id' => 8, 'parent' => 4, 'name' => '8888'), '9' => array('id' => 9, 'parent' => 4, 'name' => '9999') ) '4' => array( ); if (!isset($arr[$category_id])) { return ""; } foreach($arr[$category_id] AS $key => $cate) { if ($cate['id'] == $default_category)

{ $txt = "<option selected value=".$cate['id'].""; }else{ $txt = "<option value=".$cate['id'].""; } if ($level > 0) { $txt1 = ">" . str_repeat( "-", $level ) . " " . $cate['name'] . "</option>\n";

} }else{ $txt1 = ">" . $cate['name'] . "</option>\n"; } $val = $txt.$txt1; echo $val; self::Get_Category($key, $level + 1, $default_category); } function getFlush($category_id = 0,$level = 0, $default_category = 0) { ob_start();

} self::Get_Category($category_id ,$level, $default_category); $out = ob_get_contents(); ob_end_clean(); return $out; } $id =$_GET['id']; echo "<select>"; $c = new cate(); //$c->Get_Category(); $ttt= $c->getFlush($id,'0','3'); echo $ttt; echo "</select>"; 1、用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) echo date("Y-m-d H:i:s",strtotime("-1 day")); 2、echo(),print(),print_r()的区别(3分) echo是PHP语句,可输出一个或多个字符串,echo效率相对较高,无返回值. print和print_r是函数,有返回值. print只能打印简单类型变量(如int,string等),只可以同时输出一个字符串. print_r可打印复杂类型变量(如数组,对象等) 9、实现中文字串截取无乱码的方法。(3分) function mysubstr($str,$start,$len) { $tmpstr = ""; $strlen = $len+$start; for($i=$start; $i<$strlen; $i++) { if(ord(substr($str,$i,1)) > 0xa0) { $tmpstr .= substr($str,$i,2); $i++; } else { } $tmpstr .= substr($str,$i,1); } return $tmpstr;

}

接下来的这4个问题就是各自的使用了,我在这里就不在作答(主要是有些我也不清楚,呵呵)。

14、用PHP写出显示客户端IP与服务器IP的代码1分) $server = getenv("SERVER_ADDR"); $server_ip = getenv("SERVER_ADDR"); $client_ip = $_SERVER['REMOTE_ADDR'];

$client_ip = getenv("HTTP_X_FORWARDED_FOR");

15、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (2分)

include通过位于程序流程控制的处理部分,程序执行到include()时,才将它读进来. require一般位于程序的开始,php程序在执行前就会先将require()包含的文件读入,使它成为 php程序的一部分.

可使用include_once()和require_once()来代替.

17、有一个网页地址, 比如红心草博客主页: ,如何得到它的内容?($1分)

$content = file_get_contents(““); echo $content; 18、在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?);(2分)

header(“HTTP/1.0 401 Authorization Required”);

1.权限管理

每个后台管理员都有一个字段就是管理员的权限,具体的权限就是每个控制器和控制器对应的方法,根据数据库中管理员的权限和当前控制器和方法比较,如果该控制器和方法在管理员的权限中就可以访问该页面,否则提示该管理员没有该权限。因为需要一个管理员对后台的每个管理员的权限进行管理,所以要设置一个管理员admin,该管理员的权限为全部权限,不受权限的控制,这里的实现主要是在控制器的父类中判断,如果是admin用户登录的话,则不受权限的约束。

RBAC是一种基于组的权限管理方法 2.商店设置 商店的设置主要就是后台管理员对前台显示的设置 3.用户评论设置(ajax分页原理) 用户评论页面主要是网站用来和用户进行交互,根据用户的评论对网站进行改进,因为评论功能在商品的详细信息页面,该页面是主要是展现商品的具体信息,这里之所以使用ajax主要考虑到详细页面主要是详细信息的展示,页面大多数数据不用刷新,只有用户评论的那块需要刷新,所以在这里要使用ajax无之所以刷新分页,将用户的评论展现到页面上,不仅用户的体验比较好,还能减轻服务器的负载。

ajax分页的实现主要为2点

1是分页原理,就是根据用户的请求告知服务器当前页码,然后定每页要显示的条数,根据每页显示条数和当前页码计算偏移量

偏移量=(当前页码-1)乘每页显示条数 根据偏移量和每页显示条数拼装sql语句:select * from 表名 where 条件 limit 偏移量,每页显示条数 2.发送ajax请求到服务器,告知服务器当前页码(当前页过分页原理获取该页信息,

将获得的分页信息通过ajax回调函数将信息赋予页面

4.关键字原理

关键字过滤主要是对于用户的评论,对评论中骂人的话和一些政治上的敏感词语进行过滤,

实现逻辑主要是先将关键字的文件引入,使用file()将文件转换成为一个数组;将数组遍历,遍历数组的时候用正则替换(preg_replace)将数组里边的\r\n去掉,然后判断用户的评论是否有关键字,有关键字则使用*代替。

PDO

1. PDO(php data object)指的是数据库访问抽象层,之所以使用PDO是因为在数据更换的时候比较方便,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据,在使用的时候要先打开pdo扩展,然后打开mysql扩展

dsn(Data Sourse Name)建立pdo数据源名字

建立pdo对象 $pdo = new PDO($dsn,'root',''); 设定字符集 $pdo -> query('set names utf8'); 设置与数据库操作的错误信息 $pod -> setAttribute(); 格式: $pod -> setAttribute( pdo::Attr_ERRMODE 错误提示 PDO::ERRMODE_SIMENT 不显示错误信息只显示错误代码 ); PDO::ERRMODE_WARING 显示警告错误 PDO::ERRMODE_EXCEPTION 抛出异常 $dsn = "mysql:host=localhost;dbname=shop"; php.ini中打开 extension=php_pdo_mysql.dll extension=php_pdo.dll pdo常用函数: pdo::exec 执行sql语句,并返回影响行数 PDO::query 执行sql语句,并返回一个PDOStatement对象。 pdo::quote 转义字符 PDO::beginTransaction 开启事务 PDO::rollBack 回滚事务

PDO::inTransaction 判读是否在事务中

pdo::prepare + execute 编译sql语句(自动转义特殊字符)【同一句话多次执行时,先编译,然后套入参数执行】

pdo还有一个最大的好处就是有PDO预处理;如果有多条一样的sql语句执行时,可以把sql语句放到内存中,每次使用只须使用bindvalue或者bindparam()给sql语句传递具体的参数即可,在执行是使用execute,这样就只需在内存中加载一边即可,

2.简述使用PDO操作数据库有什么优势。

1.编码的一致行:由于PHP可用的各种数据库扩展是由不同发行者编写的, 所以尽管所有扩展都提供了基本相同的特性,却不满足编码的一致性。 PDO消除了这种不一致,提供可用于各种数据库的单一接口。 2.灵活性:因为PDO在运行时加载必需的数据库驱动程序, 所以不需要在每次使用不同数据库时重新配置和重新编译PHP。 例如,如果数据库需要从Oracle切换到MySQL,只要加载PDO_MYSQL驱动程序就可以了。

3.面向对象特性:PDO利用PHP5的面向对象特性,可以获得更强大、更高效的数据库通信。

4.高性能:PDO用C编写,编译为PHP,与用PHP编写的其他解决方案相比, 8.地区三级联动原理 数据库表的设计: 省份表 字段 类型 注释 provice_id int 省份id province_name varchar 省份名称 城市表 字段 类型 注释 city_id int 城市id city_name varchar 城市名称 city_province_id int 城市上级省份ID 类型 注释 地区表 字段 district_id int 地区id district_name varchar 地区名称 district_city_id int 地区上级城市ID 给省份和城市下拉列表设置onchange事件,例如从省份到城市的联动,省份有改变时,会通过onchange事件调用ajax事件,ajax根据具体的省份id到服务器取出对应的城市信息,之后到ajax回调函数将传回的信息显示到城市的下拉列表中,城市和地区的联动类似于省份和城市的联动。业务的实现主要是数据库表的设计,在城市和地区表的设计主要要有上级id,根据上级id获取该id对应的地区或者城市,在实现上要注意的一点是,当省份改变时,城市会发生相应的变化,而地区的信息不会发生变化,这时要在省份改变的ajax

事件中调用地区改变的事件

9.事务是什么

事务是将多条sql捆绑起来执行,要么全部执行,要么都不执行,可以保护数据的完整性,主要在商品总的库存量和订单售出的商品数量上,实现逻辑是使用事务,在每次订单生成的时候减少对应的商品信息

事务的使用方法:

templates_dir、cache_dir、config_dir、compile_dir、templates_c 1开启事务:start transaction (begin) 2.要执行的sql语句 3.提交事务 4.回滚事务(提交事务和回滚事务只能执行一个,在所有的sql语句都执行成功是则执行提交事务,如果有sql语句执行不成功,则需要回滚事务) 10.购物车原理 1.取Cookie中的商品信息 2.反序列化商品信息 3.对商品信息进行增删操作 4.序列化商品信息 5.将商品信息存入cookie 11.简述网站购物流程 13.smarty的四个目录:

2. 什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么?

ajax是(asynchronous)异步的 javascript and xml的缩写, 是javascript、xml、css、DOM等多个技术的组合。 '$'是jQuery的别名. 页面中用户的请求通过ajax引擎异步地与服务器进行通信, 服务器将请求的结果返回给这个ajax引擎,最后由这个ajax引擎 来决定将返回的数据显示到页面中的指定位置。 Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。 这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。 所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信, 减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好 程度。 Ajax的优点是:

1. 减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;

2. 在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。 Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。

ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。 3.jQuery是什么?jQuery简化ajax后的方法有哪些? jQuery是Javascript的一种框架。 jQuery简化ajax后的方法有 $.get(),$.post(),$.ajax()。$是jQuery对象的别名。 代码如下: <script> var loadUrl = 'translate.php'; var input_val = $('#words').val(); //方法1: $.post(loadUrl,{'words' : input_val},function(msg){ $("#result").html(msg); }); //方法2: $.get(loadUrl,{'words': input_val},function(msg){ $("#result").html(msg); }); //方法3: jQuery.ajax({ type: "post", url: loadUrl, cache:false, data: "words=" + input_val, success: function(msg) { $("#result").html(msg); } }); </script> 4. 什么是会话控制? 简单地说会话控制就是跟踪和识别用户信息的机制。 会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量, 系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限, 从而展示给用户适合于其相应权限的页面内容。 目前最主要的会话跟踪方式有cookie,session。

5. *** Session的原理是什么? 当用户向服务器端发送了一个开启了session的url请求, 服务器会因为该请求开启了session,而为这次请求随机分配一个sessionid。 同时服务器端的指定路径下,会记录该sessionid,以及该用户的登录信息 (例如用户名和密码)。同时会将这个sessionid传回发送请求的客户端, 而这个sessionid会被保存在客户端一个生命周期为0的cookie中。 因此session的正常使用要依赖于cookie的开启。 因为cookie是通过客户端浏览器来保存的,在ie浏览器中, 如果浏览器的隐私设置为阻止所有cookie,那么cookie则被禁用, 而session也不能正常使用。 如果想让session正常发挥作用,浏览器隐私需要设置为高或者以下。 6. *** session和cookie的概念是什么,两者的区别是什么? cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则

cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,

当再次打开浏览器时cookie值依然有效。 session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,

其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是

哪个用户的。

session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份

访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了

管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。

Session和Cookie的区别: cookie是保存在客户端机器的,对于未设置过期时间的cookie, cookie值会保存在机器的内存中,只要关闭浏览器则cookie自动消失。 如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式 保存到硬盘中,当再次打开浏览器时cookie值依然有效。 session是把用户需要存储的信息保存在服务器端。每个用户的session信息 就像是键值对一样存储在服务器端,其中的键就是sessionid,而值就是用户 需要存储信息。服务器就是通过sessionid来区分存储的session信息是哪个 用户的。 Session和Cookie两者最大的区别就是session存储在服务器端, 而cookie是在客户端。session安全性更高,而cookie安全性弱。

7 . ** session和cookie的使用步骤分别是什么? 使用session的步骤: 1. 启动session: 使用session_start()函数来启动。session_start()前面不能有任何输出,包括空行。 2. 注册会话: 直接给$_SESSION数组添加元素即可。 3. 使用会话:

判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即

可。

4. 删除会话: 1.可以使用unset删除单个session; 2.使用$_SESSION=array()的方式,一次注销所有的会话变量; 3.使用session_destroy()函数来彻底销毁session。 cookie怎么使用? 1. 记录用户访问的部分信息 2. 在页面间传递变量 3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。 创建cookie: setcookie(string cookiename , string value , int expire); 读取cookie: 通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。 删除cookie:有两种方法 1.手工删除方法: 右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文

2.setcookie()方法: 件删除。

跟设置cookie的方法一样,不过此时将cookie的值设置为空,有效时间为0或小于当前时间戳。

8. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用? $this 当前对象 self 当前类 parent 当前类的父类 $this在当前类中使用,使用->调用属性和方法。 self也在当前类中使用,不过需要使用::调用。 parent在类中使用。 9. OOP的三大特性是什么? 1. 封装性: 也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。

于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,

实现代码模块间松藕合。

2. 继承性:

就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。

php只支持单继承,也就是说一个子类只能有一个父类。 3. 多态性: 子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。 于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些 多态性增强了软件的灵活性。 相同的方法后却可以获得完全不同的结果,这种技术就是多态性。 11. ** smarty配置主要有哪几项? smarty模板技术的用途是为了php与html分开, 美工和程序员各司其职,互不干扰。 Smarty配置信息包括: 1. 引入Smarty.class.php; 2. 实例化smarty对象; 3. 重新修改默认的模板路径; 4. 重新修改默认的编译后文件的路径; 5. 6. 7. 8. 重新修改默认的配置文件的路径; 重新修改默认的cache的路径; 可以设置是否开启cache; 可以设置左侧和右侧定界符。 12. *** smarty的概念以及如何应用? Smarty是基于MVC思想的一种模板引擎, 它将一个页面程序分成了两部分来实现: 即视图层和控制层,也就是说smarty技术将html与php代码分离开。 这样程序员和美工各司其职,互不干扰。 smarty的使用过程: 1.正确配置smarty。 主要要实例化smarty对象,配置smarty模板文件的路径; 2.php页面中使用assign赋值 和 display显示页面; 3.smarty模板文件中不允许出现php代码段, 所有的注释,变量,函数都要包含在定界符内。 Smarty模板语言主要包括: A. smarty基本语法 B. Smarty模板调用各种变量 C. Smarty模板内建函数:include,literal,foreach, if else,config_load D. Smarty缓存技术的应用 E. Smarty常用变量调节器:

default,{$title|default:'???'} date_format {$smarty.now|data_format:'%Y-%m-%D'}, truncate {$title|truncate:10} count_characters {$title|count_characters} strip_tags {$title|strip_tags} 13. ** MVC的概念是什么? MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。 M指模型层,V是指视图层(显示层或者用户界面),C是指控制层。 使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。

C存在的目的则是在M和V之间起到调节作用,确保M和V的同步,一旦M改变,V应该能同步更新。

将M和V分离,就可以做到同一个网页,在不同节日到来的时候能显示不同的页面风格,这只需要提前制作多个视图层模板页面,

而无需更改M层程序。 MVC做到了编程中的分工合作,代码的可重用性得到最大化体现, 程序逻辑更加清晰而富有条理,便于后期维护管理。 访问权限修饰符有哪几种,对比解释 14、 答:1、public 表示公共的,在本类中和子类中以及类外,可以对其调用 2、protected表示受保护的,可以在本类中和子类中调用 3、private表示私有的,只能在本类中调用 4、var,效果等同于public 作用域操作符在哪些场合下使用? 15、 答:作用于操作符的使用场合 a) 本类中: i. self::类常量 ii. self::静态属性 iii. self::方法() parent::方法() b) 子类中: i. parent::类常量 ii. parent::静态属性(public或者protected) iii. parent::方法()(public或者protected) i. 类名::类常量 ii. 类名::静态属性(public) iii. 类名::静态方法(public) c) 类外: 16、 $this,self, parent分别代表什么?哪些场合下使用 答:$this代表的是当前对象 self代表的是当前的类

parent代表的是当前类的父类

使用场合:

$this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法;

self只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;

parent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法。

17、 说明是接口、抽象类二者有何相同和不同的地方? 1、接口是帮助php实现功能意义上的多继承的,用interface来声明,其方法没有接口中只能包含抽象方法和类常量,不可以包含成员属性。 方法体,使用implemens关键词来实现接口。

2、抽象类是一种不能被实例化的类,只能作父类,用abstract class来定义,抽象类和普通类可以没有区别,类中可以包含成员属性、类常量、方法。

子类得用extends来继承,而且只能是单继承。 两者相同点是都不可以被实例化,都是需要被继承才可以使用。 两者的最大区别是接口可以实现多继承,而抽象类只能是单继承。 接口中不能包含成员属性,而抽象类中可以有成员属性。 接口中的抽象方法必须是public或者无访问修饰词,接口中的抽象方法不能用abstract来修饰。

抽象类中的方法可以是普通方法,也可以是抽象方法,如果是抽象方法,一定需要使用abstract来修饰。

19、 ** 解释PHP中单例模式? 又叫做单态模式、单元素模式、singleton pattern。 单例模式指在PHP的应用程序的范围内只对指定的类创建一个实例。 使用单例模式的类称为单例类。 在php中单例类必须要有一个私有的构造方法, 还要有一个私有的魔术克隆方法(该方法体中为空) 和一个私有的静态的成员属性$_instance.

私有构造方法防止除自身以外的类来实例化它。私有的方法体为空的克隆方法防止该类被克隆。

$_instance用来存储被自身实例化后的对象。 还必须要有一个公共的静态的方法getInstance()。 该方法必须返回$_instance。 20. * 什么是单一入口(单点入口)呢?

所谓单一入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来

转发,

比如说在上面我们就使用index.php作为程序的单点入口, 当然这个入口文件的名字是可以由自己任意定义的。 单点入口有几大好处: 第一、一些系统全局变量,都可以在这里定义。

比如说你要对数据进行初步的过滤,你要模拟session处理, 你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面 第二、程序的架构更加清晰明了。 21. *** 分页原理是什么? 数据分页需要以下几个条件: 1. 参与分页的总条数 $msg_count ,该值通过数据库查询可以获取到; 2. 每页显示的条数 $pagesize ,这个数值由自己定义; 3. 当前页的页码数 $page,该数值通过地址栏传递和接收; 4. 可以通过以上资料计算出总页数 $pagecount ,此处需要借助ceil(); $pagecount = ceil($msg_count/$pagesize); 5. 数据库查询借助sql语句中的limit来实现数据的变化: 例如: select * from 表名 where 条件 limit $startnum , $pagesize; 而$startnum = ($page-1)*$pagesize; 22. *** 无限极分类的原理是什么? 要实现无限极分类,数据库表结构是关键。 表结构中至少需要三个字段,如果想避免递归循环,那么需要四个字段。 1. id ,当前数据的唯一标识; 2. typename ,类型名称; 3. parentid , 当前类型的上一层父类型的id; 4. path , 其中存储当前类型的id和它所有父级类型的id。 这些id之间采用“-”隔开。 5. 当通过以下sql语句就可以实现,相同顶级类下的信息都在一起集中显示。 select * from 表名 where 条件 order by path; 25. smarty中fetch和display的区别? fetch 是返回内容 display 是输出内容 display方法:

显示模板,需要指定一个合法的模板资源的类型和路径。还可以通过第二个可选参数指定一个缓存号。

fetch方法: 取得输出的内容。返回一个模板输出的内容(HTML代码),而不是直接显示出来参数答案要点(display是输出,fetch是返回) 会话控制 session是以文件形式存放在服务器端的时间变量信息 cookie是以文件形式存在在浏览器端的时间变量信息 session与cookie的区别 1.cookie数据存放在客户的浏览器上,session数据放在服务器上 与display相同

2.session比cookie安全。cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

4.session依靠cookie 才能正常使用,如果客户端完全禁止cookie,session将失效需要有解决方案。

5.session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路

径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。session 有效路径 有效域

session使用是要先开启session然后设置session cookie使用是要使用setcookie函数设置,在setcookie前边不能有任何的输出语句 setcookie(名字,值,有效时间,有效路径,作用域,安全级别); 如果不设置cookie的有效时间,就是浏览器上存在的临时变量信息,当浏览器关闭时,cookie信息也就不存在了 PHP的扩展(画图功能) 打开gb2才能使用画图功能 ① header("content-type:image/png") ② 创建画板 ③各种颜色的笔 ④填充颜色 ⑤画图 ⑥输出图形 ⑦销毁画板 Smarty ①display 加载模版文件(直接输出) ② fetch 将内容返回 (有返回值,输出内容是要使用echo) ③ assign 将变量传递到模版页面 ④ include 包含重复代码 ⑤ config_load 加载配置文件( 使用:{#配置变量#} {$smarty.config.变量名} ) |-首页 |-登录 会员中心- |-注册 |-修改个人信息 |-修改个人密码 |-验证码 |- model :对数据库操作

| MVC-|- view :视图 HTML/XML/FLASH 与用户交互的页面 (80年代产生的) | |- controller : 接受用户的请求,调用响应的视图和模型,最终将结果返回 |-web (电脑浏览器) |- ① 代码重用高 |-wap(手机) | |- ②三个构件彼此独立,改变一个对另外两个没有影响 |- ③ 分开合作开发项目 | |- ④ 方便后期维护 MVC优点—| 单例:一个类至始至终只能实例化一个对象,这样的类就是单例类 单例类的优点:① 节省空间 ② 节省资源 实现单例类的四个要点:①私有的构造函数②私有的__clone的方法③私有的静态属性,属性有以保存类的实例④公共的静态方法来实例化对象

无限级分类:①数据库设计:region_id(自增ID) region_name(地区名称) parent-id(上级地区id) region_path(全路径)

②程序设计:

全路径的作用:a根据全路径顺序取数据 b用作信息层级显示

2.session和cookie(会话技术) session是以文件形式存放在服务器的时间变量信息 cookie是保存在浏览器的时间变量信息 session的使用: 开启session: session_statrt(); 使用session: $_session['变量名'] = 值 删除session信息:session_destory(); session_unset(); unset(); $_session=array(); session自身删除 cookie的使用: 设置cookie信息:setcookie('名字',值,有效时间,作用域) 删除:setcookie('名字',值,time()-1,'/') session与cookie的区别

1.cookie数据存放在客户的浏览器上,session数据放在服务器上

2.session比cookie安全。cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

4.session依靠cookie 才能正常使用,如果客户端完全禁止cookie,session将失效需要有解决方案。

5.session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路

径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。session 有效路径 有效域

session与cookie的原理

当用户访问网站的时候,网站要给每一个用户都分配一个session空间,这是也给每一个用户一个sessionID,

这个sessionID是保存在浏览器上的 用户可以根据这个sessionID跟踪自己的信息,网站也利用这个sessionID

识别出来当前用户和其他用户的区别。session是有有效期的!要根据平衡php.ini配置文件进行设置。

当用户首次访问网站的时候,将cookie信息保存在浏览器上,当用户再次访问网站的时候,浏览器要将用户的信息

发送到服务器上在服务器上将cookie信息设置为超级全局数组变量,这是就可以使用cookie信息了。设置cookie的

时候是由有效路径和有效域的。 session在项目中的使用:用户登录时记住用户的登录状态 权限的管理 验证码 cookie的使用: 购物车 两周不用重复登录 3.jquery jquery是js的封装框架包,里边有很多集成的函数可以让我们使用,可以帮助我们很好的处理html代码,能使html代码和js代码分离,jquery的宗旨就是写更少的代码实现更多的功能(06年上市)

使用的方法: 1.引进jquery包 <script type="text/javascript" src='jquery-1.4.2.js'><script> 2.测试jquery是否加载成功(onload事件) $(function(){

alert("jquey加载成功"); }) 3.获取页面的元素 $('#div');通过id获取页面元素 $('.div');通过class获取页面元素 jquery中的事件 1.$('#mydiv').click(function(){});鼠标点击事件【要写在onload事件里边】 2.$('#mydiv').hover(function(){},function(){});鼠标移动到对象事件 3.$('#mydiv').attr();获得对象属性信息 4.$('#mydiv').attr('checked');查看单复选框的选定情况! 5.$('#mydiv').css();获得对象的属性信息 6.$('#mydiv').css(样式,值);给对象赋予样式 7.$('#mydiv').addClass('trb');给元素class属性赋值trb; 8.$('#mydiv').removeClass('trb');使元素失去class属性; 9.$('#mydiv').submit(function(){});提交事件; 10.$('#mydiv').keyup(function(){});键盘敲击事件; 在项目中的使用:表单的验证

smarty:

* smarty 是一个模板类,所以和普通的类的引入没有区别 * 1:包含smarty类文件

* 2:实例化对象

*smarty 的典型应用流程 * 1:$smarty = new smarty(); * 2:$smarty->assign('tag','value'); * 3:$smarty->display('index.html'); * smarty的常用配置 * $smarty->template_dir = 'view'; //模板目录 * $smarty->compile_dir = 'data/tpl_c'; 模板编译目录 * $smarty->cache_dir = '' ; //缓存目录 * $smarty->caching = true; // 是否缓存,true,1/false,0 * $smarty->cache_lifetime ; //缓存有效期 * 基本语法与注释 * 标签 默认是{} * 可以通过修改$smarty->left_delimiter, * right_delimiter 定义自己的标签符号.

* 注释标签 * left_delimiter* *right_delimiter * 模板包含 * {include file="子模板文件"} * 局部缓存 * 模板里{insert name="functionName"} * 此时 ,模板的此标签处,真正打印的是 insert_functionName的返回值 * 所以,.php里,必须已经定义insert_functionName()这个函数 * 如何屏蔽一段js或css代码,使其不被smarty解析 * 答:在代码两端 加上{literal}{/literal}标签 * 判断及使用缓存 * $smarty->is_cached('模板名') { * } * 清除缓存 * $smarty->clear_cache('模板名') ->删除指定模板的缓存 * $smarty->clear_all_cache ->删除全部缓存

前沿

1.结合memcache的工作原理,简述为什么使用memcache可以减轻服务器的压力。 答:从减轻数据库压力的角度看,在数据提交的时候,有些数据不经常发生改变当第一次访问它们时将它们放到内存中,等下次访问时直接到内存中访问数据就好了,当数据库的数据更新时,将内存中的数据及时更新或者给内存中的数据设置有效期,当有效期一过则重新从数据库中读取数据放到内存中,这样我们每次取数据直接跑到内存中取数据从而可以减轻数据库的压力,因此也就减轻了服务器的压力。

4.如何实现一个网页缓存有效期30秒,在30秒内不读取数据库,如果缓存超过30秒 重新读取数据库生成缓存页面(简述实现思路)

答: 当http请求一个页面的时,在被请求的PHP文件开头部位使用ob_start开启缓冲区,

用来捕获下面所有的输出内容,等页面程序执行完毕之后,该页面的所有输出暂时保存在PHP的缓冲区中,

使用 ob_get_contents()函数可以获取缓冲区中的所有内容,

并可以通过 file_put_contents()函数,将输出内容写到静态缓存文件中。

当http再次请求该页面时,通过程序判断该页面的静态缓存文件是否存在,如果存在再判断这个缓存页面是否 超过了30秒,如果没有超过30秒,直接访问缓存页面,

不存在的话重新执行PHP程序生成该文件的缓存。 6.单例模式拥有以下三种公共元素是什么。单例模式的好处是什么? 私有的构造方法,私有的静态属性,私有的克隆方法,公有的静态方法 好处:在任何时候,应用程序中都只会有这个类仅有的一个实例存在。 这可以防止我们去打开数据库的多个连接或者不必要地使用多余的系统资源。在更加复杂的系统中,使用单例模式在维持应用程序状态的同步方面也尤其有用。 8.后台管理权限设置原理,用户表和权限表的设置 原理: 权限管理指的是后台的管理员对后台的管理,因为后台管理员可以有很

多人,每个人的权限不一样,比如客服人员只要对用户进行管理,销售人员只可以对商品进行管理等,每个管理员的权限都不同,这是考虑到这些就是给后台管理员进行权限的管理。

每个后台管理员都有一个字段就是管理员的权限,具体的权限就是每个控制器和控制器对应的方法,根据数据库中管理员的权限和当前控制器和方法比较,如果该控制器和方法在管理员的权限中就可以访问该页面,否则提示该管理员没有该权限。因为需要一个管理员对后台的每个管理员的权限进行管理,所以要设置一个管理员admin,该管理员的权限为全部权限,不受权限的控制,这里的实现主要是在控制器的父类中判断,如果是admin用户登录的话,则不受权限的约束

表:权限列列表:id(权限id) pid(权限所属上级的id) name(权限名字) code(权限代码)

用户表:id(管理员id) user(管理员) psd(管理原密码) addr(管理员地址) tel(管理员电话) power(管理元权限)

10.为什么要使用纯静态、有什么好处、如何制作纯静态文件

因为一旦处理的页面增加,重复工作就会对服务器造成很大的负担。因此,当需求增加时,处理这些不断解释和动态生成的页面需要消耗更多的系统资源,在加上对数据库的请求,页面就可能出现延时,所以为了节约 CPU 周期,提高服务器性能就是减少运行 PHP 应用程序所需的重复工作,将动态页面生成静态页面。

好处:1. 避免重复工作,减轻了WEB服务器的负担.

2. 因为生成了HTML静态页面,所以其网站被搜索引擎搜索到的机率更大一3. 减轻数据库高并发的瓶颈. 4. 提高可靠性。即使服务器上的动态程序出现问题,数据库损坏或升级等, 些.

都不影响正常的使用。

在被请求的PHP文件开头部位使用ob_start开启缓冲区,用来捕获下面所有的输出内容,等页面程序执行完毕之后,该页面的所有输出暂时保存在PHP的缓冲区中,使用

ob_get_contents()函数可以获取缓冲区中的所有内容,并可以通过 file_put_contents()函数,将输出内容写到静态缓存文件中。

11.为什么要使用伪静态、伪静态的分类、如何设置伪静态 因为要迎合搜索引擎的喜好保证搜索引擎能够更多更快的收录这些数据,需要将URL地址转换为静态格式,由于信息更新快不适合做页面的静态化,除了生成静态页面另一种方式是通过rewrite重写的方式实现链接的静态化。网站对外使用静态化的链接,而内部实际上仍然使用动态页面的URL形式。

伪静态分两种:服务器级和目录级(服务器级在httpd.conf中配置,目录级在 .htaccess中设置)

伪静态配置方式: httpd.conf 服务器级配置 # LoadModule rewrite_module modules/mod_rewrite.so 去除前面的 # LoadModule rewrite_module modules/mod_rewrite.so .htaccess 目录级配置 首先将虚拟目录中<Directory>的 AllowOverride None 修改为: AllowOverride All,让其加载根目录下的.htaccess文件, mod_rewrite 规则的使用: <IfModule mod_rewrite.c> RewriteEngine on </IfModule> RedirectMatch ^(.*)/([^/]*)\.html$ $1/index.php?class=$2 14.简述学习过的设计模式。用自己的话说说什么是工厂模式。

工厂类是指包含了一个专门用来创建其他对象的方法的类。工厂类在多态性编程实践中是至关重要的。它允许动态地替换类,修改配置,并且通常会使应用程序更加灵活。熟练掌握工厂模式对高级PHP开发人员来说是很重要的。

工厂模式通常用来返回符合类似接口的不同的类。工厂的一种常见用法就是创建多态的提供者,从而允许我们基于应用程序逻辑或者配置设置来决定应该实例化哪一个类。例如,可以使用这样的提供者来扩展一个类,而不需要重构应用程序的其他部分,从而使用新的扩展后的名称。

多态:不同的对象调用相同的方法,结果不一样 15.简述sphinx的简单工作原理。 原理是通过sphinx达到对数据库字段建立索引的目的,支持中文分词和全文索引。 sphinx生成索引-》通过索引查找mysql数据库。

Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。

17.第三方支付的概念和流程,为什么要使用第三方支付 所谓第三方支付,就是一些和各大银行签约、并具备一定实力和信誉保障的第三方

独立机构提供的交易支持平台。在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖家货款到达。 目前提供第三方支付的机构很多,常见的有支付宝、财付通、快钱、网银在线、易宝支付、云网等各大支付平台。网站如果需要实现第三方支付首先应该向第三方支付平台申请一个账号并签署协议,协议生效后第三方支付平台将为其开通在线支付功能,通过程序将接口集成到网站中。

第三方支付实现思路 1用户向商城网站发起确认订单的请求

2商城网站接收到请求保存订单数据到数据库或其他存储介质 3返回订单确认页面,页面上应该显示订单金额等信息

4用户确认支付,发起支付请求。注:支付请求是发送到支付网关(比如支付宝、

网银在线)而不是发送到商城网站。 5显示支付页面

6用户填写认证信息(账号密码等)提交

7这里有两个步骤一个是扣款成功后页面跳转到支付结果页面(展示给用户),另

一个是支付通知,这两步没有先后顺序可能同时执行,商城网站接收到支付通知后根据验证

规则验证信息的有效性,并作出相应的更改操作(例:有效则更改订单为已付款状态,无效则记录非法请求信息)。

搜索引擎优化:

opendir — 打开目录句柄

readdir — 从目录句柄中读取条目 输出缓冲 session入库

相关推荐