1. 寫出一個能創建多級目錄的 PHP 函數
<?php function create_dir($path,$mode = 0777){ if (is_dir($path)) { echo "該目錄已經存在"; } else { if (mkdir($path,$mode,true)) { echo "創建目錄成功"; } else { echo "創建目錄失敗"; } } }?>2. 寫出 smarty 模板的特點
速度快,編譯型,緩存技術,插件機制,強大的表現邏輯
3. 打開 php.ini 中的 safe_mode,會影響哪些函數?至少說出 6 個。
safe_mode,PHP 安全模式,它提供一個基本安全的共享環境,在一個有多個用戶帳戶存在的 php 開發的 web 伺服器上。
當安全模式打開的時候,一些函數將被完全的禁止,而另一些函數的功能將會受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink 等。
注意,在 php5.3 以上版本,safe_mode 被棄用,在 php5.4 以上版本,則將此特性完全去除了。
4. 抓取遠程圖片到本地,你會用什麼函數?
file_get_contents 或者 curl5.PHP 的垃圾收集機制是怎樣的
PHP 可以自動進行內存管理,清除不再需要的對象。PHP 使用了引用計數 (reference counting) 這種單純的垃圾回收 (garbage collection) 機制。每個對象都內含一個引用計數器,每個 reference 連接到對象,計數器加 1。當 reference 離開生存空間或被設為 NULL,計數器減 1。當某個對象的引用計數器為零時,PHP 知道你將不再需要使用這個對象,釋放其所佔的內存空間。
6. 請寫一段 PHP 代碼,確保多個進程同時寫入同一個文件成功
核心思路:加鎖
<?php $fp = fopen("lock.txt","w+"); if (flock($fp,LOCK_EX)) { fwrite($fp, "write something"); flock($fp, LOCK_UN); } else { echo "file is locking..."; } fclose($fp);?>7. 寫一個函數,儘可能高效的,從一個標準 url 裡取出文件的擴展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或.php
<?php function getExt1($url){ $arr = parse_url($url); $file = basename($arr['path']); $ext = explode('.', $file); return $ext[count($ext)-1]; } function getExt2($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); } } $path = "http://www.sina.com.cn/abc/de/fg.php?id=1"; echo getExt1($path); echo "<br />"; echo getExt2($path);?>相關題目:使用五種以上方式獲取一個文件的擴展名,要求:dir/upload.image.jpg,找出.jpg 或者 jpg,必須使用 PHP 自帶的處理函數進行處理,方法不能明顯重複,可以封裝成函數,比如 get_ext1 (file_name)
8. 寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。
<?php function my_scandir($dir){ $files = array(); if(is_dir($dir)){ if ($handle = opendir($dir)) { while (($flie = readdir($handle))!== false) { if ($flie!="." && $file!="..") { if (is_dir($dir."/".$file)) { $files[$file] = my_scandir($dir."/".$file); } else { $files[] = $dir."/".$file; } } } closedir($handle); return $files; } } }?>9. 簡述論壇中無限分類的實現原理。
創建類別表如下:
CREATE TABLE category(cat_id smallint unsigned not null auto_increment primary key comment'類別ID',cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'類別名稱',parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'類別父ID')engine=MyISAM charset=utf8;編寫一個函數,遞歸遍歷,實現無限分類
<?php function tree($arr,$pid=0,$level=0){ static $list = array(); foreach ($arr as $v) { if ($v['parent_id'] == $pid) { $v['level'] = $level; $list[] = $v; tree($arr,$v['cat_id'],$level+1); } } return $list; }?>10. 寫一個函數,算出兩個文件的相對路徑,如 b=』/a/b/12/34/c.php』; 計算出 a 的相對路徑應該是../../c/d
<?php function releative_path($path1,$path2){ $arr1 = explode("/",dirname($path1)); $arr2 = explode("/",dirname($path2)); for ($i=0,$len = count($arr2); $i < $len; $i++) { if ($arr1[$i]!=$arr2[$i]) { break; } } if ($i==1) { $return_path = array(); } if ($i != 1 && $i < $len) { $return_path = array_fill(0, $len - $i,".."); } if ($i == $len) { $return_path = array('./'); } $return_path = array_merge($return_path,array_slice($arr1,$i)); return implode('/',$return_path); } $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php'; $c = '/e/b/c/d/f.php'; $d = '/a/b/c/d/g.php'; echo releative_path($a,$b); echo "<br />"; echo releative_path($a,$c); echo "<br />"; echo releative_path($a,$d); echo "<br />";?>11.mysql_fetch_row () 和 mysql_fetch_array () 有什麼分別?
mysql_fetch_row () 把資料庫的一列儲存在一個以零為基數的數組中,第一欄在數組的索引 0,第二欄在索引 1,依此類推。
mysql_fetch_assoc () 把資料庫的一列儲存在一個關聯數組中,數組的索引就是欄位名稱,例如我的資料庫查詢送回 「first_name」、「last_name」、「email」 三個欄位,數組的索引便是 「first_name」、「last_name」 和 「email」。
mysql_fetch_array () 可以同時送回 mysql_fetch_row () 和 mysql_fetch_assoc () 的值。
12. 有一個網頁地址,比如 PHP 開發資源網主頁:http://www.phpres.com/index.html, 如何得到它的內容 ?
方法 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");13. 談談對 mvc 的認識
由模型 (model),視圖 (view),控制器 (controller) 完成的應用程式。model 層負責提供數據,和資料庫有關的操作都交給模型層來處理,
view 層則提供交互的界面,並輸出數據,
而 controller 層則負責接收請求,並分發給相應的 model 來處理,然後調用 view 層來顯示。
14.What does the GD library do?
GD 庫提供了一系列用來處理圖片的 API,使用 GD 庫可以處理圖片,或者生成圖片。在網站上 GD 庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。自從 PHP 4.3.0 版本後 GD 便內建在 PHP 系統中。
15.What function can you use to open a file for reading and writing?
A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget () 這不是一個 PHP 函數,會引致執行錯誤。
file_open () 這不是一個 PHP 函數,會引致執行錯誤。
fopen () 這是正確答案,fopen () 可以用來開啟檔案以便讀寫。
open_file () 這不是一個 PHP 函數,會引致執行錯誤。
16.Smarty 的原理
smarty 是一個模板引擎,使用 smarty 主要是為了實現邏輯和外在內容的分離,如果不使用模板的話,通常的做法就是 php 代碼和 html 代碼混編。使用了模板之後,則可以將業務邏輯都放到 php 文件中,而負責顯示內容的模板則放到 html 文件中。
Smarty 在執行 display 方法的時候,讀取模板文件,並進行數據替換,生成編譯文件,之後每次訪問都會直接訪問編譯文件,讀取編譯文件省去了讀取模板文件,和字符串替換的時間,所以可以更快,編譯文件裡時間戳記錄模板文件修改時間,如果模板被修改過就可以檢測到,然後重新編譯(編譯是把靜態內容保存起來,動態內容根據傳入的參數不同而不同)。
如果啟用了緩存,則會根據編譯文件生成緩存文件,在訪問的時候如果有緩存文件並且緩存文件沒有過期,則直接訪問緩存文件。
相關題目 1:能夠使 HTML 和 PHP 分離開使用的模板
smarty,phplib 等
相關題目 2:您是否用過模板引擎?如果有您用的模板引擎的名字是?
Smarty
17.PHP 如何實現頁面跳轉
方法一:php 函數跳轉,缺點,header 頭之前不能有輸出,跳轉後的程序繼續執行,可用 exit 中斷執行後面的程序。
header("Location:網址");header("refresh:3;url=http://axgle.za.NET");方法二:利用 meta
echo"<meta http-equiv=refresh content='0;url=網址'>";18.PHP 可以和 sql server/oracle 等資料庫連接嗎?
可以
19. 使用哪些工具進行版本控制?
SVN 或者 CVS,Git
相關題目:您是否用過版本控制軟體?如果有您用的版本控制軟體的名字是?
TortoiseSVN-1.2.6
20. 寫出一個正則表達式,過慮網頁上的所有 JS/VBS 腳本(即把 script 標記及其內容都去掉):
過濾 JavaScript 腳本參考:
<?php header("content-type:text/html;charset=utf-8"); $script = "以下內容不顯示:<script type='text/javascript'>alert('cc');</script>"; $pattern = '/<script[^>]*?>.*?</script>/si'; echo preg_replace($pattern, "腳本內容", $script);?>21.Given a line of text $string,how would you write a regular expression to strip all the HTML tags from it?
方案一,使用 PHP 內建函數 strip_tags () 除去 HTML 標籤 方案二,自定義函數,如下:
<?php header("content-type:text/html;charset=utf-8"); function strip_html_tags($str){ $pattern = '/<("[^"]*"|'[^']*'|[^>"'])*>/'; return preg_replace($pattern,'',$str); } // 實例 $html = '<p id="">ddddd<br /></p>'; echo strip_html_tags($html); echo "<br />"; $html = '<p id=">">bb<br />aaa<br /></p>'; echo strip_html_tags($html);?>22. 請寫一個函數驗證電子郵件的格式是否正確(要求使用正則)
preg_match('/^[w-.]+@[w-]+(.w+)+$/',$email);相關題目:請用正則表達式寫一個函數,驗證電子郵件的格式是否正確。
23. 請對 POSIX 風格和兼容 Perl 風格兩種正則表達式的主要函數進行類比說明
主要區別有以下三種:
preg_replace () 裡面的正則可以寫成型如:」/.xxx/「而 ereg_replace () 裡面的正則需寫成型如 「xxx」
preg_replace () 能操作數組,而 ereg_replace () 不可以
在逆向引用用 preg_replace () 可使用 0-99 個,而 ereg_replace () 最多為 9 個
使用 Perl 兼容正則表達式語法的 preg_match () 函數通常是比 ereg () 更快的替代方案。
24. 請寫出並說明如何在命令行下運行 PHP 腳本(寫出兩種方式)同時向 PHP 腳本傳遞參數?
首先進入 php 安裝目錄
php -f d:/wamp/www/1.php 其中-f參數指定要執行的php文件php -r phpinfo(); 其中-r表示直接執行php代碼,無需寫開始結束標記25. 使用正則表達式提取一段標識語言(html 或 xml)代碼段中指定標籤的指定屬性值(需考慮屬性值對不規則的情況,如大小寫不敏感,屬性名值與等號間有空格等)。此處假設需提取 test 標籤的 attr 屬性值,請自行構建包含該標籤的串
編寫如下函數:
<?php header("content-type:text/html;charset=utf-8"); function getAttrValue($str,$tagName,$attrName){ $pattern1="/<".$tagName."(s+w+s*=s*(['"]?)([^'"]*)())*s+".$attrName."s*=s*(['"]?)([^'"]*)()(s+w+s*=s*(['"]?)([^'"]*)(9))*s*>/i"; $arr=array(); $re=preg_match($pattern1,$str,$arr); if($re){ echo"<br/>$arr[6]={$arr[6]}"; }else{ echo"<br/>沒找到。"; } } $str1="<test attr='ddd'>"; getAttrValue($str1,"test","attr"); $str2="<test2 attr='ddd'attr2='ddd2't1="t1 value"t2='t2 value'>"; getAttrValue($str2,"test2","t1");?>26.What does the following code do?Explain what’s going on there.date);
這是把一個日期從 MM/DD/YYYY 的格式轉為 DD/MM/YYYY 格式。輸出 26/08/2003
27.What function would you use to redirect the browser to a new page?
A.redir()
B.header()
C.location()
D.redirect()
答案:B
redir () 這不是一個 PHP 函數,會引致執行錯誤。
header () 這個是正確答案,header () 函數發送頭信息,可以用來使瀏覽器轉向到另一個頁面,例如:header (「Location:www.search-this.com/「)。
location () 這不是一個 PHP 函數,會引致執行錯誤。
redirect () 這不是一個 PHP 函數,會引致執行錯誤。
28.When turned on____________will_________your script with different variables from HTML forms and cookies.
A.show_errors,enable
B.show_errors,show
C.register_globals,enhance
D.register_globals,inject
答案:C
29. 一個函數的參數不能是對變量的引用,除非在 php.ini 中把____設為 on。
allow_call_time_pass_reference 是否啟用在函數調用時強制參數被按照引用傳遞
30. 在 HTML 語言中,頁面頭部的 meta 標記可以用來輸出文件的編碼格式,以下是一個標準的 meta 語句 <META http-equiv=』Content-Type』content=’text/html;charset=gbk』>,請使用 PHP 語言寫一個函數,把一個標準 HTML 頁面���的類似 meta 標記中的 charset 部分值改為 big5。
請注意:
(1) 需要處理完整的 html 頁面,即不光此 meta 語句
(2) 忽略大小寫
(3)』和」 在此處是可以互換的
(4)』Content-Type』兩側的引號是可以忽略的,但’text/html;charset=gbk』兩側的不行
(5) 注意處理多餘空格
編寫正則表達式如下:
$reg1="/(<metas*http-equivs*=s*(['"]?)Content-Type()s*contents*=s*(['"])text/html;charset=)(UTF-8)()(s*/?>)/i";31.PHP 中如何判斷一個字符串是否是合法的日期模式:2007-03-13 13:13:13。要求代碼不超過 5 行。
<?php function checkDateTime($data){ if (date('Y-m-d H:i:s',strtotime($data)) == $data) { return true; } else { return false; } } $data = '2015-06-20 13:35:42'; var_dump(checkDateTime($data)); $data = '2015-06-36 13:35:42'; var_dump(checkDateTime($data));?>32.PHP 中,如何獲得一個數組的鍵值?
使用 key () 可以獲得數組中當前元素的鍵名,使用 current () 則可以返回當前元素的值。
使用 array_keys () 則可以得到數組中所有的鍵名。
使用 foreach 結構 foreach ($arr as value) 可以通過 value 分別獲取鍵名和值。
33. 如果模板是用 smarty 模板。怎樣用 section 語句來顯示一個名為 $data 的組。
比如:
$data=array( 0=>array('id'=>8,'name'=>'name1'), 1=>array('id'=>10,'name'=>'name2'), 2=>array('id'=>15,'name'=>'name3'));寫出在模板頁的代碼?若用 foreach 語句又要怎樣顯示呢?
用 section 語句:
<{section name=test loop=$data start=0 step=1}>id:<{$data[test].id}><br/>name:<{$data[test].name}><br/><br/><{sectionelse}> 數組為空<{/section}>用 foreach 語句:
<{foreach from=$data item=test}>id:<{$test.id}><br/>name:<{$test.name}><br/><br/><{foreachelse}>數組為空<{/foreach}>34. 哪個選項會匹配下邊的這個正則表達式?(/.*xyzd/)
A.*****xyz
B.xyz1
C.*xyz2
D.*xyz
答案:C
35. 以下哪個錯誤無法被標準的錯誤控制器獲取?
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:B
36. 以下哪種錯誤類型無法被自定義的錯誤處理器捕捉到?
A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:C
37.(^s)|(s$) 這個正則表達式作用是:__;
匹配以 0 個或多個空白符開頭或者 0 個或多個空白符結尾的字符串
38. 編寫函數取得上一月的最後一天
<?php date_default_timezone_set('PRC'); function get_last_month_last_day($date = ''){ if ($date != '') { $time = strtotime($date); } else { $time = time(); } $day = date('j',$time); return date('Y-m-d',strtotime("-{$day} days",$time)); } echo get_last_month_last_day(); echo "<br />"; echo get_last_month_last_day("2013-3-21");?>39. 在很多時候,我們可以通過 apache 的主配置文件來設置對 test 目錄的訪問權限控制,如 http://IP/test 請問如果需設置 test 下的一個子目錄的訪問控制權限,是否可以在主配置文件中修改,如果不可以應如何解決。
可以,還可以在需要控制的子目錄下創建.htaccess 文件,寫入訪問控制。
40. 如果我的網站用的 utf-8 編碼,為防止亂碼出現,都需要注意哪些地方?
從以下幾個方面考慮:
資料庫中庫和表都用 utf8 編碼
php 連接 mysql,指定資料庫編碼為 utf8 mysql_query (「set names utf8」);
php 文件指定頭部編碼為 utf-8header (「content-type:text/html;charset=utf-8」);
網站下所有文件的編碼為 utf8
html 文件指定編碼為 utf-8
<meta http-equiv="Content-Type"content="text/html;charset=utf-8"/>41. 在 url 中用 get 傳值的時候,若中文出現亂碼,應該用哪個函數對中文進行編碼?
42. 寫出兩種對變量加密的函數?
43. 如何把 2009-9-2 10:30:25 變成 unix 時間戳?
<?php date_default_timezone_set("PRC"); $unix_time = strtotime("2009-9-2 10:30:45"); echo $unix_time; echo "<br />"; echo date("Y-m-d H:i:s",$unix_time);?>44. 如何把一個 GB2312 格式的字符串裝換成 UTF-8 格式?
<?php iconv('GB2312','UTF-8','悄悄是別離的笙簫');?>45. 如果需要原樣輸出用戶輸入的內容,在數據入庫前,要用哪個函數處理?
htmlspecialchars 或者 htmlentities46. 寫出五種以上你使用過的 PHP 的擴展的名稱(提示:常用的 PHP 擴展)
mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO 等47. 了解 MVC 模式嗎?請寫出三種以上目前 PHP 流行的 MVC 框架名稱(不區分大小寫)
mb_sring、iconv、curl、GD、XML、socket、MySQL、PDO 等48.php 中 WEB 上傳文件的原理是什麼,如何限制上傳文件的大小?
上傳文件的表單使用 post 方式,並且要在 form 中添加 enctype=’multipart/form-data』。
一般可以加上隱藏域:,位置在 file 域前面。
value 的值是上傳文件的客戶端字節限制。可以避免用戶在花時間等待上傳大文件之後才發現文件過大上傳失敗的麻煩。
使用 file 文件域來選擇要上傳的文件,當點擊提交按鈕之後,文件會被上傳到伺服器中的臨時目錄,在腳本運行結束時會被銷毀,所以應該在腳本結束之前,將其移動到伺服器上的某個目錄下,可以通過函數 move_uploaded_file() 來移動臨時文件,要獲取臨時文件的信息,使用 $_FILES。
限制上傳文件大小的因素有:
客戶端的隱藏域 MAX_FILE_SIZE 的數值(可以被繞開)。
伺服器端的 upload_max_filesize,post_max_size 和 memory_limit。這幾項不能夠用腳本來設置。
自定義文件大小限制邏輯。即使伺服器的限制是能自己決定,也會有需要個別考慮的情況。所以這個限制方式經常是必要的。
49. 簡述 UBB code 的實現原理。
UBB 代碼是 HTML 的一個變種,通過程序自定義我們的標籤,比如 「[a] PHP 中 UBB 的使用 [/a]」 這樣的標籤,其實質就是查找 [a][/a] 標籤,將其替換成的標準 html,說白了,就是將標準的 html 標記通過技術手段使其簡化,其輸出出來的結果還是標準的 html。
明白了 ubb 的原理,那麼再製作一個簡單的 ubb 編輯器就不難了,和 fck 之類的編輯器比較起來,ubb 代碼最大的優點就是代碼簡單,功能很少,簡單的 ubb 只需要一個文件,而且 ubb 標籤可以自己來定義,更改起來很方便,在 php 中就是利用替換函數就可以將 html 進行標籤化,輸出時進行標籤的轉化。
50. 怎麼把文件保存到指定目錄?怎麼避免上傳文件重名問題?
可以自己設置上傳文件的保存目錄,與文件名拼湊形成一個文件路徑,使用 move_uploaded_file(),就可以完成將文件保存到指定目錄。可以通過上傳的文件名獲取到文件後綴,然後使用時間戳 + 隨機數 + 文件後綴的方式為文件重新命名,這樣就避免了重名。
51._____函數能返回腳本裡的任意行中調用的函數的名稱。該函數同時還經常被用在調試中,用來判斷錯誤是如何發生的。
52. 在 Smarty 模板語法中怎麼能遍歷數組 ids
{section name=temp loop=$ids} {if $ids[temp].id==500} <span style=『color: {esle} {$ids[temp].id} {/if}{/section}53. 在 Smarty 模板語法中如何獲取當前時間,並且使用 Y-m-d Hs 的格式輸出?
使用 {$smarty.now} 來獲取當前時間,得到的是 unix 系統時間戳 使用變量調節器進行格式化,如下:
{$smarty.now|date_format:「%Y-%m-%d%H:%M:%S」}54. 在 Smarty 模板語法中如何獲取 php 的全局環境變量
$smarty.get.變量 $smarty.post.變量 $smarty.cookies.變量 $smarty.server.SERVER_NAME $smarty.env.PATH $smarty.session.變量 $smarty.request.變量55. 在 Smarty 模板中如何用自定義函數
使用模板分隔符包含,傳遞參數則使用 HTML 屬性的方式,例如:{html_image file="pumpkin.jpg"}
56. 列舉出你所知道的 php 系統函數庫例如,數學函數庫
mysql,gd,pdo,XML,zip,filesystem,mail 等57. 假如讓你來寫一個函數實現 Utf-8 轉 gb2312,那麼函數的名稱應該怎麼命名?
utf8_to_gb2312或者utf8togb2312
58. 請描述如下 URL 重寫規則的用意。
<IfModulemod_rewrite.c> RewriteEngineon RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d RewriteBase/ RewriteRule./index.php[L]</IfModule>如果 REQUEST_FILENAME 文件存在,就直接訪問文件,不進行下面的 rewrite 規則, 如果 REQUEST_FILENAME 目錄存在,就直接訪問目錄,不進行下面的 rewrite 規則, RewriteRule./index.php[L] 的意思是把所有的請求都給 index.php 處理。
59.Warning:Cannot modify header information-headers already sent by (output started at D:srcinit.php:7) in D:srcinit.php on line10 通常什麼情況下 php 會報該警告信息?
一般是在 header、set_cookie 以及 session_start 函數前面有輸出(包括空格)的情況下,會報該警告信息.