PHP面試基礎題目php
雙引號解釋變量,單引號不解釋變量css
雙引號裏插入單引號,其中單引號裏若是有變量的話,變量解釋html
雙引號的變量名後面必需要有一個非數字、字母、下劃線的特殊字符,或者用{}講變量括起來,不然會將變量名後面的部分當作一個總體,引發語法錯誤前端
雙引號解釋轉義字符,單引號不解釋轉義字符,可是解釋'\和\\mysql
能使單引號字符儘可能使用單引號,單引號的效率比雙引號要高(由於雙引號要先遍歷一遍,判斷裏面有沒有變量,而後再進行操做,而單引號則不須要判斷)git
$_GET ----->get傳送方式web
$_POST ----->post傳送方式面試
$_REQUEST ----->能夠接收到get和post兩種方式的值算法
$GLOBALS ----->全部的變量都放在裏面sql
$_FILES ----->上傳文件使用
$_SERVER ----->系統環境變量
$_SESSION ----->會話控制的時候會用到
$_COOKIE ----->會話控制的時候會用到
HTTP定義了與服務器交互的不一樣的方法,最基本的是POST、GET、PUT、DELETE,與其比不可少的URL的全稱是資源描述符,咱們能夠這樣理解:url描述了一個網絡上資源,而post、get、put、delegate就是對這個資源進行增、刪、改、查的操做!
get是把參數數據隊列加到提交表單的action屬性所指的url中,值和表單內各個字段一一對應,從url中能夠看到;post是經過HTTPPOST機制,將表單內各個字段與其內容防止在HTML的head中一塊兒傳送到action屬性所指的url地址,用戶看不到這個過程
對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據
get傳送的數據量較小,post傳送的數據量較大,通常被默認不受限制,但在理論上,IIS4中最大量爲80kb,IIS5中爲1000k,get安全性很是低,post安全性較高
GET請求會向數據庫發索取數據的請求,從而來獲取信息,該請求就像數據庫的select操做同樣,只是用來查詢一下數據,不會修改、增長數據,不會影響資源的內容,即該請求不會產生反作用。不管進行多少次操做,結果都是同樣的。
與GET不一樣的是,PUT請求是向服務器端發送數據的,從而改變信息,該請求就像數據庫的update操做同樣,用來修改數據的內容,可是不會增長數據的種類等,也就是說不管進行多少次PUT操做,其結果並無不一樣。
POST請求同PUT請求相似,都是向服務器端發送數據的,可是該請求會改變數據的種類等資源,就像數據庫的insert操做同樣,會建立新的內容。幾乎目前全部的提交操做都是用POST請求的。
DELETE請求顧名思義,就是用來刪除某一個資源的,該請求就像數據庫的delete操做。
Hypertext Preprocessor----超文本預處理器
Personal Home Page 原始名稱
目標用途: 容許web開發人員快速編寫動態生成的web頁面,與其餘頁面相比,PHP是將程序嵌入到HTML文檔中去執行,效率比徹底生成HTML編輯的CGI高不少
HTML: Hypertext Markup Language
創始人: 拉姆斯勒·勒多夫Rasmus Lerdorf,1968年生,加拿大滑鐵盧大學
勒多夫最開始是爲了維護我的網頁,用prel語言寫了維護程序,以後又用c進行了重寫,最終衍生出php/fi
時間軸:
1995.06.08將PHP/FI公開釋出
1995 php2.0,加入了對MySQL的支持
1997 php3.0
2000 php4.0
2008 php5.0
因爲php6.0沒有徹底解決Unicode編碼,因此基本沒有生產線上的應用,基本只是一款概念產品,不少功能已經在php5.3.3和php5.3.4上實現
常見的IDE(Intergrated Development Environment): 集成開發環境
Coda(mac)
PHPStrom
Adobe Dreamweaver
NetBeans
常見文本編輯器,具有代碼高亮:
NodePad++
SublimeText
PHP特性:
php獨特混合了C,Java,Prel以及PHP自創的語法
能夠比CGI或者Prel更快速去執行動態網頁,與其餘變成語言相比,PHP是講程序嵌入到HTML文檔中去執行,執行效率比徹底生成HTML編輯的CGI要高不少,全部的CGI都能實現
支持幾乎全部流行的數據庫以及操做系統
PHP可使用C,C++進行程序的擴展
PHP優點:
開放源代碼
免費性
快捷性
跨平臺強
效率高
圖形處理
面向對象
專業專一
PHP技術應用:
靜態頁面生成
數據庫緩存
過程緩存
p+css w3c標準
大負荷
分佈式
flex
支持MVC
Smarty模塊引擎
初級 IFE:Index Front Engineer 前端工程師
中級 IPE:Index PHP Engineer PHP工程師
高級 IAE:Index Architecture Engineer 架構工程師
1
2
3
4
|
*
echo
、print是php語句,var_dump和print_r是函數
*
echo
輸出一個或多個字符串,中間以逗號隔開,沒有返回值是語言結構而不是真正的函數,所以不能做爲表達式的一部分使用
* print也是php的一個關鍵字,有返回值 只能打印出簡單類型變量的值(如int,string),若是字符串顯示成功則返回
true
,不然返回
false
* print_r 能夠打印出複雜類型變量的值(如數組、對象)以列表的形式顯示,並以array、object開頭,但print_r輸出布爾值和NULL的結果沒有意義,由於都是打印
"\n"
,所以var_dump()函數更適合調試
* var_dump() 判斷一個變量的類型和長度,並輸出變量的數值
|
常見的HTTP狀態碼:
200 - 請求成功
301 - 資源(網頁等)被永久轉義到其餘URL
404 - 請求的資源(網頁等)不存在
505 - 內部服務器錯誤
HTTP狀態碼分類:
1** - 信息,服務器收到的請求,須要請求者繼續執行操做
2** - 成功,操做被成功接收並處理
3** - 重定向,須要進一步的操做以完成請求
4** - 客戶端錯誤,請求包含語法錯誤或者沒法完成請求
5** 服務器錯誤,服務器在處理請求的過程
中發生了錯誤
魔術引號是一個將自動將進入PHP腳本的數據進行轉義的過程,最好在編碼時不要轉義而在運行時根據須要而轉義
客戶端:$_SERVER["REMOTE_ADDR"];或者getenv('REMOTE_ADDR')
ip2long進行轉換
服務器端:gethostbyname('www.baidu.com')
cvs、svn、vss、git
選取最適用的字段屬性,儘量減小定義字段寬度,儘可能把字段設置NOTNULL,例如'省份'、'性別'最好適用ENUM
使用鏈接(JOIN)來代替子查詢
適用聯合(UNION)來代替手動建立的臨時表
事務處理
鎖定表、優化事務處理
適用外鍵,優化鎖定表
創建索引
優化查詢語句
Smarty:Smarty算是一種很老的PHP模板引擎了,它曾是我使用這門語言模板的最初選擇。雖然它的更新已經不算頻繁了,而且缺乏新一代模板引擎所具備的部分特性,可是它仍然值得一看。
確認服務器硬件是否可以支持當前的流量
數據庫讀寫分離,優化數據表
程序功能規則,禁止外部的盜鏈
控制大文件的下載
使用不一樣主機分流主要流量
require是無條件包含,也就是若是一個流程里加入require,不管條件成立與否都會先執行require,當文件不存在或者沒法打開的時候,會提示錯誤,而且會終止程序執行
include有返回值,而require沒有(可能由於如此require的速度比include快),若是被包含的文件不存在的化,那麼會提示一個錯誤,可是程序會繼續執行下去
注意:包含文件不存在或者語法錯誤的時候require是致命的,而include不是
require_once表示了只包含一次,避免了重複包含
由模型、視圖、控制器完成的應用程序,由模型發出要實現的功能到控制器,控制器接收組織功能傳遞給視圖
變量默認老是傳值賦值,那也就是說,當將一個表達式的值賦予一個變量時,整個表達式的值被賦值到目標變量,這意味着:當一個變量的賦予另一個變量時,改變其中一個變量的值,將不會影響到另一個變量
php也提供了另一種方式給變量賦值:引用賦值。這意味着新的變量簡單的引用(換言之,成爲了其別名或者指向)了原始變量。改動的新的變量將影響到原始變量,反之亦然。使用引用賦值,簡單地將一個&符號加到將要賦值的變量前(源變量)
對象默認是傳引用
對於較大是的數據,傳引用比較好,這樣能夠節省內存的開銷
isset 判斷變量是否認義或者是否爲空
1
2
3
|
變量存在返回ture,不然返回
false
變量定義不賦值返回
false
unset
一個變量,返回
false
變量賦值爲null,返回
false
|
empty:判斷變量的值是否爲空,能轉換爲false的都是空,爲空返回true,反之返回false。
1
2
|
""
,0,
"0"
,NULL,FALSE都認爲爲空,返回
true
沒有任何屬性的對象都認爲是空
|
is_null:檢測傳入的值(值、變量、表達式)是否爲null
1
2
|
定義了,可是賦值爲Null
定義了,可是沒有賦值
unset
一個變量
|
Firefox的firebug
Chrome的開發工具
Emmet
JSON格式校驗工具
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏全部記錄的引用指針。
普通索引(由關鍵字KEY或INDEX定義的索引)的惟一任務是加快對數據的訪問速度。
普通索引容許被索引的數據列包含重複的值。若是能肯定某個數據列將只包含彼此各不相同的值,在爲這個數據列建立索引的時候就應該用關鍵字UNIQUE把它定義爲一個惟一索引。也就是說,惟一索引能夠保證數據記錄的惟一性。
主鍵,是一種特殊的惟一索引,在一張表中只能定義一個主鍵索引,主鍵用於惟一標識一條記錄,使用關鍵字 PRIMARY KEY 來建立。
索引能夠覆蓋多個數據列,如像INDEX(columnA, columnB)索引,這就是聯合索引。
索引能夠極大的提升數據的查詢速度,可是會下降插入、刪除、更新表的速度,由於在執行這些寫操做時,還要操做索引文件。
事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做完成,事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。ACID 四大特性,原子性、隔離性、一致性、持久性。
XSS是跨站腳本攻擊,首先是利用跨站腳本漏洞以一個特權模式去執行攻擊者構造的腳本,而後利用不安全的Activex控件執行惡意的行爲。
使用htmlspecialchars()函數對提交的內容進行過濾,使字符串裏面的特殊符號實體化。
SQL注入產生的緣由:程序開發過程當中不注意規範書寫sql語句和對特殊字符進行過濾,致使客戶端能夠經過全局變量POST和GET提交一些sql語句正常執行。
開啓配置文件中的magic_quotes_gpc 和 magic_quotes_runtime設置
執行sql語句時使用addslashes進行sql語句轉換
Sql語句書寫儘可能不要省略雙引號和單引號。
過濾掉sql語句中的一些關鍵詞:update、insert、delete、select、 * 。
提升數據庫表和字段的命名技巧,對一些重要的字段根據程序的特色命名,取不易被猜到的。
Php配置文件中設置register_globals爲off,關閉全局變量註冊
控制錯誤信息,不要在瀏覽器上輸出錯誤信息,將錯誤信息寫到日誌文件中。
命令注入(Command Injection)
eval 注入(Eval Injection)
客戶端腳本攻擊(Script Insertion)
跨網站腳本攻擊(Cross Site Scripting, XSS)
SQL 注入攻擊(SQL injection)
跨網站請求僞造攻擊(Cross Site Request
Forgeries, CSRF)
Session 會話劫持(Session Hijacking)
Session 固定攻擊(Session Fixation)
HTTP 響應拆分攻擊(HTTP Response Splitting)
文件上傳漏洞(File Upload Attack)
目錄穿越漏洞(Directory Traversal)
遠程文件包含攻擊(Remote Inclusion)
動態函數注入攻擊(Dynamic Variable
Evaluation)
URL 攻擊(URL attack)
表單提交欺騙攻擊(Spoofed Form
Submissions)
HTTP 請求欺騙攻擊(Spoofed HTTP Requests)
多口就是經過訪問不一樣的文件來完成用戶請求。單一入口只 web 程序全部的請求都指向一個腳本文件的。
單一入口更容易控制權限,方便對 http 請求能夠進行安全性檢查。
缺點:URL 看起來不那麼美觀,特別是對搜索引擎來講不友好。
快速訪問數據表中的特定信息,提升檢索速度
建立惟一性索引,保證數據庫表中每一行數據的惟一性。
加速表和表之間的鏈接
使用分組和排序子句進行數據檢索時,能夠顯著減小查詢中分組和排序的時間
負面影響:
建立索引和維護索引須要耗費時間,這個時間隨着數據量的增長而增長;索引須要佔用物理空間,不光是表須要佔用數據空間,每一個索引也須要佔用物理空間;當對錶進行增、刪、改、的時候索引也要動態維護,這樣就下降了數據的維護速度。
在最頻繁使用的、用以縮小查詢範圍的字段上創建索引。
在頻繁使用的、須要排序的字段上創建索引
對於查詢中不多涉及的列或者重複值比較多的列,不宜創建索引。
對於一些特殊的數據類型,不宜創建索引,好比文本字段(text)等。
區別於其餘數據庫的最重要的特色就是其插件式的表存儲引擎。切記:存儲引擎是基於表的,而不是數據庫。
InnoDB與MyISAM的區別:
InnoDB存儲引擎: 主要面向OLTP(Online Transaction Processing,在線事務處理)方面的應用,是第一個完整支持ACID事務的存儲引擎(BDB第一個支持事務的存儲引擎,已經中止開發)。
特色:
行鎖設計、支持外鍵;
支持相似於Oracle風格的一致性非鎖定讀(即:默認狀況下讀取操做不會產生鎖);
InnoDB將數據放在一個邏輯的表空間中,由InnoDB自身進行管理。從MySQL4.1版本開始,能夠將每一個InnoDB存儲引擎的表單獨存放到一個獨立的ibd文件中;
InnoDB經過使用MVCC(多版本併發控制:讀不會阻塞寫,寫也不會阻塞讀)來得到高併發性,而且實現了SQL標準的4種隔離級別(默認爲REPEATABLE級別);
InnoDB還提供了插入緩衝(insert buffer)、二次寫(double write)、自適應哈希索引(adaptive hash index)、預讀(read ahead)等高性能和高可用的功能;
InnoDB採用了彙集(clustered)的方式來存儲表中的數據,每張標的存儲都按主鍵的順序存放(若是沒有顯式的在建表時指定主鍵,InnoDB會爲每一行生成一個6字節的ROWID,並以此做爲主鍵);
InnoDB表會有三個隱藏字段:除了上面提到了6字節的DB_ROW_ID外,還有6字節的DB_TX_ID(事務ID)和7字節的DB_ROLL_PTR(指向對應回滾段的地址)。這個能夠經過innodb monitor看到;
MyISAM存儲引擎: 是MySQL官方提供的存儲引擎,主要面向OLAP(Online Analytical Processing,在線分析處理)方面的應用。特色:
不支持事務,支持表所和全文索引。操做速度快;
MyISAM存儲引擎表由MYD和MYI組成,MYD用來存放數據文件,MYI用來存放索引文件。MySQL數據庫只緩存其索引文件,數據文件的緩存交給操做系統自己來完成;
MySQL5.0版本開始,MyISAM默認支持256T的單表數據;
先說什麼是交叉鏈接: 交叉鏈接又叫笛卡爾積,它是指不使用任何條件,直接將一個表的全部記錄和另外一個表中的全部記錄一一匹配。
內鏈接 則是隻有條件的交叉鏈接,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出如今結果集中,即內鏈接只鏈接匹配的行。外鏈接 其結果集中不只包含符合鏈接條件的行,並且還會包括左表、右表或兩個表中
的全部數據行,這三種狀況依次稱之爲左外鏈接,右外鏈接,和全外鏈接。
左外鏈接,也稱左鏈接,左表爲主表,左表中的全部記錄都會出如今結果集中,對於那些在右表中並無匹配的記錄,仍然要顯示,右邊對應的那些字段值以NULL來填充。右外鏈接,也稱右鏈接,右表爲主表,右表中的全部記錄都會出如今結果集中。左鏈接和右鏈接能夠互換,MySQL目前還不支持全外鏈接。
MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、
Archive、CSV、Blackhole、MaxDB 等等十幾個引擎
面向對象是程序的一種設計模式,它利於提升程序的重用性,使程序機構更加清晰。 主要特徵是:封裝、繼承、多態。
五大基本原則: 單一職責原則;開放封閉原則;替換原則; 依賴原則; 接口分離原則。
參考答案:
靜態路由是由系統管理員設計與構建的路由表規定的路由。適用於網關數量有限的場 合,且網絡拓樸結構不常常變化的網絡。其缺點是不能動態地適用網絡情況的變化,當 網絡情況變化後必須由網絡管理員修改路由表。
動態路由是由路由選擇協議而動態構建的,路由協議之間經過交換各自所擁有的路由信 息實時更新路由表的內容。動態路由能夠自動學習網絡的拓樸結構,並更新路由表。其 缺點是路由廣播更新信息將佔據大量的網絡帶寬。
Memcahce 是把全部的數據保存在內存當中,採用 hash 表的方式,每條數據由 key 和 value 組成,每一個 key 是獨一無二的,當要訪問某個值的時候先按照找到值,而後返回結果。
Memcahce 採用 LRU 算法來逐漸把過時數據清除掉。
流行的 Ajax 框架有 jQuery,Prototype,Dojo,MooTools。
Ajax 的工做原理是一個頁面的指定位置能夠加載另外一個頁面全部的輸出內容,這樣就實現了一個靜態頁面也能獲取到數據庫中的返回數據信息了。因此 Ajax 技術實現了一個靜態網頁在不刷新整個頁面的狀況下與服務器通訊,減小了用戶等待時間,同時也從而下降了網絡流量,加強了客戶體驗的友好程度。
在使用 Ajax 時,涉及到數據傳輸,即將數據從服務器返回到客戶端,服務器端和客戶端分別使用不一樣的腳步語言來處理數據,這就須要一種通用的數據格式,XML 和 json 就是最經常使用的兩種,而 json 比 XML 更簡單。
事務是用戶定義的一個數據庫操做序列,這些操做要麼全作要麼全不作,是一個不可分割的工做單位,事務回滾是指將該事務已經完成的對數據庫的更新操做撤銷。
要同時修改數據庫中兩個不一樣表時,若是它們不是一個事務的話,當第一個表修改完,可能第二個表修改過程當中出現了異常而沒能修改,此時就只有第二個表依舊是未修改以前的狀態,而第一個表已經被修改完畢。而當你把它們設定爲一個事務的時候,當第一個表修改完,第二表修改出現異常而沒能修改,第一個表和第二個表都要回到未修改的狀態,這就是所謂的事務回滾。