防止SQL注入
簡單回答:防止——利用即有的應(yīng)用、功能,將(惡意)SQL命令發(fā)送到到后臺(tái)數(shù)據(jù)庫引擎。
防止SQL注入漏洞可以用哪些函數(shù)?
addslashes()
mysql_escape_string()
SQL注入產(chǎn)生的原因:
程序開發(fā)過程中不注意規(guī)范書寫sql語句和對(duì)特殊字符進(jìn)行過濾,導(dǎo)致客戶端可以通過全局變量POST和GET提交一些sql語句正常執(zhí)行。
防止SQL注入的方式:
開啟配置文件中的magic_quotes_gpc和magic_quotes_runtime設(shè)置,
執(zhí)行sql語句時(shí)使用addslashes()進(jìn)行sql語句轉(zhuǎn)換
Sql語句書寫盡量不要省略雙引號(hào)和單引號(hào)。
過濾掉sql語句中的一些關(guān)鍵詞:update、insert、delete、select、 * 。
提高數(shù)據(jù)庫表和字段的命名技巧,對(duì)一些重要的字段根據(jù)程序的特點(diǎn)命名,取不易被猜到的。
Php配置文件中設(shè)置register_globals為off,關(guān)閉全局變量注冊(cè),控制錯(cuò)誤信息,不要在瀏覽器上輸出錯(cuò)誤信息,將錯(cuò)誤信息寫到日志文件中。
算法:https://www.kancloud.cn/i281151/php_questions/198601
排序

