普通PHP程序員筆試題
標簽: 程序員 PHP 面試 2009-02-06 15:19
1. 用PHP打印出前一天的時間,打印格式是2007年5月10日 22:21:21
2. PHP代碼如下:
$a="hello";
$b=&$a;
unset($b);
$b="world";
echo $a;
其結果是?
3. PHP代碼如下:
$str="cd";
$$str="landog";
$$str.="ok";
echo $cd;
其結果是?
4. 用PHP寫一段代碼,實現不使用第3個變量,交換$a、$b的值,$a、$b的初始值自己定。
5. 根據題目要求,用PHP寫出代碼。
表名User
ID Name Tel Content Date
1 張三 13333663366 大專畢業 2006-10-11
3 張三 13612312331 本科畢業 2006-10-15
5 張四 020-5566556 中專畢業 2006-10-15
4 王五 13521212125 大專畢業 2006-12-25
2 …………
6 …………
假設數據庫連接如下:
$mysql_db=mysql_connect("local","root","pass");
@mysql_select_db("DB",$mysql_db);
(1)查詢出所有Name等於“張三”的記錄,並輸出。
(2)按ID升序查詢,只返回排序後的前3條記錄,並輸出。
6. javascript能否定義二維數組,如果不能你如何解決?
7. 假設a.html和b.html在同一個文件夾下面,用javascript實現當打開a.html五秒鐘後,自動跳轉到b.html。
8. 有兩個文件a.html和a.php,代碼如下:
a.html
<html>
<head>
<meta http-equiv=Content-Type content=text/html;charset=utf-8>
<title>PHP程序員面試</title>
</head>
<body>
<center>
<form method="post" action="a.php">
<table border="1">
<tr>
<td align="right">姓名:</td>
<td align="left"><input type="text" ></td>
</tr>
<tr>
<td align="right">電話:</td>
<td align="left"><input type="text" ></td>
</tr>
<tr>
<td align="right">郵箱:</td>
<td align="left"><input type="text" ></td>
</tr>
<tr>
<td align="right">地址:</td>
<td align="left"><input type="text" ></td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" value="提交">
<input type="reset" value="重填">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
a. php
<?php
$user_name = $_GET['user_name'];
$user_tel = $_GET['user_tel'];
$user_email = $_GET['user_email'];
$user_add = $_GET['user_add'];
echo "用戶名:$user_name<br>電話:$user_tel<br>郵箱:$user_email<br>地址:$user_add<br>";
?>
(1)請畫出a.html在浏覽器的顯示效果圖。
(2)在a.html中輸入:用戶名=張三,電話=020-38259977,郵箱[email protected],地址=廣州升瑞,按提交按鈕後輸出結果是?
9. 你是否使用過版本控制工具,如果有,請簡要說明。
10. 利用CSS樣式表定義已訪問的超鏈接字體大小為14pt,顏色為red。
11. 移動任意一位數或符號,使等式成立, 102 = 101-1。注:是移動不是交換,等號不能分開。
12. 規律題,3、1、4、1、5、9、2、( ), 請按照規律在括號內寫出下一表達式。
13. 規律題,5、8、-3、5、-2、3、-1、( ),請按照規律在括號內寫出下一表達式。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
答案:
1. echo date('Y-m-d H:i:s', strtotime('-1 day'));
2. hello
3. landogok
4. $a = "abcd";
$b = "1234";
echo "初始化時 a=$a,b=$b<br>";
$a = $a . $b;
$b = strlen( $b );
$b = substr( $a, 0, (strlen($a) - $b ) );
$a = substr( $a, strlen($b) );
echo "交換後 a=$a,b=$b<br>";
5. (1)$sql = “select * from User where > $result = mysql_query( $sql );
while( $row = mysql_fetch_array( $result, MYSQL_ASSOC ) ){
echo $row[‘Name’];
}
(2) $sql = “select * from User order by ID asc limit 0,3”;
$result = mysql_query( $sql );
while( $row = mysql_fetch_array( $result, MYSQL_ASSOC ) ){
echo $row[‘Name’];
}
6. javascript不支持二維數組定義,可以用arr[0] = new array()來解決
7. javascript代碼如下:
<script>
function go2b(){
window.location = "b.html";
window.close();
}
setTimeout( "go2b()",5000 ); //5秒鐘後自動執行go2b()
</script>
8.
(1)如下所示:
略。因為懶得插入圖片,如果想看結果可以把代碼保存為html文件,再用浏覽器打開查看。
(2)輸出結果應為:
姓名:
電話:
郵箱:
地址:
因為表單是用post方式提交,但在a.php中卻用get方式來讀取,所以不會讀到任何值。
9. 略
10. a:visited { font-size: 14pt; color: red; }
11. 102 = 101-1
12. 答案為6,因為∏=3.1415926
13. 答案為2,規律為n=(n-2) – |(n-1)| ,n>=3
1.在PHP中,當前腳本的名稱(不包括路徑和查詢字符串)記錄在預定義變量(1)中;而鏈接到當前頁面的的前一頁面URL記錄在預定義變量(2)中 <?php
//本頁地址,SCRIPT_NAME也可以:php/test.php
echo $_SERVER['PHP_SELF']."<br />";
//鏈接到當前頁面的前一頁面的 URL 地址:
echo $_SERVER['HTTP_REFERER']."<br />";
//其它的見參考手冊:語言參考》變量》預定義變量
//前執行腳本的絕對路徑名:D:Inetpubwwwrootphp est.php
echo $_SERVER["SCRIPT_FILENAME"]."<br />";
//正在浏覽當前頁面用戶的 IP 地址:127.0.0.1
echo $_SERVER["REMOTE_ADDR"]."<br />";
//查詢(query)的字符串(URL 中第一個問號 ? 之後的內容):id=1&bi=2
echo $_SERVER["QUERY_STRING"]."<br />";
//當前運行腳本所在的文檔根目錄:d:inetpubwwwroot
echo $_SERVER["DOCUMENT_ROOT"]."<br />";
?>
2.執行程序段<?php echo 8%(-2) ?>將輸出__。
<?php
//參考手冊》語言參考》運算符》算術運算符》%為取模運算,輸出0
echo 8%(-2)."<br />";
//取模 $a % $b 在 $a 為負值時的結果也是負值。輸出-2
echo ((-8)%3)."<br />";
//輸出2
echo (8%(-3))."<br />";
?>
3.在HTTP 1.0中,狀態碼 401 的含義是____;如果返回“找不到文件”的提示,則可用 header 函數,其語句為____。
答:401表示未授權;header("HTTP/1.0 404 Not Found");[見參考手冊》函數參考》HTTP函數》header]
4.數組函數 arsort 的作用是____;語句 error_reporting(2047)的作用是____。
答:arsort:對數組進行逆向排序並保持索引關系 error_reporting(2047)的作用是:report All errors and warnings
5.寫出一個正則表達式,過慮網頁上的所有JS/VBS腳本(即把script標記及其內容都去掉):
<?php
$script="以下內容不顯示:<script language='javascript'>alert('cc');</script>";
echo preg_replace("/<script[^>].*?>.*?</script>/si", "替換內容", $script);
?>
6.以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句____動態裝載PHP模塊,
然後再用語句____使得Apache把所有擴展名為php的文件都作為PHP腳本處理。
答:LoadModule php5_module "c:/php/php5apache2.dll";AddType application/x-httpd-php .php
見參考手冊》目錄》II. 安裝與配置》6. Windows 系統下的安裝》Microsoft Windows 下的 Apache 2.0.x
7.語句 include 和 require 都能把另外一個文件包含到當前文件中,它們的區別是____;為了避免多次包含同一文件,可以用語句____來代替它們。
答:在如何處理失敗時,include() 產生一個警告而 require() 則導致一個致命錯誤;require_once()/include_once()
8.一個函數的參數不能是對變量的引用,除非在php.ini中把____設為on.
答:allow_call_time_pass_reference boolean :是否啟用在函數調用時強制參數被按照引用傳遞, 見參考手冊》附錄G
9.SQL 中LEFT JOIN的含義是__,如果 tbl_user記錄了學生的姓名(name)和學號(ID),
tbl_score記錄了學生(有的學生考試以後被開除了,沒有其記錄)的學號(ID)和考試成績(score)以及考試科目(subject),要想打印出各個學生姓名及對應的的各科總成績,則可以用SQL語句____.
答:自然左外連接
create database phpinterview;
use phpinterview
create table tbl_user
(
ID int not null,
name varchar(50) not null,
primary key (ID)
);
create table tbl_score
(
ID int not null,
score dec(6,2) not null,
subject varchar(20) not null
);
insert into tbl_user (ID, name) values (1, 'beimu');
insert into tbl_user (ID, name) values (2, 'aihui');
insert into tbl_score (ID, score, subject) values (1, 90, '語文');
insert into tbl_score (ID, score, subject) values (1, 80, '數學');
insert into tbl_score (ID, score, subject) values (2, 86, '數學');
insert into tbl_score (ID, score, subject) values (2, 96, '語文');
select A.id,sum(B.score) as sumscore
from tbl_user A left join tbl_score B
on A.ID=B.ID
group by A.id
10. 在PHP中,heredoc是一種特殊的字符串,它的結束標志必須____
答:結束標識符所在的行不能包含任何其它字符除";"
11.寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。
<?php
function my_scandir($dir)
{
$files=array();
if(is_dir($dir))
{
if($handle=opendir($dir))
{
while(($file=readdir($handle))!==false)
{
if($file!="." && $file!="..")
{
if(is_dir($dir."/".$file))
{
$files[$file]=my_scandir($dir."/".$file);
}
else
{
$files[]=$dir."/".$file;
}
}
}
closedir($handle);
return $files;
}
}
}
print_r(my_scandir("D:Program FilesInternet ExplorerMUI"));
?>
1.以下哪一句不會把 John 新增到 users 陣列?
$users[] = 'john';
成功把 John 新增到陣列 users。
array_add($users,’john’);
函式 array_add() 無定義。
array_push($users,‘john’);
成功把 John 新增到陣列 users。
$users ||= 'john';
語法錯誤。
2.sort()、assort()、和 ksort() 有什麼分別?它們分別在什麼情況下使用?
sort()
根據陣列中元素的值,以英文字母順序排序,索引鍵會由 0 到 n-1 重新編號。主要是當陣列索引鍵的值無關疼癢時用來把陣列排序。
assort()
PHP 沒有 assort() 函式,所以可能是 asort() 的筆誤。
asort()
與 sort() 一樣把陣列的元素按英文字母順序來排列,不同的是所有索引鍵都獲得保留,特別適合替聯想陣列排序。
ksort()
根據陣列中索引鍵的值,以英文字母順序排序,特別適合用於希望把索引鍵排序的聯想陣列。
3.以下的代碼會產生什麼?為什麼?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由於函式 multiply() 沒有指定 $num 為全域變量(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。
4. reference 跟一個正規的變量有什麼分別?如何 pass by reference?在什麼情況下我們需要這樣做?
Reference 傳送的是變量的地址而非它的值,所以在函式中改變一個變量的值時,整個應用都見到這個變量的新值。
一個正規變量傳送給函式的是它的值,當函式改變這個變量的值時,只有這個函式才見到新值,應用的其他部分仍然見到舊值。
$myVariable = "its' value";
Myfunction(&$myVariable); // 以 reference 傳送參數以 reference 傳送參數給函式,可以使函式改變了的變量,即使在函式結束後仍然保留新值。
5.些函式可以用來在現正執行的腳本中插入函式庫?
對這道題目不同的理解會有不同的答案,我的第一個想法是插入 PHP 函式庫不外乎 include()、include_once()、require()、require_once(),但細心再想,“函式庫”也應該包括 com 物件和 .net 函式庫,所以我們的答案也要分別包括 com_load 和 dotnet_load,下次有人提起“函式庫”的時候,別忘記這兩個函式。
6.foo() 與 @foo() 有什麼分別?
foo() 會執行這個函式,任何解譯錯誤、語法錯誤、執行錯誤都會在頁面上顯示出來。
@foo() 在執行這個函式時,會隱藏所有上述的錯誤訊息。
很多應用程式都使用 @mysql_connect() 和 @mysql_query 來隱藏 mysql 的錯誤訊息,我認為這是很嚴重的失誤,因為錯誤不該被隱藏,你必須妥善處理它們,可能的話解決它們。
7.你如何替 PHP 的應用程式偵錯?
我並不常這樣做,我曾經試過很多不同的偵錯工具,在 Linux 系統中設定這些工具一點也不容易。不過以下我會介紹一個近來頗受注目的偵錯工具。
PHP - Advanced PHP Debugger 或稱 PHP - APD,第一步是執行以下的指令安裝:
pear install apd安裝後在你的腳本的開頭位置加入以下的語句開始進行偵錯:
apd_set_pprof_trace();執行完畢,打開以下檔案來查閱執行日志:
apd.dumpdir
你也可以使用 pprofp 來格式化日志。
詳細的資料可以參閱 http://us.php.net/manual/en/ref.apd.php。
8.“===”是什麼?試舉一個“==”是真但“===”是假的例子。
“===”是給既可以送回布爾值“假”,也可以送回一個不是布爾值但卻可以賦與“假”值的函式,strpos() 和 strrpos() 便是其中兩個例子。
問題的第二部份有點困難,想一個“==”是假,但是“===”是真的例子卻很容易,相反的例子卻很少。但我終於找到以下的例子:
if (strpos("abc", "a") == true){ // 這部分永不會被執行,因為 "a" 的位置是 0,換算成布爾值“假”}if (strpos("abc", "a") === true){ // 這部份會被執行,因為“===”保證函式 strpos() 的送回值不會換算成布爾值.}
9.你會如何定義一個沒有成員函式或特性的類別 myclass?
class myclass{}
10.你如何產生一個 myclass 的物件?
$obj = new myclass();
11.在一個類別內如何存取這個類別的特性及變改它的值?
使用語句:$this->propertyName,例如:
class myclass{ private $propertyName; public function __construct() { $this->propertyName = "value"; }}
12.include 和 include_once 有什麼分別?require 又如何?
三者都是用來在腳本中插入其他檔案,視乎 url_allow_fopen 是否核准,這個檔案可以從系統內部或外部取得。但他們之間也有微細的分別:
include():這個函式容許你在腳本中把同一個檔案插入多次,若果檔案不存在,它會發出系統警告並繼續執行腳本。
include_once():它跟 include() 的功能相似,正如它的名字所示,在腳本的執行期間,有關檔案只會被插入一次。
require():跟 include() 差不多,它也是用來在腳本中插入其他檔案,但若果檔案不存在,它會發出系統警告,這個警告會引致致命錯誤令腳本中止執行
13.以下哪一個函式可以把浏覽器轉向到另一個頁面?
redir()
這不是一個 PHP 函式,會引致執行錯誤。
header()
這個是正確答案,header() 用來插入卷頭資料,可以用來使浏覽器轉向到另一個頁面,例如:
header("Location: http://www.search-this.com/");
location()
這不是一個 PHP 函式,會引致執行錯誤。
redirect()
這不是一個 PHP 函式,會引致執行錯誤。
14.以下哪一個函式可以用來開啟檔案以便讀/寫?
fget()
這不是一個 PHP 函式,會引致執行錯誤。
file_open()
這不是一個 PHP 函式,會引致執行錯誤。
fopen()
這是正確答案,fopen() 可以用來開啟檔案以便讀/寫,事實上這個函式還有很多選項,詳細資料請參閱 php.net。
open_file()
這不是一個 PHP 函式,會引致執行錯誤。
15.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() 的值。
16.下面的代碼用來做什麼?請解釋。
$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","[url=file://2///1///3%22,$date]\2/\1/\3",$date[/url]);
這是把一個日期從 MM/DD/YYYY 的格式轉為 DD/MM/YYYY 格式。我的一個好朋友告訴我可以把這個正規表達式拆解為以下的語句,對於如此簡單的表示是來說其實無須拆解,純粹為了解說的方便:
// 對應一個或更多 0-9,後面緊隨一個斜號$regExpression = "([0-9]+)/";// 應一個或更多 0-9,後面緊隨另一個斜號$regExpression .= "([0-9]+)/";// 再次對應一個或更多 0-9$regExpression .= "([0-9]+)";至於 [url=file://2///1///3]\2/\1/\3[/url] 則是用來對應括號,第一個括號對的是月份,第二個括號對應的是日期,第三個括號對應的是年份。
17.給你一行文字 $string,你會如何編寫一個正規表達式,把 $string 內的 HTML 標簽除去?
首先,PHP 有內建函式 strip_tags() 除去 HTML 標簽,為何要自行編寫正規表達式?好了,便當作是面試的一道考題吧,我會這樣回答:
$stringOfText = "<p>This is a test</p>";$expression = "/<(.*?)>(.*?)</(.*?)>/";echo preg_replace($expression, "[url=file://2/]\2[/url]", $stringOfText);// 有人說也可以使用 /(<[^>]*>)/ $expression = "/(<[^>]*>)/";echo preg_replace($expression, "", $stringOfText);
18.PHP 和 Perl 分辨陣列和散列表的方法有什麼差異?
這正是為何我老是告訴別人選擇適當的編程語言,若果你只用一種語言的話你怎麼能回答這道問題?這道問題很簡單,Perl 所有陣列變量都是以 @ 開頭,例如 @myArray,PHP 則沿用 $ 作為所有變量的開頭,例如 $myArray。
至於 Perl 表示散列表則用 %,例如 %myHash,PHP 則沒有分別,仍是使用 $,例如 $myHash。
19.你如何利用 PHP 解決 HTTP 的無狀態本質?
最主要的倆各選擇是 session 和 cookie。使用 session 的方法是在每一頁的開始加上 session_start(),然後利用 $_SESSION 散列表來儲存 session 變量。至於 cookie 你只需記著一個原則:在輸出任何文字之前調用 set_cookie() 函式,此外只需使用 $_COOKIE 散列表便可以存取所有 cookie 變量。
還有一個不那麼可靠的方法,就是利用訪客的 IP 地址,這個方法有特定的危險性。
20.GD 函式庫用來做什麼?
這個可能是我最喜歡的函式庫,自從 PHP 4.3.0 版本後 GD 便內建在 PHP 系統中。這個函式庫讓你處理和顯示各式格式的圖檔,它的另一個常見用途是制作所圖檔。GD 以外的另一個選擇是 ImageMagick,但這個函式庫並不內建於 PHP 之中,必須由系統管理員安裝在伺服器上。
21.試寫出幾個輸出一段 HTML 代碼的方法。
嗯,你可以使用 PHP 中任何一種輸出語句,包括 echo、print、printf,大部分人都使用如下例的 echo:
echo "My string $variable";你也可以使用這種方法:
echo <<<ENDThis text is written to the screen as output and this $variable is parsed too. If you wanted you can have <span> HTML tags in here as well.</span> The END; remarks must be on a line of its own, and can't contain any extra white space.END;
22.PHP 比 Perl 好嗎?請討論。
我們不要為一個簡單的問題引發一場舌戰,正如我經常說的:“為工作選擇適合的語言,不要把工作遷就語言。”我個人認為 Perl 十分適合用作命令行工具,雖然它在網頁應用上也有不錯的表現,但是它的真正實力在命令行上才能充分發揮。同樣地,PHP 雖然可以在控制台的環境中使用,但是個人認為它在網頁應用上有更好的表現,PHP 有大量專門為網頁應用而設計的函式,Perl 則似乎以命令行為設計之本。
個人來說兩種語言我都喜歡,在大學期間我經常使用 Perl、PHP 和 Java,可惜工作上我使用 C#,但在家裡我花不少時間操練 PHP、Perl、Ruby(現正學習)和 Java,保持我的技能知識在最新狀態。很多人問我 C 和 C++ 怎麼樣,它們是否仍有機會在我的應用中占一席位,我的答案基本上是“否”,我近來的工作主要集中在網頁開發,雖然 C 和 C++ 也可以用來寫網頁,但它們到底不是為這種工作而設計的,“為工作選擇適合的語言”,若果我需要編寫一個控制台應用,用來展示 bubble sort、quick sort 和 merge sort 的效能比較,我一定會使用 C / C++。若果我需要編寫一個相片簿系統,我會使用 PHP 或者 C#(我認為制作用戶介面方面 .NET 語言比網頁更加)。
PHP經典面試題(連載4)
1 請說明 PHP 中傳值與傳引用的區別。什麼時候傳值什麼時候傳引用?
答: 傳值只是把某一個變量的值傳給了另一個變量,而引用則說明兩者指向了同一個地方。
2 在PHP中error_reporting這個函數有什麼作用?
答: The error_reporting() function sets the error_reporting directive at runtime. PHP has many levels of errors, using this function sets that level for the duration (runtime) of your script.
3 請用正則表達式(Regular Expression)寫一個函數驗證電子郵件的格式是否正確。
答:
<?php
if(isset($_POST['action']) &&
$_POST['action']=='submitted')
{
$email=$_POST['email'];
if(!preg_match("/^(?:w+.?)*w+@(?:w+.?)*w+$/",$email))
{
echo
"電子郵件檢測失敗";
}
else
{
echo
"電子郵件檢測成功";
}
}
else
{
?>
<html>
<head><title>EMAIL檢測</title>
<script type="text/javascript">
function checkEmail(sText)
{
var reg=/^(?:w+.?)*w+@(?:w+.?)*w+$/;
var email=document.getElementById(sText).value;
if(!reg.test(email))
{
alert("電子郵件檢測失敗");
}
else
{
alert("電子郵件格式正確");
}
}
</script>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
電子郵件:<input type="text" id="email" name="email"
/><br />
<input type="hidden" name="action" value="submitted"
/>
<input type="button" name="button" value="客戶端檢測" onclick="checkEmail('email')"
/>
<input type="submit" name="submit" value="服務器端檢測"
/>
</form>
</body>
</html>
<?php
}
?>
4 簡述如何得到當前執行腳本路徑,包括所得到參數。
<?php
echo
"http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
//echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
5 有一個一維數組,裡面存儲整形數據,請寫一個函數,將他們按從大到小的順序排列。要求執行效率高。並說明如何改善執行效率。(該函數必須自己實現,不能使用php函數)
<?php
function BubbleSort(&$arr)
{
$cnt=count($arr);
$flag=1;
for($i=0;$i<$cnt;$i++)
{
if($flag==0)
{
return;
}
$flag=0;
for($j=0;$j<$cnt-$i-1;$j++)
{
if($arr[$j]>$arr[$j+1])
{
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);
?>
6 請舉例說明在你的開發過程中用什麼方法來加快頁面的加載速度
答:要用到服務器資源時才打開,及時關閉服務器資源,數據庫添加索引,頁面可生成靜態,圖片等大文件單獨服務器。使用代碼優化工具啦