1.strlen()与mb_strlen()的作用分别是什么?
strlen()和mb_strlen()都是作用于字符串长度的,但是mb_strlen()可以在第二个参数中指定字符编码,因为strlen()不能正确处理中文字符,得到的只是字符串的字节数,一个中文字符占三个字节.
[if !supportLists]2.[endif]include和 require 都能把另外一个文件包含到当前文件中,他们有什么区别?include 和include是_one又有什么区别?
include和 require的区别:
include如果引入的文件不存在,试图往下执行,会报warning错误,但是下面代码还会往下执行.(如果你不介意引入的文件是否存在,之后的内容都要执行,就用include)
require如果引入文件不存在会报fatal error,不再继续执行(如果文件不引人就不往下执行,就用require)
include和 include_once的区别:
include()如果两次引入相同文件会warning报错.重复引入,requier()引入两次报严重错误
include_once()或者requier_once()会自动判断文件是否以及该被引入,如果引入则不会重复执行,但是缺点是效率比较低.
[if !supportLists]3.[endif]检测一个变量是否有设置函数的函数是什么?检测是否为空的函数是?
isset()
empty()
[if !supportLists]4.[endif]sort() ,asort(), ksort()有什么区别?分别在什么情况下使用?
sort():根据数组元素中的值,以英文字母顺序排序,索引会由0到n-1重新编号.
sort()使用情况:当数组索引键的值无关紧要的时候使用他来对数组进行排序
asort():根据数组元素的值,以英文字母顺序排序,数组的索引保持和单元的关联.
asort()使用情况:主要用于那些单元顺序很重要的结合数组进行排序
ksort():根据数组中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的关联数组
5.在php中error_reporting()这个函数有什么作用?
设置php错误级别并返回当前级别
[if !supportLists]6.[endif]写个函数来对二维数组进行排序
function quicksort2($arr){
if(count($arr) >1){
foreach($arr as $k=>$v){
if(is_string($k)){
ksort($arr);
}
if(is_array($v)){
asort($v);
$arr[$k]=$v;
}else{
$arr[$k]=$v;
asort($arr);
}
}
return $arr;
}else{
return $arr;
}
}
8.计算某段字符串中某个字符串出现的次数,例如’dfdsfdsdsfedd’中’g’出现的次数
substr_count()
9.说出数组中涉及到的常用函数
数组的键名和值
array_values($arr)获得数组的值
array_keys($arr)获取数组的键名
in_array(‘apple’,$arr)在数组中检索apple,如果存在则返回真假值
array_search(‘apple’,$arr);在数组中检索apple,如果存在则返回键名
array_key_exists(‘apple’,$arr)检测给定的键名是否存在数组中
isset($arr[$apple])检测给定的键名是否存在数组中
数组的内部指针
current($arr);返回数组中的当前单元pos($arr);返回数组中的当前单元key($arr);返回数组中当前单元的键名prev($arr);将数组中的内部指针倒回一位next($arr);将数组中的内部指针向前移动一位end($arr);将数组中的内部指针指向最后一个单元reset($arr;将数组中的内部指针指向第一个单元each($arr);将返回数组当前元素的一个键名/值的构造数组,并使数组指针向前移动一位list($key,$value)=each($arr);获得数组当前元素的键名和值
数组和变量之间转换
extract($arr)用于把数组中的元素转化成变量导入到当前文件中,键名当做变量名,值作为变量值.
compact(var1,var2,var3);用给定的变量创建一个数组
三、数组与栈
array_push($arr,"apple","pear");将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数array_pop($arr);将数组栈的最后一个元素弹出(出栈)
四、数组与列队
array_shift($arr);数组中的第一个元素移出并作为结果返回(数组长度减1,其他元素向前移动一位,数字键名改为从零技术,文字键名不变)array_unshift($arr,"a",array(1,2));在数组的开头插入一个或多个元素
五、回调函数
array_walk($arr,'function','words');使用用户函数对数组中的每个成员进行处理(第三个参数传递给回调函数function)array_mpa("function",$arr1,$arr2);可以处理多个数组(当使用两个或更多数组时,他们的长度应该相同)array_filter($arr,"function");使用回调函数过滤数组中的每个元素,如果回调函数为TRUE,数组的当前元素会被包含在返回的结果数组中,数组的键名保留不变array_reduce($arr,"function","*");转化为单值函数(*为数组的第一个值)
六、数组的排序
通过元素值对数组排序
sort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序rsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)忽略键名的数组排序usort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)忽略键名的数组排序asort($arr);由小到大的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序arsort($arr);由大到小的顺序排序(第二个参数为按什么方式排序)保留键名的数组排序uasort($arr,"function");使用用户自定义的比较函数对数组中的值进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)保留键名的数组排序
通过键名对数组排序
ksort($arr);按照键名正序排序krsort($arr);按照键名逆序排序uksort($arr,"function");使用用户自定义的比较函数对数组中的键名进行排序(function中有两个参数,0表示相等,正数表示第一个大于第二个,负数表示第一个小于第二个)
自然排序法排序
natsort($arr);自然排序(忽略键名)natcasesort($arr);自然排序(忽略大小写,忽略键名)
七、数组的计算
数组元素的求和
array_sum($arr);对数组内部的所有元素做求和运算
数组的合并
array_merge($arr1,$arr2);合并两个或多个数组(相同的字符串键名,后面的覆盖前面的,相同的数字键名,后面的不会做覆盖操作,而是附加到后面)“+”$arr1+$arr2; 对于相同的键名只保留后一个array_merge_recursive($arr1,$arr2);递归合并操作,如果数组中有相同的字符串键名,这些值将被合并到一个数组中去。如果一个值本身是一个数组,将按照相应的键名把它合并为另一个数组。当数组 具有相同的数组键名时,后一个值将不会覆盖原来的值,而是附加到后面
数组的差集
array_diff($arr1,$arr2);返回差集结果数组array_diff_assoc($arr1,$arr2,$arr3);返回差集结果数组,键名也做比较
数组的交集
array_intersect($arr1,$arr2);返回交集结果数组array_intersect_assoc($arr1,$arr2);返回交集结果数组,键名也做比较
八、其他的数组函数
range(0,12);创建一个包含指定范围单元的数组array_unique($arr);移除数组中重复的值,新的数组中会保留原始的键名array_reverse($arr,TRUE);返回一个单元顺序与原数组相反的数组,如果第二个参数为TRUE保留原来的键名//srand((float)microtime()*10000000);随机种子触发器array_rand($arr,2);从数组中随机取出一个或 多个元素shuffle($arr);将数组的顺序打乱
本类函数允许用多种方法来操作数组和与之交互。数组的本质是储存,管理和操作一组变量。
PHP支持一维和多维数组,可以是用户创建或由另一个函数创建。有一些特定的数据库处理函数可以从数据库查询中生成数组,还有一些函数返回数组。
array_change_key_case— 返回字符串键名全为小写或大写的数组
array_chunk— 将一个数组分割成多个
array_combine— 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
array_count_values— 统计数组中所有的值出现的次数
array_diff_assoc— 带索引检查计算数组的差集
array_diff_key— 使用键名比较计算数组的差集
array_diff_uassoc— 用用户提供的回调函数做索引检查来计算数组的差集
array_diff_ukey— 用回调函数对键名比较计算数组的差集
array_diff— 计算数组的差集
array_fill_keys— Fill an array with values, specifying keys
array_fill— 用给定的值填充数组
array_filter— 用回调函数过滤数组中的单元
array_flip— 交换数组中的键和值
array_intersect_assoc— 带索引检查计算数组的交集
array_intersect_key— 使用键名比较计算数组的交集
array_intersect_uassoc— 带索引检查计算数组的交集,用回调函数比较索引
array_intersect_ukey— 用回调函数比较键名来计算数组的交集
array_intersect— 计算数组的交集
array_key_exists— 检查给定的键名或索引是否存在于数组中
array_keys— 返回数组中所有的键名
array_map— 将回调函数作用到给定数组的单元上
array_merge_recursive— 递归地合并一个或多个数组
array_merge— 合并一个或多个数组
array_multisort— 对多个数组或多维数组进行排序
array_pad— 用值将数组填补到指定长度
array_pop— 将数组最后一个单元弹出(出栈)
array_product— 计算数组中所有值的乘积
array_push— 将一个或多个单元压入数组的末尾(入栈)
array_rand— 从数组中随机取出一个或多个单元
array_reduce— 用回调函数迭代地将数组简化为单一的值
array_reverse— 返回一个单元顺序相反的数组
array_search— 在数组中搜索给定的值,如果成功则返回相应的键名
array_shift— 将数组开头的单元移出数组
array_slice— 从数组中取出一段
array_splice— 把数组中的一部分去掉并用其它值取代
array_sum— 计算数组中所有值的和
array_udiff_assoc— 带索引检查计算数组的差集,用回调函数比较数据
array_udiff_uassoc— 带索引检查计算数组的差集,用回调函数比较数据和索引
array_udiff— 用回调函数比较数据来计算数组的差集
array_uintersect_assoc— 带索引检查计算数组的交集,用回调函数比较数据
array_uintersect_uassoc— 带索引检查计算数组的交集,用回调函数比较数据和索引
array_uintersect— 计算数组的交集,用回调函数比较数据
array_unique— 移除数组中重复的值
array_unshift— 在数组开头插入一个或多个单元
array_values— 返回数组中所有的值
array_walk_recursive— 对数组中的每个成员递归地应用用户函数
array_walk— 对数组中的每个成员应用用户函数
array— 新建一个数组
arsort— 对数组进行逆向排序并保持索引关系
asort— 对数组进行排序并保持索引关系
compact— 建立一个数组,包括变量名和它们的值
count— 计算数组中的单元数目或对象中的属性个数
current— 返回数组中的当前单元
each— 返回数组中当前的键/值对并将数组指针向前移动一步
end— 将数组的内部指针指向最后一个单元
extract— 从数组中将变量导入到当前的符号表
in_array— 检查数组中是否存在某个值
key— 从关联数组中取得键名
krsort— 对数组按照键名逆向排序
ksort— 对数组按照键名排序
list— 把数组中的值赋给一些变量
natcasesort— 用“自然排序”算法对数组进行不区分大小写字母的排序
natsort— 用“自然排序”算法对数组排序
next— 将数组中的内部指针向前移动一位
pos— current() 的别名
prev— 将数组的内部指针倒回一位
range— 建立一个包含指定范围单元的数组
reset— 将数组的内部指针指向第一个单元
rsort— 对数组逆向排序
shuffle— 将数组打乱
sizeof— count() 的别名
sort— 对数组排序
uasort— 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
uksort— 使用用户自定义的比较函数对数组中的键名进行排序
usort— 使用用户自定义的比较函数对数组中的值进行排序
[if !supportLists]10.[endif]字符串的常用函数
strlen($str)返回字符串长度返回的是字节数 mb_strlen($str)可以返回中文字符串长度
strtolower($str)字母转小写
strtoupper($str)字母转大写
ucfirst($str)首字母转大写
ucwords($str)每一个单词的首字母大写
str_replace(search, replace, str)字符串替换,区分大小写
str_ireplace(search,replace,str)字符串替换,不区分大小写
htmlspecialchars($str,ENT_NOQUTES)字符串转换成html实体实体 ENT_COMPT(默认只编译双引号)ENT_QUOTES单引号双引号都编译,ENT_NOQUOTES不编译任何引号
trim($str)删除字符串前后空格
ltrim($str)删除字符串左侧空格
rtrim($str)删除字符串右侧的空格
strpos(‘a’,$str)字符串a在字符串中首次的位置
stripos(‘a’,$str)字符串a在字符串中首次的位置,不区分大小
substr($str,0,3)截取字符串
[if !supportLists]11.[endif]在php中两个数组怎么连接到一起
array_merge()如果键名相同会把前一个数组中关联数组相同的键值覆盖,索引形式的则会河北在一起
array_merge_recursive()函数会把键值相同的值以一个新的关联数组的形式返回,并以这个键值作为二维数组的键值,其他索引形式则不会受影响。
[if !supportLists]12.[endif]php5中魔术方法函数有几个,请举例说明各自的用法
魔术方法
__construct()实例化对象时被调用
__destuct()当删除一个对象或者对象操作终止是被执行
__call()调用对象不存在方法时被调用
__get()调用对象不存在属性时被调用
__set()设置对象不存在属性时被调用
__toString()打印一个对象时被调用
__clone()克隆对象时被调用
__sleep() serialize之前被调用,若对象比较大,想做一些删除在序列化,可以考虑使用该方法
__wakeup() unserialize之前被调用,做些对象的初始化
__isset()检测对象是否存在时被调用
__unset() unset一个对象属性时被调用
__set_state()调用var_export时被调用,用__set_state的返回值作为var_export的返回值
__autoload()实例化一个对象时,如果对应的类不存在,在该方法被调用
魔术常量
__LINE__返回当前行号
__FILE__返回当前完整的路径和文件名
__FUNCTION__返回函数名称
__CLASS__返回类的名称
__METHOD__返回类的方法名
13.写出你知道的几种设计模式,并用代码实现其中的一种
单例模式
工厂模式
ORM策略模式
适配器模式
装饰器模式
观察者模式
设计模式
注册模式
原型模式
class Single{
//私有化静态属性
private static $instance = null;
//私有化一个克隆方法
private function __clone(){}
//私有化构造方法,防止直接创建对象
private function __construct(){}
//静态化一个公共的方法,判断对象是否生成并返回对象
public function getObj(){
if(!self::$instance) self::$instance = new self();
return self::$instance;
}
}
14.sql语句应考虑哪些安全性
[if !supportLists]1.[endif]防止sql注入,对特殊字符进行转义(addslashes)或者使用已经编译好的sql语句进行变量的绑定
[if !supportLists]2.[endif]当sql运行出现错误的时候,不要把数据库返回的错误全部显示给客户,以防止泄露服务器和数据库的相关信息
3.最小权限原则,特别不要使用root用户,为不同类型的动作或者租组建不同的账户
15.简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(读写两方面考虑)?
[if !supportLists](1)[endif]索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.
(2)普通索引(由关键字KEY或INDEX定义的索引)的唯一任务就是加快对数据的访问速度.
(3)普通索引允许被索引的数据列包含重复的值,如果能确定某个数据lie值包含彼此不同的值,在为这个数据索引创建索引的时候就应该用关键字UNIQE把它定义为一个唯一索引,唯一索引可以保证数据记录的唯一性.
(4)主键,一个特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,是用关键字PRIMARY KEY来创建.
(5)索引可以覆盖多个数据列,如像INDEX索引,这就是联合索引
(6)索引可以极大的提高数据的查询速度,但会降低插入删除更新表的速度,因为在执行这些写操作的时候,还要操作索引文件.
16.有一个留言板,用mysql做数据库,用户信息包括:用户名,密码,email.留言内容包括:留言ID,标题,内容,发表时间,状态(审核,未审核)实现以下需求
(1)数据库结构
user用户表
字段名字段说明字段类型索引
user_id用户idint主键索引
user_name用户名varchar(30)
user_pass密码char(30)
email邮箱varchar(50)
message留言表
字段名字段说明字段类型索引
user_id用户idint关联id
message_id留言idint留言id 主键id
title标题varchar(45)
content内容varchar(255)
status状态int0:未审核 1:审核通过
[if !supportLists](2)[endif]用一个sql语句查询出发表留言数量大于10条的用户名及留言数量,查询结果按文章数量降序排序
select u.user_name,count(*) as total from user as u INNER JOIN message as m ON u.user_id = m.user_id group by u.name having total>10 order by total desc