摘要:以下題目和解析分別來源于我的新書程序員面試筆試寶典程序員面試筆試真題解析。類通過一個簡單的外部接口與外界發生關系,對象與對象之間通過消息進行通信。真題獲得實例化對象所屬類名字的函數是。
以下題目和解析分別來源于我的新書《PHP程序員面試筆試寶典》、《PHP程序員面試筆試真題解析》。
1、PHP常考基礎
1、PHP與ASP、JSP有什么區別?
ASP全名Active Server Pages,是一個基于Windows平臺的Web服務器端的開發環境,利用它可以產生和運行動態的、交互的、高性能的Web服務應用程序,它只能在微軟平臺上使用,移植性不好。ASP采用腳本語言VB Script、JScript(JavaScript)作為自己的開發語言。國內早期大部分網站都用它來開發。但因微軟全面轉向,ASP.NET放棄了ASP的Web開發模式,所以現在已經被淘汰使用。
PHP是一種跨平臺的服務器端的嵌入式腳本語言。它大量地借用C、Java和Perl語言的語法,并耦合PHP自己的特性,使Web開發者能夠快速地寫出動態生成頁面。它可嵌入HTML中,非常適合Web開發,而且它支持目前絕大多數數據庫。除此以外,PHP是完全免費的,不用花錢,開發人員就可以從PHP官方站點(http://www.php.net)自由下載。而且開發人員可以不受限制地獲得源碼,甚至可以從中加入自己需要的特色,開發效率高,成本低。
JSP是Sun公司推出的一種網絡編程語言,跨平臺運行,安全性高,運行效率也高。它的開發語言主要基于Java。
ASP、JSP、PHP三者都提供在 HTML 代碼中混合某種程序代碼、由語言引擎解釋執行,但JSP代碼被編譯成 Servlet并由Java虛擬機解釋執行,這種編譯操作僅在對JSP頁面的第一次請求時發生。在ASP、PHP、JSP環境下,HTML代碼主要負責描述信息的顯示樣式,而程序代碼則用來描述處理邏輯。普通的HTML頁面只依賴于Web服務器,而ASP、PHP、JSP頁面需要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被重新嵌入HTML代碼中,然后一起發送給瀏覽器。ASP、PHP、JSP三者都是面向 Web 服務器的技術,客戶端瀏覽器不需要任何附加的軟件支持。
2、在PHP中,單引號和雙引號所包圍的字符串的區別是( )。
A.單引號解析其中rt等轉義字符,而雙引號不解析
B.雙引號速度快,單引號速度慢
C.單引號速度快,雙引號速度慢
D.雙引號解析其中以$開頭的變量,而單引號不解析
參考答案:D。
分析:雙引號是可以解析$符開頭的變量和轉義字符的,而單引號不解析也不轉義字符。所以,選項A錯誤,選項D正確。
對于選項B和選項C,由于題目中明確說了引號內包含的是字符串,因此不需要對變量進行解析,在這種情況下雙引號和單引號的效率是相同的。選項B和選項C都是錯誤的。
3、面向對象與面向過程有什么區別?
面向對象是當今軟件開發方法的主流方法之一,它是把數據及對數據的操作方法放在一起,作為一個相互依存的整體,即對象。對同類對象抽象出其共性,即類,類中的大多數數據,只能被本類的方法進行處理。類通過一個簡單的外部接口與外界發生關系,對象與對象之間通過消息進行通信。程序流程由用戶在使用中決定。例如,站在抽象的角度,人類具有身高、體重、年齡、血型等一些特稱,人類會勞動、會直立行走、會吃飯、會用自己的頭腦去創造工具等這些方法,人類僅僅只是一個抽象的概念,它是不存在的實體,但是所有具備人類這個群體的屬性與方法的對象都稱為人,這個對象人是實際存在的實體,每個人都是人這個群體的一個對象。
而面向過程是一種以事件為中心的開發方法,就是自頂向下順序執行,逐步求精,其程序結構是按功能劃分為若干個基本模塊,這些模塊形成一個樹狀結構,各模塊之間的關系也比較簡單,在功能上相對獨立,每一模塊內部一般都是由順序、選擇和循環三種基本結構組成,其模塊化實現的具體方法是使用子程序,而程序流程在寫程序時就已經決定。例如五子棋,面向過程的設計思路就是首先分析問題的步驟:第一步,開始游戲;第二步,黑子先走;第三步,繪制畫面;第四步,判斷輸贏;第五步,輪到白子;第六步,繪制畫面;第七步,判斷輸贏;第八步,返回步驟二;第九步,輸出最后結果。把上面每個步驟用分別的函數來實現,就是一個面向過程的開發方法。
具體而言,二者主要有以下幾個方面的不同之處。
1)出發點不同。面向對象是用符合常規思維方式來處理客觀世界的問題,強調把問題域的要領直接映射到對象及對象之間的接口上。而面向過程方法則不然,它強調的是過程的抽象化與模塊化,它是以過程為中心構造或處理客觀世界問題的。
2)層次邏輯關系不同。面向對象方法則是用計算機邏輯來模擬客觀世界中的物理存在,以對象的集合類作為處理問題的基本單位,盡可能地使計算機世界向客觀世界靠攏,以使問題的處理更清晰直接,面向對象方法是用類的層次結構來體現類之間的繼承和發展。面向過程方法處理問題的基本單位是能清晰準確地表達過程的模塊,用模塊的層次結構概括模塊或模塊間的關系與功能,把客觀世界的問題抽象成計算機可以處理的過程。
3)數據處理方式與控制程序方式不同。面向對象方法將數據與對應的代碼封裝成一個整體,原則上其他對象不能直接修改其數據,即對象的修改只能由自身的成員函數完成,控制程序方式上是通過“事件驅動”來激活和運行程序。而面向過程方法是直接通過程序來處理數據,處理完畢后即可顯示處理結果,在控制程序方式上是按照設計調用或返回程序,不能自由導航,各模塊之間存在著控制與被控制、調用與被調用。
4)分析設計與編碼轉換方式不同。面向對象方法貫穿軟件生命周期的分析、設計及編碼之間是一種平滑過程,從分析到設計再到編碼是采用一致性的模型表示,即實現的是一種無縫連接。而面向過程方法強調分析、設計及編碼之間按規則進行轉換,貫穿軟件生命周期的分析、設計及編碼之間,實現的是一種有縫的連接。
4、在PHP中,自定義一個類的方式是( )。
A.
B.
C.
D.
參考答案:B。
分析:定義一個類是使用class關鍵字加類名來定義的,定義格式為:class 類名{}。實例化一個類的格式為:$object=new 類名();。
【真題11】 獲得實例化對象所屬類名字的函數是( )。
A.get_class() B.get_object_vars()
C.get_class_methods() D.get_classname()
參考答案:A。
分析:對于選項A,get_class()函數用于返回一個對象的類的名稱。所以,選項A正確。
對于選項B,get_object_vars()函數用于得到給定對象的屬性。所以,選項B錯誤。
對于選項C,get_class_methods()函數用于獲取類方法的名字。所以,選項C錯誤。
對于選項D,PHP中沒有該方法。所以,選項D錯誤。
5、以下有關PHP面向對象的說法中,不正確的是( )。
A.要實現一個接口,使用 implements操作符,類中必須實現接口中定義的所有方法,否則會報一個致命錯誤
B.類名可以是任何非 PHP保留字的合法標簽,漢字也可以作為PHP的類名
C.如果PHP的子類中定義了構造函數,則創建子類的對象時,會隱式地調用其父類的構造函數
D.序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字
參考答案:C。
分析:子類定義的構造函數會覆蓋父類的構造函數,如果要子類的構造函數執行,同時也執行父類的構造函數,那么必須顯式地使用parent::__construct();去調用。所以,選項C錯誤。
6、下面關于PHP抽象類的描述中,錯誤的是( )。
A.PHP中抽象類使用abstract關鍵字定義
B.沒有方法體的方法叫抽象方法,包含抽象方法的類必須是抽象類
C.抽象類中必須有抽象方法,否則不叫抽象類
D.抽象類不能實例化,也就是不可以new成對象
參考答案:C。
分析:抽象類可以是個空類,也就是不一定需要有抽象方法。但抽象方法只能存在抽象類中。所以,選項C錯誤。
7、什么是多態?
多態是面向對象程序設計中代碼重用的一個重要機制,它表示當同一個操作作用在不同的對象的時候,會有不同的語義,從而會產生不同的結果。例如,同樣是“+”操作,3+4用來實現整數相加,而“3”+“4”卻實現了字符串的連接。一般而言,多態有兩種實現方式:覆蓋和重載。
8、 include與require有什么區別?
require和include有著相似的功能:將指定文件中的所有代碼/文本/標記復制到使用require或include語句的文件中。通常被用在數據、文件或代碼需要被共享的場景。通過把需要被共享的代碼或數據放到一個多帶帶PHP文件中,在需要使用的文件中通過require或include來引用。require()和include()也不是真正的函數,因此,require()和include()語句也可以不加圓括號而直接加參數。
9、下列代碼的輸出是( )。
A.Error B.5 C.10 D.15
參考答案:B。
分析:在PHP中,define函數用于定義一個常量,而常量的值在設定以后,是無法更改的。本題中,x的值始終為5。所以,選項B正確。
10、如何對變量進行引用?
可以在變量的前面加&符號對變量進行引用,變量的引用相當于給變量起了個別名,通過不同的名字訪問同一個變量內容,所以改變其中一個變量的值,另一個變量也會跟著改變。
【真題54】 有如下代碼:
程序的運行結果為( )
A.hello B.world C.NULL D.unset
參考答案:A。
分析:這個代碼的執行過程如下圖所示。
1)首先執行$b= &$a后,a和b引用同一個字符串變量“hello”。
2)接著執行unset($b),這個函數可以斷開這個引用關系。此時由于a仍然指向字符串“hello”,也就是說,這個字符串仍然被a使用,因此這個字符串不會被回收。
3)接著執行$b="world",此時,b指向一個新的字符串“world”,這并不會影響a的值。因此輸出結果為hello。
2、PHP常考進階
11、請寫一個函數驗證電子郵件的格式是否正確。
參考答案:
function checkEmail($email) { $pregEmail= "/^([0-9A-Za-z-_.]+)@([0-9a-z]+.[a-z]{2,3}(.[a-z]{2})?)$/i"; return preg_match($pregEmail,$email); }
分析:首尾兩個斜杠/是正則表達式的限定符,這是Perl正則的標準,而PHP與Perl有相同的正則的規范。兩個斜杠之間表示的是正則內容,后面的i表示忽略大小寫。
這個正則表達式表示的含義如下:
1)必須以([0-9A-Za-z-_.]+)開頭,也就是說,郵件地址以多個字母、數組、“-”或“.”開頭。
2)緊接著是字符“@”。
3)然后接著是多個字母或數字的字符串,接著是一個字符“.”,接著是兩個或三個字母;然后接下來一部分可有可無的:一個“.”后面跟著兩個字母。
4)郵件的結束符是滿足3)的字符串。
12、以下可以匹配中國居民身份證號碼的正則表達式是( )。
A.d{15} B.d{18}
C.d D.(^d{15}$)|(^d{18}$)|(^d{17}(d|X|x)$)
參考答案:D。
分析:d表示0~9任意數字。
13、【真題96】 一個函數的參數不能是對變量的引用,除非在php.ini中把( )設為on。
參考答案:allow_call_time_pass_reference。
分析:在PHP函數調用的時候,基本數據類型默認會使用值傳遞,而不是引用傳遞。allow_call_time_pass_reference?選項的作用為是否啟用在函數調用時強制參數被按照引用傳遞。如果把allow_call_time_pass_reference?配置為on,那么在函數調用的時候會默認使用引用傳值。但是不推薦使用這種方法,原因是該方法在未來的版本中很可能不再支持。如果想使用引用傳遞,那么推薦在函數調用的時候顯式地使用&進行引用傳遞。
14、文件讀操作
讀取文件前,通常會判斷文件能否讀取,例如,是否有讀權限,可以使用is_readable函數;示例代碼如下:
當然也需要判斷文件是否存在,可以使用file_exists()函數。示例代碼如下:
讀取文件的方法有很多種,此處列舉最常用的按行讀取方法,示例代碼如下:
需要注意的是,讀取文件的length參數是可選項,如果忽略,則將繼續從流中讀取數據直到行結束。指定最大行的長度在利用資源上更為有效。此外,還有fread、file_get_contents等讀取文件的方法,此處不再贅述。
15、什么是異常處理與錯誤處理?
當運行的程序發生異常被拋出時,程序不會繼續執行異常處后面的代碼,PHP 會嘗試查找匹配的“catch”代碼塊。如果異常沒有被捕獲,那么將會發生嚴重的錯誤,程序會終止或者不受控制地執行。示例代碼如下:
10) { throw new Exception("Exception ocur"); } return true; } GetNum(100); ?>
程序的運行結果為
Uncaught exception "Exception" with message "Exception ocur"
從這個例子可以看出,如果不對異常進行處理,那么當程序有異常拋出的時候就會結束執行。而對于對象方法的異常處理,還有另外一種處理方法,下面介紹在PHP中當調用一些不存在的對象方法時的異常處理,從而保證程序正常運行。這主要是通過__call方法來實現的。
方法聲明為__call($funname,$arr_value),當被調用方法不存在的時候會默認調用這個方法。
示例代碼如下:
class My { function __call($n,$v) { echo "錯誤的方法名:".$n; echo "錯誤的參數:".$v; } }
16、什么是內存管理?
內存管理主要是指程序運行時對計算機內存資源的分配、使用和釋放等技術,內存管理的目標是高效、快速地分配內存同時及時地釋放和回收內存資源。內存管理主要包括是否有足夠的內存供程序使用,從內存池中獲取可用內存,使用后及時銷毀并重新分配給其他程序使用。
在PHP開發過程中,如果遇到大數組等操作,那么可能會造成內存溢出等問題。一些常見的處理方法如下:
1)通過ini_set("memory_limit","64M")方法重置php可以使用的內存大小,一般在遠程主機上是不能修改php.ini文件的,只能通過程序設置。注:在safe_mode(安全模式)下,ini_set會失效。
2)另一方面可以對數組進行分批處理,及時銷毀無用的變量,盡量減少靜態變量的使用,在需要數據重用時,可以考慮使用引用(&)。同時對于數據庫、文件操作完要及時關閉,對象使用完要及時調用析構函數等。
3)及時使用unset()函數釋放變量,使用時需要注意以下兩點:
① unset()函數只能在變量值占用內存空間超過256字節時才會釋放內存空間。
② 只有當指向該變量的所有變量都銷毀后,才能成功釋放內存。
17、與MySQL一樣,Redis在使用過程中,也會碰到很多的問題,適當的技巧和優化將大大提高Redis的使用性能,提高服務的質量。現將常見的一些問題總結如下:
1.停止使用keys *操作
keys*操作執行速度將會變慢。因為keys命令的時間復雜度是O(n),其中n是要返回的keys的個數,由此可見這個命令的復雜度就取決于數據量的大小了。當數據量比較大時,在這個操作執行期間,其他任何命令在實例中都無法執行,嚴重影響了性能。
可以使用scan命令來代替,scan命令通過增量迭代的方式來掃描數據庫。
2.定位Redis速度降低的原因
使用INFO commandstats命令來查看所有命令的統計情況,如命令執行了多少次,執行命令所耗費的毫秒數等信息。
18、Memcache的特征和特性
Memcache的特征如下:
1)協議簡單。
2)基于libevent的事件處理。
3)內置內存存儲方式。
4)Memcached不互相通信的分布式。
Memcache的特性如下:
(1)單個item 最大的數據為1MB。
(2)單進程最大的使用內存為2GB,需要更多內存時可開多個端口。
(3)Memcached是多線程,非阻塞io復用的網絡模型,Redis是單線程。
(4)鍵長最大為250字節。
19、下面可以用于服務器共享session的方式有( )。
A.利用NFS共享Session數據 B.基于數據庫的Session共享
C.基于Cookie的Session共享 D.使用類似BIG-IP的負載設備來實現資源共享
參考答案:A、B、C、D。
分析:共享Session的方式主要有以下幾種:
1)基于NFS的Session共享。NFS(Network? File System)最早由Sun公司為解決Unix網絡主機間的目錄共享而研發。僅需將共享目錄服務器mount到其他服務器的本地session目錄即可。
2)基于數據庫的Session共享。
3)基于Cookie的Session共享。原理是將全站用戶的Session信息加密、序列化后以Cookie的方式,統一種植在根域名下(如:.host.com),利用瀏覽器訪問該根域名下的所有二級域名站點時,會傳遞與之域名對應的所有Cookie內容的特性,從而實現用戶的Cookie化Session 在多服務間的共享訪問。
4)基于緩存(Memcache)的Session共享。Memcache是一款基于Libevent多路異步I/O技術的內存共享系統,簡單的key + value數據存儲模式使得代碼邏輯小巧高效,因此在并發處理能力上占據了絕對優勢,目前能達到2000/s平均查詢,并且服務器CPU消耗依然不到10%。
所以,本題的答案為A、B、C、D。
20、如何預防各類安全性問題?
常見的安全性問題主要包括以下方面:
1)SQL注入攻擊。所謂SQL注入式攻擊,就是攻擊者把SQL命令插入Web表單的域或頁面請求的查詢字符串中,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。例如,對于一個站點http://www.shuaiqi100.com/New...,id是查詢參數,通過id獲取顯示某條信息,在JSP程序中,用SQL語句來讀取該條新聞:“select * from news where id =”+ id,正常執行的話,只需要將id替換為參數2即可,沒有任何問題,但是當非法用戶將id的參數變為id=2;drop database news時,則執行的SQL語句除了讀取對應的新聞信息外,還會執行drop database news信息,可是后面這條語句是非法的。
由于SQL注入攻擊利用的是合法的SQL語句,使得這種攻擊不能被防火墻檢查,而且由于對任何基于SQL語言標準的數據庫都適用,所以危害特別大。盡管如此,目前防止SQL注入攻擊的方法也非常多,具體而言,有以下一些方法:使用預處理語句和參數分別發送到數據庫服務器進行解析,參數將會被當作普通字符處理。使用這種方式后,攻擊者無法注入惡意的SQL。那么如何防止SQL注入攻擊呢,下面介紹常用的一些方法:
① 預處理語句和參數分別發送到數據庫服務器進行解析。
② 使用函數addslashes()轉義提交的內容。
③ PHP配置文件中開啟magic_quotes_gpc=on;將自動轉換用戶查詢的SQL語句,對防止SQL注入有重大作用。
④ 在PHP配置文件中,將register_globals設置為off,關閉全局變量注冊。
⑤ 在PHP配置文件中,開啟安全模式safe_mode=on;。
⑥ SQL語句的書寫盡量不要省略小引號與單引號。
⑦ 提高數據庫表和字段的命名技巧,對一些重要的字段根據程序的特點命名,取不易被猜到的名字。
⑧ 控制錯誤信息,關閉錯誤信息的輸出,將錯誤信息寫到日志文件中,不要在網站暴露錯誤信息。
2)數據庫操作安全問題。例如,未對用戶的權限進行限制,update、delete、insert等誤操作造成系統安全性問題。
解決方法為給不同的用戶授不同的權限,這樣能夠保證只有有權限的用戶才能進行特定的操作。
3)沒有驗證用戶http請求方式。惡意的用戶可以模擬http對網站進行請求產生惡意攻擊,為了防止這種攻擊需要檢查用戶的http請求中的訪問來源是否可信,對http頭中的referer進行過濾,只允許本域站點訪問。
4)沒有驗證表單來源的唯一性,不能識別是合法的表單提交還是黑客偽造的表單提交。
為了防止黑客偽造表單提交,可以使用一次性令牌Token。通過服務器端以某種策略生成隨機字符串作為令牌保存在Session里,然后發出請求的頁面時,把該令牌以隱藏域一類的形式,與其他信息一并發出,在接收頁面中把接收到的信息中的令牌與Session中的令牌比較,一致才處理請求,否則拒絕請求,以此保證表單的來源唯一,防止黑客偽造的表單提交。
21、PHP的開發框架有哪些?
CodeIgniter是一個輕量級的PHP開發框架,具有快速開發、靈活性高等優點,它特別適合互聯網公司的快速迭代場景,因此很受歡迎,據說騰訊、去哪兒網等應用場景都使用了這個框架。CodeIgniter具有動態實例化、松耦合、組件單一性等很多優點。動態實例化是指組件的導入和函數在執行時才會生效。松耦合是指系統模塊之間的關聯依賴很少,確保系統具有很好的重用性和靈活性。框架內的類和功能都是高度自治的,具有非常好的組件單一性。
在CodeIgniter中,模型代表數據結構,包含取出、插入、更新數據庫的這些功能。視圖通常是一個網頁,但是在CodeIgniter中,一個視圖也可以是一個頁面片段,如頭部、頂部HTML代碼片段。它還可以是一個RSS頁面,或其他任一頁面。控制器相當于一個指揮者,或者說是一個“中介”,它負責聯系視圖和模型,以及其他任何處理HTTP請求和產生網頁的資源。
Zend Framework是完全基于PHP語言的針對Web應用開發的框架,與眾多的其他PHP開發框架相比,Zend Framework是一個PHP“官方”的框架,它由Zend公司負責開發和維護。Zend Framework同樣基于MVC模式,Zend Framework采用了ORM(Object Relational Mapping,對象關系映射)思路,這是一種為了解決面向對象編程與關系數據庫存在的互不匹配現象的技術。簡單地說,這種技術將數據庫中的一個表映射為程序中的一個對象,表中的字段映射為對象的屬性,然后通過提供的方法完成對數據庫的操作。就這一點而言,Zend Framework很相似于現在流行的非PHP的開發框架Ruby on Rails。
ThinkPHP是一個快速、兼容而且簡單的輕量級國產PHP開發框架,誕生于2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,其遵循Apache2開源協議發布,從Struts結構移植過來并做了改進和完善,同時也借鑒了國外很多優秀的框架和模式,使用面向對象的開發結構和MVC模式,融合了Struts的思想和TagLib(標簽庫)、RoR的ORM映射和ActiveRecord模式。
此外,還有FleaPHP、CakePHP等很多優秀的框架,此處就不一一列舉,它們本質上都是基于MVC的架構,下面著重介紹一下在互聯網公司使用比較廣泛的CI框架。
3、PHP+mysql
1、問題:設教務管理系統中有三個基本表:
學生信息表S(SNO, SNAME, AGE, SEX),其屬性分別表示學號、學生姓名、年齡和性別。
選課信息表SC(SNO, CNO, SCGRADE),其屬性分別表示學號、課程號和成績。
課程信息表C(CNO, CNAME, CTEACHER),其屬性分別表示課程號、課程名稱和任課老師姓名。
1)把SC表中每門課程的平均成績插入另外一個已經存在的表SC_C(CNO, CNAME, AVG_GRADE)中,其中AVG_GRADE表示的是每門課程的平均成績。
INSERT INTO SC_C(CNO, CNAME, AVG_GRADE)
SELECT SC.CNO, C.CNAME, AVG(SCGRADE) FROM SC, C WHERE SC.CNO = C.CNO GROUP BY SC.CNO
2)規定女同學選修何昊老師的課程成績都應該在80分以上(包含80分)。
ALERT TABLE SC, S, C
ADD CONSTRAINT GRADE CHECK(SCGRADE>=80)
WHERE SC.CNO=C.CNO AND SC.SNO=S.SNO AND C.CTEACHER="何昊" AND S.SEX=
"女"
3)從SC表中把何昊老師的女學生選課記錄刪除。
DELETE FROM SC WHERE CNO=(SELECT CNO FROM C WHERE C.CTEACHER ="何昊") AND SNO IN (SELECT SNO FROM S WHERE SEX="女")
4)找出沒有選修過“何昊”老師講授課程的所有學生姓名。
SELECT SNAME FROM S
WHERE NOT EXISTS(
SELECT * FROM SC,C WHERE SC.CNO=C.CNO AND CNAME="何昊" AND SC.SNO=S.SNO)
5)列出有兩門以上(含兩門)不及格課程(成績小于60)的學生姓名及其平均成績。
SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,( SELECT SNO FROM SC WHERE SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2)A WHERE S.SNO=A.SNO AND SC.SNO = A.SNO GROUP BY S.SNO,S.SNAME
6)列出既學過“1”號課程,又學過“2”號課程的所有學生姓名。
SELECT S.SNO,S.SNAME
FROM S,(SELECT SC.SNO FROM SC,C
WHERE SC.CNO=C.CNO AND C.CNAME IN("1","2")
GROUP BY SNO HAVING COUNT(DISTINCT CNO)=2
)SC WHERE S.SNO=SC.SNO
7)列出“1”號課成績比“2”號同學該門課成績高的所有學生的學號。
SELECT S.SNO,S.SNAME
FROM S,(
SELECT SC1.SNO
FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME="1"
AND SC2.CNO=C2.CNO AND C2.NAME="2"
AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO
8)列出“1”號課成績比“2”號課成績高的所有學生的學號及其“1”號課和“2”號課的成績。
SELECT S.SNO,S.SNAME,SC.[1號課成績],SC.[2號課成績]
FROM S,( SELECT SC1.SNO,[1號課成績]=SC1.SCGRADE,[2號課成績]=SC2.SCGRADE
FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME="1"
AND SC2.CNO=C2.CNO AND C2.NAME="2"
AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO
2、UNION和UNION ALL有什么區別?
UNION在進行表求并集后會去掉重復的元素,所以會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。
而UNION ALL只是簡單地將兩個結果合并后就返回。因此,如果返回的兩個結果集中有重復的數據,那么返回的結果集就會包含重復的數據。
從上面的對比可以看出,在執行查詢操作的時候,UNION ALL要比UNION快很多,所以,如果可以確認合并的兩個結果集中不包含重復的數據,那么最好使用UNION ALL。例如,如下有兩個學生表Table1和Table2。
Table1
C1 C2
1 1
2 2
3 3
Table2
C1 C2
3 3
4 4
1 1
select from Table1 union select from Table2 的查詢結果為
C1 C2
1 1
2 2
3 3
4 4
select from Table1 union all select from Table2 的查詢結果為
C1 C2
1 1
2 2
3 3
3 3
4 4
1 1
3、什么是數據庫三級封鎖協議?
眾所周知,基本的封鎖類型有兩種:排它鎖(X鎖)和共享鎖(S鎖)。所謂X鎖是事務T對數據A加上X鎖時,只允許事務T讀取和修改數據A。所謂S鎖是事務T對數據A加上S鎖時,其他事務只能再對數據A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。若事務T對數據對象A加了S鎖,則T就可以對A進行讀取,但不能進行更新(S鎖因此又稱為讀鎖),在T釋放A上的S鎖以前,其他事務可以再對A加S鎖,但不能加X鎖,從而可以讀取A,但不能更新A。
在運用X鎖和S鎖對數據對象加鎖時,還需要約定一些規則,例如,何時申請X鎖或S鎖、持鎖時間、何時釋放等,稱這些規則為封鎖協議(Locking Protocol)。對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議。一般使用三級封鎖協議,也稱為三級加鎖協議。該協議是為了保證正確的調度事務的并發操作。三級加鎖協議是事務在對數據庫對象加鎖、解鎖時必須遵守的一種規則。下面分別介紹這三級封鎖協議。
一級封鎖協議:事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。事務結束包括正常結束(COMMIT)和非正常結束(ROLLBACK)。一級封鎖協議可以防止丟失修改,并保證事務T是可恢復的。使用一級封鎖協議可以解決丟失修改問題。在一級封鎖協議中,如果僅僅是讀數據不對其進行修改,是不需要加鎖的,它不能保證可重復讀和不讀“臟”數據。
二級封鎖協議:一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,讀完后方可釋放S鎖。二級封鎖協議除防止了丟失修改,還可以進一步防止讀“臟”數據。但在二級封鎖協議中,由于讀完數據后即可釋放S鎖,所以它不能保證可重復讀。
三級封鎖協議:一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,直到事務結束才釋放。三級封鎖協議除防止了丟失修改和不讀“臟”數據外,還進一步防止了不可重復讀。
4、以下關于mysql_pconnect的說法中,正確的是( )。
A.與數據庫進行多連接 B.與mysql_connect功能相同
C.與@mysql_connect功能相同 D.與數據庫建立持久連接
參考答案:D。
分析:mysql_pconnect()函數打開一個到 MySQL 服務器的持久連接。
mysql_pconnect()和mysql_connect()非常相似,雖然只多了一個p,但它們有兩個主要區別:當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接標識而不打開新連接。其次,當腳本執行完畢后到SQL服務器的連接不會被關閉,此連接將保持打開以備以后使用(mysql_close()不會關閉由mysql_pconnect()建立的連接)。所以,選項D正確。
【真題204】 PDO通過執行SQL查詢與數據庫進行交互,可以分為多種不同的策略,使用哪一種方法取決于你要做什么操作。如果向數據庫發送DML語句,那么下面最合適的方式是( )。
A.使用PDO對象中的exec()方法
B.使用PDO對象中的query()方法
C.使用PDO對象中的prepare()和PDOStatement對象中的execute()兩個方法結合
D.以上方式都可以
參考答案:A。
分析:PDO->exec()方法主要是針對沒有結果集合返回的操作,例如INSERT、UPDATE、DELETE 等操作,它返回的結果是當前操作影響的列數。所以,選項A正確。
5、PHP的mysql系列函數中常用的遍歷數據的函數是( )。
A.mysql_fetch_row,mysql_fetch_assoc,mysql_affetced_rows
B.mysql_fecth_row,mysql_fecth_assoc,mysql_affetced_rows
C.mysql_fetch_rows,mysql_fetch_array,mysql_fetch_assoc
D.mysql_fecth_row,mysql_fecth_array,mysql_fecth_assoc
參考答案:D。
分析:最常用的mysql系列函數常用的遍歷數據函數有mysql_fetch_row、mysql_fetch_ array和mysql_fetch_assoc等三個函數,但不存在mysql_fetch_rows。
所以,本題的答案為D。
6、更改表字段名的標準語法為( )。
A.alter table 表名 add 字段字類型[first|after]
B.alter table 表名 drop 字段[first|after]
C.alter table 表名 change 原名新名新類型[first|after]
D.alter table 表名 modify 原名字段類型[first|after]
參考答案:C。
分析:修改表字段名的語法:alter table 表名change 原字段名新字段名類型;。
修改字段類型的語法:alter table 表名modify 字段名類型;。
增加一個字段:alter table 表名add column 字段名類型 not null(或default null);新增一個字段默認不為空(默認為空)。
刪除一個字段:alter table 表名drop column 新字段名;。
更多的PHP面試真題可以關注公眾號“琉憶編程庫”獲取。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29792.html
摘要:程序員面試筆試真題解析歷時一年,由機械工業出版社出版,在年月問世。讓你在面試時順利的通過這些相關的真題現免費送出本程序員面試筆試真題解析,具體參與規則如下在本文下留言即可參與,并且一個用戶的多次留言只算作一次。 考慮到近期是面試找工作潮,想搞個小活動。你好,是我琉憶。 《 PHP 程序員面試筆試真題解析》歷時一年,由機械工業出版社出版,在 2018 年 11 月問世。本書的適用群體:剛...
摘要:個人也建議不要滿足于自己當下所知道的,多去拓展自己,多去學新的東西。作為一個面試者來說,知識點的記憶準備為的是更好的應對面試中技術面中問到的各種問題。 你好,是我琉憶——PHP程序員面試筆試系列圖書的作者。 隨著越來越多的人開始邁入PHP開發工程師的隊列,不管是一個PHP新手還是一個有一兩年開發經驗的PHPer都不得不去面對找工作前面試這件事。 我現在以個人對面試的經歷和見解來全面的對...
摘要:自己整理了一篇不同等級面試都問什么的文章,關注公眾號琉憶編程庫,回復等級,我發給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內存數據庫常考的專題。本周一和周三更新的文章路徑:PHP面試常考內容之Memcache和Redis(1)PHP面試常考內容之Memcache和Redis(2)本周(2019.2-18至...
摘要:自己整理了一篇不同等級面試都問什么的文章,關注公眾號琉憶編程庫,回復等級,我發給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內存數據庫常考的專題。本周一和周三更新的文章路徑:PHP面試常考內容之Memcache和Redis(1)PHP面試常考內容之Memcache和Redis(2)本周(2019.2-18至...
閱讀 1671·2021-09-26 10:00
閱讀 2935·2021-09-06 15:00
閱讀 3537·2021-09-04 16:40
閱讀 2297·2019-08-30 15:44
閱讀 714·2019-08-30 10:59
閱讀 1882·2019-08-29 18:34
閱讀 3615·2019-08-29 15:42
閱讀 2292·2019-08-29 15:36