近期去面試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協議的版本,無法完成處理