語句include和require的區(qū)別是什么?
在失敗的時(shí)候:
include 產(chǎn)生一個(gè) warning ,而 require 直接產(chǎn)生錯(cuò)誤中斷;
require 在運(yùn)行前載入;
include 在運(yùn)行時(shí)載入;
require_once 和 include_once 表示了只包含一次,可以避免重復(fù)包含同一文件。
require是無條件包含,也就是如果一個(gè)流程里加入require,無論條件成立與否都會(huì)先執(zhí)行require,當(dāng)文件不存在或者無法打開的時(shí)候,會(huì)提示錯(cuò)誤,并且會(huì)終止程序執(zhí)行
include有返回值,而require沒有(可能因?yàn)槿绱藃equire的速度比include快),如果被包含的文件不存在的化,那么會(huì)提示一個(gè)錯(cuò)誤,但是程序會(huì)繼續(xù)執(zhí)行下去
注意:包含文件不存在或者語法錯(cuò)誤的時(shí)候require是致命的,而include不是
下面哪項(xiàng)沒有將john添加到users數(shù)組中?
(a) $users[] = 'john';
(b) array_add($users,'john');
(c) array_push($users,'john');
(d) $users ||= 'john';
答案為bd,php 里面無 array_add 函數(shù),d項(xiàng)為語法錯(cuò)誤的表達(dá)。
HTTP協(xié)議中幾個(gè)狀態(tài)碼的含義。
200 : 請(qǐng)求成功,請(qǐng)求的數(shù)據(jù)隨之返回。
301 : 永久性重定向。資源(網(wǎng)頁等)被永久轉(zhuǎn)義到其他URL
302 : 暫時(shí)行重定向。
401 : 當(dāng)前請(qǐng)求需要用戶驗(yàn)證。
403 : 服務(wù)器拒絕執(zhí)行請(qǐng)求,即沒有權(quán)限。
404 : 請(qǐng)求失敗,請(qǐng)求的數(shù)據(jù)在服務(wù)器上未發(fā)現(xiàn)。請(qǐng)求的資源(網(wǎng)頁等)不存在
500 : 服務(wù)器錯(cuò)誤。一般服務(wù)器端程序執(zhí)行錯(cuò)誤。
503 : 服務(wù)器臨時(shí)維護(hù)或過載。這個(gè)狀態(tài)時(shí)臨時(shí)性的。
505 - 內(nèi)部服務(wù)器錯(cuò)誤
寫出一些php魔術(shù)方法。
__construct() 實(shí)例化類時(shí)自動(dòng)調(diào)用。
__destruct() 類對(duì)象使用結(jié)束時(shí)自動(dòng)調(diào)用。
__set() 在給未定義的屬性賦值的時(shí)候調(diào)用。
__get() 調(diào)用未定義的屬性時(shí)候調(diào)用。
__isset() 使用isset()或empty()函數(shù)時(shí)候會(huì)調(diào)用。
__unset() 使用unset()時(shí)候會(huì)調(diào)用。
__sleep() 使用serialize序列化時(shí)候調(diào)用。
__wakeup() 使用unserialize反序列化的時(shí)候調(diào)用。
__call() 調(diào)用一個(gè)不存在的方法的時(shí)候調(diào)用。
__callStatic()調(diào)用一個(gè)不存在的靜態(tài)方法是調(diào)用。
__toString() 把對(duì)象轉(zhuǎn)換成字符串的時(shí)候會(huì)調(diào)用。比如 echo。
__invoke() 當(dāng)嘗試把對(duì)象當(dāng)方法調(diào)用時(shí)調(diào)用。
__set_state() 當(dāng)使用var_export()函數(shù)時(shí)候調(diào)用。接受一個(gè)數(shù)組參數(shù)。
__clone() 當(dāng)使用clone復(fù)制一個(gè)對(duì)象時(shí)候調(diào)用。
MySQL存儲(chǔ)引擎 MyISAM 和 InnoDB 的區(qū)別。
a. MyISAM類型不支持事務(wù)處理等高級(jí)處理,而InnoDB類型支持.
b. MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快.
c. InnoDB不支持FULLTEXT類型的索引.
d. InnoDB中不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來計(jì)算有多少行,但是MyISAM只要簡單的讀出保存好的行數(shù)即可.
e. 對(duì)于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。
f. DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除。
g. LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用.
h. MyISAM支持表鎖,InnoDB支持行鎖。
說出一些MySQL優(yōu)化方法?
索引。
緩存。
避免join
靜態(tài)頁面
選取最適用的字段屬性:字段長度和非空
優(yōu)化查詢語句
設(shè)計(jì)良好的數(shù)據(jù)庫結(jié)構(gòu),允許部分?jǐn)?shù)據(jù)冗余,盡量避免join查詢,提高效率。
選擇合適的表字段數(shù)據(jù)類型和存儲(chǔ)引擎,適當(dāng)?shù)奶砑铀饕?/p>
mysql庫主從讀寫分離。
找規(guī)律分表,減少單表中的數(shù)據(jù)量提高查詢速度。
添加緩存機(jī)制,比如memcached,apc等。
不經(jīng)常改動(dòng)的頁面,生成靜態(tài)頁面。
書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.
優(yōu)化查詢語句
a.最好在相同字段進(jìn)行比較操作,在建立好的索引字段上盡量減少函數(shù)操作
例子1:SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢) SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";```
1、選取最適用的字段屬性
MySQL可以很好的支持大數(shù)據(jù)量的存取,但是一般說來,數(shù)據(jù)庫中的表越小,在它上面執(zhí)行的查詢也就會(huì)越快。因此,在創(chuàng)建表的時(shí)候,為了獲得更好的性能,我們可以將表中字段的寬度設(shè)得盡可能小。
例如,在定義郵政編碼這個(gè)字段時(shí),如果將其設(shè)置為CHAR(255),顯然給數(shù)據(jù)庫增加了不必要的空間,甚至使用VARCHAR這種類型也是多余的,因?yàn)镃HAR(6)就可以很好的完成任務(wù)了。同樣的,如果可以的話,我們應(yīng)該使用MEDIUMINT而不是BIGIN來定義整型字段。
另外一個(gè)提高效率的方法是在可能的情況下,應(yīng)該盡量把字段設(shè)置為NOT NULL,這樣在將來執(zhí)行查詢的時(shí)候,數(shù)據(jù)庫不用去比較NULL值。
對(duì)于某些文本字段,例如“省份”或者“性別”,我們可以將它們定義為ENUM類型。因?yàn)樵贛ySQL中,ENUM類型被當(dāng)作數(shù)值型數(shù)據(jù)來處理,而數(shù)值型數(shù)據(jù)被處理起來的速度要比文本類型快得多。這樣,我們又可以提高數(shù)據(jù)庫的性能。
說下php中empty()和isset()的區(qū)別。
isset 用于檢測變量是否被設(shè)置,使用 isset() 測試一個(gè)被設(shè)置成 NULL 的變量,將返回 FALSE 。
empty 如果 var 是非空或非零的值,則 empty() 返回 FALSE。換句話說,""、0、"0"、NULL、FALSE、array()、var $var; 以及沒有任何屬性的對(duì)象都將被認(rèn)為是空的,如果 var 為空,則返回 TRUE 。
如果變量為 0 ,則empty()會(huì)返回TRUE,isset()會(huì)返回TRUE;
如果變量為空字符串,則empty()會(huì)返回TRUE,isset()會(huì)返回TRUE;
如果變量未定義,則empty()會(huì)返回TRUE,isset()會(huì)返回FLASE。
注意:isset() 只能用于變量,因?yàn)閭鬟f任何其它參數(shù)都將造成解析錯(cuò)誤。若想檢測常量是否已設(shè)置,可使用 defined() 函數(shù)。
當(dāng)要 判斷一個(gè)變量是否已經(jīng)聲明的時(shí)候 可以使用 isset 函數(shù);
當(dāng)要 判斷一個(gè)變量是否已經(jīng)賦予數(shù)據(jù)且不為空 可以用 empty函數(shù);
當(dāng)要 判斷 一個(gè)變量 存在且不為空 先 isset 函數(shù) 再用 empty 函數(shù);
表單中 get與post提交方法的區(qū)別?
get是發(fā)送請(qǐng)求HTTP協(xié)議通過url參數(shù)傳遞進(jìn)行接收,
而post是實(shí)體數(shù)據(jù),可以通過表單提交大量信息。
請(qǐng)用正則表達(dá)式(Regular Expression)寫一個(gè)函數(shù)驗(yàn)證電子郵件的格式是否正確
<?php
/*http://www.manongjc.com/article/1524.html*/
$email=$_POST['email'];
if(!preg_match(‘/^[\w.]+@([\w.]+).[a-z]{2,6}$/i’,$email))? {
echo "電子郵件檢測失敗";
}else{
echo "電子郵件檢測成功";
}
?>
session與cookie的區(qū)別?
兩者最大的區(qū)別就是session存儲(chǔ)在服務(wù)器端,而cookie是在客戶端。
session安全性更高,而cookie安全性弱
session:儲(chǔ)存用戶訪問的全局唯一變量,存儲(chǔ)在服務(wù)器上的php指定的目錄中的(session_dir)的位置進(jìn)行的存放.
cookie:用來存儲(chǔ)連續(xù)訪問一個(gè)頁面時(shí)所使用,是存儲(chǔ)在客戶端,對(duì)于Cookie來說是存儲(chǔ)在用戶WIN的Temp目錄中的。
兩者都可通過時(shí)間來設(shè)置時(shí)間長短.
session有什么用?怎么使用?
session在web開發(fā)中具有非常重要的份量。它可以將用戶正確登錄后的信息記錄到服務(wù)器的內(nèi)存中,當(dāng)用戶以此身份
訪問網(wǎng)站的管理后臺(tái)時(shí),無需再次登錄即可得到身份確認(rèn)。而沒有正確登錄的用戶則不分配session空間,即便輸入了
管理后臺(tái)的訪問地址也不能看到頁面內(nèi)容。通過session確定了用戶對(duì)頁面的操作權(quán)限。
使用session的步驟:
啟動(dòng)session:使用session_start()函數(shù)來啟動(dòng)。
注冊(cè)會(huì)話:直接給$_SESSION數(shù)組添加元素即可。
使用會(huì)話:判斷session是否為空或者是否已經(jīng)注冊(cè),如果已經(jīng)存在則像普通數(shù)組使用即可。
刪除會(huì)話:
1.可以使用unset刪除單個(gè)session;
2.使用$_SESSION=array()的方式,一次注銷所有的會(huì)話變量;
3.使用session_destroy()函數(shù)來徹底銷毀session。
cookie有什么用?怎么使用?
記錄用戶訪問的部分信息
在頁面間傳遞變量
將所查看的internet頁存儲(chǔ)在cookies臨時(shí)文件夾中,可以提高以后的瀏覽速度。
創(chuàng)建cookie:setcookie(string cookiename , string value , int expire);
讀取cookie:通過超級(jí)全局?jǐn)?shù)組$_COOKIE來讀取瀏覽器端的cookie的值。
刪除cookie:有兩種方法
1.手工刪除方法:右擊瀏覽器屬性,可以看到刪除cookies,執(zhí)行操作即可將所有cookie文件刪除
2.setcookie()方法:跟設(shè)置cookie的方法一樣,不過此時(shí)講cookie的值設(shè)置為空,有效時(shí)間為0或小于當(dāng)前時(shí)間戳。
題9:數(shù)據(jù)庫中的事務(wù)是什么?
事務(wù)(transaction)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個(gè)操作失敗,事務(wù)也不成功。如果所有操作完成,事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。如果一個(gè)操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。
簡述下面程序的輸出結(jié)果, 簡要說明為什么, 如何解決這類問題?
<?php
$tmp = 0 == "a"? 1: 2;
echo $tmp;
?>
答案: 1
int和string類型強(qiáng)制轉(zhuǎn)換造成的,0==="a"
0 == 0 肯定是true啊
PHP是弱類型
$tmp = 0 === "a"? 1: 2;
echo $tmp; 這樣就是2
什么是MVC?
答案:MVC由Model(模型), View(視圖)和Controller(控制器)組成,PHP MVC可以更高效地管理好3個(gè)不同層的PHP代碼。
Model:數(shù)據(jù)信息存取層。數(shù)據(jù)結(jié)構(gòu)層
View:view層負(fù)責(zé)將應(yīng)用的數(shù)據(jù)以特定的方式展現(xiàn)在界面上。
Controller:通??刂破髫?fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù)。
MYSQL取得當(dāng)前時(shí)間的函數(shù)是?,格式化日期的函數(shù)是
答案:now(),dateformat()
在頁面中引用CSS有幾種方式?
在頁面中使用CSS有3中方式:
引用外部CSS文件
內(nèi)部定義Style樣式
內(nèi)聯(lián)樣式
假設(shè)a.html和b.html在同一個(gè)文件夾下面,用javascript實(shí)現(xiàn)當(dāng)打開a.html五秒鐘后,自動(dòng)跳轉(zhuǎn)到b.html。
答案:
/**http://www.manongjc.com/article/1524.html*/
function go2b(){
window.location = “b.html”;window.close();
}
setTimeout( “go2b()”,5000 ); //5秒鐘后自動(dòng)執(zhí)行g(shù)o2b()
用PHP打印出前一天的時(shí)間格式是2006-5-10 22:21:21(2分)
$a = date(“Y-m-d H:i:s”, strtotime(“-1 day”));
print_r($a);
如何實(shí)現(xiàn)字符串翻轉(zhuǎn)?(3分)
英文:
strrev($a)
中文或其他文字:
中文:GB2312, 代碼是使用GB2312編碼
<?php
function reverse($str)
{
$ret = “”;
len=mbstrwidth(str,”GB2312″);
for(i=0;i< len;i++)
{
arr[]=mbsubstr(str, $i, 1, “GB2312″);
}
return implode(“”, array_reverse($arr));
}
print_r(reverse(“你好”));
對(duì)于大流量的網(wǎng)站,您采用什么樣的方法來解決訪問量問題?(4分)
有效使用緩存,增加緩存命中率
使用負(fù)載均衡
對(duì)靜態(tài)文件使用CDN進(jìn)行存儲(chǔ)和加速
想法減少數(shù)據(jù)庫的使用
查看出現(xiàn)統(tǒng)計(jì)的瓶頸在哪里
數(shù)據(jù)庫讀寫分離,優(yōu)化數(shù)據(jù)表
使用不同主機(jī)分流主要流量
如何修改SESSION的生存時(shí)間. (1分)
session_set_cookie_params
一般有三年以上php開發(fā)經(jīng)驗(yàn)去百度、騰訊面試,常會(huì)接觸的面試題小總結(jié)一下:
簡單做一下自我介紹,?? 然后談一下近三年來你的得意之作?
面試官看過你的簡歷,會(huì)問一些你做的項(xiàng)目的用戶量、pv、吞吐量、相關(guān)難點(diǎn)和解決方法等
數(shù)據(jù)庫設(shè)計(jì)經(jīng)驗(yàn),為什么進(jìn)行分表? 分庫?
一般多少數(shù)據(jù)量開始分表? 分庫? 分庫分表的目的? 什么是數(shù)據(jù)庫垂直拆分? 水平拆分? 分區(qū)等等?可以舉例說明
web開發(fā)方面會(huì)遇到哪些緩存? 分別如何優(yōu)化?
給你256M的內(nèi)存,對(duì)10G的文件進(jìn)行排序(文件每行1個(gè)數(shù)字),如何實(shí)現(xiàn)?
對(duì)10G的文件進(jìn)行查找如何實(shí)現(xiàn)?
統(tǒng)計(jì)10G文件每個(gè)關(guān)鍵字出現(xiàn)的次數(shù)如何實(shí)現(xiàn)?
假如你現(xiàn)在是12306火車訂票的設(shè)計(jì)師,你該如何設(shè)計(jì)滿足全國人民訂票?
假如有1億用戶的訪問量,你的服務(wù)器架構(gòu)是怎樣的? 用戶信息的存儲(chǔ)方案如何設(shè)計(jì)?
如果你是技術(shù)組長,所帶團(tuán)隊(duì)任務(wù)進(jìn)度無法完成你該如何解決?
如果在進(jìn)度排滿的前提下插入任務(wù),你該如何保證總進(jìn)度不延期?
如果有的工程師今天預(yù)定任務(wù)沒有完成,你該如何解決?
從你的經(jīng)驗(yàn)方面談一下如何構(gòu)建高性能web站點(diǎn)? 需要哪些環(huán)節(jié)? 步驟? 每個(gè)步驟需要注意什么如何優(yōu)化等?
為什么要對(duì)數(shù)據(jù)庫進(jìn)行主從分離?
如何處理多服務(wù)器共享session?
一個(gè)10G的表,你用php程序統(tǒng)計(jì)某個(gè)字段出現(xiàn)的次數(shù),思路是?
會(huì)告訴你一個(gè)nginx日志例子,用你認(rèn)為最佳的編程語言統(tǒng)計(jì)一下http響應(yīng)時(shí)間超過1秒的前10個(gè)url?
給你一個(gè)mysql配置文件,用你認(rèn)為最佳的編程語言解析該文件?
給你兩個(gè)路徑a和b,寫一個(gè)算法或思路計(jì)算a和b差距幾層并顯示a和b的交集?
給你一個(gè)url,在nginx配置一下rewrite指定到某個(gè)具體路徑?
一個(gè)php文件的解釋過程是? 一般加速php有哪些?? 提高php整體性能會(huì)用到哪些技術(shù)?
session和cookie生存周期區(qū)別? 存儲(chǔ)位置區(qū)別?
chrome號(hào)稱為多線程的,所以多線程和多進(jìn)程的區(qū)別為?
php在2011年底出現(xiàn)hash碰撞,hash碰撞原理為? 如何進(jìn)行修復(fù)?
web不安全因素有哪些? 分別如何防范?
假如兩個(gè)單鏈表相交,寫一個(gè)最優(yōu)算法計(jì)算交點(diǎn)位置,說思路也可以?
假如你是技術(shù)組長? 如何提高團(tuán)隊(duì)效率?
nginx負(fù)載均衡有哪些? 如果其中一臺(tái)服務(wù)器掛掉,報(bào)警機(jī)制如何實(shí)現(xiàn)?
不優(yōu)化前提下,apache一般最大連接數(shù)為? nginx一般最大連接數(shù)為? mysql 每秒insert ? select ? update ? delete?
mysql 數(shù)據(jù)類型有哪些 ? 分別占用多少存儲(chǔ)空間 ?
nginx設(shè)置緩存js、css、圖片等信息,緩存的實(shí)現(xiàn)原理是?
如何提高緩存命中率? 如何對(duì)緩存進(jìn)行顆?;?
php的內(nèi)存回收機(jī)制是?
我的所有問題都問完了,你有什么問題問我沒有?
1、雙引號(hào)和單引號(hào)的區(qū)別
雙引號(hào)解釋變量,單引號(hào)不解釋變量
雙引號(hào)里插入單引號(hào),其中單引號(hào)里如果有變量的話,變量解釋
雙引號(hào)的變量名后面必須要有一個(gè)非數(shù)字、字母、下劃線的特殊字符,或者用{}講變量括起來,否則會(huì)將變量名后面的部分當(dāng)做一個(gè)整體,引起語法錯(cuò)誤
雙引號(hào)解釋轉(zhuǎn)義字符,單引號(hào)不解釋轉(zhuǎn)義字符,但是解釋'\和\
能使單引號(hào)字符盡量使用單引號(hào),單引號(hào)的效率比雙引號(hào)要高(因?yàn)殡p引號(hào)要先遍歷一遍,判斷里面有沒有變量,然后再進(jìn)行操作,而單引號(hào)則不需要判斷)
HTTP中POST、GET、PUT、DELETE方式的區(qū)別
HTTP定義了與服務(wù)器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,與其比不可少的URL的全稱是資源描述符
我們可以這樣理解:url描述了一個(gè)網(wǎng)絡(luò)上資源,而post、get、put、delegate就是對(duì)這個(gè)資源進(jìn)行增、刪、改、查的操作!
php程序中如何設(shè)置當(dāng)前頁面的編碼為utf-8?
header(“content-type:text/html;charset=utf-8”);
php中,如何跳轉(zhuǎn)到blog/view.php頁面,請(qǐng)用函數(shù)實(shí)現(xiàn)?
header(“l(fā)ocation:blog/view.php”);
===是什么運(yùn)算?
是php比較運(yùn)算符中的一種,表示恒等,說明兩個(gè)變量不只是數(shù)值上相等,而且兩者的數(shù)據(jù)類型也相等。
如果$a !== $b,那么說明兩個(gè)變量要么數(shù)值不等,要么就是數(shù)據(jù)類型不相同。
說出數(shù)組涉及到的常用函數(shù)。
array --? 聲明一個(gè)數(shù)組
count -- 計(jì)算數(shù)組中的單元數(shù)目或?qū)ο笾械膶傩詡€(gè)數(shù)
array_push()將一個(gè)或多個(gè)元素插入數(shù)組的末尾(入棧)
array_column()返回輸入數(shù)組中某個(gè)單一列的值;
array_combine()通過合并兩個(gè)數(shù)組來創(chuàng)建一個(gè)新數(shù)組;
array_reverse()以相反的順序返回?cái)?shù)組
array_unique()刪除數(shù)組中的重復(fù)值;
in_array()檢查數(shù)組中是否存在指定的值
foreach -- 遍歷數(shù)組
list -- 遍歷數(shù)組
explode -- 將字符串轉(zhuǎn)成數(shù)組
implode -- 將數(shù)組轉(zhuǎn)成一個(gè)新字符串
array_merge -- 合并一個(gè)或多個(gè)數(shù)組
is_array -- 檢查是否是數(shù)組
print_r -- 輸出數(shù)組
sort -- 數(shù)組排序
array_keys -- 返回?cái)?shù)組中所有的鍵名
array_values -- 返回?cái)?shù)組中所有的值
key -- 從關(guān)聯(lián)數(shù)組中取得鍵名
GD庫是做什么用的? (1分)
動(dòng)態(tài)的開放的圖片處理庫
下面哪個(gè)函數(shù)可以打開一個(gè)文件,以對(duì)文件進(jìn)行讀和寫操作?(1分) c
(a) fget() (b) file_open() (c) fopen() (d) open_file()
MySQL存儲(chǔ)引擎中,innodb和myisam的區(qū)別
MyISAM 和 InnoDB 講解
InnoDB和MyISAM是許多人在使用MySQL時(shí)最常用的兩個(gè)表類型,這兩個(gè)表類型各有優(yōu)劣,視具體應(yīng)用而定。
基本的差別為:MyISAM類型不支持事務(wù)處理等高級(jí)處理,而InnoDB類型支持。
MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持,
而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫功能。
函數(shù)內(nèi)部 static 和 global 關(guān)鍵字的作用
static 是靜態(tài)變量,在局部函數(shù)中存在且只初始化一次,使用過后再次使用會(huì)使用上次執(zhí)行的結(jié)果; 作為計(jì)數(shù),程序內(nèi)部緩存,單例模式中都有用到。
global 關(guān)鍵字,引用全局變量,wordpress中大量用到,如面向過程開發(fā)。
static 靜態(tài)方法,是類的成員方法,但不需要實(shí)例化類可直接使用
$GLOBAL 在函數(shù)內(nèi)使用具有全局作用域的變量,如$GLOBAL['a']
子類重寫父類的 protected 方法有什么限制?或者說有什么要遵守的規(guī)則?
用例子說明,以 Laravel 框架中的控制器作為說明
final修飾的類方法不可被子類重寫
PHP是否重寫父類方法只會(huì)根據(jù)方法名是否一致判斷(5.3以后重寫父類方法參數(shù)個(gè)數(shù)必須一致)
重寫時(shí)訪問級(jí)別只可以等于或者寬松于父類 不可提升訪問級(jí)別
什么是 CSRF 攻擊 ?XSS 攻擊?如何防范?
CSRF,跨站請(qǐng)求偽造,攻擊方偽裝用戶身份發(fā)送請(qǐng)求從而竊取信息或者破壞系統(tǒng)。
講述基本原理:用戶訪問A網(wǎng)站登陸并生成了cookie,再訪問B網(wǎng)站,如果A網(wǎng)站存在CSRF漏洞,此時(shí)B網(wǎng)站給A網(wǎng)站的請(qǐng)求(此時(shí)相當(dāng)于是用戶訪問),A網(wǎng)站會(huì)認(rèn)為是用戶發(fā)的請(qǐng)求,從而B網(wǎng)站就成功偽裝了你的身份,因此叫跨站腳本攻擊。
CSRF防范:
合理規(guī)范api請(qǐng)求方式,GET,POST
對(duì)POST請(qǐng)求加token令牌驗(yàn)證,生成一個(gè)隨機(jī)碼并存入session,表單中帶上這個(gè)隨機(jī)碼,提交的時(shí)候服務(wù)端進(jìn)行驗(yàn)證隨機(jī)碼是否相同。
XSS,跨站腳本攻擊。
防范:不相信任何輸入,過濾輸入。
了解XSS攻擊嗎?如何防止?
XSS是跨站腳本攻擊,首先是利用跨站腳本漏洞以一個(gè)特權(quán)模式去執(zhí)行攻擊者構(gòu)造的腳本,然后利用不安全的Activex控件執(zhí)行惡意的行為。
使用htmlspecialchars()函數(shù)對(duì)提交的內(nèi)容進(jìn)行過濾,使字符串里面的特殊符號(hào)實(shí)體化。
PHP處理字符串的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
trim()移除字符串兩側(cè)的空白字符和其他字符;
substr_replace()把字符串的一部分替換為另一個(gè)字符串;
substr_count()計(jì)算子串在字符串中出現(xiàn)的次數(shù);
substr()返回字符串的一部分;
strtolower()把字符串轉(zhuǎn)換為小寫字母;
strtoupper()把字符串轉(zhuǎn)換為大寫字母;
strtr()轉(zhuǎn)換字符串中特定的字符;
strrchr()查找字符串在另一個(gè)字符串中最后一次出現(xiàn);
strstr()查找字符串在另一字符串中的第一次出現(xiàn)(對(duì)大小寫敏感);
strrev()反轉(zhuǎn)字符串;
strlen()返回字符串的長度;
str_replace()替換字符串中的一些字符(對(duì)大小寫敏感);
print()輸出一個(gè)或多個(gè)字符串;
explode()把字符串打散為數(shù)組;
is_string()檢測變量是否是字符串;
strip_tags()從一個(gè)字符串中去除HTML標(biāo)簽;
mb_substr()用來截中文與英文的函數(shù)
PHP處理時(shí)間的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
date_default_timezone_get()返回默認(rèn)時(shí)區(qū)
date_default_timezone_set()設(shè)置默認(rèn)時(shí)區(qū)。
date()格式化本地時(shí)間/日期。
getdate()返回日期/時(shí)間信息。
gettimeofday()返回當(dāng)前時(shí)間信息。
microtime()返回當(dāng)前時(shí)間的微秒數(shù)。
mktime()返回一個(gè)日期的 Unix時(shí)間戳。
strtotime()將任何英文文本的日期或時(shí)間描述解析為 Unix時(shí)間戳。
time()返回當(dāng)前時(shí)間的 Unix時(shí)間戳。
什么是事務(wù)?及其特性?
MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。比如說,在人員管理系統(tǒng)中,你刪除一個(gè)人員,你即需要?jiǎng)h除人員的基本資料,也要?jiǎng)h除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構(gòu)成一個(gè)事務(wù)!
事務(wù):是一系列的數(shù)據(jù)庫操作,是數(shù)據(jù)庫應(yīng)用的基本邏輯單位。
事務(wù)特性:
(1)原子性:即不可分割性,事務(wù)要么全部被執(zhí)行,要么就全部不被執(zhí)行。
(2)一致性或可串性。事務(wù)的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)
(3)隔離性。在事務(wù)正確提交之前,不允許把該事務(wù)對(duì)數(shù)據(jù)的任何改變提供給任何其他事務(wù)。事務(wù)獨(dú)立運(yùn)行。一個(gè)事務(wù)處理后的結(jié)果,影響了其他事務(wù),那么其他事務(wù)會(huì)撤回。事務(wù)的100%隔離,需要犧牲速度。
(4) 持久性。事務(wù)正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫中,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會(huì)得到保存。
或者這樣理解:
事務(wù)就是被綁定在一起作為一個(gè)邏輯工作單元的SQL語句分組,如果任何一個(gè)語句操作失敗那么整個(gè)操作就被失敗,以后操作就會(huì)回滾到操作前狀態(tài),或者是上有個(gè)節(jié)點(diǎn)。為了確保要么執(zhí)行,要么不執(zhí)行,就可以使用事務(wù)。要將有組語句作為事務(wù)考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。
什么是鎖?
答:數(shù)據(jù)庫是一個(gè)多用戶使用的共享資源。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。
加鎖是實(shí)現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個(gè)非常重要的技術(shù)。當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作。
基本鎖類型:鎖包括行級(jí)鎖和表級(jí)鎖
索引的作用?和它的優(yōu)點(diǎn)缺點(diǎn)是什么?
索引就一種特殊的查詢表,數(shù)據(jù)庫的搜索引擎可以利用它加速對(duì)數(shù)據(jù)的檢索。它很類似與現(xiàn)實(shí)生活中書的目錄,不需要查詢整本書內(nèi)容就可以找到想要的數(shù)據(jù)。
索引可以是唯一的,創(chuàng)建索引允許指定單個(gè)列或者是多個(gè)列。
缺點(diǎn)是它減慢了數(shù)據(jù)錄入的速度,同時(shí)也增加了數(shù)據(jù)庫的尺寸大小。
什么是基本表?什么是視圖?
基本表是本身獨(dú)立存在的表,在 SQL 中一個(gè)關(guān)系就對(duì)應(yīng)一個(gè)表。
視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。視圖本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫中,是一個(gè)虛表
主鍵、外鍵和索引的區(qū)別?
主鍵、外鍵和索引的區(qū)別
定義:
主鍵--唯一標(biāo)識(shí)一條記錄,不能有重復(fù)的,不允許為空
外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值
索引--該字段沒有重復(fù)值,但可以有一個(gè)空值
作用:
主鍵--用來保證數(shù)據(jù)完整性
外鍵--用來和其他表建立聯(lián)系用的
索引--是提高查詢排序的速度
個(gè)數(shù):
主鍵--主鍵只能有一個(gè)
外鍵--一個(gè)表可以有多個(gè)外鍵
索引--一個(gè)表可以有多個(gè)唯一索引
數(shù)組[‘a(chǎn)’, ‘b’, ‘c’] 轉(zhuǎn)換成字符串 ‘a(chǎn)bc’
echo? implode(‘’,[‘a(chǎn)’, ‘b’, ‘c’]);
echo? join([‘a(chǎn)’, ‘b’, ‘c’],'');
獲取字符串’aAbB’中A首次出現(xiàn)的位置
$str=‘a(chǎn)AbB’;
echo strpos($str,"A");
數(shù)組內(nèi)置的排序方法有哪些?
sort($array); //數(shù)組升序排序
rsort($array); //數(shù)組降序排序
asort($array);? //根據(jù)值,以升序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序
ksort($array);? //根據(jù)建,以升序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序
arsort($array);? //根據(jù)值,以降序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序
krsort($array);? // 根據(jù)鍵,以降序?qū)﹃P(guān)聯(lián)數(shù)組進(jìn)行排序
用PHP打印出前一天的時(shí)間格式是2017-3-22 22:21:21
$a = date("Y-m-d H:i:s", strtotime("-1 days"));
求兩個(gè)日期的差數(shù),例如2007-2-5 ~ 2007-3-6 的日期差數(shù)
// 方法一:
用DateTime類
$day1 = '2003-09-16';
$day2 = '2011-11-23';
$d1 = new dateTime($day1);
$d2 = new dateTime($day2);
echo $d1->diff($d2)->days;
// 方法二,用時(shí)間戳計(jì)算
echo (strtotime($day2) - strtotime($day1))/(24*3600);
array實(shí)操
$array = array(1, 1, 1, 54, 3,4, 3,4, 3, 14, 3,4, 3,7,8,9,12,45,66,5,7,8,9,2,45);
$array2 = array_count_values($array); // 統(tǒng)計(jì)數(shù)組中所有值出現(xiàn)的次數(shù),
arsort($array2); // 按照鍵值對(duì)關(guān)聯(lián)數(shù)組進(jìn)行降序排序,
$first = reset($array2);
$first_key = key($array2);
echo("數(shù)組中數(shù)字{$first_key}重復(fù)次數(shù)最多,為:{$first}次");
exit;
Apache與Nginx的優(yōu)缺點(diǎn)比較
1、nginx相對(duì)于apache的優(yōu)點(diǎn):
輕量級(jí),比apache 占用更少的內(nèi)存及資源。高度模塊化的設(shè)計(jì),編寫模塊相對(duì)簡單
抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞,多個(gè)連接(萬級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程,
而apache 則是阻塞型的,是同步多進(jìn)程模型,一個(gè)連接對(duì)應(yīng)一個(gè)進(jìn)程,在高并發(fā)下nginx 能保持低資源低消耗高性能
nginx處理靜態(tài)文件好,Nginx 靜態(tài)處理性能比 Apache 高 3倍以上
2、apache 相對(duì)于nginx 的優(yōu)點(diǎn):
apache 的rewrite 比nginx 的rewrite 強(qiáng)大 ,模塊非常多,基本想到的都可以找到 ,比較穩(wěn)定,少bug ,nginx 的bug 相對(duì)較多
3:原因:這得益于Nginx使用了最新的epoll(Linux 2.6內(nèi)核)和kqueue(freebsd)網(wǎng)絡(luò)I/O模型,而Apache則使用的是傳統(tǒng)的select模型。目前Linux下能夠承受高并發(fā)訪問的 Squid、Memcached都采用的是epoll網(wǎng)絡(luò)I/O模型。 處理大量的連接的讀寫,Apache所采用的select網(wǎng)絡(luò)I/O模型非常低效。
MySQL 增刪改查數(shù)據(jù)
增:$sql = "INSERT INTO w3cschool_tbl ". "(w3cschool_title,w3cschool_author, submission_date) ". "VALUES ". "('$w3cschool_title','$w3cschool_author','$submission_date')";
刪:$sql = 'DELETE FROM w3cschool_tbl WHERE w3cschool_id=3';
改:$sql = 'UPDATE w3cschool_tbl SET w3cschool_title="Learning JAVA" WHERE w3cschool_id=3';
查:$sql = 'SELECT w3cschool_id, w3cschool_title, w3cschool_author, submission_date FROM w3cschool_tbl';
INNER JOIN(內(nèi)連接,或等值連接):獲取兩個(gè)表中字段匹配關(guān)系的記錄。
$sql = 'SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl a INNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author';
LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對(duì)應(yīng)匹配的記錄。
RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對(duì)應(yīng)匹配的記錄。
排序:$sql = 'SELECT w3cschool_id, w3cschool_title, w3cschool_author, submission_date FROM w3cschool_tbl ORDER BY w3cschool_author DESC';
分組:SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
分頁:limit是mysql的語法:
select * from table limit m,n
其中m是指記錄開始的index,從0開始,表示第一條記錄
n是指從第m+1條開始,取n條。
select * from tablename limit 2,4
即取出第3條至第6條,4條記錄