php面試題

防止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條記錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容