PHP面試100題彙總
1,Http 和Https的區別
第一:http是超文字傳輸協議,資訊是明文傳輸,https是具有安全性的ssl加密傳輸協議
第二:http和https使用的是完全不同的連線方式,埠也不一樣,前者80 或者443
第三:http連線很簡單,是無狀態的。https協議是由ssl+http協議構建的可進行加密傳輸,身份認證的網路協議。
2.什麼方法來加快頁面的載入速度
1,用到伺服器資源時在開啟,不用時,立即關閉伺服器資源。
2,資料庫新增索引
3,頁面可生成靜態
4,圖片等大檔案單獨放在一個伺服器
5,能不查詢資料庫的儘量不去資料取資料,可以放在快取中。
3.表單中 get與post提交方法的區別?
答:get是傳送請求HTTP協議通過url引數傳遞進行接收,而post是實體資料,可以通過表單提交大量資訊.
4.echo ,print,print_r 的區別:
echo 是php語句,無返回值。
print,print_r是函式,有返回值。 print() 只能打印出簡單型別變數的值(如int,string)
print_r() 可以打印出複雜型別變數的值(如陣列,物件) echo 輸出一個或者多個字串
5.session與cookie區別
session與cookie相同:跨頁面、不跨使用者
session與cookie不相同:
1、session可以儲存任意型別的資料,但cookie只能儲存字串
2、cookie產生在伺服器端、儲存在客戶端
session產生在伺服器端、儲存在伺服器端
6.魔術常量
答案:
__LINE__檔案中的當前行號。
__FILE__檔案的完整路徑和檔名。
__FUNCTION__函式名稱
__CLASS__類的名稱
__METHOD__類的方法名
7.資料庫中的事務是什麼?
答:事務(transaction)是作為一個單元的一組有序的資料庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,事務則提交,其修改將作用於所有其他資料庫程序。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。
8.1優化MYSQL資料庫的方法。
1、選擇合適的欄位的資料型別
1)能用數字不用字串
2)char、varchar、text 能用varchar不用char
3)給欄位加not null 避免在表中出現NULL關鍵字(default 值)
2、選擇合適的欄位充當主鍵
1)建議每張表必須有主鍵
2)用數字型別的欄位充當主鍵
- 拆分表
- 拆分欄位,將文章的標題與內容分開
2)拆分記錄,將今年的記錄與往年的記錄分開
- 給欄位合理新增索引
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[索引欄位])
5、事務處理:
a.保證資料完整性,例如新增和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
6、鎖定表,優化事務處理:
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");
7、使用外來鍵,優化鎖定表
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;
8、優化查詢語句
a用內連線代替子查詢代替子查詢,用sphinx代替like模糊查詢
b最好在相同欄位進行比較操作,在建立好的索引欄位上儘量減少函式操作
例子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";
- 快取,靜態化
- 選擇合適儲存引擎用Innodb增刪改,用myisam查詢
- 主從資料庫
- 負載均衡
- 最好拿數字型別的欄位充當where條件
- 最好拿相同型別的欄位進行比對(避免發生資料型別的轉換)
- 不要在具有索引的欄位上新增資料庫函式(索引失效)
8.2請簡述專案中優化sql語句執行效率的方法,從哪些方面,sql語句效能如何分析?
答:(1)選擇最有效率的表名順序
(2)WHERE子句中的連線順序
(3)SELECT子句中避免使用‘*’
(4)用Where子句替換HAVING子句
(5)通過內部函式提高SQL效率
(6)避免在索引列上使用計算。
(7)提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。
9.對於大流量網站,採用什麼方法解決訪問量問題?
1,確認伺服器的硬體是否足夠支援當前的流量
2,優化資料庫的訪問
3,禁止外部的盜鏈
4,控制大檔案的下載
5,使用不同主機分流主要流量
6,使用流量分析統計軟體
10.一個函式,能夠遍歷一個資料夾下的所有檔案和子資料夾(20分)
function dir_recurse($dir) {
$i = 1;
if($handle = opendir($dir)) {
while(false !== ($file = readdir($handle))) {
if($file != "."&& $file != ".." ) {
if(is_dir($dir."/".$file) == true) {
$fullpath = $dir."/".$file;
dir_recurse($fullpath);
echo "$fullpath\n";
$i++;
} else {
$fullpath = $dir."/".$file;
echo "$fullpath\n";
$i++;
}
}
}
closedir($handle);
}
}
10.2寫一個函式,能夠遍歷一個資料夾下的所有檔案和子資料夾。
function my_scandir($dir){
$files = array();
if ( $handle = opendir($dir) ) {
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".."&& $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
} else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
11、能夠使HTML和PHP分離開使用的模板(1分)
答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
12、使用哪些工具進行版本控制?(1分)
答:cvs,svn,vss;
13、如何實現字串翻轉?(3分)
英文:
strrev($a)
中文或其他文字:
中文:GB2312, 程式碼是使用GB2312編碼
<?php
function reverse($str)
{
$ret = "";
len=mb s trwidth( len=mbstrwidth(len = mb_strwidth(str,"GB2312");
for(i=0; i=0;i=0; i< len; len;len; i++)
{
arr[]=mb s ubstr( arr[]=mbsubstr(arr[] = mb_substr(str, $i, 1, "GB2312");
}
return implode("", array_reverse($arr));
}
print_r(reverse("你好"));
14.PHP的意思(送1分)
PHP是一個基於服務端來建立動態網站的指令碼語言,您可以用PHP和HTML生成網站主頁
15.MYSQL取得當前時間的函式是?,格式化日期的函式是(2分)
答:now(),date()
16.用PHP寫出顯示客戶端IP與伺服器IP的程式碼1分)
答:列印客戶端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR');
列印伺服器IP:echo gethostbyname("www.bolaiwu.com")
17、語句include和require的區別是什麼?為避免多次包含同一檔案,可用(?)語句代替它們?
答:require->require是無條件包含也就是如果一個流程里加入require,無論條件成立與否 都會先執行require
include->include有返回值,而require沒有(可能因為如此require的速度比include快)
注意:包含檔案不存在或者語法錯誤的時候require是致命的,include不是
18.http請求返回狀態碼
400 請求無效
401 未授權
403 請求被禁止
404 請求資源不存在
405 請求資源被禁止
406 無法接受
407 要求代理身份驗證
500 Internal Server Error 服務端原始碼錯誤
600 源站沒有返回響應頭部,只返回實現內容
19,linux授權碼:
600 屬主有讀寫許可權
644 屬主有讀寫許可權,屬性組有讀許可權
700 屬主有讀寫執行許可權
755 屬主有讀寫執行許可權,屬性組有讀,執行許可權
711 屬主有讀寫執行許可權,屬性組有執行許可權
666 所有使用者都有檔案的讀寫許可權
777 所有使用者都有檔案的讀寫執行許可權
20.有一個網頁地址, 比如PHP開發資源網主頁: http://www.phpres.com/index.html,如何得到它的內容?(1分)
答:方法1(對於PHP5及更高版本):
$readcontents = fopen("http://www.phpres.com/index.html", "rb");
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
方法2:
echo file_get_contents("http://www.phpres.com/index.html");
11.在PHP中error_reporting這個函式有什麼作用? (1分)
答:設定錯誤級別與錯誤資訊回報
12.JS表單彈出對話方塊函式是?獲得輸入焦點函式是? (2分)
答:彈出對話方塊: alert(),prompt(),confirm()
獲得輸入焦點 focus()
13.foo()和@foo()之間有什麼區別?(1分)
答:@foo()控制錯誤輸出
14、mysql_fetch_row() 和mysql_fetch_array之間有什麼區別? (1分)
答:mysql_fetch_row是從結果集取出1行陣列,作為列舉
mysql_fetch_array是從結果集取出一行陣列作為關聯陣列,或數字陣列,兩者兼得
15、GD庫是做什麼用的? (1分)
答:gd庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。
在網站上GD庫通常用來生成縮圖或者用來對圖片加水印或者對網站資料生成報表。
16.面向物件程式設計
有兩個重要的概念:類和物件
類是具備某項功能的抽象模型,實際應用中,還需要對類進行例項化後使用。這樣就引入了物件的概念。
物件是類進行例項化後的一個產物,是一個實體。
封裝 :把客觀的事物封裝成一個抽象的類。
繼承:子類繼承父類,可以使用父類的屬性和方法。可以實現介面,同時實現介面中的所有方法
多型:覆蓋和過載 子類可以覆蓋父類中的方法;一個類中可以同時擁有同一個函式名的方法,但是方法的引數不同,實現的結果也不同。
17.php框架
熟悉YII ,Thinkphp還有laravel ,symfony2,cakephp
18.mysql儲存引擎
ISAM: 查詢速度快、增刪改慢,支援全文索引、不支援外來鍵、不支援事務
MyISAM: ISAM升級版
Memory: 資料駐留在記憶體、速度快、資料管理不穩定、斷電後資料全部丟失
InnoDB: 速度較慢、支援外來鍵、支援事務、不支援全文索引
使用的儲存引擎
MyISAM:內容管理系統(新聞、官網、電商、軟體下載、房屋、招聘...) 可讀不可改 大部分是瀏覽資訊
InnoDB:技術型網站(bbs、blog、webo、oa...)
19.資料庫操作流程
$link = mysql_connect("localhost","root","root");
mysql_select_db("test",$link);
$sql ="select * from table";
$result = mysql_query($sql);
while($row =mysql_fetch_****($result) ){
$arr[]=$row;
}
$row = mysql_fetch_array($result) 意思:$row['name'] 和$row[1] 都可以取到值
$row = mysql_fetch_row($result)) 意思:$row[1] 只有用索引取值,偏移量從0開始。
$row = mysql_fetch_assoc($result)) 意思: $row['name'] 欄位名作為索引取值 抽取一條記錄轉為 關聯陣列,失敗返回false
20.php 加密函式
crypt($str[,$slat]) 可以完成單向加密功能
md5()
sha1() 返回一個40位的十六進位制數,
加密擴充套件庫
Mcrypt() 和Mash
21、字串“to upper case” 分別用php,shell ,js實現將字串中的字元全部轉換成大寫並輸出。(5分)
Php實現: echo strtoupper(‘to upper case’)
Shell實現:echo "to upper case" | tr 'a-z' 'A-Z'
Js實現:
<script language="javascript"> var stmp1 = " to upper case "; alert(stmp1.toLocaleUpperCase());//轉換成大寫 alert(stmp1.toUpperCase())//轉換成大寫 </script>
22.防止SQL注入
1)一般使用 addslashes 函式
addslashes 函式在制定的預定義字元前新增反斜槓
- 對欄位和密碼MD5加密處理
- 預處理過濾處理
23、用PHP打印出前一天的時間,格式是2006-5-10 22:21:21
<?php
//echo date('Y-m-d H:i:s',time()-60*60*24
echo date("Y:m:d H:i:s",strtotime("-1 day"));
?>
24.如何實現字串翻轉?
其實PHP本身就有字串翻轉的函式:strrev(),不妨試試echo strrev($str);不過
所有的這三種方法都不能解決中文字串翻轉的問題,會出錯的。
程式碼
<?php
function reverse($var)
{
$res="";
for($i=0,$j=strlen($var);$i<$j;$i++)
{
$res=$var[$i].$res;
}
return $res;
}
$tmpvar="wofang";
$res=reverse($tmpvar);
echo $res;
}
?>
25.實現中文字串擷取無亂碼的方法。
mb_substr()
26.以下哪一句不會把 John 新增到 users 陣列?
$users[] = 'john';
成功把 John 新增到陣列 users。
array_add($users,’john’);
函式 array_add() 無定義。
array_push($users,‘john’);
成功把 John 新增到陣列 users。
$users ||= 'john';
語法錯誤。
27.sort()、assort()、和 ksort() 有什麼分別?它們分別在什麼情況下使用?
sort()
根據陣列中元素的值,以英文字母順序排序,索引鍵會由 0 到 n-1 重新編號。主
要是當陣列索引鍵的值無關疼癢時用來把 陣列排序。
assort()
PHP 沒有 assort() 函式,所以可能是 asort() 的筆誤。
asort()
與 sort() 一樣把陣列的元素按英文字母順序來排列,不同的是所有索引鍵都獲得保留,特別適合替聯想陣列排序。
ksort()
根據陣列中索引鍵的值,以英文字母順序排序,特別適合用於希望把索引鍵排序的聯想陣列。
28.以下的程式碼會產生什麼?為什麼?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由於函式 multiply() 沒有指定 $num 為全域變數(例如 global $num 或者
$_GLOBALS['num']),所以 $num 的值是 10。
29.些函式可以用來在現正執行的指令碼中插入函式庫?
對這道題目不同的理解會有不同的答案,我的第一個想法是插入 PHP 函式庫不外乎
include()、include_once()、require ()、require_once(),但細心再想,“函式庫”也應該包括 com 物件和 .net 函式庫,所以我們的答案也要分別包括
com_load 和 dotnet_load,下次有人提起“函式庫”的時候,別忘記這兩個函式。
30.foo() 與 @foo() 有什麼分別?
foo() 會執行這個函式,任何解譯錯誤、語法錯誤、執行錯誤都會在頁面上顯示出來。
@foo() 在執行這個函式時,會隱藏所有上述的錯誤訊息。
很多應用程式都使用 @mysql_connect() 和 @mysql_query 來隱藏 mysql 的錯誤訊息,我認為這是很嚴重的失誤,因為錯誤 不該被隱藏,你必須妥善處理它們,可能的話解決它們。
31 “===”是什麼?試舉一個“==”是真但“===”是假的例子。
“===”是給既可以送回布林值“假”,也可以送回一個不是布林值但卻可以賦與“假”值的函式,strpos() 和 strrpos() 便是其中兩個例子。
問題的第二部份有點困難,想一個“==”是假,但是“===”是真的例子卻很容易,
相反的例子卻很少。但我終於找到以下的 例子:
if (strpos("abc", "a") == true){ // 這部分永不會被執行,因為 "a" 的位
置是 0,換算成布林值“假”}if (strpos("abc", "a") === true){ // 這部份
會被執行,因為“===”保證函式 strpos() 的送回值不會換算成布林值.}
32、如何修改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);
33、在PHP中,heredoc是一種特殊的字串,它的結束標誌必須?(1分)
答:heredoc的語法是用"<<<"加上自己定義成對的標籤,在標籤範圍內的文字視為一
個字串
例子:
$str = <<<SHOW
my name is Jiang Qihui!
SHOW;
34 在PHP中error_reporting這個函式有什麼作用? (1分)
答:設定錯誤級別與錯誤資訊回報
35 請寫一個函式驗證電子郵件的格式是否正確 (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);
}
36、請寫出資料型別(int char varchar datetime text)的意思; 請問varchar和char
有什麼區別(2分)
答:int是數字型別,char固定長度字串,varchar實際長度字串,datetime日期時
間型,text文字字串
char的場地固定為建立表設定的長度,varchar為可變長度的字元
37、檢測一個變數是否有設定的函式是否?是否為空的函式是?(2分)
答:isset($str),empty($str);
38、取得查詢結果集總數的函式是?(1分)
答:mysql_num_rows($result);
39 簡述如何得到當前執行指令碼路徑,包括所得到引數。
<?php
echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?".$_SERVER
['QUERY_STRING'];
//echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
40 請舉例說明在你的開發過程中用什麼方法來加快頁面的載入速度
- 要用到伺服器資源時才打開
- 及時關閉伺服器資源,
- 資料庫新增索引,
- 頁面可生成靜態,圖片等大檔案單獨伺服器。
- 使用程式碼優化工具啦
41. 給定一個用逗號分隔一組值的字串,以下哪個函式能在僅呼叫一次的情況下就
把每個獨立的值放入一個新建立的陣列?
A.strstr()
B.不可能只調用一次就完成
C.extract()
D.explode()√
E.strtok()
42.如果用+操作符把一個字串和一個整型數字相加,結果將怎樣?
A.直譯器輸出一個型別錯誤
B.字串將被轉換成數字,再與整型數字相加
C.字串將被丟棄,只保留整型數字√
D.字串和整型數字將連線成一個新字串
E.整形數字將被丟棄,而保留字串
43.以下指令碼輸出什麼?
$s = '12345';
$s[$s[1]] = '2';
echo $s;
?>
A.12345
B.12245√
C.22345
D.11345
44.以下指令碼輸出什麼?
$x = 'apple';
echo substr_replace ($x, 'x', 1, 2);
?>
A.x
B.axle√
C.axxle
D.applex
E.xapple
45. 函式______能讀取文字檔案中的一行。讀取二進位制檔案或者其他檔案時,應當
用______函式。
A.fgets(), fseek()
B.fread(), fgets()
C.fputs(), fgets()
D.fgets(), fread()√
E.fread(), fseek()
46.哪個函式能夠往文字檔案中寫入一個字串?
答案:fwrite()和fputs()兩個函式在這裡都可以,而後者其實是前者的別名。在
PHP中,寫入二進位制資料和寫入字串沒有區別。
47.函式______能判斷一個檔案是否可寫。
答案:is_writeable
48.以下哪個選項能將檔案指標移到開頭?
A.reset()
B.fseek(-1)
C.fseek(0, SEEK_END)
D.fseek(0, SEEK_SET)√
E.fseek(0, SEEK_CUR)
49、include的功能和require一樣,不同的是,require不能用在[ ]
A、判斷語句或迴圈裡,
B、連線語句裡
C、宣告語句裡
D、檔案的開頭
E、檔案的中間√
50、下面建立與MySQL Server的連線語法正確的是:[ ]
A、$link=connect("host_name","user_name","password");
B、$link=mysql_connect("host_name","user_name","password");√
C、$link=mysqlconnect("host_name","user_name","password");
D、$link=mysql_pconnect("host_name","user_name","password");√
E、$link=pconnect("host_name","user_name","password");
51.將字串轉換成小寫
strtolower(): 該函式將傳入的字串引數所有的字元都轉換成小寫,並以小定形式
放回這個字串
52.將字元轉成大寫
strtoupper(): 該函式的作用同strtolower函式相反,是將傳入的字元引數的字元全
部轉換成大寫,並以大寫的形式返回這個字串.用法同strtolowe()一 樣.
53.將字串首字元轉換成大寫
ucfirst(): 該函式的作用是將字串的第一個字元改成大寫,該函式返回首字元大
寫的字串.用法同strtolowe()一樣.
54.將字串每個單詞的首字元轉換成大寫
ucwords(): 該函式將傳入的字串的每個單詞的首字元變成大寫.如"hello
world",經過該函式處理後,將返回"Hello Word".用法同strtolowe()一樣.
55、NoSQL:Not Only SQL
思想:網站產生的資料,一部分儲存資料庫、一部分存到NoSQL相關產品
NoSQL產品
1、Memcache:記憶體(速度快、資料量小)、資料的過期時間
2、MongoDB:文件資料庫
3、Redis:記憶體(速度快、資料量小)、庫、沒有過期時間
56. 什麼樣的資料,儲存在什麼位置?
MySQL:穩定的資料
NoSQL:活躍的資料
57. 快取分類
1、快取資料儲存位置不同
1)檔案快取
2)記憶體快取
2、快取的資料量的不同
1)頁面快取
2)區域性快取
3)區域性不快取
4)資料快取(變數快取、動態快取)
Memcache:記憶體快取、變數快取
58. LINUX命令
檢視當前目錄下所有內容 ls
在當前目錄下,新建一個資料夾 mkdir 資料夾名
刪除指定的資料夾 rmdir 資料夾名 只能刪除空目錄
在當前目錄下新建一個空白檔案 touch 檔名
刪除當前目錄下的一個檔案 unlink檔名
刪除檔案或資料夾 rm
複製檔案 cp
移動檔案或資料夾 mv
檔案或資料夾重新命名 mv
檢視完整的工作目錄 pwd
切換目錄: cd cd/ 返回根目錄
檔案傳輸 ftp
檢視檔案內容 cat 檔名
檢視檔案編碼 file 檔名
查詢檔案 find 路徑 -name 檔名
修改檔案或資料夾許可權
許可權種類:r 4(讀)、w 2(寫)、x 1(執行)
許可權操作符:+(賦予許可權)、-(收回許可權)
使用者種類:a(所有人)、u(檔案擁有者)、g(組使用者)、o(其他使用者)
檢視許可權:ls -l
-rw-r--r-- a.txt
drwxr-xr-x hello
第1位:是檔案還是資料夾(-檔案、d資料夾)
第234位:u使用者的許可權
第567位:g使用者的許可權
最後三位:o使用者的許可權
1)將最大許可權賦予a.txt
chmod a+r+w+x a.txt
chmod 777 a.txt
2)設定a.txt許可權,收回o使用者的wx許可權
chmod o-w-x a.txt
3)設定a.txt許可權:u:rw g:r o:r
chmod 644 a.txt
4)設定hello資料夾權,給予最大許可權(不影響子檔案)
chmod 777 hello
5)設定hello資料夾權,給予最大許可權(影響子檔案)
chmod -R 777 hello
59、建立檔案exer1,設定訪問許可權為rw-r--r--,現要增加所有使用者的執行許可權和同組使用者的寫許可權,寫出操作過程的命令(10分)
touch exer1
chmod 644 exer1
增加許可權
chmod a+x exer1
chmod g+w exer1
或者
chmod 775 exer1
60.易出現編碼的地方
- 檔案儲存格式的編碼
- <meta http-equiv=”content-type” content=”text/html;charset=utf-8”>
- Header();
- Msq本身的編碼(修改ini)
- Set names gbk;
- Mysql_query(“set names utf8”);
- Iconv()PHP的系統函式進行轉碼
61.PHP工作原理
- 一個網站執行時客戶端有無數個,伺服器通常只有一個(負載均衡)
- 開發環境的安裝2,PHP5.4,MYSQL5.3-------開源,可以跨平臺
- 配置檔案:conf(Apache), php.ini my.ini
- PHP文件組成:HTML,css,js,jquery,PHP
- PHP語法風格:xml風格,短風格,ASP風格(已過時),指令碼風格
- <?php ?>注意:位置任意,同一頁面可以出現多次,不能巢狀,裡面只能出現php程式碼,需要轉字串輸出
- 執行在伺服器端
- 註釋:單行註釋,多行註釋
62.資料型別:
- 標量型別:integer,Float,String,boolean
- 複合型別:Array,Object
- 特殊型別:Resource,Null
- 偽型別:mixed,number,callback(回撥函式)
63.PHP中被認為是false的值:
0, 0.0, null, 空陣列, 空字串, false
64.求兩個日期的差數,例如2012-2-27 ~ 2013-05-6 的日期差數
<?php
function get_days($date1, $date2){
$time1 = strtotime($date1);
$time2 = strtotime($date2);
return ($time2-$time1)/86400;
}
echo get_days("2013-05-6", "2012-2-27");
?>
65.什麼是MVC?
回答:MVC由Model(模型), View(檢視)和Controller(控制器)組成,PHP MVC可以更高效地管理好3個不同層的PHP程式碼。
Model:資料資訊存取層。
View:view層負責將應用的資料以特定的方式展現在介面上。
Controller:通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料。
66.PHP中獲取影象尺寸大小的方法是什麼?
回答:getimagesize () 獲取圖片的尺寸
Imagesx () 獲取圖片的寬度
Imagesy () 獲取圖片的高度
67.如何在PHP中定義常量?
回答:PHP中使用Define () 來定義常量。
define (“Newconstant”, 30);
68.如何不使用submit按鈕來提交表單?
如果我們不想用submit按鈕來提交表單,我們也可以用超連結來提交,我們可以這樣寫程式碼:
<a href=”javascript: document.myform.submit();”>Submit Me</a>
69.簡述論壇中無限分類的實現原理。
答:無限極分類,那麼應該是考察遞迴函式吧!
第一步:建立測試資料庫
CREATE TABLE `category` ( `id` smallint(5) unsigned NOT NULL auto_increment, `fid` smallint(5) unsigned NOT NULL default '0', `value` varchar(50) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第二步:插入測試資料
INSERT INTO `category` ( `fid`, `value`) VALUES (0, 'PHP點點通部落格PHPDDT.COM'), (1,'a'), (1,'b'), (2,'c'), (2,'d'), (4,'e')
第三步:遞迴輸出分類
70.試述isset()和empty()的區別
isset() 測試變數是否存在 empty() 測試變數是否為空
71.請用盡可能少的語句實現對輸入Email地址進行驗證的功能
72.使用PHP描述氣泡排序和快速排序演算法,物件可以是一個數組
//氣泡排序(陣列排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0)
return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j–){
if ($array[$j] < $array[$j-1]) {
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(陣列排序)
function quick_sort($array) {
if (count($array) <= 1)
return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++){
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
73、使用PHP描述順序查詢和二分查詢(也叫做折半查詢)演算法,順序查詢必須考慮效率,物件可以是一個有序陣列
//二分查詢(數組裡查詢某個元素)
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
} else if ($k < $array[$mid]) {
return bin_sch($array, $low, $mid-1, $k);
} else {
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//順序查詢(數組裡查詢某個元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n) {
return $i;
} else {
return -1;
}
}
74.寫一個二維陣列排序演算法函式,能夠具有通用性,可以呼叫php內建函式
function array_sort($arr, $keys, $order=0) {
if (!is_array($arr)) {
return false;
}
$keysvalue = array();
foreach($arr as $key => $val) {
$keysvalue[$key] = $val[$keys];
}
if($order == 0){
asort($keysvalue);
}else {
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals) {
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val) {
$new_array[$key] = $arr[$val];
}
return $new_array;
}
75.utf-8轉換成gbk的函式是?
iconv("gbk",""UTF-8,"我們");
mb_convert_encoding($str, "GBK", "UTF-8")
76.Php中分割字串成陣列的函式和連線陣列成字串的函分別有哪些?
explode() split() ;implode() join()
77.說幾個你知道的設計模式?
單例模式: 保證一個類僅有一個例項,並提供一個訪問他的全域性訪問點例如框架中的資料庫連線
簡單工廠模式: 它具有建立物件的某些方法,可以使用工廠類建立物件,而不直接使用 new。例如初始化資料庫的時候會用到,比如MySQL,MSSQL
策略模式: 針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,例如進入個人主頁時,根據瀏覽者的不同,給予不同的顯示與操作
註冊模式: 提供了在程式中有條理的存放並管理一組全域性物件 (object),例如ZF框架中的Zend_Registry::set
介面卡模式: 將不同介面適配成統一的API介面,例如資料操作有mysql、mysqli、pdo等,可利用介面卡模式統一介面
觀察者模式: 一個物件通過新增一個方法使本身變得可觀察。當可觀察的物件更改時,它會將訊息傳送到已註冊的觀察者。例如實現實現訊息推送
裝飾器模式: 不修改原類程式碼和繼承的情況下動態擴充套件類的功能,例如框架的每個Controller檔案會提供before和after方法
迭代器模式: 提供一個方法順序訪問一個聚合物件中各個元素,在PHP中將繼承 Iterator 類
原型模式: 實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件的代價比較大時,則採用這種模式。例如,一個物件需要在一個高代價的資料庫操作之後被建立。
78.echo,print(),print_r(),printf(),sprintf(),var_dump()有什麼區別?
echo :是語句不是函式,沒有返回值,可輸出多個變數值,不需要圓括號。不能輸出陣列和物件,只能列印簡單型別(如int,string)
print :是語句不是函式,有返回值 1 ,只能輸出一個變數,不需要圓括號。不能輸出陣列和物件,只能列印簡單型別(如int,string)。
print_r:是函式,可以列印複合型別,例如:stirng、int、float、array、object等,輸出array時會用結構表示,而且可以通過print_r($str,true)來使print_r不輸出而返回print_r處理後的值
printf :是函式,把文字格式化以後輸出(參看C語言)
sprintf :是函式,跟printf相似,但不列印,而是返回格式化後的文字,其他的與printf一樣。
var_dump :函式,輸出變數的內容、型別或字串的內容、型別、長度。常用來除錯。
79.echo count(“abc”); 輸出什麼?
答案:1
80.寫個函式用來對二維陣列排序。
答案:array_multisort() 。
81.對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?
首先,確認伺服器硬體是否足夠支援當前的流量。
其次,優化資料庫訪問。
第三,禁止外部的盜鏈。
第四,控制大檔案的下載。
第五,使用不同主機分流主要流量
第六,使用流量分析統計軟體。
82.error_reporting(2047)什麼作用?
答案:相當於 error_reporting(‘E_ALL’); 輸出所有的錯誤。
83、 簡述如何得到當前執行指令碼路徑,包括所得到引數。
訪問http://temp.com/phpinfo.php?id=1
echo $_SERVER['SCRIPT_URL']; //得到/phpinfo.php
echo $_SERVER["SCRIPT_URI"]; //得到http://temp.com/phpinfo.php
echo $_SERVER["SCRIPT_FILENAME"]; //得到F:/www/Temp/phpinfo.php
echo $_SERVER["REQUEST_URI"]; //得到/phpinfo.php?id=1
echo $_SERVER["SCRIPT_NAME"]; //得到/phpinfo.php
參考server.php http://lesson.com/test/server.php?id=1
84.寫出session的執行機制。
session建立時,是否會在服務端記錄一個cookie?cookie裡面的內容是什麼?
session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。
當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識-稱為sessionid,如果已包含一個sessionid則說明以前已經為此客戶端建立過session,伺服器就按照sessionid把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含sessionid,則為此客戶端建立一個session並且生成一個與此session相關聯的sessionid,sessionid的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個sessionid將被在本次響應中返回給客戶端儲存。_
儲存這個sessionid的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發給伺服器。一般這個cookie的名字都是類似於SEEESIONID。r
由於cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把sessionid傳遞迴伺服器。經常被使用的一種技術叫做URL重寫,就是把sessionid直接附加在URL路徑的後面,附加方式也有兩種,一種是作為URL路徑的附加資訊,表現形式為http://…../xxx;SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764比
另一種是作為查詢字串附加在URL後面,表現形式為http://…../xxx?SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764參
為了在整個互動過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個SEEESIONID。
85.Cookie的原理及使用?
Cookie是網站儲存在瀏覽器客戶端的資訊,也就是說儲存在訪客的機器裡的變數,一般隨著HTTP頭髮送到伺服器端。在Cookie生效之後及失效之前,客戶每次發出頁面請求的時候(包括PHP頁面和靜態html頁面),都會把Cookie一塊傳送到伺服器,只要我們針對它進行相應的處理,就可以實現變數”追隨”。到
86.Form中的get和post方法,在資料傳輸過程中分別對應了HTTP協議中的GET和POST方法。
二者主要區別如下:
a、Get是用來從伺服器上獲得資料,而Post是用來向伺服器上傳遞資料。
b、Get將表單中資料的按照variable=value的形式,新增到action所指向的URL後面,並且兩者使用”?”連線,而各個變數之間使用”&”連線;Post是將表單中的資料放在form的資料體中,按照變數和值相對應的方式,傳遞到action所指向URL。u
c、Get是不安全的,因為在傳輸過程,資料被放在請求的URL中,而如今現有的很多伺服器、代理伺服器或者使用者代理都會將請求URL記錄到日誌檔案中,然後放在某個地方,這樣就可能會有一些隱私的資訊被第三方看到。另外,使用者也可以在瀏覽器上直接看到提交的資料,一些系統內部訊息將會一同顯示在使用者面前。Post的所有操作對使用者來說都是不可見的。而
d、Get傳輸的資料量小,這主要是因為受URL長度限制;而Post可以傳輸大量的資料,所以在上傳檔案只能使用Post(當然還有一個原因,將在後面的提到)。
e、Get限制Form表單的資料集的值必須為ASCII字元;而Post支援整個ISO10646字符集。
f、Get是Form的預設方法。
*.Post傳輸資料時,不需要在URL中顯示出來,而Get方法要在URL中顯示。
*.Post傳輸的資料量大,可以達到2M,而Get方法由於受到URL長度的限制,只能傳遞大約1024位元組.
.Post顧名思義,就是為了將資料傳送到伺服器段,Get就是為了從伺服器段取得資料.而Get之所以也能傳送資料,只是用來設計告訴伺服器,你到底需要什麼樣的資料.Post的資訊作為http請求的內容,而Get是在Http頭部傳輸的。提
87.PHP5中魔術方法函式有哪幾個,請舉例說明各自的用法
__sleep
__wakeup
__toString
__set_state
__construct,
__destruct
__call,
__get,
__set,
__isset,
__unset
__clone
__autoload
88.isset()和empty()的區別
兩者都是測試變數用的。但是isset()是 測試變數是否被賦值 ,而empty()是測試 一個已經被賦值的變數是否為空
。如果一個變數沒被賦值就引用在php裡是被允許的,但會有notice提示。如果一個變數被賦空值,$foo=””或者$foo=0或者$foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會登出一個變數。要登出一個變數,可以用d
unset($foo)或者$foo=NULL。
89.以下哪一句不會把 John 新增到 users 陣列?
$users[] = ‘john’;
成功把 John 新增到陣列 users。
array_add($users,’john’);
函式 array_add() 無定義。
array_push($users,‘john’);
成功把 John 新增到陣列 users。
$users ||= ‘john’;
語法錯誤。
90.以下哪一個函式可以把瀏覽器轉向到另一個頁面?
redir()這不是一個 PHP 函式,會引致執行錯誤。
header()這個是正確答案,header() 用來插入卷頭資料,可以用來使瀏覽器轉向到另一個頁面,例如:
header(“Location: http://www.phpmst.com/”);
location()這不是一個 PHP 函式,會引致執行錯誤。
redirect()這不是一個 PHP 函式,會引致執行錯誤。
91.PHP中的非靜態方法可以通過靜態呼叫嗎,反之呢?
其實問題是問沒有通過static定義的方法,能否通過”物件名::方法名“這樣的形式來呼叫。答案是會產生一個strict錯誤,但在會繼續執行程式碼。
反之,能否通過“物件名->方法名“的形式來呼叫static定義的方法?答案是不能,會出錯並中斷程式執行。
92.使用utf-8編碼,以下程式碼輸出結果是什麼?strlen函式是計算字串的位元組數還是字元數?
$str = “您好hello”;
答案:echo strlen($str);
11 strlen() 函式返回字串的長度。
93. 什麼是時間戳?時間戳能代表的最小年份和最大年份是多少?
答案:(格林威治時間 1970 年 1 月 1 日 00:00:00)到當前時間的秒數。
有效的時間戳典型範圍是格林威治時間 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07。(此範圍符合
32 位有符號整數的最小值和最大值)。
不過在 PHP 5.1 之前此範圍在某些系統(如 Windows)中限制為從 1970 年 1 月 1 日到 2038 年 1 月 19 日。
94. MyISAM與innoDB儲存引擎有何差別?
答案:A、兩者在檔案構成上有區別;
B、InnoDB支援事務處理,MyISAM不支援;
C、對無WHERE子句的COUNT(*)操作的不同:MyISAM中儲存了該值,直接讀取,InnoDB需要作全表掃描;
D、鎖的區別:InnoDB支援表級鎖和行級鎖,MyISAM只支援表級鎖;
E、索引會快取資料,而MYISAM不會;
F、INNODB不區分char和varchar;
G、INNODB支援hash索引,而MYISAM不支援;
H、InnoDB不支援FULLTEXT型別的索引;
I、InnoDB 中不儲存表的具體行數,也就是說,執行select count(*) from
table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出儲存好的行數即可。注意的是,當count(*)語句包含
where條件時,兩種表的操作是一樣的;
J、對於AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引;
K、DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除;
L、LOAD TABLE FROM
MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外來鍵)的表不適用。
95.如何記錄php程式錯誤至系統日誌?
答案:將PHP的log_errors開啟即可,預設是記錄到WEB伺服器的日誌檔案裡,比如Apache的error.log檔案。
當然也可以記錄錯誤日誌到指定的檔案中。
程式碼如下:
# vim /etc/php.inidisplay_errors = Off
log_errors = On
error_log = /var/log/php-error.log
另外也可以設定error_log = syslog,使這些錯誤資訊記錄到作業系統的日誌裡。
display_errors = Off //不顯示錯誤
error_reporting 設定錯誤訊息回報的等級
96.用最少的程式碼寫一個求3值最大值的函式.
答案: function($a,$b,$c){
return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b : $c );
}
97.在PHP中,heredoc是一種特殊的字串,它的結束標誌必須?(1分)
答:heredoc的語法是用”<<<”加上自己定義成對的標籤,在標籤範圍內的文字視為一個字串
例子:
$str = <<<SHOW
my name is Jiang Qihui!
SHOW;
98.字串函式
chr — 通過ASCII碼值返回指定的字元
ord — 通過指定的字元返回ASCII碼值
explode — 使用一個字串分割另一個字串
implode — 將一個一維陣列的值轉化為字串
join — 別名implode
htmlspecialchars — 把預定義的字元轉換為HTML實體(比如說大於小於)
nl2br — 在字串所有新行之前插入HTML換行標記
strip_tags — 從字串中去除 HTML 和 PHP 標記
lcfirst — 使一個字串的第一個字元小寫
ucfirst — 將字串的首字母轉換為大寫
ucwords — 將字串中每個單詞的首字母轉換為大寫
md5 — 加密,返回32位的字串
sha1 — 加密,返回40位的字串
number_format — 以千位分隔符方式格式化一個數字
trim — 去除字串首尾處的空白字元(或者其他字元)
ltrim — 刪除字串開頭的空白字元(或其他字元)
rtrim — 刪除字串末端的空白字元(或者其他字元)
chop — rtrim 的別名
str_replace — 子字串替換
str_ireplace — str_replace的忽略大小寫版本
str_pad — 使用另一個字串填充字串為指定長度
str_repeat — 重複一個字串
str_shuffle — 隨機打亂一個字串
str_split — 將字串轉換為陣列
strstr — 查詢字串的首次出現
strchr — 別名 strstr
stristr — strstr 函式的忽略大小寫版本
strrchr — 查詢指定字元在字串中的最後一次出現
strpos — 查詢字串首次出現的位置
stripos — 查詢字串首次出現的位置(不區分大小寫)
strripos — 計算指定字串在目標字串中最後一次出現的位置(不區分大小寫)
strrpos — 計算指定字串在目標字串中最後一次出現的位置
strlen — 獲取字串長度
strrev — 反轉字串
strtolower — 將字串轉化為小寫
strtoupper — 將字串轉化為大寫
substr — 擷取字串
99.陣列函式
答案:
array_shift — 將陣列開頭的單元移出陣列
array_pop — 將陣列最後一個單元彈出(出棧)
array_unshift — 在陣列開頭插入一個或多個單元
array_push — 將一個或多個單元壓入陣列的末尾(入棧)
array_keys — 返回陣列中部分的或所有的鍵名
array_values — 返回陣列中所有的值
in_array — 檢查陣列中是否存在某個值
array_key_exists — 檢查給定的鍵名或索引是否存在於陣列中
key_exists — 別名 array_key_exists
array_rand — 從陣列中隨機取出一個或多個單元
array_reverse — 返回一個單元順序相反的陣列
array_unique — 移除陣列中重複的值
array_merge — 合併一個或多個數組
count — 計算陣列中的單元數目或物件中的屬性個數
sizeof — count 的別名
array_sum — 計算陣列中所有值的和
array_flip — 交換陣列中的鍵和值
array_count_values — 統計陣列中所有的值出現的次數
shuffle — 將陣列打亂
reset — 將陣列的內部指標指向第一個單元
prev — 將陣列的內部指標倒回一位
current — 返回陣列中的當前單元
pos — current 的別名
each — 返回陣列中當前的鍵/值對並將陣列指標向前移動一步
next — 將陣列中的內部指標向前移動一位
end — 將陣列的內部指標指向最後一個單元
sort — 對陣列排序
rsort — 對陣列逆向排序
asort — 對陣列進行排序並保持索引關係
arsort — 對陣列進行逆向排序並保持索引關係
ksort — 對陣列按照鍵名排序
krsort — 對陣列按照鍵名逆向排序
compact — 建立一個數組,包括變數名和它們的值
range — 快速建立陣列
100.單例模式,建立mysqli資料庫連結的單例物件
class Db
{
private static $instance;
public $handle;
private function __construct($host, $username, $password, $dbname)
{
$this->handle = NULL;
$this->getcon($host, $username, $password, $dbname);
}
public static function getBb()
{
self::$instance = new Db();
return self::$instance;
}
private function getcon($host, $username, $password, $dbname)
{
if($this->handle!=NULL){
return true;
}
$this->handle = mysqli_connect($host, $username, $password,$dbname);
}
}