PHP寶典面試筆試題目
來自《PHP程序員面試筆試寶典》,涵蓋了近三年了各大型企業常考的PHP面試題,針對面試題提取出來各種面試知識也涵蓋在了本書。
PHP題目
【真題68】 ( )操作符在兩個操作數中有一個(不是全部)為 True 時返回 True。
參考答案:邏輯異或(xor)運算符。
【真題61】 執行如下程序段:
<?php
echo 24%(-5);
?>
程序的輸出結果是( )。
A.5 B.4 C.-4 D.19
參考答案:B。
分析:在PHP中,取模運算符%的操作數在運算之前都會轉換成整數(除去小數部分)。其運算結果和被除數的符號(正負號)相同。即$a%$b的結果和$a的符號相同。本題中,24%(-5)的符號為正,結果為4。所以,選項B正確。
【真題181】 寫一個函數,算出兩個文件的相對路徑。例如,$a = \/a/b/c/d/e.php\;,$b = \/a/b/12/ 34/c.php\;,計算出 $b 相對於 $a 的相對路徑應該是 ../../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);
}
$a = "\/a/b/c/d/e.php\";
$b = "\/a/b/12/34/c.php\";
echo getRelativepath($a, $b);
【真題182】 以下關於PHP文件處理的說法中,正確的是( )。
A.filegetcontents()函數能用來抓取網頁數據,但是沒辦法設置超時時間
B.file()函數既能讀取文本文件也能讀取二進制文件,但是讀取二進制文件有可能出現安全問題
C.如果表單中沒有選擇上傳的文件,則 PHP 變量的值將為NULL
D.fsockopen()和fputs()結合起來可以發送郵件,也可以用來抓取網頁內容、下載ftp文件等
參考答案:C。
分析:對於選項A,可以通過context參數設置超時時間。所以,選項A錯誤。
對於選項B,file()函數是可以安全用於讀取二進制文件的。所以,選項B錯誤。
對於選項C,表單中沒有文件上傳時,PHP的$_FILES變量值為NULL。所以,選項C正確。
對於選項D,fputs()用於寫入字符串到文件中,只能用於上傳不能用於下載ftp文件。所以,選項D錯誤。
【真題215】 按要求寫出SQL實現。
1)創建新聞發布系統,表名為message,有如下字段:
id 文章id
title 文章標題
content 文章內容
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;
2)同樣上述新聞發布系統:表comment記錄用戶回復內容,字段如下:
comment_id 回復id
id 文章id,關聯message表中的id
comment_content 回復內容
現通過查詢數據庫需要得到以下格式的文章標題列表,並按照回復數量排序,回復最高的排在最前面。
文章id 文章 標題 點擊量 回復 數量
用一個SQL語句完成上述查詢,如果文章沒有回復,則回復數量顯示為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';
上述內容管理系統,表category保存分類信息,字段如下:
category_id int(4) not null auto_increment;
category_name varchar(40) not null;
3)用戶輸入文章時,通過選擇下拉菜單選定文章分類,寫出如何實現這個下拉菜單。
參考答案:
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("<optionvalue='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</ option>/n");
}
print("</select>");
}
【真題216】 使用PHP寫一段簡單查詢,查出所有姓名為“張三”的內容並打印出來。
表名User
Name Tel Content Date
張三 13333663366 大專畢業 2006-10-11
張三 13612312331 本科畢業 2006-10-15
張四 021-55665566 中專畢業 2006-10-15
參考答案:根據上面的題目完成代碼:
$mysql_db=mysql_connect("local","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"];
}
【真題217】 考慮如下SQL語句,哪個選項能對返回記錄的條數進行限制?( )(雙選)
SELECT * FROM MY_TABLE
A.如果可能,那么把查詢轉換成存儲例程
B.如果程序允許,那么給查詢指定返回記錄的范圍
C.如果可能,那么添加 where 條件
D.如果DBMS允許,那么把查詢轉換成視圖
參考答案:B、C。
分析:有兩個方法能限制返回記錄的條數——使用 where 條件或limit關鍵字指定查詢返回的記錄的范圍。
通常情況下,如果沒有特殊需要,那么盡量不要用 select *,這會浪費大量的數據緩存。
【真題218】 執行以下 SQL 語句后將發生( )。
BEGIN TRANSACTION
DELETE FROM MYTABLE WHERE ID=1
DELETE FROM OTHERTABLE
ROLLBACK TRANSACTION
A.OTHERTABLE 中的內容將被刪除
B.OTHERTABLE 和 MYTABLE 中的內容都會被刪除
C.OTHERTABLE 中的內容將被刪除,MYTABLE 中 ID 是 1 的內容將被刪除
D.數據庫沒有變化
參考答案:D。
分析:這個查詢是一個事務,並且這個事務的最后有回滾,數據庫不會有變化。
Mysql題目
一、如何進行數據庫優化?
數據庫優化的過程可以使用以下的方法進行:
1)選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設置NOT NULL,例如'省份、性別',最好設置為ENUM。
2)使用連接(JOIN)來代替子查詢。
① 刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。
② 提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。
③ 提高b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo. customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL。
3)使用聯合(UNION)來代替手動創建的臨時表。創建臨時表:SELECT name FROM 'nametest' UNION SELECT username FROM 'nametest2'。
4)事務處理。保證數據完整性,例如添加和修改。同時,如果兩者成立,則都執行,一者失敗都失敗:
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM 'orderinfo' where customerid=".$id");
mysql_query("COMMIT");
5)鎖定表,優化事務處理。用一個SELECT語句取出初始數據,通過一些計算,用UPDATE語句將新值更新到表中。包含有WRITE關鍵字的LOCK TABLE語句可以保證在UNLOCK TABLES命令被執行之前,不會有其他的訪問來對customerinfo表進行插入、更新或者刪除的操作。
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)使用外鍵,優化鎖定表。把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。
二、選擇正確的存儲引擎?
在MySQL中有兩個存儲引擎:MyISAM和InnoDB,每個引擎都有利有弊。
MyISAM適合於一些需要大量查詢的應用,但其對於有大量寫操作的支持並不是很好。甚至只是需要update一個字段,整個表都會被鎖起來,而其他進程,就算是讀進程都無法操作直到讀操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。
InnoDB 的趨勢會是一個非常復雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。但是它支持“行鎖”,於是在寫操作比較多的時候,會更優秀。並且,它還支持更多的高級應用,例如事務。
三、【真題231】 用什么方法檢查PHP腳本的執行效率(通常是腳本執行時間)和數據庫SQL的效率(通常是數據庫query時間),並定位和分析腳本執行和數據庫查詢的瓶頸所在?
參考答案:檢查PHP腳本的執行效率的方法如下:可以在檢查的代碼開頭記錄一個時間,然后在代碼的結尾也記錄一個時間,結尾時間減去開頭時間取這個時間的差值,從而檢查PHP的腳本執行效率,記錄時間可以使用microtime()函數。
檢查數據庫SQL的效率的方法如下:可以通過explain顯示MySQL如何使用索引來處理select語句及連接表,幫助選擇更好的索引和寫出更優化的查詢語句。然后啟用slow query log記錄慢查詢,通過查看SQL的執行時間和效率來定位分析腳本執行的問題和瓶頸所在。
四、 以下代碼的運行結果為( )。
<?php
mysql_connect('localhost','root',"");
$result = mysql_query("SELECT id,name FROM tb1");
while($row = mysql_fetch_array($result,MySQL_ASSOC)){
echo' ID:' .$row[0].' Name:' .$row[];
}
?>
A.報錯 B.循環換行打印全部記錄
C.無任何結果 D.只打印第一條記錄
參考答案:A。
分析:因為代碼中沒有指明要操作的數據庫名,所以會報錯。
所以,本題的答案為A。
【真題222】 以下說法正確的是( )。
A.使用索引能加快插入數據的速度
B.良好的索引策略有助於防止跨站攻擊
C.應當根據數據庫的實際應用合理設計索引
D.刪除一條記錄將導致整個表的索引被破壞
參考答案:C。
分析:索引的作用主要是幫助數據庫快速查找到對應的數據,並不能加快插入數據的速度,所以,選項A錯誤。
索引不能夠幫助防止跨站攻擊,所以,選項B錯誤。
創建合理的索引需要分析數據庫的實際用途並找出它的弱點。優化腳本中的冗余查詢同樣也能提高數據庫效率。索引是占用物理空間的,所以在實際的應用中是要合理設計使用索引的。所以,選項C正確。
索引是一種表結構,刪除一條數據也不會影響到整個表的索引,並且索引不一定是數字,也可以是字符串。所以,選項D錯誤。
【真題223】 下列關於全文檢索技術的說法中,不正確的是( )。
A.Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能
B.Solr是新一代的全文檢索組件,它比Lucene的搜索效率高很多,還能支持HTTP的訪問方式,PHP調用Solr也很方便
C.MySQL中把一個字段建立FULLTEXT索引,就可以實現全文檢索,目前MyISAM和InnoDB的table都支持FULLTEXT索引
D.Lucene附帶的二元分詞分析器CJKAnalyzer切詞速度很快,能滿足一般的全文檢索需要
參考答案:B。
分析:Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL、PostgreSQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。
Solr是一個獨立的企業級搜索應用服務器,用戶可以通過HTTP請求訪問,它是采用JAVA5開發,基於Lucene的全文搜索服務器,同時對其進行了擴展,提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴展並對查詢性能進行了優化,並且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎。並且Solr比Lucene的搜索效率高很多,但是PHP調用Solr並不方便,選項B的說法錯誤。
MySQL中的MyISAM和InnoDB都是支持FULLTEXT全文索引的。全文搜索引擎可以在不使用模板匹配操作的情況下查找單詞或短語。
購買鏈接:京東購買
題目來自《PHP程序員面試筆試寶典》,里面涵蓋了近三年了各大型企業常考的PHP面試題,針對面試題提取出來各種面試知識也涵蓋在了本書。
更多PHP面試筆試真題可以瀏覽:www.shuaiqi100.com
更多有趣有料的PHP面試筆試資料可以關注:“琉憶編程庫”
或者瀏覽:www.shuaiqi100.com 獲取。
PHP程序員面試筆試寶典下載:https://pan.baidu.com/s/1-ES2ZI3z5Lhv-zTKFmJDSQ