一份超级全面的PHP面试题
1,用PHP打印出前一天的時間,格式是2006-5-10 22:21:21
echo date("Y:m:d H:i:s",strtotime("-1 day"));
?>
2,echo(),print(),print_r()的區(qū)別
echo是語言結(jié)構(gòu),無返回值;print功能和echo基本相同,不同的是print是函數(shù),有返回值;print_r是遞歸打印,用于輸出數(shù)組對象
3,能夠使HTML和PHP分離開使用的模板
smarty, PHPLib, FastTemplate, Savant,MiniTemplator,TagTemplate
4,如何實現(xiàn)PHP、JSP交互
$foo = new Java(’java.lang.System’);
5,使用哪些工具進(jìn)行版本控制
CVS或SVN
CVS Server on Apache作服務(wù)端,WinCVS作客戶端
Subversion on Apache/DAV 做服務(wù)端,TortoiseSVN做客戶端
6,如何實現(xiàn)字符串翻轉(zhuǎn)
$str=strrev("Wilson Peng");
echo $str;
?>
7,優(yōu)化MYSQL數(shù)據(jù)庫的方法
(1)選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設(shè)置NOT NULL,例如’省份,性別’,最好設(shè)置為ENUM
(2)使用連接(JOIN)來代替子查詢:
(3)使用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表
(4)事務(wù)處理:
保證數(shù)據(jù)完整性,例如添加和修改同時,兩者成立則都執(zhí)行,一者失敗都失敗
mysql_query(”BEGIN”);
mysql_query(”INSERT INTO customerinfo (name) VALUES (’$name1′)”;
mysql_query(”SELECT * FROM `orderinfo` where customerid=”.$id”);
mysql_query(”COMMIT”);
(5)鎖定表,優(yōu)化事務(wù)處理:
我們用一個 SELECT 語句取出初始數(shù)據(jù),通過一些計算,用 UPDATE 語句將新值更新到表中。包含有 WRITE 關(guān)鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執(zhí)行之前,不會有其它的訪問來對 inventory 進(jìn)行插入、更新或者刪除的操作
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”);
(6)使用外鍵,優(yōu)化鎖定表
(7)建立索引:
(8)優(yōu)化查詢語句
最好在相同字段進(jìn)行比較操作,在建立好的索引字段上盡量減少函數(shù)操作
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>=”good” and name<"good";
8,實現(xiàn)中文字串截取無亂碼的方法
$str = '我是一串比較長的中';
echo "mb_substr:" . mb_substr($str, 0, 6, 'utf-8');
echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8');
?>
mb_substr:我是一串比較
mb_strcut:我是
mb_substr是按字來切分字符,而mb_strcut是按字節(jié)來切分字符,但是都不會產(chǎn)生半個字符的現(xiàn)象
9,用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼
echo $_SERVER[‘REMOTE_ADDR’];
getenv('REMOTE_ADDR');
//客戶端IP
$ip=gethostbyname ("www.murray.cn");
//服務(wù)器IP
echo $ip;
?>
10,在PHP中,當(dāng)前腳本的名稱(不包括路徑和查詢字符串)記錄在預(yù)定義變量中;而鏈接到當(dāng)前頁面的URL記錄在預(yù)定義變量中
echo $_SERVER['PHP_SELF'];
echo $_SERVER["HTTP_REFERER"];
11,
$null = NULL;
$bool = FALSE;
$notSet;
$array = array();
//以下是問題
$a = "hello";
$b = &$a;
unset($b);
//答案為:hello
echo $a;
$b = "world";
//答案為:hello
echo $a;
//以下是問題
$a = 1;
$x = &$a;
$b = $a++;
//答案為:1
echo $b;
//以下是問題
$x = empty($array);
//答案為:1
echo $x;
//答案為:true
echo $x?"true":"false";
?>
12,表單中 get與post提交方法的區(qū)別
get是發(fā)送請求HTTP協(xié)議通過url參數(shù)傳遞進(jìn)行接收,而post是實體數(shù)據(jù),可以通過表單提交大量信息
13,session與cookie的區(qū)別
session:儲存用戶訪問的全局唯一變量,存儲在服務(wù)器上的php指定的目錄中的(session_dir)的位置進(jìn)行的存放
cookie:用來存儲連續(xù)訪問一個頁面時所使用,是存儲在客戶端,對于Cookie來說是存儲在用戶WIN的Temp目錄中的。
兩者都可通過時間來設(shè)置時間長短
14,數(shù)據(jù)庫中的事務(wù)是什么
事務(wù)(transaction)是作為一個單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個操作失敗,事務(wù)也不成功。如果所有操作完成,事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。如果一個操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消
15,MYSQL取得當(dāng)前時間的函數(shù)是 now()
格式化日期的函數(shù)是 date()
16,語句include和require的區(qū)別是什么
require->require是無條件包含也就是如果一個流程里加入require,無論條件成立與否都會先執(zhí)行require
include->include有返回值,而require沒有(可能因為如此require的速度比include快)
17,如何修改SESSION的生存時間
將php.ini中的session.gc_maxlifetime設(shè)置為9999重啟apache
或:$savePath = “./session_save_dir/”;
$lifeTime = 小時 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
18,有一個網(wǎng)頁地址,比如http://www.murray.cn/,如何得到它的內(nèi)容
$readcontents = fopen(”http://www.murray.cn/”, “rb”);
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
或
echo file_get_contents(”http://www.murray.cn/”);
19,在HTTP 1.0中,狀態(tài)碼401的含義是 未被授權(quán)
如果返回“找不到文件”的提示,則可用 header 函數(shù),其語句為 header(”Location:www.murray.cn”);
20,在PHP中,heredoc是一種特殊的字符串,它的結(jié)束標(biāo)志必須
heredoc的語法是用”<<<"加上自己定義成對的標(biāo)簽,在標(biāo)簽范圍內(nèi)的文字視為一個字符串
例子:
$str = << my name is Jiang Qihui!
murray;
21,請說明php中傳值與傳引用的區(qū)別。什么時候傳值什么時候傳引用?
按值傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部都會被忽略
按引用傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部也能反映出這些修改
優(yōu)缺點:按值傳遞時,php必須復(fù)制值。特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作。
按引用傳遞則不需要復(fù)制值,對于性能提高很有好處。
22,在PHP中error_reporting這個函數(shù)有什么作用
設(shè)置錯誤級別與錯誤信息回報
23,請寫一個函數(shù)驗證電子郵件的格式是否正確
$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);
24,如何得到當(dāng)前執(zhí)行腳本路徑,包括所得到參數(shù)
$script_name = basename(__file__);
print_r($script_name);
25,JS表單彈出對話框函數(shù)是
alert(),prompt(),confirm();
獲得輸入焦點函數(shù)是focus();
26,如何聲明一個名為”myclass”的沒有方法和屬性的類
class myclass{ }
如何實例化一個名為”myclass”的對象
new myclass()
如何訪問和設(shè)置一個類的屬性
$object = new myclass();
$newstr = $object->test;
$object->test = “info”;
27,可以打開一個文件,以對文件進(jìn)行讀和寫操作: fopen()
28,$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
//輸出:10
29,寫一個函數(shù),盡可能高效的,從一個標(biāo)準(zhǔn) url 里取出文件的擴(kuò)展名
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(”.”,$file);
return $ext[1];
}
30,PHP5權(quán)限控制修飾符
public(公共),private(私用),protected(繼承)
===================================================
1 請說明 PHP 中傳值與傳引用的區(qū)別。什么時候傳值什么時候傳引用?
答: 傳值只是把某一個變量的值傳給了另一個變量,而引用則說明兩者指向了同一個地方。
2 在PHP中error_reporting這個函數(shù)有什么作用?
答: 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 請用正則表達(dá)式(Regular Expression)寫一個函數(shù)驗證電子郵件的格式是否正確。
答:
<?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=”客戶端檢測” οnclick=”checkEmail(‘email’)”
/>
<input type=”submit” name=”submit” value=”服務(wù)器端檢測”
/>
</form>
</body>
</html>
<?php
}
?>
4 簡述如何得到當(dāng)前執(zhí)行腳本路徑,包括所得到參數(shù)。
<?php
echo
“http://”.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'].”?”.$_SERVER['QUERY_STRING'];
//echo “http://”.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
5 有一個一維數(shù)組,里面存儲整形數(shù)據(jù),請寫一個函數(shù),將他們按從大到小的順序排列。要求執(zhí)行效率高。并說明如何改善執(zhí)行效率。(該函數(shù)必須自己實現(xiàn),不能使用php函數(shù))
<?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 請舉例說明在你的開發(fā)過程中用什么方法來加快頁面的加載速度
答:要用到服務(wù)器資源時才打開,及時關(guān)閉服務(wù)器資源,數(shù)據(jù)庫添加索引,頁面可生成靜態(tài),圖片等大文件單獨服務(wù)器。使用代碼優(yōu)化工具啦
=============================================
1. 寫出如下程序的輸出結(jié)果
<?
$str1 = null;
$str2 = false;
echo $str1==$str2 ? ‘相等’ : ‘不相等’;
//相等
$str3 = ”;
$str4 = 0;
echo $str3==$str4 ? ‘相等’ : ‘不相等’;
//相等
$str5 = 0;
$str6 = ’0′;
echo $str5===$str6 ? ‘相等’ : ‘不相等’;
//不相等
?>
2. 寫出如下程序的輸出結(jié)果
<?
$a1 = null;
$a2 = false;
$a3 = 0;
$a4 = ”;
$a5 = ’0′;
$a6 = ‘null’;
$a7 = array();
$a8 = array(array());
echo empty($a1) ? ‘true’ : ‘false’;//true
echo empty($a2) ? ‘true’ : ‘false’;//true
echo empty($a3) ? ‘true’ : ‘false’;//true
echo empty($a4) ? ‘true’ : ‘false’;//true
echo empty($a5) ? ‘true’ : ‘false’;//true
echo empty($a6) ? ‘true’ : ‘false’;//false
echo empty($a7) ? ‘true’ : ‘false’;//true
echo empty($a8) ? ‘true’ : ‘false’;//false
?>
3. 寫出如下程序的輸出結(jié)果
<?
$test = ‘a(chǎn)aaaaa’;
$abc = & $test;
unset($test);
echo $abc;//’aaaaaa’
?>
4. 寫出如下程序的輸出結(jié)果
<?$count = 5;
function get_count(){
static $count = 0;
return $count++;
}
echo $count;? //5
++$count;
echo get_count();//0
echo get_count();//1
?>
5. 寫出如下程序的輸出結(jié)果
<?
$GLOBALS['var1'] = 5;
$var2 = 1;
function get_value(){
global $var2;
$var1 = 0;
return $var2++;
}
get_value();
echo $var1;?? //0
echo $var2;?? //2
?>
6. 寫出如下程序的輸出結(jié)果
<?
function get_arr($arr){
unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);
get_arr(&$arr1);
get_arr($arr2);
echo count($arr1);//1
echo count($arr2);//2
?>
=================================================
1. 用PHP打印出前一天的時間,打印格式是2007年5月10日 22:21:21
2. PHP代碼如下:
$a=”hello”;
$b=&$a;
unset($b);
$b=”world”;
echo $a;
其結(jié)果是?
3. PHP代碼如下:
$str=”cd”;
$$str=”landog”;
$$str.=”ok”;
echo $cd;
其結(jié)果是?
4. 用PHP寫一段代碼,實現(xiàn)不使用第3個變量,交換$a、$b的值,$a、$b的初始值自己定。
5. 根據(jù)題目要求,用PHP寫出代碼。
表名User
ID? Name?? Tel???????? Content?? Date
1?? 張三 13333663366? 大專畢業(yè)? 2006-10-11
3?? 張三 13612312331? 本科畢業(yè)? 2006-10-15
5?? 張四 020-5566556? 中專畢業(yè)? 2006-10-15
4?? 王五 13521212125? 大專畢業(yè)?? 2006-12-25
2?? …………
6?? …………
假設(shè)數(shù)據(jù)庫連接如下:
$mysql_db=mysql_connect(“l(fā)ocal”,”root”,”pass”);
@mysql_select_db(“DB”,$mysql_db);
(1)查詢出所有Name等于“張三”的記錄,并輸出。
(2)按ID升序查詢,只返回排序后的前3條記錄,并輸出。
6. javascript能否定義二維數(shù)組,如果不能你如何解決?
7. 假設(shè)a.html和b.html在同一個文件夾下面,用javascript實現(xiàn)當(dāng)打開a.html五秒鐘后,自動跳轉(zhuǎn)到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,郵箱=sunrising@srtek.cn,地址=廣州升瑞,按提交按鈕后輸出結(jié)果是?
9. 你是否使用過版本控制工具,如果有,請簡要說明。
10. 利用CSS樣式表定義已訪問的超鏈接字體大小為14pt,顏色為red。
11. 移動任意一位數(shù)或符號,使等式成立, 102 = 101-1。注:是移動不是交換,等號不能分開。
12. 規(guī)律題,3、1、4、1、5、9、2、(? ), 請按照規(guī)律在括號內(nèi)寫出下一表達(dá)式。
13. 規(guī)律題,5、8、-3、5、-2、3、-1、(? ),請按照規(guī)律在括號內(nèi)寫出下一表達(dá)式。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
答案:
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不支持二維數(shù)組定義,可以用arr[0] = new array()來解決
7. javascript代碼如下:
<script>
function go2b(){
window.location = “b.html”;
window.close();
}
setTimeout( “go2b()”,5000 ); //5秒鐘后自動執(zhí)行g(shù)o2b()
</script>
8.
(1)如下所示:
略。因為懶得插入圖片,如果想看結(jié)果可以把代碼保存為html文件,再用瀏覽器打開查看。
(2)輸出結(jié)果應(yīng)為:
姓名:
電話:
郵箱:
地址:
因為表單是用post方式提交,但在a.php中卻用get方式來讀取,所以不會讀到任何值。
9. 略
10.?? a:visited { font-size: 14pt; color: red; }
11.? 102 = 101-1
12. 答案為6,因為∏=3.1415926
13. 答案為2,規(guī)律為n=(n-2) – |(n-1)| ,n>=3
================================================================
1、使用單引號括起來的字符串
當(dāng)使用雙引號來括字符串時,PHP解釋器會對其進(jìn)行變量替換、轉(zhuǎn)義等操作,如 “\n”。如果只想輸出一個基本的字符串,用單引號會節(jié)省一些資源。當(dāng)然,如果需要進(jìn)行變量替換的,那就必須用雙引號了。
2、字符串的輸出
以下哪一條語句的運(yùn)行速度最快?
print “Hi my name is $a. I am $b”$$
echo “Hi my name is $a. I am $b”$$
echo “Hi my name is “.$a.”. I am “.$b;
echo “Hi my name is “,$a,”. I am “,$b;
echo ‘Hi my name is ‘,$a,’. I am ‘,$b;
最后一條的運(yùn)行速度是最快的。 print比echo要慢,在字符串中進(jìn)行變量替換時會慢,而連接字符串要比用逗號連接來得慢,最后一句則是第一個習(xí)慣的體現(xiàn)。所以,不在字符串中進(jìn)行變 量替換不僅會加快程序運(yùn)行速度,也會讓你的代碼在任何語法高亮顯示的編輯器中顯得更為易懂(變量會被高亮顯示出來)。很少人知道echo的參數(shù)可以用逗號 連接,且速度會比字符串連接要來得快。最后再用上第一個習(xí)慣,那這條語句就非常好了。
3、在數(shù)組索引中使用單引號
正 如你在上面的測試題中所看到的,$x[sales]從嚴(yán)格意義上來說是錯誤的,索引應(yīng)該被括起來,即$x['sales']。這是因為PHP會將 沒有括起來的索引辨認(rèn)為“裸”字符串,并把它解釋為一個常量。當(dāng)找不到該常量的定義時,才將其解釋為一個字符串,所以這條語句才是可運(yùn)行的。把索引括起來 可以省去這部分工作,如果將來正好要用這一字符串定義常量時也就不會有錯誤了。
4、不使用開始標(biāo)志的縮寫形式
你正在使用 這樣的符號嗎?“<?”是非常糟糕的符號,它會引起與XML解釋器的沖突。而且一旦你發(fā)布了這些代碼,那么使用者就必須修改php.ini文件來打 開對此符號的支持。所以實在沒有理由去使用這種形式。用“<?php“吧。
5、盡量不要使用正則表達(dá)式
在進(jìn)行 常規(guī)的字符串操作時,盡可能不要去使用正則表達(dá)式(preg和ereg系列函數(shù))。str_replace函數(shù)要比preg_replace快得多,甚至 strtr函數(shù)也要比str_replace來得快。省去這些不必要的麻煩吧,你的老板會感謝你的。
6、不要在循環(huán)聲明中使用函數(shù)
這個問題不單單出現(xiàn)在PHP中,你可以在其他語言的代碼中經(jīng)常看到:
差:for($i=0;$i< count($array);$i++){…}
好:$count=count($array);for($i=0;$i& lt;$count;$i++){…}
如果在循環(huán)聲明中使用了 count函數(shù),那每次循環(huán)都會調(diào)用一次。如果循環(huán)次數(shù)很多,會浪費(fèi)非常多的時間。
7、不要使用 register_globals和magic quotes
老版本的PHP在安裝時會默認(rèn)打開這兩個功能,這會引起安全漏洞、編程錯誤及其他的問題,如只有用戶輸入了數(shù)據(jù)時才會創(chuàng)建變量等。如今這兩個功 能都被舍棄了,每個程序員都應(yīng)該避免使用。
8、一定要對變量進(jìn)行初始化(這 里的“初始化”指的是“聲明”)
當(dāng)需要沒有初始化的變量,PHP解釋器會自動創(chuàng)建一個變量,但依靠這個特性來編程并不是一 個好主意。這會造成程序的粗糙,或者使代碼變得另人迷惑,因為你需要探尋這個變量是從哪里開始被創(chuàng)建的。另外,對一個沒有初始化的變量進(jìn)行遞增操作要比初 始化過的來得慢。所以對變量進(jìn)行初始化會是個不錯的主意。
9、對代碼進(jìn)行注釋
這個問題已經(jīng)提過很多次了,但再多次也 不夠。我知道有些地方是不聘用不對代碼進(jìn)行注釋的程序員的。我在前一次工作面試后和副總、面試官一起瀏覽我寫的代碼,當(dāng)他們對我所做的代碼注釋印象深刻, 還了解了一下我的這一習(xí)慣。一天之后,我得到了這個工作。
我知道有些自稱為PHP大師的人聲稱自己的代碼寫得很好,不需要添加什么注 釋。在我看來,這些人都是垃圾。學(xué)一寫注釋的規(guī)范和技巧,熟悉一下phpDocumentor或Doxygen之類的注釋輔助軟件,都是值得的。
10、 遵循一個編程規(guī)范
關(guān)于這一點,是你需要在面試中詢問你潛在的老板的,問問他們正在使用什么編程規(guī)范。PEAR?Zend?內(nèi)部規(guī)范? 要提及你正在使用的編程規(guī)范,不管是你自己創(chuàng)建的,還是目前普遍流行的一種。對于PHP這種松松垮垮的語言來說,如果沒有一個好的編程規(guī)范,那么那些代碼 就會看起來想一堆垃圾。發(fā)臭的,令人作嘔的垃圾。一些基本的規(guī)范包括空格規(guī)范、打括號匹配、命名風(fēng)格等。這對任何一個追求高質(zhì)量的代碼的人來說都是必須 的。
有人說:“我討厭你的4個空格的縮進(jìn)。”我要說,什么?用4個空格來縮進(jìn)?這比用制表符過占用3個字符的空間。更重要的是,只要 是使用比記事本高級的編輯器,你可以自定義制表符的縮進(jìn)值。所以每個程序員都可以以其最習(xí)慣的方式來看代碼。可以時設(shè)置為4,也可以設(shè)置為0(如果你是個 受虐狂)。反正我不在乎,但你就是不能用空格來縮進(jìn)!
=========================================================
填空題:
1.在PHP中,當(dāng)前腳本的名稱(不包括路徑和查詢字符串)記錄在預(yù)定義變量__$_SERVER['PHP_SELF']__中;而鏈接到當(dāng)前頁面的URL記錄在預(yù)定義變量__$_SERVER['HTTP_REFERER']__
中
2.執(zhí)行程序段<?php echo 8%(-2) ?>將輸出__0__。
3.在HTTP 1.0中,狀態(tài)碼 401 的含義是____;如果返回“找不到文件”的提示,則可用 header 函數(shù),其語句為____。
4.數(shù)組函數(shù) arsort 的作用是__對數(shù)組進(jìn)行逆向排序并保持索引關(guān)系__;語句 error_reporting(2047)的作用是__報告所有錯誤和警告__。
5.PEAR中的數(shù)據(jù)庫連接字符串格式是____。
6.寫出一個正則表達(dá)式,過慮網(wǎng)頁上的所有JS/VBS腳本(即把scrīpt標(biāo)記及其內(nèi)容都去掉):preg_replace(“/<script[^>].*?>.*?</script>/si”, “newinfo”, $script);
7.以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句____動態(tài)裝載PHP模塊,然后再用語句____使得Apache把所有擴(kuò)展名為php的文件都作為PHP腳本處理。
LoadModule php5_module “c:/php/php5apache2.dll” , AddType application/x-httpd-php .php,
8.語句 include 和 require 都能把另外一個文件包含到當(dāng)前文件中,它們的區(qū)別是____;為了避免多次包含同一文件,可以用語句__require_once||include_once__來代替它們。
9.類的屬性可以序列化后保存到 session 中,從而以后可以恢復(fù)整個類,這要用到的函數(shù)是____。
10.一個函數(shù)的參數(shù)不能是對變量的引用,除非在php.ini中把__allow_call_time_pass_reference boolean__設(shè)為on.
11.SQL中LEFT JOIN的含義是__自然左外鏈接__。如果 tbl_user記錄了學(xué)生的姓名(name)和學(xué)號(ID),tbl_score記錄了學(xué)生(有的學(xué)生考試以后被開除了,沒有其記錄)的學(xué)號(ID)
和考試成績(score)以及考試科目(subject),要想打印出各個學(xué)生姓名及對應(yīng)的的各科總成績,則可以用SQL語句____。
12.在PHP中,heredoc是一種特殊的字符串,它的結(jié)束標(biāo)志必須____。
編程題:
13.寫一個函數(shù),能夠遍歷一個文件夾下的所有文件和子文件夾。
答:
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;
}
}
14.簡述論壇中無限分類的實現(xiàn)原理。
答:
<?php
/*
數(shù)據(jù)表結(jié)構(gòu)如下:
CREATE TABLE `category` (
`categoryID` smallint(5) unsigned NOT NULL auto_increment,
`categoryParentID` smallint(5) unsigned NOT NULL default ’0′,
`categoryName` varchar(50) NOT NULL default ”,
PRIMARY KEY (`categoryID`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES
(0, ‘一級類別’),
(1, ‘二級類別’),
(1, ‘二級類別’),
(1, ‘二級類別’),
(2, ‘三級類別’),
(2, ’333332′),
(2, ’234234′),
(3, ‘a(chǎn)qqqqqd’),
(4, ‘哈哈’),
(5, ’66333666′);
*/
//指定分類id變量$category_id,然后返回該分類的所有子類
//$default_category為默認(rèn)的選中的分類
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
global $DB;
$sql = “SELECT * FROM category ORDER BY categoryID DESC”;
$result = $DB->query( $sql );
while ($rows = $DB->fetch_array($result))
{
$category_array[$rows[categoryParentID]][$rows[categoryID]] = array(‘id’ => $rows[categoryID], ‘parent’ => $rows[categoryParentID], ‘name’ => $rows
[categoryName]);
}
if (!isset($category_array[$category_id]))
{
return “”;
}
foreach($category_array[$category_id] AS $key => $category)
{
if ($category['id'] == $default_category)
{
echo “<option selected value=”.$category['id'].”";
}else
{
echo “<option value=”.$category['id'].”";
}
if ($level > 0)
{
echo “>” . str_repeat( ” “, $level ) . ” ” . $category['name'] . “</option>\n”;
}
else
{
echo “>” . $category['name'] . “</option>\n”;
}
Get_Category($key, $level + 1, $default_category);
}
unset($category_array[$category_id]);
}
/*
函數(shù)返回的數(shù)組格式如下所示:
Array
(
[1] => Array ( [id] => 1 [name] => 一級類別 [level] => 0 [ParentID] => 0 )
[4] => Array ( [id] => 4 [name] => 二級類別 [level] => 1 [ParentID] => 1 )
[9] => Array ( [id] => 9 [name] => 哈哈 [level] => 2 [ParentID] => 4 )
[3] => Array ( [id] => 3 [name] => 二級類別 [level] => 1 [ParentID] => 1 )
[8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 )
[2] => Array ( [id] => 2 [name] => 二級類別 [level] => 1 [ParentID] => 1 )
[7] => Array ( [id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2 )
[6] => Array ( [id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2 )
[5] => Array ( [id] => 5 [name] => 三級類別 [level] => 2 [ParentID] => 2 )
[10] => Array ( [id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5 )
)
*/
//指定分類id,然后返回數(shù)組
function Category_array($category_id = 0,$level=0)
{
global $DB;
$sql = “SELECT * FROM category ORDER BY categoryID DESC”;
$result = $DB->query($sql);
while ($rows = $DB->fetch_array($result))
{
$category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows;
}
foreach ($category_array AS $key=>$val)
{
if ($key == $category_id)
{
foreach ($val AS $k=> $v)
{
$options[$k] =
array(
‘id’ => $v['categoryID'], ‘name’ => $v['categoryName'], ‘level’ => $level, ‘ParentID’=>$v['categoryParentID']
);
$children = Category_array($k, $level+1);
if (count($children) > 0)
{
$options = $options + $children;
}
}
}
}
unset($category_array[$category_id]);
return $options;
}
?>
<?php
class cate
{
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
echo $category_id;
$arr = array(
’0′ => array(
’1′ => array(‘id’ => 1, ‘parent’ => 0, ‘name’ => ’1111′),
’2′ => array(‘id’ => 2, ‘parent’ => 0, ‘name’ => ’2222′),
’4′ => array(‘id’ => 4, ‘parent’ => 0, ‘name’ => ’4444′)
),
’1′ => array(
’3′ => array(‘id’ => 3, ‘parent’ => 1, ‘name’ => ’333333′),
’5′ => array(‘id’ => 5, ‘parent’ => 1, ‘name’ => ’555555′)
),
’3′ => array(
’6′ => array(‘id’ => 6, ‘parent’ => 3, ‘name’ => ’66666′),
’7′ => array(‘id’ => 7, ‘parent’ => 3, ‘name’ => ’77777′)
),
’4′ => array(
’8′ => array(‘id’ => 8, ‘parent’ => 4, ‘name’ => ’8888′),
’9′ => array(‘id’ => 9, ‘parent’ => 4, ‘name’ => ’9999′)
)
);
if (!isset($arr[$category_id]))
{
return “”;
}
foreach($arr[$category_id] AS $key => $cate)
{
if ($cate['id'] == $default_category)
{
$txt = “<option selected value=”.$cate['id'].”";
}else{
$txt = “<option value=”.$cate['id'].”";
}
if ($level > 0)
{
$txt1 = “>” . str_repeat( “-”, $level ) . ” ” . $cate['name'] . “</option>\n”;
}else{
$txt1 = “>” . $cate['name'] . “</option>\n”;
}
$val = $txt.$txt1;
echo $val;
self::Get_Category($key, $level + 1, $default_category);
}
}
function getFlush($category_id = 0,$level = 0, $default_category = 0)
{
ob_start();
self::Get_Category($category_id ,$level, $default_category);
$out = ob_get_contents();
ob_end_clean();
return $out;
}
}
$id =$_GET['id'];
echo “<select>”;
$c = new cate();
//$c->Get_Category();
$ttt=? $c->getFlush($id,’0′,’3′);
echo $ttt;
echo “</select>”;
?>
===========================================================
編程題:
1. 寫一個函數(shù),盡可能高效的,從一個標(biāo)準(zhǔn) url 里取出文件的擴(kuò)展名
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php
答案1:
function getExt($url){
$arr = parse_url($url);
$file = basename($arr['path']);
$ext = explode(“.”,$file);
return $ext[1];
}
答案2:
function getExt($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);
}
}
2. 在 HTML 語言中,頁面頭部的 meta 標(biāo)記可以用來輸出文件的編碼格式,以下是一個標(biāo)準(zhǔn)的 meta 語句
請使用 PHP 語言寫一個函數(shù),把一個標(biāo)準(zhǔn) HTML 頁面中的類似 meta 標(biāo)記中的 charset 部分值改為 big5
請注意:
1. 需要處理完整的 html 頁面,即不光此 meta 語句
2. 忽略大小寫
3. ‘ 和 ” 在此處是可以互換的
4. ‘Content-Type’ 兩側(cè)的引號是可以忽略的,但 ‘text/html; charset=gbk’ 兩側(cè)的不行
5. 注意處理多余空格
3. 寫一個函數(shù),算出兩個文件的相對路徑
如 $a = ‘/a/b/c/d/e.php’;
$b = ‘/a/b/12/34/c.php’;
計算出 $b 相對于 $a 的相對路徑應(yīng)該是 ../../c/d將()添上
答:function getRelativePath($a, $b) {
$returnPath = array(dirname($b));
$arrA = explode(‘/’, $a);
$arrB = explode(‘/’, $returnPath[0]);
for ($n = 1, $len = count($arrB); $n < $len; $n++) {
if ($arrA[$n] != $arrB[$n]) {
break;
}
}
if ($len – $n > 0) {
$returnPath = array_merge($returnPath, array_fill(1, $len – $n, ‘..’));
}
$returnPath = array_merge($returnPath, array_slice($arrA, $n));
return implode(‘/’, $returnPath);
}
echo getRelativePath($a, $b);
=====================================================================
基礎(chǔ)題:
1.表單中 get與post提交方法的區(qū)別?
答:get是發(fā)送請求HTTP協(xié)議通過url參數(shù)傳遞進(jìn)行接收,而post是實體數(shù)據(jù),可以通過表單提交大量信息.
2.session與cookie的區(qū)別?
答:session:儲存用戶訪問的全局唯一變量,存儲在服務(wù)器上的php指定的目錄中的(session_dir)的位置進(jìn)行的存放
cookie:用來存儲連續(xù)訪問一個頁面時所使用,是存儲在客戶端,對于Cookie來說是存儲在用戶WIN的Temp目錄中的。
兩者都可通過時間來設(shè)置時間長短
3.數(shù)據(jù)庫中的事務(wù)是什么?
答:事務(wù)(transaction)是作為一個單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個操作失敗,事務(wù)也不成功。如果所有操作完成,
事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。如果一個操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。
簡述題:
1、用PHP打印出前一天的時間格式是2006-5-10 22:21:21(2分)
答:echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’));
2、echo(),print(),print_r()的區(qū)別(3分)
答:echo是PHP語句, print和print_r是函數(shù),語句沒有返回值,函數(shù)可以有返回值(即便沒有用)
print()??? 只能打印出簡單類型變量的值(如int,string)
print_r() 可以打印出復(fù)雜類型變量的值(如數(shù)組,對象)
echo???? 輸出一個或者多個字符串
3、能夠使HTML和PHP分離開使用的模板(1分)
答:Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
5、使用哪些工具進(jìn)行版本控制?(1分)
答:cvs,svn,vss;
6、如何實現(xiàn)字符串翻轉(zhuǎn)?(3分)
答:echo strrev($a);
7、優(yōu)化MYSQL數(shù)據(jù)庫的方法。(4分,多寫多得)
答:
1、選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設(shè)置NOT NULL,例如’省份,性別’,最好設(shè)置為ENUM
2、使用連接(JOIN)來代替子查詢:
a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度優(yōu)化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3、使用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表
a.創(chuàng)建臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事務(wù)處理:
a.保證數(shù)據(jù)完整性,例如添加和修改同時,兩者成立則都執(zhí)行,一者失敗都失敗
mysql_query(“BEGIN”);
mysql_query(“INSERT INTO customerinfo (name) VALUES (‘$name1′)”;
mysql_query(“SELECT * FROM `orderinfo` where customerid=”.$id”);
mysql_query(“COMMIT”);
5、鎖定表,優(yōu)化事務(wù)處理:
a.我們用一個 SELECT 語句取出初始數(shù)據(jù),通過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE 關(guān)鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執(zhí)行之前,
不會有其它的訪問來對 inventory 進(jìn)行插入、更新或者刪除的操作
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”);
6、使用外鍵,優(yōu)化鎖定表
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’,該參數(shù)保證當(dāng)customerinfo表中的一條記錄刪除的話同時也會刪除order
表中的該用戶的所有記錄,注意使用外鍵要定義事務(wù)安全類型為INNODB;
7、建立索引:
a.格式:
(普通索引)->
創(chuàng)建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
創(chuàng)表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))
(唯一索引)->
創(chuàng)建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
創(chuàng)表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))
(主鍵)->
它是唯一索引,一般在創(chuàng)建表是建立,格式為:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
8、優(yōu)化查詢語句
a.最好在相同字段進(jìn)行比較操作,在建立好的索引字段上盡量減少函數(shù)操作
例子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”;
8、PHP的意思(送1分)
答:PHP是一個基于服務(wù)端來創(chuàng)建動態(tài)網(wǎng)站的腳本語言,您可以用PHP和HTML生成網(wǎng)站主頁
9、MYSQL取得當(dāng)前時間的函數(shù)是?,格式化日期的函數(shù)是(2分)
答:now(),date()
10、實現(xiàn)中文字串截取無亂碼的方法。(3分)
答:function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
$str=null;
$len=$start+$length;
for($i=$start;$i<$len;$i++){
if(ord(substr($string,$i,1))>0xa0){
$str.=substr($string,$i,2);
$i++;
}else{
$str.=substr($string,$i,1);
}
}
return $str.’…’;
}else{
return $string;
}
}
11、您是否用過版本控制軟件? 如果有您用的版本控制軟件的名字是?(1分)
12、您是否用過模板引擎? 如果有您用的模板引擎的名字是?(1分)
答:用過,smarty
13、請簡單闡述您最得意的開發(fā)之作(4分)
答:信息分類
14、對于大流量的網(wǎng)站,您采用什么樣的方法來解決訪問量問題?(4分)
答:確認(rèn)服務(wù)器硬件是否足夠支持當(dāng)前的流量,數(shù)據(jù)庫讀寫分離,優(yōu)化數(shù)據(jù)表,
程序功能規(guī)則,禁止外部的盜鏈,控制大文件的下載,使用不同主機(jī)分流主要流量
15、用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼1分)
答:打印客戶端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’);
打印服務(wù)器IP:echo gethostbyname(“www.bolaiwu.com”)
16、語句include和require的區(qū)別是什么?為避免多次包含同一文件,可用(?)語句代替它們? (2分)
答:require->require是無條件包含也就是如果一個流程里加入require,無論條件成立與否都會先執(zhí)行require
include->include有返回值,而require沒有(可能因為如此require的速度比include快)
注意:包含文件不存在或者語法錯誤的時候require是致命的,include不是
17、如何修改SESSION的生存時間(1分).
答:方法1:將php.ini中的session.gc_maxlifetime設(shè)置為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);
18、有一個網(wǎng)頁地址, 比如PHP開發(fā)資源網(wǎng)主頁: http://www.phpres.com/index.html,如何得到它的內(nèi)容?($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”);
19、在HTTP 1.0中,狀態(tài)碼401的含義是(?);如果返回“找不到文件”的提示,則可用 header 函數(shù),其語句為(?);(2分)
答:狀態(tài)401代表未被授權(quán),header(“Location:www.xxx.php”);
12、在PHP中,heredoc是一種特殊的字符串,它的結(jié)束標(biāo)志必須?(1分)
答:heredoc的語法是用”<<<”加上自己定義成對的標(biāo)簽,在標(biāo)簽范圍內(nèi)的文字視為一個字符串
例子:
$str = <<<SHOW
my name is Jiang Qihui!
SHOW;
13、談?wù)刟sp,php,jsp的優(yōu)缺點(1分)
答:ASP全名Active Server Pages,是一個WEB服務(wù)器端的開發(fā)環(huán)境, 利用它可以產(chǎn)生和運(yùn)
行動態(tài)的、交互的、高性能的WEB服務(wù)應(yīng)用程序。ASP采用腳本語言VB Script(Java script
)作為自己的開發(fā)語言。
PHP是一種跨平臺的服務(wù)器端的嵌入式腳本語言. 它大量地借用C,Java和Perl語言的語法
, 并耦合PHP自己的特性,使WEB開發(fā)者能夠快速地寫出動態(tài)生成頁面.它支持目前絕大多數(shù)數(shù)
據(jù)庫。還有一點,PHP是完全免費(fèi)的,不用花錢,你可以從PHP官方站點(http://www.php.ne
t)自由下載。而且你可以不受限制地獲得源碼,甚至可以從中加進(jìn)你自己需要的特色。
JSP 是Sun公司推出的新一代站點開發(fā)語言,他完全解決了目前ASP,PHP的一個通病--
腳本級執(zhí)行(據(jù)說PHP4 也已經(jīng)在Zend 的支持下,實現(xiàn)編譯運(yùn)行).Sun 公司借助自己在Jav
a 上的不凡造詣,將Java 從Java 應(yīng)用程序 和 Java Applet 之外,又有新的碩果,就是Js
p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能強(qiáng)大的站點
程序。
三者都提供在 HTML 代碼中混合某種程序代碼、由語言引擎解釋執(zhí)行程序代碼的能力。
但JSP代碼被編譯成 Servlet 并由 Java 虛擬機(jī)解釋執(zhí)行,這種編譯操作僅在對 JSP 頁面的
第一次請求時發(fā)生。在 ASP 、PHP、JSP 環(huán)境下, HTML 代碼主要負(fù)責(zé)描述信息的顯示樣式
,而程序代碼則用來描述處理邏輯。普通的 HTML 頁面只依賴于 Web 服務(wù)器,而 ASP 、PH
P、JSP 頁面需要附加的語言引擎分析和執(zhí)行程序代碼。程序代碼的執(zhí)行結(jié)果被重新嵌入到
HTML 代碼中,然后一起發(fā)送給瀏覽器。 ASP 、PHP、 JSP三者都是面向 Web 服務(wù)器的技術(shù)
,客戶端瀏覽器不需要任何附加的軟件支持。
14、談?wù)剬vc的認(rèn)識(1分)
答:由模型(model),視圖(view),控制器(controller)完成的應(yīng)用程序
由模型發(fā)出要實現(xiàn)的功能到控制器,控制器接收組織功能傳遞給視圖;
15、寫出發(fā)貼數(shù)最多的十個人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)
答:SELECT * FROM `members` ORDER BY posts DESC limit 0,10;
16. 請說明php中傳值與傳引用的區(qū)別。什么時候傳值什么時候傳引用?(2分)
答:按值傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部都會被忽略
按引用傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部也能反映出這些修改
優(yōu)缺點:按值傳遞時,php必須復(fù)制值。特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作。
按引用傳遞則不需要復(fù)制值,對于性能提高很有好處。
17. 在PHP中error_reporting這個函數(shù)有什么作用? (1分)
答:設(shè)置錯誤級別與錯誤信息回報
18. 請寫一個函數(shù)驗證電子郵件的格式是否正確 (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);
}
19. 簡述如何得到當(dāng)前執(zhí)行腳本路徑,包括所得到參數(shù)。(2分)
答:$script_name = basename(__file__); print_r($script_name);
21、JS表單彈出對話框函數(shù)是?獲得輸入焦點函數(shù)是? (2分)
答:彈出對話框: alert(),prompt(),confirm()
獲得輸入焦點 focus()
22、JS的轉(zhuǎn)向函數(shù)是?怎么引入一個外部JS文件?(2分)
答:window.location.href,<script type=”text/javascript” src=”js/js_function.js”></script>
23、foo()和@foo()之間有什么區(qū)別?(1分)
答:@foo()控制錯誤輸出
24、如何聲明一個名為”myclass”的沒有方法和屬性的類? (1分)
答:class myclass{ }
25、如何實例化一個名為”myclass”的對象?(1分)
答:new myclass()
26、你如何訪問和設(shè)置一個類的屬性? (2分)
答:$object = new myclass();
$newstr = $object->test;
$object->test = “info”;
27、mysql_fetch_row() 和mysql_fetch_array之間有什么區(qū)別? (1分)
答:mysql_fetch_row是從結(jié)果集取出1行數(shù)組,作為枚舉
mysql_fetch_array是從結(jié)果集取出一行數(shù)組作為關(guān)聯(lián)數(shù)組,或數(shù)字?jǐn)?shù)組,兩者兼得
28、GD庫是做什么用的? (1分)
答:gd庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。
在網(wǎng)站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網(wǎng)站數(shù)據(jù)生成報表。
29、指出一些在PHP輸入一段HTML代碼的辦法。(1分)
答:echo “<a href=’index.php’>aaa</a>”;
30、下面哪個函數(shù)可以打開一個文件,以對文件進(jìn)行讀和寫操作?(1分)
(a) fget() (b) file_open() (c) fopen() (d) open_file()? [? c? ]
31、下面哪個選項沒有將 john 添加到users 數(shù)組中? (1分)
(a) $users[] = ‘john’;
(b) array_add($users,’john’);
(c) array_push($users,‘john’);
(d) $users ||= ‘john’;? [? a , c? ]
32、下面的程序會輸入是否?(1分)
$num = 10;
function multiply(){
$num = $num * 10;
}
multiply();
echo $num;
?>
輸出:10
33、使用php寫一段簡單查詢,查出所有姓名為“張三”的內(nèi)容并打印出來 (2分)
表名User
Name Tel Content Date
張三 13333663366 大專畢業(yè) 2006-10-11
張三 13612312331 本科畢業(yè) 2006-10-15
張四 021-55665566 中專畢業(yè) 2006-10-15
請根據(jù)上面的題目完成代碼:
$mysql_db=mysql_connect(“l(fā)ocal”,”root”,”pass”);
@mysql_select_db(“DB”,$mysql_db);
$result = mysql_query(“SELECT * FROM `user` WHERE name=’張三’”);
while($rs = mysql_fetch_array($result)){
echo $rs["tel"].$rs["content"].$rs["date"];
}
34、如何使用下面的類,并解釋下面什么意思?(3)
class test{
function Get_test($num){
$num=md5(md5($num).”En”);
return $num;
}
}
答:$testnum = “123″;
$object = new test();
$encrypt = $object->Get_test($testnum);
echo $encrypt;
類test里面包含Get_test方法,實例化類調(diào)用方法多字符串加密
35、寫出 SQL語句的格式 : 插入 ,更新 ,刪除 (4分)
表名User
Name Tel Content Date
張三 13333663366 大專畢業(yè) 2006-10-11
張三 13612312331 本科畢業(yè) 2006-10-15
張四 021-55665566 中專畢業(yè) 2006-10-15
(a) 有一新記錄(小王 13254748547 高中畢業(yè) 2007-05-06)請用SQL語句新增至表中
mysql_query(“INSERT INTO `user` (name,tel,content,date) VALUES
(‘小王’,’13254748547′,’高中畢業(yè)’,’2007-05-06′)”)
(b) 請用sql語句把張三的時間更新成為當(dāng)前系統(tǒng)時間
$nowDate = date(“Ymd”);
mysql_query(“UPDATE `user` SET date=’”.$nowDate.”‘ WHERE name=’張山’”);
(c) 請寫出刪除名為張四的全部記錄
mysql_query(“DELETE FROM `user` WHERE name=’張四’”);
36、請寫出數(shù)據(jù)類型(int char varchar datetime text)的意思; 請問varchar和char有什么區(qū)別(2分)
答:int是數(shù)字類型,char固定長度字符串,varchar實際長度字符串,datetime日期時間型,text文本字符串
char的場地固定為創(chuàng)建表設(shè)置的長度,varchar為可變長度的字符
38、寫出以下程序的輸出結(jié)果 (1分)
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;
?>
答:4
39、檢測一個變量是否有設(shè)置的函數(shù)是否?是否為空的函數(shù)是?(2分)
答:isset($str),empty($str);
40、取得查詢結(jié)果集總數(shù)的函數(shù)是?(1分)
答:mysql_num_rows($result);
41、$arr = array(‘james’, ‘tom’, ‘symfony’); 請打印出第一個元素的值 (1分)
答:echo $array[0];
42、請將41題的數(shù)組的值用’,'號分隔并合并成字串輸出(1分)
答:for($i=0;$i<count($array);$i++){ echo $array[$i].”,”;}
43、$a = ‘a(chǎn)bcdef’; 請取出$a的值并打印出第一個字母(1分)
答:echo $a{0} 或 echo substr($a,0,1)
44、PHP可以和sql server/oracle等數(shù)據(jù)庫連接嗎?(1分)
答:當(dāng)然可以
45、請寫出PHP5權(quán)限控制修飾符(3分)
答:public(公共),private(私用),protected(繼承)
46、請寫出php5的構(gòu)造函數(shù)和析構(gòu)函數(shù)(2分)
答:__construct , __destruct
47、完成以下:
(一)創(chuàng)建新聞發(fā)布系統(tǒng),表名為message有如下字段 (3分)
id 文章id
title 文章標(biāo)題
content 文章內(nèi)容
category_id 文章分類id
hits 點擊量
答:CREATE TABLE ‘message’(
‘id’ int(10) NOT NULL auto_increment,
‘title’ varchar(200) default NULL,
‘content’ text,
‘category_id’ int(10) NOT NULL,
‘hits’ int(20),
PRIMARY KEY(‘id’);
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
(二)同樣上述新聞發(fā)布系統(tǒng):表comment記錄用戶回復(fù)內(nèi)容,字段如下 (4分)
comment_id 回復(fù)id
id 文章id,關(guān)聯(lián)message表中的id
comment_content 回復(fù)內(nèi)容
現(xiàn)通過查詢數(shù)據(jù)庫需要得到以下格式的文章標(biāo)題列表,并按照回復(fù)數(shù)量排序,回復(fù)最高的排在最前面
文章id 文章標(biāo)題 點擊量 回復(fù)數(shù)量
用一個SQL語句完成上述查詢,如果文章沒有回復(fù)則回復(fù)數(shù)量顯示為0
答:SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) hits,
IF(comment.`id` is NULL,0,count(*)) number FROM message LEFT JOIN
comment ON message.id=comment.id GROUP BY message.`id`;
(三)上述內(nèi)容管理系統(tǒng),表category保存分類信息,字段如下 (3分)
category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用戶輸入文章時,通過選擇下拉菜單選定文章分類
寫出如何實現(xiàn)這個下拉菜單
答:function categoryList()
{
$result=mysql_query(“select category_id,categroy_name from category”)
or die(“Invalid query: ” . mysql_error());
print(“<select name=’category’ value=”>\n”);
while($rowArray=mysql_fetch_array($result))
{
print(“<option value=’”.$rowArray['category_id'].”‘>”.$rowArray['categroy_name'].”</option>\n”);
}
print(“</select>”);
}
=============================================================
PHP對Cookie的接收和處理的支持非常好,是完全自動的,跟FORM變量的原則一樣,特別簡單。
比如設(shè)置一個名為 MyCookier的Cookie,PHP會自動從WEB服務(wù)器接收的HTTP頭里把它分析出來,并形成一個與普通變量一樣的變量,名為$ myCookie,這個變量的值就是Cookie的值。數(shù)組同樣適用。另外一個辦法是引用PHP的全局變量$HTTP_COOKIE_VARS數(shù)組。
分別舉例如下:(假設(shè)這些都在以前的頁面里設(shè)置過了,并且仍然有效)
echo $MyCookie;
echo $CookieArray[0];
echo $_COOKIE["MyCookie"];
echo $HTTP_COOKIE_VARS["MyCookie"];
要刪除一個已經(jīng)存在的Cookie,有兩個辦法:
1、SetCookie(“Cookie”, “”);
2、SetCookie(“Cookie”, “value” , time()-1 / time() );
使用Cookie的限制
1、必須在HTML文件的內(nèi)容輸出之前設(shè)置;
2、不同的瀏覽器對Cookie的處理不一致,且有時會出現(xiàn)錯誤的結(jié)果。
3、限制是在客戶端的。一個瀏覽器能創(chuàng)建的Cookie數(shù)量最多為30個,并且每個不能超過4KB,每個WEB站點能設(shè)置的Cookie總數(shù)不能超過20個。
============================================================
?
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的一份超级全面的PHP面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zend Studio 默认模板和输入代
- 下一篇: DOM中的setInterval方法