防止SQL注入
簡(jiǎn)單回答:防止——利用即有的應(yīng)用、功能,將(惡意)SQL命令發(fā)送到到后臺(tái)數(shù)據(jù)庫(kù)引擎。
防止SQL注入漏洞可以用哪些函數(shù)?
- addslashes()
- mysql_escape_string()
SQL注入產(chǎn)生的原因:
程序開(kāi)發(fā)過(guò)程中不注意規(guī)范書(shū)寫(xiě)sql語(yǔ)句和對(duì)特殊字符進(jìn)行過(guò)濾,導(dǎo)致客戶(hù)端可以通過(guò)全局變量POST和GET提交一些sql語(yǔ)句正常執(zhí)行。
防止SQL注入的方式:
-
開(kāi)啟配置文件中的
magic_quotes_gpc和magic_quotes_runtime設(shè)置, - 執(zhí)行sql語(yǔ)句時(shí)使用
addslashes()進(jìn)行sql語(yǔ)句轉(zhuǎn)換
Sql語(yǔ)句書(shū)寫(xiě)盡量不要省略雙引號(hào)和單引號(hào)。 - 過(guò)濾掉sql語(yǔ)句中的一些關(guān)鍵詞:update、insert、delete、select、 * 。
- 提高數(shù)據(jù)庫(kù)表和字段的命名技巧,對(duì)一些重要的字段根據(jù)程序的特點(diǎn)命名,取不易被猜到的。
- Php配置文件中設(shè)置
register_globals為off,關(guān)閉全局變量注冊(cè),控制錯(cuò)誤信息,不要在瀏覽器上輸出錯(cuò)誤信息,將錯(cuò)誤信息寫(xiě)到日志文件中。
算法:https://www.kancloud.cn/i281151/php_questions/198601
排序
//快速排序
public function quick_sort($arr) {
//先判斷是否需要繼續(xù)進(jìn)行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//如果沒(méi)有返回,說(shuō)明數(shù)組內(nèi)的元素個(gè)數(shù) 多余1個(gè),需要排序
//選擇一個(gè)標(biāo)尺
//選擇第一個(gè)元素
$base_num = $arr[0];
//遍歷 除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個(gè)數(shù)組內(nèi)
//初始化兩個(gè)數(shù)組
$left_array = array();//小于標(biāo)尺的
$right_array = array();//大于標(biāo)尺的
for($i=1; $i<$length; $i++) {
if($base_num > $arr[$i]) {
//放入左邊數(shù)組
$left_array[] = $arr[$i];
} else {
//放入右邊
$right_array[] = $arr[$i];
}
}
//再分別對(duì) 左邊 和 右邊的數(shù)組進(jìn)行相同的排序處理方式
//遞歸調(diào)用這個(gè)函數(shù),并記錄結(jié)果
$left_array = $this->quick_sort($left_array);
$right_array = $this->quick_sort($right_array);
//合并左邊 標(biāo)尺 右邊
return array_merge($left_array, array($base_num), $right_array);
}
public function bubble_sort($array){
//冒泡排序
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j--){
if ($array[$j]<$array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
echo(),print(),print_r()的區(qū)別?
- echo 和 print 不是一個(gè)函數(shù),是一個(gè)語(yǔ)言結(jié)構(gòu);
- print(string $arg) 只有一個(gè)參數(shù);
-
echo arg1,arg2可以輸出多個(gè)參數(shù),返回 void ; - echo 和 print 只能打印出string,不能打印出結(jié)構(gòu);
- print_r能打印出結(jié)構(gòu)。比如:
$arr = array("key"=>"value");
print_r($arr);
語(yǔ)句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是無(wú)條件包含,也就是如果一個(gè)流程里加入require,無(wú)論條件成立與否都會(huì)先執(zhí)行require,當(dāng)文件不存在或者無(wú)法打開(kāi)的時(shí)候,會(huì)提示錯(cuò)誤,并且會(huì)終止程序執(zhí)行
- include有返回值,而require沒(méi)有(可能因?yàn)槿绱藃equire的速度比include快),如果被包含的文件不存在的化,那么會(huì)提示一個(gè)錯(cuò)誤,但是程序會(huì)繼續(xù)執(zhí)行下去
- 注意:包含文件不存在或者語(yǔ)法錯(cuò)誤的時(shí)候require是致命的,而include不是
下面哪項(xiàng)沒(méi)有將john添加到users數(shù)組中?
- (a) $users[] = 'john';
- (b) array_add($users,'john');
- (c) array_push($users,'john');
- (d) $users ||= 'john';
- 答案為bd,php 里面無(wú) array_add 函數(shù),d項(xiàng)為語(yǔ)法錯(cuò)誤的表達(dá)。
HTTP協(xié)議中幾個(gè)狀態(tài)碼的含義。
- 200 : 請(qǐng)求成功,請(qǐng)求的數(shù)據(jù)隨之返回。
- 301 : 永久性重定向。資源(網(wǎng)頁(yè)等)被永久轉(zhuǎn)義到其他URL
- 302 : 暫時(shí)行重定向。
- 401 : 當(dāng)前請(qǐng)求需要用戶(hù)驗(yàn)證。
- 403 : 服務(wù)器拒絕執(zhí)行請(qǐng)求,即沒(méi)有權(quán)限。
- 404 : 請(qǐng)求失敗,請(qǐng)求的數(shù)據(jù)在服務(wù)器上未發(fā)現(xiàn)。請(qǐng)求的資源(網(wǎng)頁(yè)等)不存在
- 500 : 服務(wù)器錯(cuò)誤。一般服務(wù)器端程序執(zhí)行錯(cuò)誤。
- 503 : 服務(wù)器臨時(shí)維護(hù)或過(guò)載。這個(gè)狀態(tài)時(shí)臨時(shí)性的。
- 505 - 內(nèi)部服務(wù)器錯(cuò)誤
寫(xiě)出一些php魔術(shù)方法。
- __construct() 實(shí)例化類(lèi)時(shí)自動(dòng)調(diào)用。
- __destruct() 類(lèi)對(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類(lèi)型不支持事務(wù)處理等高級(jí)處理,而InnoDB類(lèi)型支持.
- b. MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快.
- c. InnoDB不支持FULLTEXT類(lèi)型的索引.
- d. InnoDB中不保存表的具體行數(shù),也就是說(shuō),執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來(lái)計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可.
- e. 對(duì)于AUTO_INCREMENT類(lèi)型的字段,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支持行鎖。
說(shuō)出一些MySQL優(yōu)化方法?
- 索引。
- 緩存。
- 避免join
- 靜態(tài)頁(yè)面
- 選取最適用的字段屬性:字段長(zhǎng)度和非空
- 優(yōu)化查詢(xún)語(yǔ)句
- 設(shè)計(jì)良好的數(shù)據(jù)庫(kù)結(jié)構(gòu),允許部分?jǐn)?shù)據(jù)冗余,盡量避免join查詢(xún),提高效率。
- 選擇合適的表字段數(shù)據(jù)類(lèi)型和存儲(chǔ)引擎,適當(dāng)?shù)奶砑铀饕?/li>
- mysql庫(kù)主從讀寫(xiě)分離。
- 找規(guī)律分表,減少單表中的數(shù)據(jù)量提高查詢(xún)速度。
- 添加緩存機(jī)制,比如memcached,apc等。
- 不經(jīng)常改動(dòng)的頁(yè)面,生成靜態(tài)頁(yè)面。
- 書(shū)寫(xiě)高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.
- 優(yōu)化查詢(xún)語(yǔ)句
- 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ù)量的存取,但是一般說(shuō)來(lái),數(shù)據(jù)庫(kù)中的表越小,在它上面執(zhí)行的查詢(xún)也就會(huì)越快。因此,在創(chuàng)建表的時(shí)候,為了獲得更好的性能,我們可以將表中字段的寬度設(shè)得盡可能小。
- 例如,在定義郵政編碼這個(gè)字段時(shí),如果將其設(shè)置為CHAR(255),顯然給數(shù)據(jù)庫(kù)增加了不必要的空間,甚至使用VARCHAR這種類(lèi)型也是多余的,因?yàn)镃HAR(6)就可以很好的完成任務(wù)了。同樣的,如果可以的話,我們應(yīng)該使用MEDIUMINT而不是BIGIN來(lái)定義整型字段。
- 另外一個(gè)提高效率的方法是在可能的情況下,應(yīng)該盡量把字段設(shè)置為NOT NULL,這樣在將來(lái)執(zhí)行查詢(xún)的時(shí)候,數(shù)據(jù)庫(kù)不用去比較NULL值。
- 對(duì)于某些文本字段,例如“省份”或者“性別”,我們可以將它們定義為ENUM類(lèi)型。因?yàn)樵贛ySQL中,ENUM類(lèi)型被當(dāng)作數(shù)值型數(shù)據(jù)來(lái)處理,而數(shù)值型數(shù)據(jù)被處理起來(lái)的速度要比文本類(lèi)型快得多。這樣,我們又可以提高數(shù)據(jù)庫(kù)的性能。
說(shuō)下php中empty()和isset()的區(qū)別。
- isset 用于檢測(cè)變量是否被設(shè)置,使用 isset() 測(cè)試一個(gè)被設(shè)置成 NULL 的變量,將返回 FALSE 。
- empty 如果 var 是非空或非零的值,則 empty() 返回 FALSE。換句話說(shuō),""、0、"0"、NULL、FALSE、array()、var $var; 以及沒(méi)有任何屬性的對(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ò)誤。若想檢測(cè)常量是否已設(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é)議通過(guò)url參數(shù)傳遞進(jìn)行接收,
- 而post是實(shí)體數(shù)據(jù),可以通過(guò)表單提交大量信息。
請(qǐng)用正則表達(dá)式(Regular Expression)寫(xiě)一個(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 "電子郵件檢測(cè)失敗";
}else{
echo "電子郵件檢測(cè)成功";
}
?>
session與cookie的區(qū)別?
- 兩者最大的區(qū)別就是session存儲(chǔ)在服務(wù)器端,而cookie是在客戶(hù)端。
- session安全性更高,而cookie安全性弱
- session:儲(chǔ)存用戶(hù)訪問(wèn)的全局唯一變量,存儲(chǔ)在服務(wù)器上的php指定的目錄中的(session_dir)的位置進(jìn)行的存放.
- cookie:用來(lái)存儲(chǔ)連續(xù)訪問(wèn)一個(gè)頁(yè)面時(shí)所使用,是存儲(chǔ)在客戶(hù)端,對(duì)于Cookie來(lái)說(shuō)是存儲(chǔ)在用戶(hù)WIN的Temp目錄中的。
兩者都可通過(guò)時(shí)間來(lái)設(shè)置時(shí)間長(zhǎng)短.
session有什么用?怎么使用?
session在web開(kāi)發(fā)中具有非常重要的份量。它可以將用戶(hù)正確登錄后的信息記錄到服務(wù)器的內(nèi)存中,當(dāng)用戶(hù)以此身份
訪問(wèn)網(wǎng)站的管理后臺(tái)時(shí),無(wú)需再次登錄即可得到身份確認(rèn)。而沒(méi)有正確登錄的用戶(hù)則不分配session空間,即便輸入了
管理后臺(tái)的訪問(wèn)地址也不能看到頁(yè)面內(nèi)容。通過(guò)session確定了用戶(hù)對(duì)頁(yè)面的操作權(quán)限。
使用session的步驟:
- 啟動(dòng)session:使用session_start()函數(shù)來(lái)啟動(dòng)。
- 注冊(cè)會(huì)話:直接給$_SESSION數(shù)組添加元素即可。
- 使用會(huì)話:判斷session是否為空或者是否已經(jīng)注冊(cè),如果已經(jīng)存在則像普通數(shù)組使用即可。
- 刪除會(huì)話:
1.可以使用unset刪除單個(gè)session;
2.使用$_SESSION=array()的方式,一次注銷(xiāo)所有的會(huì)話變量;
3.使用session_destroy()函數(shù)來(lái)徹底銷(xiāo)毀session。
cookie有什么用?怎么使用?
- 記錄用戶(hù)訪問(wèn)的部分信息
- 在頁(yè)面間傳遞變量
- 將所查看的internet頁(yè)存儲(chǔ)在cookies臨時(shí)文件夾中,可以提高以后的瀏覽速度。
創(chuàng)建cookie:setcookie(string cookiename , string value , int expire);
讀取cookie:通過(guò)超級(jí)全局?jǐn)?shù)組$_COOKIE來(lái)讀取瀏覽器端的cookie的值。
刪除cookie:有兩種方法
1.手工刪除方法:右擊瀏覽器屬性,可以看到刪除cookies,執(zhí)行操作即可將所有cookie文件刪除
2.setcookie()方法:跟設(shè)置cookie的方法一樣,不過(guò)此時(shí)講cookie的值設(shè)置為空,有效時(shí)間為0或小于當(dāng)前時(shí)間戳。
題9:數(shù)據(jù)庫(kù)中的事務(wù)是什么?
事務(wù)(transaction)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫(kù)操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個(gè)操作失敗,事務(wù)也不成功。如果所有操作完成,事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫(kù)進(jìn)程。如果一個(gè)操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。
簡(jiǎn)述下面程序的輸出結(jié)果, 簡(jiǎn)要說(shuō)明為什么, 如何解決這類(lèi)問(wèn)題?
<?php
$tmp = 0 == "a"? 1: 2;
echo $tmp;
?>
答案: 1
int和string類(lèi)型強(qiáng)制轉(zhuǎn)換造成的,0==="a"
0 == 0 肯定是true啊
PHP是弱類(lèi)型
$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ù),控制用戶(hù)輸入,并向模型發(fā)送數(shù)據(jù)。
MYSQL取得當(dāng)前時(shí)間的函數(shù)是?,格式化日期的函數(shù)是
答案:now(),dateformat()
在頁(yè)面中引用CSS有幾種方式?
在頁(yè)面中使用CSS有3中方式:
- 引用外部CSS文件
- 內(nèi)部定義Style樣式
- 內(nèi)聯(lián)樣式
假設(shè)a.html和b.html在同一個(gè)文件夾下面,用javascript實(shí)現(xiàn)當(dāng)打開(kāi)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)站,您采用什么樣的方法來(lái)解決訪問(wèn)量問(wèn)題?(4分)
- 有效使用緩存,增加緩存命中率
- 使用負(fù)載均衡
- 對(duì)靜態(tài)文件使用CDN進(jìn)行存儲(chǔ)和加速
- 想法減少數(shù)據(jù)庫(kù)的使用
- 查看出現(xiàn)統(tǒng)計(jì)的瓶頸在哪里
- 數(shù)據(jù)庫(kù)讀寫(xiě)分離,優(yōu)化數(shù)據(jù)表
- 使用不同主機(jī)分流主要流量
如何修改SESSION的生存時(shí)間. (1分)
session_set_cookie_params
一般有三年以上php開(kāi)發(fā)經(jīng)驗(yàn)去百度、騰訊面試,常會(huì)接觸的面試題小總結(jié)一下:
- 簡(jiǎn)單做一下自我介紹,? 然后談一下近三年來(lái)你的得意之作?
- 面試官看過(guò)你的簡(jiǎn)歷,會(huì)問(wèn)一些你做的項(xiàng)目的用戶(hù)量、pv、吞吐量、相關(guān)難點(diǎn)和解決方法等
- 數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn),為什么進(jìn)行分表? 分庫(kù)?
一般多少數(shù)據(jù)量開(kāi)始分表? 分庫(kù)? 分庫(kù)分表的目的? 什么是數(shù)據(jù)庫(kù)垂直拆分? 水平拆分? 分區(qū)等等?可以舉例說(shuō)明 - web開(kāi)發(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火車(chē)訂票的設(shè)計(jì)師,你該如何設(shè)計(jì)滿足全國(guó)人民訂票?
- 假如有1億用戶(hù)的訪問(wèn)量,你的服務(wù)器架構(gòu)是怎樣的? 用戶(hù)信息的存儲(chǔ)方案如何設(shè)計(jì)?
- 如果你是技術(shù)組長(zhǎng),所帶團(tuán)隊(duì)任務(wù)進(jìn)度無(wú)法完成你該如何解決?
如果在進(jìn)度排滿的前提下插入任務(wù),你該如何保證總進(jìn)度不延期?
如果有的工程師今天預(yù)定任務(wù)沒(méi)有完成,你該如何解決? - 從你的經(jīng)驗(yàn)方面談一下如何構(gòu)建高性能web站點(diǎn)? 需要哪些環(huán)節(jié)? 步驟? 每個(gè)步驟需要注意什么如何優(yōu)化等?
- 為什么要對(duì)數(shù)據(jù)庫(kù)進(jìn)行主從分離?
- 如何處理多服務(wù)器共享session?
- 一個(gè)10G的表,你用php程序統(tǒng)計(jì)某個(gè)字段出現(xiàn)的次數(shù),思路是?
- 會(huì)告訴你一個(gè)nginx日志例子,用你認(rèn)為最佳的編程語(yǔ)言統(tǒng)計(jì)一下http響應(yīng)時(shí)間超過(guò)1秒的前10個(gè)url?
- 給你一個(gè)mysql配置文件,用你認(rèn)為最佳的編程語(yǔ)言解析該文件?
- 給你兩個(gè)路徑a和b,寫(xiě)一個(gè)算法或思路計(jì)算a和b差距幾層并顯示a和b的交集?
- 給你一個(gè)url,在nginx配置一下rewrite指定到某個(gè)具體路徑?
- 一個(gè)php文件的解釋過(guò)程是? 一般加速php有哪些? 提高php整體性能會(huì)用到哪些技術(shù)?
- session和cookie生存周期區(qū)別? 存儲(chǔ)位置區(qū)別?
- chrome號(hào)稱(chēng)為多線程的,所以多線程和多進(jìn)程的區(qū)別為?
- php在2011年底出現(xiàn)hash碰撞,hash碰撞原理為? 如何進(jìn)行修復(fù)?
- web不安全因素有哪些? 分別如何防范?
- 假如兩個(gè)單鏈表相交,寫(xiě)一個(gè)最優(yōu)算法計(jì)算交點(diǎn)位置,說(shuō)思路也可以?
- 假如你是技術(shù)組長(zhǎng)? 如何提高團(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ù)類(lèi)型有哪些 ? 分別占用多少存儲(chǔ)空間 ?
- nginx設(shè)置緩存js、css、圖片等信息,緩存的實(shí)現(xiàn)原理是?
- 如何提高緩存命中率? 如何對(duì)緩存進(jìn)行顆粒化?
- php的內(nèi)存回收機(jī)制是?
- 我的所有問(wèn)題都問(wèn)完了,你有什么問(wèn)題問(wèn)我沒(méi)有?
1、雙引號(hào)和單引號(hào)的區(qū)別
雙引號(hào)解釋變量,單引號(hào)不解釋變量
雙引號(hào)里插入單引號(hào),其中單引號(hào)里如果有變量的話,變量解釋
- 雙引號(hào)的變量名后面必須要有一個(gè)非數(shù)字、字母、下劃線的特殊字符,或者用{}講變量括起來(lái),否則會(huì)將變量名后面的部分當(dāng)做一個(gè)整體,引起語(yǔ)法錯(cuò)誤
- 雙引號(hào)解釋轉(zhuǎn)義字符,單引號(hào)不解釋轉(zhuǎn)義字符,但是解釋'\和\
能使單引號(hào)字符盡量使用單引號(hào),單引號(hào)的效率比雙引號(hào)要高(因?yàn)殡p引號(hào)要先遍歷一遍,判斷里面有沒(méi)有變量,然后再進(jìn)行操作,而單引號(hào)則不需要判斷)
HTTP中POST、GET、PUT、DELETE方式的區(qū)別
- HTTP定義了與服務(wù)器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,與其比不可少的URL的全稱(chēng)是資源描述符
- 我們可以這樣理解:url描述了一個(gè)網(wǎng)絡(luò)上資源,而post、get、put、delegate就是對(duì)這個(gè)資源進(jìn)行增、刪、改、查的操作!
php程序中如何設(shè)置當(dāng)前頁(yè)面的編碼為utf-8?
header(“content-type:text/html;charset=utf-8”);
php中,如何跳轉(zhuǎn)到blog/view.php頁(yè)面,請(qǐng)用函數(shù)實(shí)現(xiàn)?
header(“l(fā)ocation:blog/view.php”);
===是什么運(yùn)算?
- 是php比較運(yùn)算符中的一種,表示恒等,說(shuō)明兩個(gè)變量不只是數(shù)值上相等,而且兩者的數(shù)據(jù)類(lèi)型也相等。
- 如果$a !== $b,那么說(shuō)明兩個(gè)變量要么數(shù)值不等,要么就是數(shù)據(jù)類(lèi)型不相同。
說(shuō)出數(shù)組涉及到的常用函數(shù)。
- array -- 聲明一個(gè)數(shù)組
- count -- 計(jì)算數(shù)組中的單元數(shù)目或?qū)ο笾械膶傩詡€(gè)數(shù)
- array_push()將一個(gè)或多個(gè)元素插入數(shù)組的末尾(入棧)
- array_column()返回輸入數(shù)組中某個(gè)單一列的值;
- array_combine()通過(guò)合并兩個(gè)數(shù)組來(lái)創(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庫(kù)是做什么用的? (1分)
動(dòng)態(tài)的開(kāi)放的圖片處理庫(kù)
下面哪個(gè)函數(shù)可以打開(kāi)一個(gè)文件,以對(duì)文件進(jìn)行讀和寫(xiě)操作?(1分) c
(a) fget() (b) file_open() (c) fopen() (d) open_file()
MySQL存儲(chǔ)引擎中,innodb和myisam的區(qū)別
MyISAM 和 InnoDB 講解
- InnoDB和MyISAM是許多人在使用MySQL時(shí)最常用的兩個(gè)表類(lèi)型,這兩個(gè)表類(lèi)型各有優(yōu)劣,視具體應(yīng)用而定。
- 基本的差別為:MyISAM類(lèi)型不支持事務(wù)處理等高級(jí)處理,而InnoDB類(lèi)型支持。
- MyISAM類(lèi)型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持,
- 而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。
函數(shù)內(nèi)部 static 和 global 關(guān)鍵字的作用
- static 是靜態(tài)變量,在局部函數(shù)中存在且只初始化一次,使用過(guò)后再次使用會(huì)使用上次執(zhí)行的結(jié)果; 作為計(jì)數(shù),程序內(nèi)部緩存,單例模式中都有用到。
- global 關(guān)鍵字,引用全局變量,wordpress中大量用到,如面向過(guò)程開(kāi)發(fā)。
- static 靜態(tài)方法,是類(lèi)的成員方法,但不需要實(shí)例化類(lèi)可直接使用
- $GLOBAL 在函數(shù)內(nèi)使用具有全局作用域的變量,如$GLOBAL['a']
子類(lèi)重寫(xiě)父類(lèi)的 protected 方法有什么限制?或者說(shuō)有什么要遵守的規(guī)則?
用例子說(shuō)明,以 Laravel 框架中的控制器作為說(shuō)明
- final修飾的類(lèi)方法不可被子類(lèi)重寫(xiě)
- PHP是否重寫(xiě)父類(lèi)方法只會(huì)根據(jù)方法名是否一致判斷(5.3以后重寫(xiě)父類(lèi)方法參數(shù)個(gè)數(shù)必須一致)
- 重寫(xiě)時(shí)訪問(wèn)級(jí)別只可以等于或者寬松于父類(lèi) 不可提升訪問(wèn)級(jí)別
什么是 CSRF 攻擊 ?XSS 攻擊?如何防范?
-
CSRF,跨站請(qǐng)求偽造,攻擊方偽裝用戶(hù)身份發(fā)送請(qǐng)求從而竊取信息或者破壞系統(tǒng)。
講述基本原理:用戶(hù)訪問(wèn)A網(wǎng)站登陸并生成了cookie,再訪問(wèn)B網(wǎng)站,如果A網(wǎng)站存在CSRF漏洞,此時(shí)B網(wǎng)站給A網(wǎng)站的請(qǐng)求(此時(shí)相當(dāng)于是用戶(hù)訪問(wèn)),A網(wǎng)站會(huì)認(rèn)為是用戶(hù)發(fā)的請(qǐng)求,從而B(niǎo)網(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,跨站腳本攻擊。
防范:不相信任何輸入,過(guò)濾輸入。
了解XSS攻擊嗎?如何防止?
XSS是跨站腳本攻擊,首先是利用跨站腳本漏洞以一個(gè)特權(quán)模式去執(zhí)行攻擊者構(gòu)造的腳本,然后利用不安全的Activex控件執(zhí)行惡意的行為。
使用htmlspecialchars()函數(shù)對(duì)提交的內(nèi)容進(jìn)行過(guò)濾,使字符串里面的特殊符號(hào)實(shí)體化。
PHP處理字符串的常用函數(shù)?(重點(diǎn)看函數(shù)的‘參數(shù)’和‘返回值’)
- trim()移除字符串兩側(cè)的空白字符和其他字符;
- substr_replace()把字符串的一部分替換為另一個(gè)字符串;
- substr_count()計(jì)算子串在字符串中出現(xiàn)的次數(shù);
- substr()返回字符串的一部分;
- strtolower()把字符串轉(zhuǎn)換為小寫(xiě)字母;
- strtoupper()把字符串轉(zhuǎn)換為大寫(xiě)字母;
- strtr()轉(zhuǎn)換字符串中特定的字符;
- strrchr()查找字符串在另一個(gè)字符串中最后一次出現(xiàn);
- strstr()查找字符串在另一字符串中的第一次出現(xiàn)(對(duì)大小寫(xiě)敏感);
- strrev()反轉(zhuǎn)字符串;
- strlen()返回字符串的長(zhǎng)度;
- str_replace()替換字符串中的一些字符(對(duì)大小寫(xiě)敏感);
- print()輸出一個(gè)或多個(gè)字符串;
- explode()把字符串打散為數(shù)組;
- is_string()檢測(cè)變量是否是字符串;
- strip_tags()從一個(gè)字符串中去除HTML標(biāo)簽;
- mb_substr()用來(lái)截中文與英文的函數(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ù)。比如說(shuō),在人員管理系統(tǒng)中,你刪除一個(gè)人員,你即需要?jiǎng)h除人員的基本資料,也要?jiǎng)h除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫(kù)操作語(yǔ)句就構(gòu)成一個(gè)事務(wù)!
- 事務(wù):是一系列的數(shù)據(jù)庫(kù)操作,是數(shù)據(jù)庫(kù)應(yīng)用的基本邏輯單位。
事務(wù)特性:
(1)原子性:即不可分割性,事務(wù)要么全部被執(zhí)行,要么就全部不被執(zhí)行。
(2)一致性或可串性。事務(wù)的執(zhí)行使得數(shù)據(jù)庫(kù)從一種正確狀態(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ù)庫(kù)中,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會(huì)得到保存。
或者這樣理解:
事務(wù)就是被綁定在一起作為一個(gè)邏輯工作單元的SQL語(yǔ)句分組,如果任何一個(gè)語(yǔ)句操作失敗那么整個(gè)操作就被失敗,以后操作就會(huì)回滾到操作前狀態(tài),或者是上有個(gè)節(jié)點(diǎn)。為了確保要么執(zhí)行,要么不執(zhí)行,就可以使用事務(wù)。要將有組語(yǔ)句作為事務(wù)考慮,就需要通過(guò)ACID測(cè)試,即原子性,一致性,隔離性和持久性。
什么是鎖?
答:數(shù)據(jù)庫(kù)是一個(gè)多用戶(hù)使用的共享資源。當(dāng)多個(gè)用戶(hù)并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。
加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并發(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)行更新操作。
基本鎖類(lèi)型:鎖包括行級(jí)鎖和表級(jí)鎖
索引的作用?和它的優(yōu)點(diǎn)缺點(diǎn)是什么?
- 索引就一種特殊的查詢(xún)表,數(shù)據(jù)庫(kù)的搜索引擎可以利用它加速對(duì)數(shù)據(jù)的檢索。它很類(lèi)似與現(xiàn)實(shí)生活中書(shū)的目錄,不需要查詢(xún)整本書(shū)內(nèi)容就可以找到想要的數(shù)據(jù)。
- 索引可以是唯一的,創(chuàng)建索引允許指定單個(gè)列或者是多個(gè)列。
- 缺點(diǎn)是它減慢了數(shù)據(jù)錄入的速度,同時(shí)也增加了數(shù)據(jù)庫(kù)的尺寸大小。
什么是基本表?什么是視圖?
- 基本表是本身獨(dú)立存在的表,在 SQL 中一個(gè)關(guān)系就對(duì)應(yīng)一個(gè)表。
- 視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。視圖本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中,是一個(gè)虛表
主鍵、外鍵和索引的區(qū)別?
主鍵、外鍵和索引的區(qū)別
定義:
主鍵--唯一標(biāo)識(shí)一條記錄,不能有重復(fù)的,不允許為空
外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值
索引--該字段沒(méi)有重復(fù)值,但可以有一個(gè)空值
作用:
主鍵--用來(lái)保證數(shù)據(jù)完整性
外鍵--用來(lái)和其他表建立聯(lián)系用的
索引--是提高查詢(xú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類(lèi)
$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ì),編寫(xiě)模塊相對(duì)簡(jiǎn)單
- 抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞,多個(gè)連接(萬(wàn)級(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ā)訪問(wèn)的 Squid、Memcached都采用的是epoll網(wǎng)絡(luò)I/O模型。 處理大量的連接的讀寫(xiě),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(左連接):獲取左表所有記錄,即使右表沒(méi)有對(duì)應(yīng)匹配的記錄。
- RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒(méi)有對(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; - 分頁(yè):limit是mysql的語(yǔ)法:
select * from table limit m,n
其中m是指記錄開(kāi)始的index,從0開(kāi)始,表示第一條記錄
n是指從第m+1條開(kāi)始,取n條。
select * from tablename limit 2,4
即取出第3條至第6條,4條記錄