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