1. 程式人生 > >近期去面試php實習生遇到不熟悉的問題

近期去面試php實習生遇到不熟悉的問題

1. 陣列轉json,json轉陣列

json_encode 是 陣列轉json
json_decode 是 json轉陣列
js函式和php語言的資料想通時,把陣列或物件都轉成json,
一個兩個語言都認識的中間語言來使用,


encode是轉碼,把陣列或物件轉成這個特殊的碼json供js使用
decode是解碼,把這個特殊的碼json解開成陣列或物件供php使用
使用方法:
json_encode(array/object)
json_decode(json)

 

json主要分為兩種形式

1.物件

物件是一個無序的“‘名稱/值’對”集合。一個物件以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。

 {" ":" ",  " ":" "}   

2.陣列:

陣列是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。

['' ", '' ''] 

 

*如果PHP陣列的鍵都是數字,那麼json_encode()返回一個數組形式的Json,如果PHP陣列的鍵全是字串。那麼json_encode()就會返回一個物件形式的Json。


2.php如何接收post,get資料

 

get(顯式提交)是提交的資訊會出現在url中,而且資料要在2M以內。當然在url(href=““)中直接提交的資訊也算是get提交。目前這種提交方式僅限於用於提交不是特別重要的資訊。

post(隱式提交)是提交的資訊不會出現在url中,只有以瀏覽器開發者模式檢視時能看到提交的資訊的名稱(也看不見值) 。這種方式提交用於一些重要的資訊的提交(比如密碼等)。

 

如何接收?

原生方法

1 $id    =  $_GET['id']; // 獲取get變數
2 $name  =  $_POST['name'];  // 獲取post變數
3 $value =  $_SESSION['var']; // 獲取session變數
4 $name  =  $_COOKIE['name']; // 獲取cookie變數
5 $file  =  $_SERVER['PHP_SELF']; //
獲取server變數

tp3:I('變數型別.變數名/修飾符',['預設值'],['過濾方法'],['額外資料來源'])

 

I('get.id') //返回get中的id
I('post.id')//返回post中的id

I('get.')//返回get獲得的所有
I('post.')//返回post獲得的所有

tp5:

Request::instance()->post('name'); // 獲取某個post變數
Request::instance()->post(); // 獲取經過過濾的全部post


//助手函式
input('post.name');
input('post.');

 

 

3.sql查詢原生語句,sql引擎,sql索引,sql優化

這道題問的我完全懵逼,sql的引擎索引優化完全不知道

 

 

一 原生語句

建立表 CREATE DATABASE db1

刪除表  drop database db1

資料表中記錄的查詢,刪除,修改,插入—資料操縱語言(SELECT,DELETE,UPDATE,INSERT)

查詢:select 欄位 from  表 where 條件 

插入: insert into table1(field1,field2) values(value1,value2)

刪除:delete from table1 where 條件

更新: update table1 set field1=value1 where 範圍

查詢:select * from table1 where field1 like ’%value1%’ 

排序:select * from table1 order by field1,field2 [desc]、

總數:select count * as totalcount from table1

 

使用外連線

A、left  join:
左連線:結果集包括連線表的匹配行,也包括左連線表的所有行。

這就是LEFT JOIN 將兩個表連線起來,根據某個條件查詢,並將左邊表的資料全部顯示,右邊表顯示符合查詢條件的資料, 不足的地方顯示null

select a.content, b.name FROM
motion as a
LEFT JOIN
banner as b
ON a.id = b.id

 


B:right  join:
右連線:同左連線相反,結果集既包括連線表的匹配連線行,也包括右連線表的所有行。

 

C:INNER JOIN 只顯示兩個表符合條件的資料

實現分頁

select id,actor_id,content,time FROM motion
WHERE actor_id = 3
ORDER BY time
limit 0,8

 

 

二,sql引擎

 

最常使用的2種儲存引擎:
1.Myisam是Mysql的預設儲存引擎,當create建立新表時,未指定新表的儲存引擎時,預設使用Myisam。每個MyISAM在磁碟上儲存成三個檔案。檔名都和表名相同,副檔名分別是.frm(儲存表定義)、.MYD(MYData,儲存資料)、.MYI(MYIndex,儲存索引)。資料檔案和索引檔案可以放置在不同的目錄,平均分佈io,獲得更快的速度。


2.InnoDB儲存引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比Myisam的儲存引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留資料和索引。

 

MyIASM引擎是為了查和增加,效率高。所有功能都圍繞這這個

Innodb引擎功能更強(事務等)效率低一些。

*MyISAM 發音為 "my-z[ei]m";
*InnoDB 發音為 "in-no-db" 

 

三,sql索引

索引用於快速找出在某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多,如果表中查詢的列有一個索引,MySQL能夠快速到達一個位置去搜索資料檔案,而不必檢視所有資料,那麼將會節省很大一部分時間。

       例如:有一張person表,其中有2W條記錄,記錄著2W個人的資訊。有一個Phone的欄位記錄每個人的電話號碼,現在想要查詢出電話號碼為xxxx的人的資訊。

          如果沒有索引,那麼將從表中第一條記錄一條條往下遍歷,直到找到該條資訊為止。

          如果有了索引,那麼會將該Phone欄位,通過一定的方法進行儲存,好讓查詢該欄位上的資訊時,能夠快速找到對應的資料,而不必在遍歷2W條資料了。其中MySQL中的索引的儲存型別有兩種:BTREE、HASH。 也就是用樹或者Hash值來儲存該欄位,要知道其中詳細是如何查詢的,就需要會演算法的知識了。我們現在只需要知道索引的作用,功能是什麼就行

      優點:

       2、所有的MySql列型別(欄位型別)都可以被索引,也就是可以給任意欄位設定索引

       3、大大加快資料的查詢速度

      缺點:

       1、建立索引和維護索引要耗費時間,並且隨著資料量的增加所耗費的時間也會增加

       2、索引也需要佔空間,我們知道資料表中的資料也會有最大上線設定的,如果我們有大量的索引,索引檔案可能會比資料檔案更快達到上線值

       3、當對錶中的資料進行增加、刪除、修改時,索引也需要動態的維護,降低了資料的維護速度。

      使用原則:

            通過上面說的優點和缺點,我們應該可以知道,並不是每個欄位度設定索引就好,也不是索引越多越好,而是需要自己合理的使用。

       1、對經常更新的表就避免對其進行過多的索引,對經常用於查詢的欄位應該建立索引,

       2、資料量小的表最好不要使用索引,因為由於資料較少,可能查詢全部資料花費的時間比遍歷索引的時間還要短,索引就可能不會產生優化效果。

       3、在一同值少的列上(欄位上)不要建立索引,比如在學生表的"性別"欄位上只有男,女兩個不同值。相反的,在一個欄位上不同值較多可是建立索引。

*暫時我先記住索引是什麼是幹啥用的,等真正要用的時候再去學習如何使用

 

四,sql優化

1、選取最適用的欄位屬性、

根據欄位值,選取最適合該欄位屬性大小的欄位屬性,儘量把欄位設定為NOTNULL

對於某些文字欄位,例如“省份”或者“性別”,我們可以將它們定義為ENUM型別。因為在MySQL中,ENUM型別被當作數值型資料來處理,而數值型資料被處理起來的速度要比文字型別快得多

.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by涉及的列上建立索引。
  2.應儘量避免在 where 子句中使用 !=或<> 操作符,否則將引擎放棄使用索引而進行全表掃描。
  3.應儘量避免在 where 子句中對欄位進行 null 值 判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
  select id from t where num is null
  可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:
  select id from t where num=0
  4.應儘量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
  select id from t where num=10 or num=20
  可以這樣查詢:
  select id from t where num=10
  union all
  select id from t where num=20

2.drop直接刪掉表 truncate刪除表中資料,再插入時自增長id又從1開始 delete刪除表中資料,可以加where字句。

一般而言,drop > truncate > delete

 

這裡只是記下了一部分我能看懂的。其他的等用到的時候在實際情況中使用

 

4.說幾個jq的選擇器,js的事件,

$(‘*’) 匹配頁面所有元素
$(‘#id’) id選擇器
$(‘.class’) 類選擇器
$(‘element’) 標籤選擇器

https://www.jb51.net/article/140635.htm

$() 函式是 jQuery() 函式的別稱,$() 函式用於將任何物件包裹成 jQuery 物件,接著你就被允許呼叫定義在 jQuery 物件上的多個不同方法

 

id選擇器 $('#LoginTextBox')

class選擇器 $('.LoginTextBox')

 如何在點選一個按鈕時使用 jQuery 隱藏一個圖片?

$('#ButtonToClick').click(function(){
  $('#ImageToHide').hide();
});

 

$(this) 和 this 關鍵字在 jQuery 中有何不同?

$(this) 返回一個 jQuery 物件,你可以對它呼叫多個 jQuery 方法,比如用 text() 獲取文字,用val() 獲取值等等。而 this 代表當前元素,它是 JavaScript 關鍵詞中的一個,表示上下文中的當前 DOM 元素。你不能對它呼叫 jQuery 方法,直到它被 $() 函式包裹,例如 $(this)。

 

 JavaScript window.onload 事件和 jQuery ready 函式有何不同?(答案)

這個問答是緊接著上一個的。JavaScript window.onload 事件和 jQuery ready 函式之間的主要區別是,前者除了要等待 DOM 被建立還要等到包括大型圖片、音訊、視訊在內的所有外部資源都完全載入。如果載入圖片和媒體內容花費了大量時間,使用者就會感受到定義在 window.onload 事件上的程式碼在執行時有明顯的延遲。

另一方面,jQuery ready() 函式只需對 DOM 樹的等待,而無需對影象或外部資源載入的等待,從而執行起來更快。使用 jQuery $(document).ready() 的另一個優勢是你可以在網頁裡多次使用它,瀏覽器會按它們在 HTML 頁面裡出現的順序執行它們,相反對於 onload 技術而言,只能在單一函式裡使用。鑑於這個好處,用 jQuery ready() 函式比用 JavaScript window.onload 事件要更好些。

 如何找到所有 HTML select 標籤的選中項?(答案如下)

這是面試裡比較棘手的 jQuery 問題之一。這是個基礎的問題,但是別期望每個 jQuery 初學者都知道它。你能用下面的 jQuery 選擇器獲取所有具備 multiple=true 的 <select > 標籤的選中項:

 
$('[name=NameOfSelectedTag] :selected')

這段程式碼結合使用了屬性選擇器和 :selected 選擇器,結果只返回被選中的選項。你可按需修改它,比如用 id 屬性而不是 name 屬性來獲取 <select> 標籤。

 

常見的js事件:

https://www.cnblogs.com/yujon/p/5467579.html

a.視窗事件,只在body和frameset元素中才有效
onload      頁面或圖片載入完成時
onunload     使用者離開頁面時

b.表單元素事件,在表單元素中才有效
onchange     框內容改變時
onsubmit     點選提交按鈕時
onreset     重新點選滑鼠按鍵時
onselect     文字被選擇時
onblur      元素失去焦點時
onfocus     當元素獲取焦點時

c.鍵盤事件,在base,bdo,br,frame,frameset,head,html,iframe,meta,param,script,style,title元素裡都無效
onkeydown    按下鍵盤按鍵時
onkeypress    按下或按住鍵盤按鍵時
onkeyup     放開鍵盤按鍵時

d.在base,bdo,br,frame,frameset,head,html,iframe,meta,param,script,style,title元素裡都無效
onclick     滑鼠點選一個物件時
ondblclick    滑鼠雙擊一個物件時
onmousedown 滑鼠被按下時
onmousemove 滑鼠被移動時
onmouseout    滑鼠離開元素時
onmouseover 滑鼠經過元素時
onmouseup    釋放滑鼠按鍵時

e.其他
onresize     當視窗或框架被重新定義尺寸時
onabort     圖片下載被打斷時
onerror     當載入文件或圖片時發生錯誤時

 

5.對ajax的理解,原理

首先他是非同步的js和xml,叫做ajax

同步,是傳送方傳送資料之後,必須等接收方接收資料必須做出迴應之後,才可以進行下一步。

非同步的話則是傳送方傳送資料之後不需等接收方做出迴應,可以進行下一步操作。

 

Ajax原理

簡單來說,就是通過XMLHttpRequest物件像伺服器傳送非同步請求,從伺服器獲取資料之後,再通過JS來操作DOM節點。

 

ajax優點:

1.無重新整理更新資料,減少使用者等到時間,更好的使用者體驗

2.非同步與伺服器通訊,無需打斷使用者,響應更加迅速

3.可以把伺服器的一些負擔轉到客戶端,利用客戶端閒置的能力來處理,減輕伺服器和頻寬的負擔,節約空間和寬頻租用成本。並且減輕伺服器的負擔,AJAX的原則是“按需取資料”,可以最大程度的減少冗餘請求和響應對伺服器造成的負擔,提升站點效能。

5.基於標準化,廣泛被支援

ajax缺點

1.破壞了前進後退功能,使用者往往通過後退按鈕來取消上一步操作,但是使用ajax無法實現。可以使用Gmail來解決這個問題,它只是採用的一個比較笨但是有效的辦法,即使用者單擊後退按鈕訪問歷史記錄時,通過建立或使用一個隱藏的IFRAME來重現頁面上的變更。

2.安全問題。ajax技術就如同對企業資料建立了一個直接通道。這使得開發者在不經意間會暴露比以前更多的資料和伺服器邏輯。ajax的邏輯可以對客戶端的安全掃描技術隱藏起來,允許黑客從遠端伺服器上建立新的攻擊。還有自身受到如跨站指令碼攻擊,SQL注入等攻擊。

3.對搜尋引擎支援較弱

4.一些手持裝置不能很好的支援等
https://blog.csdn.net/zhi_miss/article/details/50932018

css的絕對相對定位

https://www.cnblogs.com/heroine/p/5852748.html

首先說relative ,相對定位。

它原來位於文件流中的位置仍然會存在,不會被第三個塊浮動過來填補掉。
同時,它的偏移也不會把別的塊從文件流中原來的位置擠開,如果有重疊的地方它會重疊在其它文件流元素之上,而不是把它們擠開,就像圖中那樣,它已經覆蓋在了第三個塊之上。
我們可以設定它的z-index屬性來調整它的堆疊順序。

 

他就是相對於自己之前的位置進行偏移,而之前的位置還會存在

 

接下來我們來看看絕對定位:position:absolute

被設定了絕對定位的元素,在文件流中是不佔據空間的,如果某元素設定了絕對定位,那麼它在文件流中的位置會被刪除,那這個元素到哪去了呢?它浮了起來,其實設定了相對定位relative時也會讓該 元素浮起來,但它們的不同點在於,相對對定位不會刪除它本身在文件流中佔據的那塊空間,而絕對定位則會刪除掉該元素在文件流中的位置,完全從文件流中抽了出來,我們可以通過z-index來設定它們的堆疊順序

首先,如果它的父元素設定了除static之外的定位,比如position:relative,或者position:absolute以及position:fixed,那麼它就會相對於它的父元素來定位,位置通過left , top ,right ,bottom屬性來規定,如果它的父元素沒有設定定位,那麼就得看它父元素的父元素是否有設定定位 ,如果還是沒有就繼續向更高層的祖先元素類推,總之它的定位就是相對於設定了除static定位之外的定位(比如position:relative)的第一個祖先元素,如果所有的祖先元素都沒有以上三種定位中的其中一種定位,那麼它就會相對於文件body來定位(並非視窗,相對於視窗定位的是fixed)

 

絕對定位就是相對自己的符合條件的父類進行偏移,之前的位置會被刪掉。

 

6.MVC模式的理解

 

Model -View-Controller

模型 檢視 控制器

模型:處理業務邏輯,與資料庫打交道,儲存讀取資料

檢視:顯示從模型處理返回的資料,使用者看到的介面就是檢視層

控制器:接收使用者的請求,資料。傳入有模型層進行業務邏輯處理,並得到資料讓檢視層加載出來

 

MVC的框架模式,有利於人員的分工,讓設計人員專注於眼前的設計

有利於程式碼的重用

 

 

7.面向物件的理解

面向物件的三大特性  封裝,繼承 ,多型   抽象,

 

什麼是類和物件:萬物皆物件   的思想  把任何東西都按它相同的屬性和行為抽象成一類事務

就是類 一類擁有相同的屬性和行為,屬性就叫做類的屬性,行為就叫做類的方法

那類是抽象的,當我們要例項一個類後,就會有一個實在的東西那就是物件

 

什麼是封裝:把一系列事物封裝成抽象的類,對外暴露公開的方法,呼叫這個方法就可以實現什麼,但是內部的具體怎麼實現是隱藏的

這樣當一個大方法需要很多次使用時,可以把他封裝起來,需要使用就呼叫,提高程式碼的複用性

 

什麼是繼承:當一個類可以派生出很多含有他的屬性和方法的類時,那派生出來的類就是繼承父類而存在,他們有部分屬性和方法繼承自父類,但是也有自己的屬性和方法,提高程式碼複用性

 

什麼是多型:

多型的三大特徵:

  • 子類繼承父類
  • 子類重寫父類
  • 父類指向子類

多型實現的前提:必須是類與類之間要有關係,要麼繼承,要麼實現,存在重寫(override),其實就是抽象函式或介面。 
多型的應用:父類物件的引用指向子類物件,其實本質上就是一個向上轉型。

 

方法的呼叫:$this->方法名();如果子類中有該方法則呼叫的是子類中的方法,若沒有則是呼叫父類中的

          parent::則始終呼叫的是父類中的方法。

          self::來呼叫自己static方法

         類名::靜態方法  呼叫靜態方法

 

靜態方法不需要通過類的例項進行訪問,而是通過類名直接訪問

 

 

8.前加加後加加的區別

int i=9
如果是++i<10。這裡i值已經是10,所以比較失敗
如果是i++<10,這裡i值還是9,比較成立
++i相當於直接進行了i+=1的運算,而i++相當於依次迴圈後運算i+=1,具有滯後的特點

 

9.常見的狀態碼含義

 

200:ok 請求成功,一般是getpost請求成功

301:  請求的url被永久移動

400: bad request 客戶端請求的語法錯誤,伺服器無法理解

401: 請求要求使用者的身份認證

403: 伺服器理解請求客戶端的請求,但是拒絕執行此請求

404: not found

500; 伺服器內部錯誤,無法完成請求

505: 伺服器不支援請求的HTTP協議的版本,無法完成處理