PHP程序員招聘試卷
選擇
1、下列命令中不是PHP的輸出命令的是(B)A.echoB.printf()C.printD.write2、PHP定義活動(dòng)變量的方法是(B)
A.VARB.$C.$$D.&
3、PHP表達(dá)式$foo=1+”bob3”,則$foo的值是(B)
A.1B.1bob3C.1bD.924、下關(guān)于PHP變量的說(shuō)法正確的是(D)A.PHP是一種強(qiáng)類型語(yǔ)言
B.PHP變量聲明時(shí)需要指定其變量的類型
C.PHP變量聲明時(shí)在變量名前面使用的字符是”&”
D.PHP變量使用時(shí),上下文會(huì)自動(dòng)確定其變量的類型5、在PHP嵌入HTML文檔使用的定界符號(hào)是(C)A.“”結(jié)束
B.以””結(jié)束C.以””結(jié)束D.以””結(jié)束
6、PHP語(yǔ)法中,假設(shè)已知$a=”hello”,$b=”china”,則要得到”hellochina”的字符串,應(yīng)該如何操作(C)
A.$a+$bB.$a-$bC.$a.$bD.$a+=$b7、要配置PHP環(huán)境,只需修改(A)
A.php.iniB.http.confC.php.sysD.php.exe8、有下列PHP語(yǔ)句段(D)
若要輸出”false”,$a應(yīng)該是
A.10B.3C.“true”D.“0”9、下面程序運(yùn)行的結(jié)果為(A)。$a=array("a","b","c","d");
$index=array_search("a",$a);if($index==false)
echo"在數(shù)組a中未發(fā)現(xiàn)字符"a"";
elseecho"index=".$index;
A.在數(shù)組a中未發(fā)現(xiàn)字符’a’B.0C.1D.210、選擇下面程序的運(yùn)行結(jié)果(D)。
Echosubstr_replace(“ABC”,”DEF”,3,1)
A.ABCB.DEFC.ABCDEFD.以上都不對(duì)11選擇下面程序運(yùn)行的結(jié)果()。echo“\\$a=$a\\$b=$b\\$c=$c”;?>
A.$a=3B.$a=3C.$a=2D.$a=2$b=2$b=2$b=2$b=2$c=3$c=2$c=3$c=2
12getdate()函數(shù)返回的值的數(shù)據(jù)類型是____________。(B)A.整形B.浮點(diǎn)型C.數(shù)組D.字符串E.布爾型13.下列哪些數(shù)據(jù)庫(kù)管理系統(tǒng)是PHP不支持的?(B)
A.MySQLB.IBMDB2
C.PostgreSQLD.MicrosoftSQLServerE.以上沒(méi)有一個(gè)PHP不支持
14.請(qǐng)看下面的SQL查詢語(yǔ)句,如何才能減少?gòu)臄?shù)據(jù)庫(kù)返回的數(shù)據(jù)量?(B)SELECT*FROMMY_TABLE
A.轉(zhuǎn)為存儲(chǔ)過(guò)程B.用具體的字段名來(lái)代替”*”C.加一個(gè)”where”語(yǔ)句D.轉(zhuǎn)變查詢?yōu)橐晥DE.使用預(yù)語(yǔ)句
15.下面哪個(gè)語(yǔ)句用來(lái)往數(shù)據(jù)表里面增加一條記錄?(D)A.SELECTB.UPDATEC.DELETED.INSERT
16.下面哪個(gè)不是一個(gè)合法的SQL的歸類函數(shù)?(E)A.AVGB.SUMC.MIND.MAXE.CURRENT_DATE()
17.下面哪個(gè)網(wǎng)絡(luò)協(xié)議是PHP不支持的?(E)
A.tcpB.udpC.udgD.pdcE.unix
18.做文件上傳的時(shí)候,你可以讓瀏覽器來(lái)限制上傳的文件大小嗎?(B)A.可以B.不可以
19.你可以通過(guò)一個(gè)PHP函數(shù)把所有的錯(cuò)誤信息匯報(bào)都屏蔽掉嗎?(A)A.可以B.不可以
20假設(shè)$a=5,有$a+=2,則$a的值為(C)A.5B.6C.7D.8二、填空題
1.Php配置文件為_(kāi)_php.ini______。2.檢查一個(gè)變量是否為空的函數(shù)_____。
3、已知ltrim()函數(shù)是去除字符串左邊的空格或其他字符,去除字符串右邊的空格或其他字符使用函數(shù)________。4、在php頁(yè)面中要運(yùn)行php代碼,可以用以下語(yǔ)句聲明腳本
5、如果在php中動(dòng)態(tài)的設(shè)置“我是一個(gè)學(xué)生”,并且以藍(lán)色隸書字體顯示,大小為12,用php代碼如何輸出,_______________________________。6、HTML標(biāo)記,可單獨(dú)使用或嵌入在各個(gè)php腳本單元中,以"_________"為定界符;php代碼可單獨(dú)使用或包含在和〈/html〉內(nèi),以"_________"為定界符7、一段與mysql數(shù)據(jù)庫(kù)建立連接的代碼
8、PHP指的是___PHP語(yǔ)言___________________。9、
此段程序執(zhí)行后,瀏覽器上顯示的結(jié)果是__5_______。
10、使用"get"方法提交的表單中獲取數(shù)據(jù)是_____________。三、問(wèn)答題
1、簡(jiǎn)述break和continue的區(qū)別
2、簡(jiǎn)述public、protected、private修飾類中的函數(shù)時(shí)的意義?3、mysql_fetch_row()和mysql_fetch_array之間有什么區(qū)別?4、簡(jiǎn)述修飾符this->、parent::、self::的作用?5、PHP如何創(chuàng)建一個(gè)COOKIE?
6、簡(jiǎn)述__get()、__set()函數(shù)的作用?7、php的包含語(yǔ)句有那些以及區(qū)別?
四、編程題:
1、用PHP實(shí)現(xiàn)一用戶登陸程序。數(shù)據(jù)庫(kù)test中user(用戶)表結(jié)構(gòu)如下:Username(useridchar(8),passwordchar(6))
2、在MYSQL中,數(shù)據(jù)庫(kù)”study”中student表內(nèi)容如下:idnamesex1001張山男1002李四男1003王武女
連接數(shù)據(jù)庫(kù)服務(wù)器參數(shù)為:(”localhost”,”root”,”root”)請(qǐng)使用PHP語(yǔ)言編寫刪除一條id為1002的數(shù)據(jù)記錄的程序
3、使用第2題的數(shù)據(jù)庫(kù)和表,用php寫一段簡(jiǎn)單查詢,查出所有性別為“男”的內(nèi)容并打印出來(lái)。
4、編程輸出99乘法表
5、編程求10的階乘并輸出
擴(kuò)展閱讀:PHP程序員招聘中的常見(jiàn)面試題
《PHP程序員招聘中的常見(jiàn)面試題!》
表單中POST方法與GET方法有什么區(qū)別?答:
1.get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)。
2.get是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng),在URL中可以看到;
而post是通過(guò)HTTPpost機(jī)制,將表單內(nèi)各個(gè)字段與其內(nèi)容放置在HTMLHEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶看不到這個(gè)過(guò)程。
3.對(duì)于get方式,服務(wù)器端用Request.QueryString獲取變量的值,對(duì)于post方式,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù)。
4.get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,但受配置文件限制。
5.get安全性非常低,post安全性較高。
優(yōu)化mysql數(shù)據(jù)庫(kù)的方法?答:
1、選取最適用的字段屬性
MySQL可以很好的支持大數(shù)據(jù)量的存取,但是一般說(shuō)來(lái),數(shù)據(jù)庫(kù)中的表越小,在它上面執(zhí)行的查詢也就會(huì)越快。因此,在創(chuàng)建表的時(shí)候,為了獲得更好的性能,我們可以將表中字段的寬度設(shè)得盡可能小。例如,在定義郵政編碼這個(gè)字段時(shí),如果將其設(shè)置為CHAR(255),顯然給數(shù)據(jù)庫(kù)增加了不必要的空間,甚至使用VARCHAR這種類型也是多余的,因?yàn)镃HAR(6)就可以很好的完成任務(wù)了。同樣的,如果可以的話,我們應(yīng)該使用MEDIUMINT而不是BIGIN來(lái)定義整型字段。
另外一個(gè)提高效率的方法是在可能的情況下,應(yīng)該盡量把字段設(shè)置為NOTNULL,這樣在將來(lái)執(zhí)行查詢的時(shí)候,數(shù)據(jù)庫(kù)不用去比較NULL值。對(duì)于某些文本字段,例如“省份”或者“性別”,我們可以將它們定義為ENUM類型。因?yàn)樵贛ySQL中,ENUM類型被當(dāng)作數(shù)值型數(shù)據(jù)來(lái)處理,而數(shù)值型數(shù)據(jù)被處理起來(lái)的速度要比文本類型快得多。這樣,我們又可以提高數(shù)據(jù)庫(kù)的性能。2、使用連接(JOIN)來(lái)代替子查詢(Sub-Queries)MySQL從4.1開(kāi)始支持SQL的子查詢。這個(gè)技術(shù)可以使用SELECT語(yǔ)句來(lái)創(chuàng)建一個(gè)單列的查詢結(jié)果,然后把這個(gè)結(jié)果作為過(guò)濾條件用在另一個(gè)查詢中。例如,我們要將客戶基本信息表中沒(méi)有任何訂單的客戶刪除掉,就可以利用子查詢先從銷售信息表中將所有發(fā)出訂單的客戶ID取出來(lái),然后將結(jié)果傳遞給主查詢,如下所示:DELETEFROMcustomerinfo
WHERECustomerIDNOTin(SELECTCustomerIDFROMsalesinfo)使用子查詢可以一次性的完成很多邏輯上需要多個(gè)步驟才能完成的SQL操作,同時(shí)也可以避免事務(wù)或者表鎖死,并且寫起來(lái)也很容易。但是,有些情況下,子查詢可以被更有效率的連接(JOIN)..替代。例如,假設(shè)我們要將所有沒(méi)有訂單記錄的用戶取出來(lái),可以用下面這個(gè)查詢完成:
SELECT*FROMcustomerinfo
WHERECustomerIDNOTin(SELECTCustomerIDFROMsalesinfo)
如果使用連接(JOIN)..來(lái)完成這個(gè)查詢工作,速度將會(huì)快很多。尤其是當(dāng)salesinfo表中對(duì)CustomerID建有索引的話,性能將會(huì)更好,查詢?nèi)缦拢篠ELECT*FROMcustomerinfo
LEFTJOINsalesinfoONcustomerinfo.CustomerID=salesinfo.CustomerID
WHEREsalesinfo.CustomerIDISNULL
連接(JOIN)..之所以更有效率一些,是因?yàn)镸ySQL不需要在內(nèi)存中創(chuàng)建臨時(shí)表來(lái)完成這個(gè)邏輯上的需要兩個(gè)步驟的查詢工作。
3、使用聯(lián)合(UNION)來(lái)代替手動(dòng)創(chuàng)建的臨時(shí)表
MySQL從4.0的版本開(kāi)始支持UNION查詢,它可以把需要使用臨時(shí)表的兩條或更多的SELECT查詢合并的一個(gè)查詢中。在客戶端的查詢會(huì)話結(jié)束的時(shí)候,臨時(shí)表會(huì)被自動(dòng)刪除,從而保證數(shù)據(jù)庫(kù)整齊、高效。使用UNION來(lái)創(chuàng)建查詢的時(shí)候,我們只需要用UNION作為關(guān)鍵字把多個(gè)SELECT語(yǔ)句連接起來(lái)就可以了,要注意的是所有SELECT語(yǔ)句中的字段數(shù)目要想同。下面的例子就演示了一個(gè)使用UNION的查詢。SELECTName,PhoneFROMclientUNION
SELECTName,BirthDateFROMauthorUNION
SELECTName,SupplierFROMproduct
4、事務(wù)
盡管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯(lián)合(UNION)來(lái)創(chuàng)建各種各樣的查詢,但不是所有的數(shù)據(jù)庫(kù)操作都可以只用一條或少數(shù)幾條SQL語(yǔ)句就可以完成的。更多的時(shí)候是需要用到一系列的語(yǔ)句來(lái)完成某種工作。但是在這種情況下,當(dāng)這個(gè)語(yǔ)句塊中的某一條語(yǔ)句運(yùn)行出錯(cuò)的時(shí)候,整個(gè)語(yǔ)句塊的操作就會(huì)變得不確定起來(lái)。設(shè)想一下,要把某個(gè)數(shù)據(jù)同時(shí)插入兩個(gè)相關(guān)聯(lián)的表中,可能會(huì)出現(xiàn)這樣的情況:第一個(gè)表中成功更新后,數(shù)據(jù)庫(kù)突然出現(xiàn)意外狀況,造成第二個(gè)表中的操作沒(méi)有完成,這樣,就會(huì)造成數(shù)據(jù)的不完整,甚至?xí)茐臄?shù)據(jù)庫(kù)中的數(shù)據(jù)。要避免這種情況,就應(yīng)該使用事務(wù),它的作用是:要么語(yǔ)句塊中每條語(yǔ)句都操作成功,要么都失敗。換句話說(shuō),就是可以保持?jǐn)?shù)據(jù)庫(kù)中數(shù)據(jù)的一致性和完整性。事物以BEGIN關(guān)鍵字開(kāi)始,COMMIT關(guān)鍵字結(jié)束。在這之間的一條SQL操作失敗,那么,ROLLBACK命令就可以把數(shù)據(jù)庫(kù)恢復(fù)到BEGIN開(kāi)始之前的狀態(tài)。
BEGIN;
INSERTINTOsalesinfoSETCustomerID=14;
UPDATEinventorySETQuantity=11
WHEREitem="book";
COMMIT;
事務(wù)的另一個(gè)重要作用是當(dāng)多個(gè)用戶同時(shí)使用相同的數(shù)據(jù)源時(shí),它可以利用鎖定數(shù)據(jù)庫(kù)的方法來(lái)為用戶提供一種安全的訪問(wèn)方式,這樣可以保證用戶的操作不被其它的用戶所干擾。
5、鎖定表
盡管事務(wù)是維護(hù)數(shù)據(jù)庫(kù)完整性的一個(gè)非常好的方法,但卻因?yàn)樗莫?dú)占性,有時(shí)會(huì)影響數(shù)據(jù)庫(kù)的性能,尤其是在很大的應(yīng)用系統(tǒng)中。由于在事務(wù)執(zhí)行的過(guò)程中,數(shù)據(jù)庫(kù)將會(huì)被鎖定,因此其它的用戶請(qǐng)求只能暫時(shí)等待直到該事務(wù)結(jié)束。如果一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)只有少數(shù)幾個(gè)用戶來(lái)使用,事務(wù)造成的影響不會(huì)成為一個(gè)太大的問(wèn)題;但假設(shè)有成千上萬(wàn)的用戶同時(shí)訪問(wèn)一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),例如訪問(wèn)一個(gè)電子商務(wù)網(wǎng)站,就會(huì)產(chǎn)生比較嚴(yán)重的響應(yīng)延遲。其實(shí),有些情況下我們可以通過(guò)鎖定表的方法來(lái)獲得更好的性能。下面的例子就用鎖定表的方法來(lái)完成前面一個(gè)例子中事務(wù)的功能。LOCKTABLEinventoryWRITESELECTQuantityFROMinventoryWHEREItem="book";...
UPDATEinventorySETQuantity=11WHEREItem="book";UNLOCKTABLES
這里,我們用一個(gè)SELECT語(yǔ)句取出初始數(shù)據(jù),通過(guò)一些計(jì)算,用UPDATE語(yǔ)句將新值更新到表中。包含有WRITE關(guān)鍵字的LOCKTABLE語(yǔ)句可以保證在UNLOCKTABLES命令被執(zhí)行之前,不會(huì)有其它的訪問(wèn)來(lái)對(duì)inventory進(jìn)行插入、更新或者刪除的操作。
6、使用外鍵
鎖定表的方法可以維護(hù)數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性。這個(gè)時(shí)候我們就可以使用外鍵。例如,外鍵可以保證每一條銷售記錄都指向某一個(gè)存在的客戶。在這里,外鍵可以把customerinfo表中的CustomerID映射到salesinfo表中CustomerID,任何一條沒(méi)有合法CustomerID的記錄都不會(huì)被更新或插入到salesinfo中。CREATETABLEcustomerinfo(
CustomerIDINTNOTNULL,PRIMARYKEY(CustomerID))TYPE=INNODB;
CREATETABLEsalesinfo(
SalesIDINTNOTNULL,CustomerIDINTNOTNULL,PRIMARYKEY(CustomerID,SalesID),
FOREIGNKEY(CustomerID)REFERENCEScustomerinfo(CustomerID)ONDELETECASCADE)TYPE=INNODB;
注意例子中的參數(shù)“ONDELETECASCADE”。該參數(shù)保證當(dāng)customerinfo表中的一條客戶記錄被刪除的時(shí)候,salesinfo表中所有與該客戶相關(guān)的記錄也會(huì)被自動(dòng)刪除。如果要在MySQL中使用外鍵,一定要記住在創(chuàng)建表的時(shí)候?qū)⒈淼念愋投x為事務(wù)安全表InnoDB類型。該類型不是MySQL表的默認(rèn)類型。定義的方法是在CREATETABLE語(yǔ)句中加上TYPE=INNODB。如例中所示。
7、使用索引
索引是提高數(shù)據(jù)庫(kù)性能的常用方法,它可以令數(shù)據(jù)庫(kù)服務(wù)器以比沒(méi)有索引快得多的速度檢索特定的行,尤其是在查詢語(yǔ)句當(dāng)中包含有MAX(),MIN()和ORDERBY這些命令的時(shí)候,性能提高更為明顯。那該對(duì)哪些字段建立索引呢?一般說(shuō)來(lái),索引應(yīng)建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上。盡量不要對(duì)數(shù)據(jù)庫(kù)中某個(gè)含有大量重復(fù)的值的字段建立索引。對(duì)于一個(gè)ENUM類型的字段來(lái)說(shuō),出現(xiàn)大量重復(fù)值是很有可能的情況,例如customerinfo中的“province”..字段,在這樣的字段上建立索引將不會(huì)有什么幫助;相反,還有可能降低數(shù)據(jù)庫(kù)的性能。我們?cè)趧?chuàng)建表的時(shí)候可以同時(shí)創(chuàng)建合適的索引,也可以使用ALTERTABLE或CREATEINDEX在以后創(chuàng)建索引。此外,MySQL從版本3.23.23開(kāi)始支持全文索引和搜索。全文索引在MySQL中是一個(gè)FULLTEXT類型索引,但僅能用于MyISAM類型的表。對(duì)于一個(gè)大的數(shù)據(jù)庫(kù),將數(shù)據(jù)裝載到一個(gè)沒(méi)有FULLTEXT索引的表中,然后再使用ALTERTABLE或CREATEINDEX創(chuàng)建索引,將是非?斓。但如果將數(shù)據(jù)裝載到一個(gè)已經(jīng)有FULLTEXT索引的表中,執(zhí)行過(guò)程將會(huì)非常慢。
8、優(yōu)化的查詢語(yǔ)句
絕大多數(shù)情況下,使用索引可以提高查詢的速度,但如果SQL語(yǔ)句使用不恰當(dāng)?shù)脑,索引將無(wú)法發(fā)揮它應(yīng)有的作用。下面是應(yīng)該注意的幾個(gè)方面。首先,最好是在相同類型的字段間進(jìn)行比較的操作。在MySQL3.23版之前,這甚至是一個(gè)必須的條件。例如不能將一個(gè)建有索引的INT字段和BIGINT字段進(jìn)行比較;但是作為特殊的情況,在CHAR類型的字段和VARCHAR類型字段的字段大小相同的時(shí)候,可以將它們進(jìn)行比較。其次,在建有索引的字段上盡量不要使用函數(shù)進(jìn)行操作。
例如,在一個(gè)DATE類型的字段上使用YEAE()函數(shù)時(shí),將會(huì)使索引不能發(fā)揮應(yīng)有的作用。所以,下面的兩個(gè)查詢雖然返回的結(jié)果一樣,但后者要比前者快得多。SELECT*FROMorderWHEREYEAR(OrderDate)<201*;SELECT*FROMorderWHEREOrderDate<"201*-01-01";同樣的情形也會(huì)發(fā)生在對(duì)數(shù)值型字段進(jìn)行計(jì)算的時(shí)候:SELECT*FROMinventoryWHEREAmount/7<24;SELECT*FROMinventoryWHEREAmount<24*7;
上面的兩個(gè)查詢也是返回相同的結(jié)果,但后面的查詢將比前面的一個(gè)快很多。第三,在搜索字符型字段時(shí),我們有時(shí)會(huì)使用LIKE關(guān)鍵字和通配符,這種做法雖然簡(jiǎn)單,但卻也是以犧牲系統(tǒng)性能為代價(jià)的。例如下面的查詢將會(huì)比較表中的每一條記錄。SELECT*FROMbooks
WHEREnamelike"MySQL%"但是如果換用下面的查詢,返回的結(jié)果一樣,但速度就要快上很多:SELECT*FROMbooks
WHEREname>="MySQL"andname<"MySQM"
最后,應(yīng)該注意避免在查詢中讓MySQL進(jìn)行自動(dòng)類型轉(zhuǎn)換,因?yàn)檗D(zhuǎn)換過(guò)程也會(huì)使索引變得不起作用。
關(guān)于通過(guò)查詢緩沖提高查詢速度
一般我們使用SQL語(yǔ)句進(jìn)行查詢時(shí),數(shù)據(jù)庫(kù)服務(wù)器每次在收到客戶端發(fā)來(lái)SQL后,都會(huì)執(zhí)行這條SQL語(yǔ)句。但當(dāng)在一定間隔內(nèi)(如1分鐘內(nèi)),接到完全一樣的SQL語(yǔ)句,也同樣執(zhí)行它。雖然這樣可以保證數(shù)據(jù)的實(shí)時(shí)性,但在大多數(shù)時(shí)候,數(shù)據(jù)并不要求完全的實(shí)時(shí),也就是說(shuō)可以有一定的延時(shí)。如果是這樣的話,在短時(shí)間內(nèi)執(zhí)行完全一樣的SQL就有些得不償失。
幸好MySQL為我們提供了查詢緩沖的功能(只能在MySQL4.0.1及以上版本使用查詢緩沖)。我們可以通過(guò)查詢緩沖在一定程度上提高查詢性能。
我們可以通過(guò)在MySQL安裝目錄中的my.ini文件設(shè)置查詢緩沖。設(shè)置也非常簡(jiǎn)單,只需要將query_cache_type設(shè)為1即可。在設(shè)置了這個(gè)屬性后,MySQL在執(zhí)行任何SELECT語(yǔ)句之前,都會(huì)在它的緩沖區(qū)中查詢是否在相同的SELECT語(yǔ)句被執(zhí)行過(guò),如果有,并且執(zhí)行結(jié)果沒(méi)有過(guò)期,那么就直接取查詢結(jié)果返回給客戶端。但在寫SQL語(yǔ)句時(shí)注意,MySQL的查詢緩沖是區(qū)分大小寫的。如下列的兩條SELECT語(yǔ)句:
代碼:
SELECT*fromTABLE1
SELECT*FROMTABLE1
上面的兩條SQL語(yǔ)句對(duì)于查詢緩沖是完全不同的SELECT。而且查詢緩沖并不自動(dòng)處理空格,因此,在寫SQL語(yǔ)句時(shí),應(yīng)盡量減少空格的使用,尤其是在SQL首和尾的空格(因?yàn)椋樵兙彌_并不自動(dòng)截取首尾空格)。
雖然不設(shè)置查詢緩沖,有時(shí)可能帶來(lái)性能上的損失,但有一些SQL語(yǔ)句需要實(shí)時(shí)地查詢數(shù)據(jù),或者并不經(jīng)常使用(可能一天就執(zhí)行一兩次)。這樣就需要把緩沖關(guān)了。當(dāng)然,這可以通過(guò)設(shè)置query_cache_type的值來(lái)關(guān)閉查詢緩沖,但這就將查詢緩沖永久地關(guān)閉了。在MySQL5.0中提供了一種可以臨時(shí)關(guān)閉查詢緩沖的方法:
代碼:
SELECTSQL_NO_CACHEfield1,field2FROMTABLE1
以上的SQL語(yǔ)句由于使用了SQL_NO_CACHE,因此,不管這條SQL語(yǔ)句是否被執(zhí)行過(guò),服務(wù)器都不會(huì)在緩沖區(qū)中查找,每次都會(huì)執(zhí)行它。
我們還可以將my.ini中的query_cache_type設(shè)成2,這樣只有在使用了SQL_CACHE后,才使用查詢緩沖。
代碼:
SELECTSQL_CALHE*FROMTABLE1
實(shí)現(xiàn)中文字串截取無(wú)亂碼的方法?
mb_substr()
session與cookie的區(qū)別?
1、session保存在服務(wù)器,客戶端不知道其中的信息;cookie保存在客戶端,服務(wù)器能夠知道其中的信息。
2、session不能區(qū)分路徑,同一個(gè)用戶在訪問(wèn)一個(gè)網(wǎng)站期間,所有的session在任何一個(gè)地方都可以訪問(wèn)到。而cookie中如果設(shè)置了路徑參數(shù),那么同一個(gè)網(wǎng)站中不同路徑下的cookie互相是訪問(wèn)不到的。
3、session默認(rèn)需要借助cookie才能正常工作。如果客戶端完全禁止cookie,session,這種方法將失效。
4、session在用戶會(huì)話結(jié)束后就會(huì)關(guān)閉了,但cookie因?yàn)楸4嬖诳蛻舳,可以長(zhǎng)期保存。
5、從應(yīng)用角度上說(shuō):session是一個(gè)動(dòng)作狀態(tài)的持續(xù),是一個(gè)會(huì)話,它在服務(wù)器中持續(xù)存在直到不用為止。cookie在后繼的請(qǐng)求中,客戶端將把該信息返回給服務(wù)器,從而確定自己的身份,對(duì)于瀏覽器在反復(fù)訪問(wèn)是保持信息是很有用的。
不用新變量直接交換現(xiàn)有兩個(gè)變理的值?
php的面試題目1.$array["anykey"]和$array[anykey]的區(qū)別?
答:?jiǎn)我?hào)和沒(méi)有單引號(hào)區(qū)別,就是字符串和常量。而單引號(hào)和雙引號(hào)的區(qū)別,就是字符串和變量吧。
不加單引號(hào)的話,php會(huì)首先認(rèn)為他是常量,然后去搜尋是否存在這個(gè)常量,若不存在,則理解為字符串,所以在效率上就慢了。
2.echo輸出語(yǔ)句時(shí)候的連接符號(hào):"."和","。點(diǎn)號(hào)和逗號(hào)的區(qū)別?
答:echo用點(diǎn)號(hào)時(shí)先把語(yǔ)句連接再輸出,而用逗號(hào)就等于給它傳多個(gè)參數(shù),不需要進(jìn)行字符串拼接這一步,效率高!
3.echo,print,print_r的區(qū)別?
答:echo,直接輸出單個(gè)或者多個(gè)字符串,是PHP語(yǔ)句!
print,打印輸出簡(jiǎn)單類型,是PHP函數(shù)!有整型返回值。我試驗(yàn)了下,都返回1。print_r,格式化打印輸出,常用于比較復(fù)雜的類型,如數(shù)組,對(duì)象之類的,可以輸出完整結(jié)構(gòu),是PHP函數(shù),返回值類型為布爾型!
4.獲取前天的日期,格式如:201*-01-1217:15:20
答:echodate("Y-m-dh:i:s",time()-2*24*60*60);
echodate("Y-m-dh:i:s",strtotime("2daysago"));未來(lái)幾天的話把a(bǔ)go去掉就行了
5.如何將字符串翻轉(zhuǎn)過(guò)來(lái)?
答:$str="7654321";
echostrrev($str);//1234567另一種方法:
$strlen=strlen($str);
for($i=1;$i上面8條優(yōu)化的詳細(xì)說(shuō)明請(qǐng)點(diǎn)擊該鏈接查看完全優(yōu)化MySQL數(shù)據(jù)庫(kù)性能的八大巧方法
7.PHP的意思?(送一分)
答:Hypertextpreprocessor超文本預(yù)處理語(yǔ)言。
8.MYSQL取得當(dāng)前時(shí)間的函數(shù)是?格式化日期的函數(shù)是?
答:當(dāng)前日期函數(shù)為NOW();格式化日期函數(shù)是:
SELECTDATE_FORMAT("201*-01-1117:25:36","%H:%i:%s%m/%d/%Y");->17:25:3601/11/201*
其它時(shí)間函數(shù):詳細(xì)請(qǐng)查看該頁(yè)面MySql格式化時(shí)間函數(shù)SELECTDAYOFWEEK("1998-02-03");->3
SELECTWEEKDAY("1997-10-0422:23:00");->5
SELECTWEEKDAY("1997-11-05");->2
SELECTDAYOFMONTH("1998-02-03");->3
SELECTDAYOFYEAR("1998-02-03");->34
SELECTMONTH("1998-02-03");->2
SELECTDAYNAME("1998-02-05");->"February"
SELECTQUARTER("1998-04-01");->2
SELECTWEEK("1998-02-20");->7
SELECTWEEK("1998-02-20",0);->7
SELECTWEEK("1998-02-20",1);->
SELECTYEAR("98-02-03");->1998
SELECTHOUR("10:05:03");->10
SELECTMINUTE("98-02-0310:05:03");->5
SELECTSECOND("10:05:03");->3
SELECTPERIOD_ADD(9801,2);->199803
SELECTPERIOD_DIFF(9802,199703);->11
SELECTTO_DAYS("1997-10-07");->729669
SELECTTO_DAYS(950501);->728779
SELECTFROM_DAYS(729669);->"1997-10-07"
SELECTUNIX_TIMESTAMP("1997-10-0422:23:00");->875996580
SELECTFROM_UNIXTIME(875996580);->"1997-10-0422:23:00"
SELECTSEC_TO_TIME(2378);->00:39:38
SELECTTIME_TO_SEC("00:39:38");->2378
9.怎樣截取中文且不出現(xiàn)亂碼?
答:如果安裝了mb擴(kuò)展可使用mb_substr();可以使用以下函數(shù):
functioncutstr($sourcestr,$startlength,$cutlength){
$returnstr="";$i=0;$n=0;
$str_length=strlen($sourcestr);//字符串的字節(jié)數(shù)while(($n=192){//如果ASCII位高與192,
$returnstr=$returnstr.substr($sourcestr,$i,2);//根據(jù)UTF-8編碼規(guī)范,將2個(gè)連續(xù)的字符計(jì)為單個(gè)字符
$i=$i+2;//實(shí)際Byte計(jì)為2$n++;//字串長(zhǎng)度計(jì)1
}elseif($ascnum>=65&&$ascnum
10.對(duì)于大流量的網(wǎng)站,您采用什么樣的方法來(lái)解決訪問(wèn)量問(wèn)題?
答:①最根本的是服務(wù)器硬件條件。服務(wù)器硬件設(shè)備如果太差,那不管怎么優(yōu)化都是徒勞、趯(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化。主要是減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)量。訪問(wèn)過(guò)多會(huì)造成服務(wù)器CPU過(guò)度消耗,導(dǎo)致服務(wù)器受訪能力嚴(yán)重下降,解決方法是是前臺(tái)使用靜態(tài)或者動(dòng)態(tài)緩存!
③防盜鏈。對(duì)于Apache服務(wù)器,主要是是用model_rewrite模塊通過(guò)對(duì)URL的正則,進(jìn)行限制和重定向!
④控制大文件下載。不提供超過(guò)2MB的文件下載,或使用專門的下載服務(wù)器,或者上傳到web2.0共享網(wǎng)站上。
⑤多主機(jī)分流。將不同文件放置在不同的主機(jī),提供鏡像之類的文件下載方式。⑥是用專業(yè)的流量分析軟件。如google流量分析。對(duì)網(wǎng)站進(jìn)行精細(xì)的流量控制!
11.用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼?
答:客戶端IP獲取$_SERVER["REMOTE_ADDR"];服務(wù)端IP獲取$_SERVER["SERVER_NAME"];
12.如何修改SESSION的生存時(shí)間?
答:$lifeTime=24*3600;
session_set_cookie_params($lifeTime);session_start();
詳細(xì)的設(shè)置請(qǐng)查看這篇文章:PHP對(duì)session生存時(shí)間的設(shè)置詳細(xì)介紹。
13.有一個(gè)網(wǎng)頁(yè)地址,比如PHP研究室主頁(yè):如何得到它的內(nèi)容?
答:$src="";$file="D:\\index.html";
①$content=file_get_contents($src);$hfile=fopen($file,w);
$result=fwrite($hfile,$content);
②$opsrc=fopen($src,r);$wfile=fopen($file,w);
$result=stream_copy_to_stream($opsrc,$wfile);
14.在HTTP1.0中,狀態(tài)碼401的含義是?;如果返回“找不到文件”的提示,則可用header函數(shù),其語(yǔ)句為?
答:①HTTP/1.0401代表:未授權(quán)。②可用header("HTTP/1.0404NotFound");15.在PHP中,heredoc是一種特殊的字符串,它的結(jié)束標(biāo)志必須?
答:
將這段代碼轉(zhuǎn)換為opcodes后.結(jié)果如下:
1:}
print_r($arr);
將看到遍歷數(shù)組后,數(shù)組中每一元素的值都被修改.
在函數(shù)(或方法)傳參中,將一變量作為參數(shù)時(shí),是以引用的方式傳處,還是值的方式傳入,主要表現(xiàn)形式是在sample_call_function($varname)還是sample_call_function(&$varname)上.
從概念上分析,值傳遞是對(duì)內(nèi)容進(jìn)行"拷貝",引用傳遞是用內(nèi)容進(jìn)行"建立快捷方式",所以很多答題答案都講值傳遞要復(fù)制一次內(nèi)存數(shù)據(jù),引用傳遞則省去了這個(gè)消耗,所以更劃算.
但從PHP底層處理方式來(lái)看,這種結(jié)論回答略顯草率了.PHP底層對(duì)于變量?jī)?nèi)存管理是基于常見(jiàn)的copyonwrite(寫時(shí)復(fù)制)和changeonwrite(改變時(shí)復(fù)制).所以對(duì)于
$val="test";
debug_zval_dump($val);
在函數(shù)debug_zval_dump中使用到的$val,并不會(huì)多開(kāi)辟一塊內(nèi)存空間來(lái)存放"test"的內(nèi)容.但對(duì)于
$val="test";$a=&$val;
debug_zval_dump($val);
則又有不同,這時(shí)傳參的$val則會(huì)新開(kāi)辟一塊內(nèi)存空間來(lái)存放"test".這在PHP源碼包,zend_execute.c中有完整的處理流程.
題目三:include和require的區(qū)別是什么?
官方手冊(cè)中對(duì)此的描述是:這兩種結(jié)構(gòu)除了在如何處理失敗之外完全一樣。include()產(chǎn)生一個(gè)警告而require()則導(dǎo)致一個(gè)致命錯(cuò)誤。
這個(gè)解釋其實(shí)已經(jīng)相當(dāng)詳細(xì)了.當(dāng)引用一個(gè)外部文件時(shí),如果這個(gè)文件打開(kāi)出錯(cuò),require將直接中止程序,并拋出一個(gè)FatalError,而include只會(huì)拋出一個(gè)warning,并繼續(xù)執(zhí)行include下面的語(yǔ)句.
另外.我在一些網(wǎng)站上看到過(guò)對(duì)include和require區(qū)別做出的如下解釋:
require()函數(shù)工作方式與XSSI相類似;不管在程序的哪個(gè)部分使用了這個(gè)函數(shù),只有程序一開(kāi)始運(yùn)行,頭文件的內(nèi)容就被作為程序本身的一部分來(lái)處理。因此,如果您在一個(gè)條件判定語(yǔ)句中使用了require()函數(shù),那么即使這個(gè)條件即使不為真,頭文件也會(huì)被包含進(jìn)來(lái)。
而include()函數(shù)只是在執(zhí)行到這一條語(yǔ)句時(shí)才會(huì)把頭文件內(nèi)容包含進(jìn)來(lái)。如果程序沒(méi)運(yùn)行到這里,那PHP是不會(huì)管它的。這就意味著,您在條件判定部分使用include時(shí),它會(huì)完全按照您希望的那樣工作。
那么這條解釋的正確性究竟如何,我們可以做2個(gè)小實(shí)驗(yàn):
文件名:1.php
假設(shè)我們只有1.php,沒(méi)有2.php按照上述說(shuō)法,當(dāng)條件不為真時(shí),文件也被包含進(jìn)來(lái),那么因?yàn)?.php根本不存在,所以必然程序會(huì)報(bào)錯(cuò).但是上述程序的執(zhí)行結(jié)果顯然否定了按上述說(shuō)法進(jìn)行的推理.
第二個(gè)實(shí)驗(yàn),使用工具,查看上述代碼最終生成的opcode:
1:將這兩者比較而言,COOKIE數(shù)據(jù)由于存放在客戶端,減輕了服務(wù)器端存儲(chǔ)方面的壓力.但數(shù)據(jù)的安全性相對(duì)來(lái)說(shuō)就要差一些.所以如果依靠COOKIE存放用戶登錄信息等敏感數(shù)據(jù)時(shí),一定要對(duì)其做加密處理.而SESSION數(shù)據(jù)存放在服務(wù)器端,客戶端本身訪問(wèn)不到直接數(shù)據(jù),安全性相對(duì)COOKIE來(lái)說(shuō)稍稍好一些.但對(duì)服務(wù)器的IO操作及存儲(chǔ)方面會(huì)帶來(lái)一些壓力.尤其是PHP默認(rèn)的SESSION處理機(jī)制,實(shí)際上就是將SESSION數(shù)據(jù)串行化,然后存放到一個(gè)以SESSION_ID為名字的文本文件中,用戶量多的情況下帶來(lái)的開(kāi)銷不容忽視.好在PHP的SESSION機(jī)制是非常靈活的,提供了相應(yīng)方法改變SESSION處理機(jī)制.比如放到memcached里或其它地方:-)這得另開(kāi)文章單獨(dú)講了.
題目一:mysql_pconnect與mysql_connect的區(qū)別在哪里?哪一個(gè)更好這道題涉及到了數(shù)據(jù)庫(kù)長(zhǎng)連接的概念.我們知道,PHP腳本的運(yùn)行機(jī)制,每次使用數(shù)據(jù)庫(kù)之前,都必須使用connect去連接數(shù)據(jù)庫(kù).而web應(yīng)用又是并發(fā)性非常高的應(yīng)用場(chǎng)景,如果同時(shí)有10個(gè)用戶訪問(wèn),便會(huì)有10個(gè)進(jìn)程在運(yùn)行腳本,相應(yīng)的,就會(huì)產(chǎn)生10次數(shù)據(jù)庫(kù)連接.如果有100個(gè)用戶同時(shí)訪問(wèn).那么就自然會(huì)產(chǎn)生100次數(shù)據(jù)庫(kù)連接.這樣便會(huì)有兩個(gè)問(wèn)題產(chǎn)生:1是頻繁建立和撤消數(shù)據(jù)庫(kù)連接.本身的開(kāi)銷就非常大,2是數(shù)據(jù)庫(kù)的同時(shí)連接數(shù)是有限的.如果有1000個(gè)用戶請(qǐng)求同時(shí)要訪問(wèn)數(shù)據(jù)庫(kù).而數(shù)據(jù)庫(kù)只開(kāi)放了最高100個(gè)連接允許的話,那么就有900個(gè)會(huì)進(jìn)入等待或失敗的隊(duì)列.這就好比是,一群搬運(yùn)工往屋里搬東西,每一次都需要開(kāi)門-->搬東西-->關(guān)門的操作,如果有很多搬運(yùn)工同時(shí)搬,每個(gè)人都要執(zhí)行開(kāi)門/關(guān)門這兩步操作的話,顯然是會(huì)產(chǎn)生很大的不必要開(kāi)銷.而且如果這道門能同時(shí)通過(guò)的人數(shù)有限,很多搬運(yùn)工不得不在外等待.
pcconnect的長(zhǎng)連接方式是怎么解決這個(gè)問(wèn)題的呢?
官方手冊(cè)中對(duì)此的描述是:在腳本結(jié)束運(yùn)行時(shí)不關(guān)閉的連接。當(dāng)收到一個(gè)永久連接的請(qǐng)求時(shí)。PHP將檢查是否已經(jīng)存在一個(gè)(前面已經(jīng)開(kāi)啟的)相同的永久連接。如果存在,將直接使用這個(gè)連接;如果不存在,則建立一個(gè)新的連接。所謂“相同”的連接是指用相同的用戶名和密碼到相同主機(jī)的連接。
其機(jī)制無(wú)非是:初次連接數(shù)據(jù)庫(kù)時(shí),便將連接句柄交至父進(jìn)程,子進(jìn)程要使用數(shù)據(jù)庫(kù)連接時(shí),直接將父進(jìn)程手中早已連接好的句柄交給子進(jìn)程,這樣子進(jìn)程的連接就成了一種"虛連接"---它并不用真正去與數(shù)據(jù)庫(kù)通訊,只需要從父進(jìn)程手中拿到已經(jīng)打開(kāi)的連接句柄,這樣就大大節(jié)省了連接/關(guān)閉的開(kāi)銷.另外,多個(gè)子進(jìn)程,共享父進(jìn)程的連接句柄,這樣實(shí)際上數(shù)據(jù)庫(kù)對(duì)外的連接數(shù),只是跟父進(jìn)程之間的個(gè)數(shù),1000個(gè)用戶請(qǐng)求,會(huì)產(chǎn)生1000個(gè)子進(jìn)程,可能只會(huì)產(chǎn)生10個(gè)父進(jìn)程,有10個(gè)數(shù)據(jù)庫(kù)連接.這樣就解決了連接數(shù)的問(wèn)題.
這樣看來(lái).長(zhǎng)連接的確是很不錯(cuò)的方式.從機(jī)理上講好于connect.所以長(zhǎng)連接更好一些.但事實(shí)是并不能這樣簡(jiǎn)單論定的:-),繼續(xù)深入下去.
首先,長(zhǎng)連接的機(jī)制是基于父-子進(jìn)程模式,也就是說(shuō),只能跑于模塊(apache-phpmodule或iis的isapi)方式,不適用于CGI和CLI模式,因?yàn)镃GI和CLI模式都是單獨(dú)進(jìn)程,執(zhí)行完就關(guān)閉,沒(méi)有父進(jìn)程控制.也就談不上長(zhǎng)鏈接.
另外,由于多個(gè)子進(jìn)程共用父進(jìn)程的連接句柄,有時(shí)會(huì)出現(xiàn)一些意外,比如某個(gè)子進(jìn)程由于一些原因,造成一個(gè)連接句柄死鎖,便會(huì)搞得共享這個(gè)句柄的所有其它子進(jìn)程都無(wú)法使用數(shù)據(jù)庫(kù).這時(shí)候只有重啟web服務(wù)才能恢復(fù).
優(yōu)缺點(diǎn)都擺明了出來(lái).至于用哪一個(gè),大家自己根據(jù)情況選擇吧.
題目二:CGI模式,模塊模式與CLI模式運(yùn)行PHP的區(qū)別以CGI方式運(yùn)行時(shí),webserver將用戶請(qǐng)求以消息的方式轉(zhuǎn)交給PHP獨(dú)立進(jìn)程,PHP與web服務(wù)之間無(wú)從屬關(guān)系.
純粹調(diào)用--返回結(jié)果的形式通訊.而模塊方式,則是將PHP做為web-server的子進(jìn)程控制,兩者之間有從屬關(guān)系.最明顯的例子就是在CGI模式下,如果修改了PHP.INI的配置文件,不用重啟web服務(wù)便可生效,而模塊模式下則需要重啟web服務(wù).
CLI則是命令行接口,用于在操作系統(tǒng)命令行模式下執(zhí)行PHP,比如可以直接在win的cmd或linux的shell模式下直接輸入phpa.php來(lái)得到結(jié)果.它與CGI模式最大的不同的地方在于既不會(huì)輸出HTTP頭信息(CGI模式除了輸出用戶能看到的結(jié)果外,還會(huì)輸出用戶不能直接看到的HTTP頭信息),拋出的信息也直接以文本方式而不以HTML方式給出,比如新建一個(gè)test.php,
寫入內(nèi)容,在瀏覽器中可以看到以HTML表格描述的信息,而在命令行輸入phptest.php則會(huì)直接看到純文本的輸出.
題目三:用PHP實(shí)現(xiàn)一個(gè)雙向隊(duì)列?(騰訊公司面試題)上次有人問(wèn)過(guò)我這道題,我個(gè)人認(rèn)為用數(shù)組函數(shù)處理這道題綽足有余了.
以上四個(gè)函數(shù)已實(shí)現(xiàn)雙向隊(duì)列的四個(gè)基本操作.可以寫一個(gè)class將其封裝起來(lái)即可.
題目四:遍歷一個(gè)目錄及其子目錄(新浪公司面試題)與網(wǎng)上普遍給的代碼不同,這道解答,我用了PHP5更安全的scandir函數(shù),以及迭代(foreach)和遞歸.
各位自己研究吧.未負(fù)責(zé)的測(cè)試/經(jīng)驗(yàn)感覺(jué)應(yīng)該比網(wǎng)上普遍的要快一些些.
foreach(scandir($rDir)as$v){
if($v=="."||$v=="..")continue;
is_dir($rDir."/".$v)?$r[$v]=showDir($rDir."/".$v):1;}
return$r;}
print_r(showDir("."));?>
一PHP/MYSQL知識(shí)
1、用PHP打印出前一天的時(shí)間格式是201*-1-188:30:30答案:date("Y-m-dH:i:s",strtotime("-1days"));
2、echo(),print(),print_r()的區(qū)別
答案:echo是PHP語(yǔ)句,print和print_r是函數(shù),語(yǔ)句沒(méi)有返回值,函數(shù)可以有返回值print()只能打印出簡(jiǎn)單類型變量的值(如int,string)print_r()可以打印出復(fù)雜類型變量的值(如數(shù)組,對(duì)象)echo輸出一個(gè)或者多個(gè)字符串
3、能夠使HTML和PHP分離開(kāi)使用的模板,你使用過(guò)什么模板?答案:Smartydiscuz等等他們的原理都是變量替換。
4、你使用過(guò)框架模式嗎?寫出你接觸過(guò)的框架。答案:thinkphpfleaphpqeephpzend等等
5、使用哪些工具進(jìn)行版本控制?答案:最常見(jiàn)的是SVN
6、如何實(shí)現(xiàn)字符串翻轉(zhuǎn)?答案:使用函數(shù)strrev()
7、優(yōu)化MYSQL數(shù)據(jù)庫(kù)的方法。
答案:要點(diǎn):1.數(shù)據(jù)庫(kù)中的表越小,在它上面執(zhí)行的查詢也就會(huì)越快
2.盡量把字段設(shè)置為NOTNULL,這樣在執(zhí)行查詢的時(shí)候,數(shù)據(jù)庫(kù)不用去比較NULL值
3.使用連接(JOIN)來(lái)代替子查詢
4.使用聯(lián)合(UNION)來(lái)代替手動(dòng)創(chuàng)建的臨時(shí)表5.使用外鍵索引
6.對(duì)查詢語(yǔ)句進(jìn)行優(yōu)化8、實(shí)現(xiàn)中文字串截取無(wú)亂碼的方法。
答案:直接使用PHP函數(shù)substr截取中文字符可能會(huì)出現(xiàn)亂碼,解決辦法:1、使用mbstring擴(kuò)展庫(kù)的mb_substr截取就不會(huì)出現(xiàn)亂碼了。2、自己書寫截取函數(shù),但效率不如用mbstring擴(kuò)展庫(kù)來(lái)得高。
3、如果僅是為了輸出截取的串,可用如下方式實(shí)現(xiàn):substr($str,0,30).chr(0)。
二PHP/MYSQL編程
1某內(nèi)容管理系統(tǒng)中,表message有如下字段id文章idtitle文章標(biāo)題content文章內(nèi)容
category_id文章分類idhits點(diǎn)擊量
創(chuàng)建上表,寫出MySQL語(yǔ)句答案:
CREATETABLE`wt_ceshi2`(
`id`INTNOTNULLAUTO_INCREMENTPRIMARYKEY,`title`VARCHAR(127)NOTNULL,`content`VARCHAR(127)NOTNULL,`category_id`INTNOTNULL,`hits`INTNOTNULL)
2同樣上述內(nèi)容管理系統(tǒng):表comment記錄用戶回復(fù)內(nèi)容,字段如下comment_id回復(fù)id
id文章id,關(guān)聯(lián)message表中的idcomment_content回復(fù)內(nèi)容
現(xiàn)通過(guò)查詢數(shù)據(jù)庫(kù)需要得到以下格式的文章標(biāo)題列表,并按照回復(fù)數(shù)量排序,回復(fù)最高的排在最前面
文章id文章標(biāo)題點(diǎn)擊量回復(fù)數(shù)量
用一個(gè)SQL語(yǔ)句完成上述查詢,如果文章沒(méi)有回復(fù)則回復(fù)數(shù)量顯示為0答案:
$sql=mysql_query(“SELECTid,title,hits,count(comment_id)asnumFROMmessageaLEFTJOINcommentbONa.id=b.comment_idORDERBYnumDESC”);While($result=mysql_fetch_array($sql)){
$num=0;
If($result[num])
$num=$result[num];
$dispMemo.=”$result[id].””.$result[title].””.$result[hits].””.$num.””;}
三、PHP程序
1.寫出以下程序的輸出結(jié)果$a=$b>$c?4:5;echo$a;?>
答案:4
2.寫出以下程序的輸出結(jié)果
答案:Hotdogok
四簡(jiǎn)答題
1.在PHP中,當(dāng)前腳本的URL怎么?上一個(gè)頁(yè)面的URL怎么寫?答案:當(dāng)前URL:"http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?".$_SERVER["QUERY_STRING"];上一個(gè)頁(yè)面URL:$_SERVER["HTTP_REFERER"]
2.在HTTP1.0中,狀態(tài)碼401的含義是?如果返回“找不到文件”的提示,則可用header函數(shù),其語(yǔ)句怎么寫?
答案:401表示未授權(quán);header(“HTTP/1.0404NotFound“);
3.數(shù)組函數(shù)arsort的作用是?語(yǔ)句error_reporting()的作用是?
答案:arsort:對(duì)數(shù)組進(jìn)行逆向排序并保持索引關(guān)系error_reporting()的作用是:打印錯(cuò)誤等級(jí)4.寫出一個(gè)正則表達(dá)式,過(guò)慮網(wǎng)頁(yè)上的所有JS/VBS腳本。答案:$script=“以下內(nèi)容不顯示:〈scriptlanguage=’javascript’〉alert(’cc’);〈/script〉“;echopreg_replace(“/〈script[^〉].*?〉.*?〈/script〉/si“,“替換內(nèi)容“,$script);
5.語(yǔ)句include和require都能把另外一個(gè)文件包含到當(dāng)前文件中,它們的區(qū)別是什么?;為了避免多次包含同一文件,可以什么語(yǔ)句來(lái)代替它們?
答案:在如何處理失敗時(shí),include()產(chǎn)生一個(gè)警告而require()則導(dǎo)致一個(gè)致命錯(cuò)誤;require_once()/include_once()
6.類的屬性可以序列化后保存到session中,從而以后可以恢復(fù)整個(gè)類,這要用到的函數(shù)是?
答案:serialize()/unserialize()
7.SQL中LEFTJOIN的含義是什么?如果tbl_user記錄了學(xué)生的姓名(name)和學(xué)號(hào)(ID),tbl_score記錄了學(xué)生(有的學(xué)生考試以后被開(kāi)除了,沒(méi)有其記錄)的學(xué)號(hào)(ID)和考試成績(jī)(score)以及考試科目(subject),要想打印出各個(gè)學(xué)生姓名及對(duì)應(yīng)的的各科總成績(jī),則可以用SQL語(yǔ)句?答案:
自然左外連接
createdatabasephpinterview;usephpinterviewcreatetabletbl_user(
IDintnotnull,namevarchar(50)notnull,primarykey(ID));
createtabletbl_score(
IDintnotnull,scoredec(6,2)notnull,subjectvarchar(20));
insertintotbl_user(ID,name)values(1,beimu);insertintotbl_user(ID,name)values(2,aihui);
insertintotbl_score(ID,score,subject)values(1,90,’語(yǔ)文’);insertintotbl_score(ID,score,subject)values(1,80,’數(shù)學(xué)’);insertintotbl_score(ID,score,subject)values(2,86,’數(shù)學(xué)’);insertintotbl_score(ID,score,subject)values(2,96,’語(yǔ)文’);selectA.id,sum(B.score)assumscorefromtbl_userAleftjointbl_scoreBonA.ID=B.IDgroupbyA.id
8.寫一個(gè)函數(shù),能夠遍歷一個(gè)文件夾下的所有文件和子文件夾。答案:〈?php
functionmy_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;}}
notnull}
closedir($handle);return$files;}}}
print_r(my_scandir(“D:ProgramFilesInternetExplorerMUI“));?〉
9.簡(jiǎn)述論壇中無(wú)限分類的實(shí)現(xiàn)原理。
答案:表中建一個(gè)對(duì)應(yīng)父類的ID,然后進(jìn)行關(guān)聯(lián)。
PHP面試題匯總
面試題1
1、用PHP打印出前一天的時(shí)間格式是201*-5-1022:21:21printdate("Y-m-d",time()-86400);
2、echo(),print(),print_r()的區(qū)別
echo語(yǔ)言結(jié)構(gòu),print/print_r是函數(shù).print是一般性輸出,print_r輸出包含底層類型.
3、能夠使HTML和PHP分離開(kāi)使用的模板
4、如何實(shí)現(xiàn)PHP、JSP交互?
5、使用哪些工具進(jìn)行版本控制?cvs,subversion
6、如何實(shí)現(xiàn)字符串翻轉(zhuǎn)?printstrrev("abc");
7、優(yōu)化MYSQL數(shù)據(jù)庫(kù)的方法。
針對(duì)經(jīng)常用到的關(guān)鍵列多做索引,explain
8、談?wù)勈聞?wù)處理
事務(wù)處理是指連續(xù)性的動(dòng)作不可被打斷的過(guò)程,事務(wù)處理失敗會(huì)撤銷相應(yīng)的影響
9、apachemysqlphp實(shí)現(xiàn)最大負(fù)載的方法
主要是配置文件的優(yōu)化了,另外用linux跑要比用windows跑效果好一點(diǎn)。條件允許的話,將mysql和apache分離開(kāi)不用同一臺(tái)機(jī)器跑也好一點(diǎn)。...軟件角度的提升,不如硬件角度的提升來(lái)得快
10、實(shí)現(xiàn)中文字串截取無(wú)亂碼的方法。mb_substr(’這樣一來(lái)我的字符串就不會(huì)有亂碼了’,0,7,‘utf-8′);中文是gb2312還是utf8?
gb2312和utf8特點(diǎn)判斷下就可以了.
面試題2
var$empty="";var$null=NULL;var$bool=FALSE;var$notSet;
var$array=array();1.
$a=\\"hello\\";$b=&$a;unset($b);$b=\\"world\\";whatis$a?
"hello"2.
$a=1;$x=&$a;$b=$a;whatis$b?13.
$x=empty($array);whatis$x?trueorfalsetrue
4.您是否用過(guò)版本控制軟件?如果有您用的版本控制軟件的名字是?是.cvs,subversion.
5.您是否用過(guò)模板引擎?如果有您用的模板引擎的名字是?是.smarty
6.請(qǐng)簡(jiǎn)單闡述您最得意的開(kāi)發(fā)之作.
7.對(duì)于大流量的網(wǎng)站,您采用什么樣的方法來(lái)解決訪問(wèn)量問(wèn)題?
針對(duì)動(dòng)態(tài)性不強(qiáng)的ye,可以生成靜態(tài)的;交互性強(qiáng)的,沒(méi)多少辦法,我仍然相信性能角度投資軟件不如投資硬件.
8.用PHP寫出顯示客戶端IP與服務(wù)器IP的代碼:
print$_SERVER["remote_addr"].$_SERVER["server_addr"];
面試題3
一、PHP/MySQL編程
1)某內(nèi)容管理系統(tǒng)中,表message有如下字段id文章idtitle文章標(biāo)題content文章內(nèi)容
category_id文章分類idhits點(diǎn)擊量
創(chuàng)建上表,寫出MySQL語(yǔ)句DROPTABLEIFEXISTSmessage;
CREATETABLEIFNOTEXISTSmessage(
idINTNOTNULLAUTO_INCREMENT,
titleVARCHAR(200)NOTNULLDEFAULT"",contentTEXT,
category_idINT,#這里估計(jì)還要改,暫時(shí)放下hitsINT,
PRIMARYKEY(id));
CREATEINDEXmessage_title_indexONmessage(title);
2)同樣上述內(nèi)容管理系統(tǒng):表comment記錄用戶回復(fù)內(nèi)容,字段如下comment_id回復(fù)id
id文章id,關(guān)聯(lián)message表中的idcomment_content回復(fù)內(nèi)容
現(xiàn)通過(guò)查詢數(shù)據(jù)庫(kù)需要得到以下格式的文章標(biāo)題列表,并按照回復(fù)數(shù)量排序,回復(fù)最高的排在最前面
文章id文章標(biāo)題點(diǎn)擊量回復(fù)數(shù)量
用一個(gè)SQL語(yǔ)句完成上述查詢,如果文章沒(méi)有回復(fù)則回復(fù)數(shù)量顯示為0
SELECTm.id,m.title,m.hits,count(comment_id)astotalFROMmessagemLEFTJOINcommentON(m.id=comment.id)GROUPBY(m.id)ORDERBYtotalDESC;
3)上述內(nèi)容管理系統(tǒng),表category保存分類信息,字段如下
category_idint(4)notnullauto_increment;categroy_namevarchar(40)notnull;
用戶輸入文章時(shí),通過(guò)選擇下拉菜單選定文章分類
寫出如何實(shí)現(xiàn)這個(gè)下拉菜單
純javascript(php取出所有分類),javascript/post/php,javascript/ajax/php...
二、PHP文件操作1)
上述內(nèi)容管理系統(tǒng):用戶提交內(nèi)容后,系統(tǒng)生成靜態(tài)HTML頁(yè)面;寫出實(shí)現(xiàn)的基本思路if(!file_exists($html_file)){
ob_start();
$html=ob_get_contents();file_put_contents($file,$html);ob_end_clean;}
header("Location:".$html_file);exit;
2)簡(jiǎn)單描述用戶修改以發(fā)布內(nèi)容的實(shí)現(xiàn)流程和基本思路
三、PHP程序
1)寫出以下程序的輸出結(jié)果
$b=201;
$c=40;
$a=$b>$c?4:5;
echo$a;?>4
2)寫出以下程序的輸出結(jié)果$str=\\"cd\\";
$$str=\\"hotdog\\";
$$str.=\\"ok\\";
echo$cd;?>
hotdogok
面試題4一.簡(jiǎn)答題
1.請(qǐng)說(shuō)明php中傳值與傳引用的區(qū)別。什么時(shí)候傳值什么時(shí)候傳引用?...拷貝消耗比較大時(shí)用引用...
2.在PHP中error_reporting這個(gè)函數(shù)有什么作用?控制錯(cuò)誤輸出級(jí)
3.請(qǐng)寫一個(gè)函數(shù)驗(yàn)證電子郵件的格式是否正確strpos("@",$str)
4.簡(jiǎn)述如何得到當(dāng)前執(zhí)行腳本路徑,包括所得到參數(shù)。
說(shuō)明:例如有一個(gè)腳本,傳給他的參數(shù)有參數(shù)1,參數(shù)2,參數(shù)3.傳遞參數(shù)的方法有可能是GET有可能是POST,那么現(xiàn)在請(qǐng)寫出類似參數(shù)1=值1&參數(shù)2=值2.....的結(jié)果
http://$_SERVER["HTTP_HOST"]$_SERVER["SCRIPT_NAME"]?$_SERVER["QUERY_STRING"]
5.如何修改SESSION的生存時(shí)間.php-i|grepsession
6..有一個(gè)網(wǎng)頁(yè)地址,如何得到它的內(nèi)容?printfile_get_contents("");
7.有一個(gè)一維數(shù)組,里面存儲(chǔ)整形數(shù)據(jù),請(qǐng)寫一個(gè)函數(shù),將他們按從大到小的順序排列。要求執(zhí)行效率高。并說(shuō)明如何改善執(zhí)行效率。(該函數(shù)必須自己實(shí)現(xiàn),不能使用php函數(shù))算法問(wèn)題不考慮.要效率寫c去.
8.請(qǐng)舉例說(shuō)明在你的開(kāi)發(fā)過(guò)程中用什么方法來(lái)加快頁(yè)面的加載速度。
二.數(shù)據(jù)庫(kù)設(shè)計(jì)題:
面試題5
1.在PHP中,當(dāng)前腳本的名稱(不包括路徑和查詢字符串)記錄在預(yù)定義變量(1)中;而鏈接到當(dāng)前頁(yè)面的URL記錄在預(yù)定義變量(2)中。$_SERVER["PHP_SELF"]$_SERVER["HTTP_REFERER"];
2.執(zhí)行程序段將輸出__0__.
3.在HTTP1.0中,狀態(tài)碼401的含義是(4);如果返回“找不到文件”的提示,則可用header函數(shù),其語(yǔ)句為(5)。
查查RFC就知道了.header("Status:...");
4.數(shù)組函數(shù)arsort的作用是(6);語(yǔ)句error_reporting(2047)的作用是(7)。數(shù)組排序后反轉(zhuǎn)并保持key相關(guān).開(kāi)啟全部出錯(cuò)輸出,E_ALL
5.PEAR中的數(shù)據(jù)庫(kù)連接字符串格式是(8)。類似:mysql://user:pass@host/database
6.寫出一個(gè)正則表達(dá)式,過(guò)慮網(wǎng)頁(yè)上的所有JS/VBS腳本(即把script標(biāo)記及其內(nèi)容都去掉):(9)。
$re="|]*>(.*)|i";
$content=preg_replace($re,"$1",$content);
7.以Apache模塊的方式安裝PHP,在文件http.conf中首先要用語(yǔ)句(10)動(dòng)態(tài)裝載PHP模塊,然后再用語(yǔ)句(11)使得Apache把所有擴(kuò)展名為php的文件都作為PHP腳本處理。LoadModulemodule_php5modules/libphp5.soAddTypeapplication/x-httpd-php.php
8.語(yǔ)句include和require都能把另外一個(gè)文件包含到當(dāng)前文件中,它們的區(qū)別是(12);為了避免多次包含同一文件,可以用語(yǔ)句(13)來(lái)代替它們。
當(dāng)文件不存在時(shí),一個(gè)warning,一個(gè)error..............._once
9.類的屬性可以序列化后保存到session中,從而以后可以恢復(fù)整個(gè)類,這要用到的函數(shù)是(14)。unserialize
10.一個(gè)函數(shù)的參數(shù)不能是對(duì)變量的引用,除非在php.ini中把(15)設(shè)為on.
11.SQL中LEFTJOIN的含義是(16)。如果tbl_user記錄了學(xué)生的姓名(name)和學(xué)號(hào)(ID),tbl_score記錄了學(xué)生(有的學(xué)生考試以后被開(kāi)除了,沒(méi)有其記錄)的學(xué)號(hào)(ID)和考試成績(jī)(score)以及考試科目(subject),要想打印出各個(gè)學(xué)生姓名及對(duì)應(yīng)的的各科總成績(jī),則可以用SQL語(yǔ)句(17)。
SELECTu.name,SUM(s.score)AStotal_scoreFROMtbl_useruLEFTJOINtbl_scoresON(u.ID=s.ID)GROUPBYu.ID;
12.在PHP中,heredoc是一種特殊的字符串,它的結(jié)束標(biāo)志必須(18)。print(4,‘哈哈’),
(5,‘66333666′);*/
//指定分類id變量$category_id,然后返回該分類的所有子類//$default_category為默認(rèn)的選中的分類
functionGet_Category($category_id=0,$level=0,$default_category=0){
global$DB;
$sql=“SELECT*FROMcategoryORDERBYcategoryIDDESC”;$result=$DB->query($sql);
while($rows=$DB->fetch_array($result)){
$category_array[$rows[categoryParentID]][$rows[categoryID]]=$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“0){
echo“>”.str_repeat(”“,$level).””.$category["name"].“\\n”;}else{
echo“>”.$category["name"].“\\n”;}
Get_Category($key,$level+1,$default_category);}
unset($category_array[$category_id]);
array(id=>}/*
函數(shù)返回的數(shù)組格式如下所示:Array(
[1]=>Array([id]=>1[name]=>一級(jí)類別[level]=>0[ParentID]=>0)[4]=>Array([id]=>4[name]=>二級(jí)類別[level]=>1[ParentID]=>1)[9]=>Array([id]=>9[name]=>哈哈[level]=>2[ParentID]=>4)[3]=>Array([id]=>3[name]=>二級(jí)類別[level]=>1[ParentID]=>1)[8]=>Array([id]=>8[name]=>aqqqqqd[level]=>2[ParentID]=>3)[2]=>Array([id]=>2[name]=>二級(jí)類別[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]=>三級(jí)類別[level]=>2[ParentID]=>2)[10]=>Array([id]=>10[name]=>66333666[level]=>3[ParentID]=>5))*/
//指定分類id,然后返回?cái)?shù)組
functionCategory_array($category_id=0,$level=0){
global$DB;
$sql=“SELECT*FROMcategoryORDERBYcategoryIDDESC”;$result=$DB->query($sql);
while($rows=$DB->fetch_array($result)){
$category_array[$rows["categoryParentID"]][$rows["categoryID"]]=$rows;}
foreach($category_arrayAS$key=>$val){
if($key==$category_id){
foreach($valAS$k=>$v){
$options[$k]=array(
‘id=>$v["categoryID"],name=>$v["categoryName"],levelParentID=>$v["categoryParentID"]);
$children=Category_array($k,$level+1);
if(count($children)>0)
=>$level,{
$options=$options+$children;}}}}
unset($category_array[$category_id]);return$options;}?>
}
foreach($arr[$category_id]AS$key=>$cate){
if($cate["id"]==$default_category){
$txt=“0){
$txt1=“>”.str_repeat(“-”,$level).””.$cate["name"].“\\n”;}else{
$txt1=“>”.$cate["name"].“\\n”;}
$val=$txt.$txt1;echo$val;
self::Get_Category($key,$level+1,$default_category);}}
functiongetFlush($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“”;$c=newcate();
//$c->Get_Category();
$ttt=$c->getFlush($id,’0′,’3′);echo$ttt;
echo“”;?>
15.設(shè)計(jì)一個(gè)網(wǎng)頁(yè),使得打開(kāi)它時(shí)彈出一個(gè)全屏的窗口,該窗口中有一個(gè)文本框和一個(gè)按鈕。用戶在文本框中輸入信息后點(diǎn)擊按鈕就可以把窗口關(guān)閉,而輸入的信息卻在主網(wǎng)頁(yè)中顯示。window.open,
onClick=opener.close()
面試題6
有一表menu(mainmenu,submenu,url),請(qǐng)用遞歸法寫出一樹(shù)形菜單,將所有的menu列出來(lái)。showMenu($menu="mainmenu"){
print$menu;
$sql=\\"SELECTsubmenuFROMmenuWHEREmainmenu=$menu\\";//getsubmenuintoarray$menusforeach($menusas$menu){
showMenu($menu);}}
可以加個(gè)$level,也可以把輸出放到數(shù)組里
面試題7
1-給你三個(gè)數(shù),寫程序求出其最大值。
print$a>$b?($a>$c?$a:$c):($b>$c?$b:$c);
2-談?wù)刟sp,php,jsp的優(yōu)缺點(diǎn)
3-談?wù)剬?duì)mvc的認(rèn)識(shí)
4-寫出發(fā)貼數(shù)最多的十個(gè)人名字的SQL,利用下表:members(id,username,posts,pass,email)
SELECTusername,COUNT(posts)AStotal_postFROMmembersGROUPBYidORDERBYtotal_postDESCLIMIT10;
面試題8
1-如何通過(guò)javascript判斷一個(gè)窗口是否已經(jīng)被屏蔽。
要判斷open方法所打開(kāi)的窗口時(shí),就按open()的值來(lái)進(jìn)行判斷。
如果要判斷原窗口被屏蔽,用opener屬性來(lái)判斷,opener.closed如果為true,就是主窗口關(guān)閉了。
2-寫出session的運(yùn)行機(jī)制
放個(gè)cookie保存session_id,在sessen.save_path里放個(gè)SESS_(session_id)的文件保存serialize過(guò)的數(shù)據(jù)
3-有一數(shù)組$a=array(4,3,8,9,2);請(qǐng)將其重新排序,按從小到大的順序列出。sort($a);
printimplode(\\"\\n\\",$a);
4-防止SQL注射漏洞一般用_____函數(shù)。settypeaddslashes
5-查詢?cè)诰人數(shù),并能處理異常掉線的SQL?....WHERE________
友情提示:本文中關(guān)于《PHP程序員招聘試卷》給出的范例僅供您參考拓展思維使用,PHP程序員招聘試卷:該篇文章建議您自主創(chuàng)作。
來(lái)源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問(wèn)題,請(qǐng)聯(lián)系我們及時(shí)刪除。