日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

php mysql常见面试题_PHP常见面试题总结

發布時間:2023/12/20 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php mysql常见面试题_PHP常见面试题总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3、表單中 get 與 post 提交方法的區別?

3.1、GET 請求能夠被 cache,GET 請求能夠被保存在瀏覽器的瀏覽歷史 里面(密碼等重要數據 GET 提交,別人查看歷史記錄,就可以直接看 到這些私密數據)POST 不進行緩存。

3.2、GET 參數是帶在 URL 后面,傳統 IE 中 URL 的最大可用長度為 2053 字符,其他瀏覽器對 URL 長度限制實現上有所不同。POST 請求無長 度限制(目前理論上是這樣的)。

3.3、GET 提交的數據大小,不同瀏覽器的限制不同,一般在 2k-8K 之間, POST 提交數據比較大,大小靠服務器的設定值限制,而且某些數據 只能用 POST 方法「攜帶」,比如 file。

3.4、全部用 POST 不是十分合理,最好先把請求按功能和場景分下類, 對數據請求頻繁,數據不敏感且數據量在普通瀏覽器最小限定的 2k 范圍內,這樣的情況使用 GET。其他地方使用 POST。

3.5、GET 的本質是「得」,而 POST 的本質是「給」。而且,GET 是「冪 等」的,在這一點上,GET 被認為是「安全的」。但實際上 server 端 也可以用作資源更新,但是這種用法違反了約定,容易造成 CSRF(跨 站請求偽造)。

4、用 PHP 打印出前一天的時間

格式是 2005-5-10 22:21:21

echo date('Y-m-d H:i:s',time()-24*3600);

或echo date('Y-m-d H:i:s',strtotime('-1 day'));

5、假設現在有一個字符串 ww.baidu.com 如何使用 PHP 對他進行操作使字符串以 moc.udiab.輸出?

$str='www.baidu.com';

//先替換,再反轉

echo strrev('www','',$str);

6、用 php 寫出顯示客戶端 IP 與服務器 IP 的代碼

客戶端 IP:

$SERVER[“REMOTE_ADDR”]

或者

getenv('REMOTE_ADDR');

服務器 IP: $_SERVER[“SERVER_ADDR”]

7、寫個函數用來對二維數組排序

8、'01' == '1';?結果是 TRUE

in_array('01',array('1'));結果是1

9、簡述單引號和雙引號的用法 雙引號串中的內容可以被解釋而且替換,

單引號串中的內容總被認為是普通字符。

10、計算某段字符串中某個字符出現的次數

(例如:gdfgfdgd59gmkblg 中 g 的次數) $text = 'gdfgfdgd59gmkblg';

echo substr_count ( $text,'g');

11、有一個樓梯n級臺階,每次可以上一級或兩級臺階,有幾種不同上法?

這是一個經典的遞歸問題.也就是費波納西級數.

f(n) = f(n-1) + f(n-2).

如果我們第一部選1個臺階,那么后面就會剩下n-1個臺階,也就是會有f(n-1)種走法.如果我們第一部選2個臺階,后面會有f(n-2)個臺階.因此,對于n個臺階來說,就會有f(n-1) + f(n-2)種走法.

因此,1個臺階f(1) = 1.

f(2) = 2,

f(3) = 3

f(4) = 5

f(5) = 8

f(6) = 13

f(7) = 21

f(8) = 34

f(9) = 55

f(10) = 89

f(11) = 89+55 = 144

f(12) = 144 + 89 = 233

.

2.

這類題可這樣理解

假設走到第n階有f(n)種走法,走到第n+1階有f(n+1)種走法;

則走到第n+2階,則可分成兩種情況:

一,最后一步是從第n階直接登兩級到第n+2階

二,最后一步是從第n+1階直接登一級到第n+2階

由于從地面到第n階,和到第n+1階的走法已經知道

故從地面到第n+2階的走法:

f(n+2)=f(n)+f(n+1)

n=1時,1種走法

n=2時,2種走法

n=3時,1+2=3種走法

n=4時,2+3=5種走法

12、普通傳值與引用傳值及unset

$param1=1;$param2=2;$param2 = $param1;$param1 = 5; //變量1和變量2是兩塊內存,互不影響;

echo $param2; //所以此處還是顯示為1

//引用傳值 ↓↓

$param1=1;$param2=2;$param2 = &$param1; //把變量1的內存地址賦給變量2;此時的變量2和變量1全等;

echo $param2;//1

$param1 = 5; //變量1和變量2是一處內存,改變其中一個,另外一個也被改變;

echo $param2; //顯示為5

?>

$a = 1;$b = &$a;unset($a);echo $b; //1

首先,要理解變量名存儲在內存棧中,它是指向堆中具體內存的地址,通過變量名查找堆中的內存;

普通傳值,傳值以后,是不同的地址名稱,指向不同的內存實體;

引用傳值,傳引用后,是不同的地址名稱,但都指向同一個內存實體;改變其中一個,另外一個就也被改變;

unset并沒有真正銷毀變量的作用...僅僅是切斷了變量與內存之間的關系,內存只要還被引用著就不會被釋放;?$b和$a同時指向1,切斷其中$a的關系,$b還是指向1,所以上題不報錯,照樣輸出1。

13、

//--------------如何理解static靜態變量-----------

/** 普通局部變量*/

functionlocal() {$loc = 0; //這樣,如果直接不給初值0是錯誤的。

++$loc;echo $loc . '
';

}

local();//1

local(); //1

local(); //1

echo '===================================
';/** static靜態局部變量*/

functionstatic_local() {static $local = 0 ; //此處可以不賦0值

$local++;echo $local . '
';

}

static_local();//1

static_local(); //2

static_local(); //3

//echo $local; 注意雖然靜態變量,但是它仍然是局部的,在外不能直接訪問的。

echo '=======================================
';/** static靜態全局變量(實際上:全局變量本身就是靜態存儲方式,所有的全局變量都是靜態變量)*/

functionstatic_global() {global $glo; //此處,可以不賦值0,當然賦值0,后每次調用時其值都為0,每次調用函數得到的值都會是1,但是不能想當然的寫上"static"加以修飾,那樣是錯誤的.

$glo++;echo $glo . '
';

}

static_global();//1

static_global(); //2

static_global(); //3

?>

在 PHP 中,作用域是不重疊的,函數之外的是全局變量,

函數內部定義的則是局部變量,二者是兩個不同的變量,除非 在函數內使用 global 顯式聲明使用全局變量或直接用 $_GLOBALS 來引用。

14、$arr = array(‘james’, ‘tom’, ‘symfony’);?請將$arr 數組的值用’ , ’分割并合并成字符串輸出

echo implode(‘ , ’ , $arr);

$str = ‘jack, james, tom, symfony’;請將$str 用’ , ’分割,并把分割后的值放到$arr 數組中

$arr = explode(‘ , ’ , $str);

15、說出數組涉及到的常用函數

array-- 聲明一個數組

count -- 計算數組中的單元數目或對象中的屬性個數

foreach-- 遍歷數組

list -- 遍歷數組

explode-- 將字符串轉成數組

implode-- 將數組轉成一個新字符串

array_merge-- 合并一個或多個數組

is_array-- 檢查是否是數組

print_r -- 輸出數組

sort -- 數組排序

array_keys-- 返回數組中所有的鍵名

array_values-- 返回數組中所有的值

key-- 從關聯數組中取得鍵名

16、字符串的常用函數

trim()-- 去除字符串首尾處的空白字符(或者其他字符)

strlen()-- 字符串長度

substr()-- 截取字符串

str_replace()-- 替換字符串函數

substr_replace()-- 對指定字符串中的部分字符串進行替換

strstr()-- 檢索字符串函數

explode()-- 分割字符串函數

implode()-- 將數組合并成字符串

str_repeat()-- 重復一個字符串

addslashes()-- 轉義字符串

htmlspecialchars()--THML 實體轉義

17、寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾

18、以下代碼的執行后是,$result 值為:

答案:false

is_null-- 檢測變量是否為NULL,

如果變量是 null 則返回 TRUE,否則返回 FALSE。

在下列情況下一個變量被認為是 NULL:

1) 被賦值為 NULL

2) 尚未被賦值

3) 被 unset()

19、請列舉出你所知道的全局環境變量

$_ENV;

$_SERVER;

$_REQUEST

$_FILES

$_SESSION;

$_COOKIE;

$_GET;

$_POST;

$GLOBALS;

20、session 與 cookie 的關系和區別?

COOKIE保存在客戶端,而SESSION則保存在服務器端

從安全性來講,SESSION的安全性更高

從保存內容的類型的角度來講,COOKIE只保存字符串(及能夠自動轉換成字符串)

從保存內容的大小來看,COOKIE保存的內容是有限的,比較小,而SESSION基本上沒有這個限制

從性能的角度來講,用SESSION的話,對服務器的壓力會更大一些

SEEION依賴于COOKIE,但如果禁用COOKIE,也可以通過url傳遞

21、寫出 php 的 public, protected, private 三種訪問控制模式的區別

public:公有,任何地方都可以訪問

protected:

繼承,只能在本類或子類中訪問,在其它地方不允許訪問

private:

私有,只能在本類中訪問,在其他地方不允許訪問

22、請寫出單例模式如何設計

namespace Test;classDatabase

{//私有化內部實例化的對象

private static $instance = null;//私有化構造方法,禁止外部實例化

private function__construct(){}//私有化__clone,防止被克隆

private function__clone(){}//公有靜態實例方法

public static functiongetInstance(){if(!empty(self::$instance)){return self::$instance;

}else{

self::$instance=newDatabase();return self::$instance;

}

}

}$obj1=Database::getInstance();$obj2=Database::getInstance();$obj3=Database::getInstance();var_dump($obj1,$obj2,$obj3);echo $obj1==$obj2?1:0;echo "
";echo $obj1==$obj3?1:0;

有些類只需要實例化一次,像數據庫連接類,實例化多次的話會浪費資源,這時候就會用到單例模式

簡單的來說是“三私一公”:

構造方法私有化后就不能從外部實例化類了,但是怎么實例化呢?

就要用到靜態方法了,將其公有化,便可在外部實例化類了,

在方法里判斷對象是否為空,如果為空就實例化,存在就直接將它返回,這樣便實現了只實例化一次了

23、接口和抽象類的區別是什么?

抽象類是一種不能被實例化的類,只能作為其他類的父類來使用。 抽象類是通過關鍵字 abstract 來聲明的。

抽象類與普通類相似,都包含成員變量和成員方法,兩者的區別 在于,抽象類中至少要包含一個抽象方法,

抽象方法沒有方法體,該方法天生就是要被子類重寫的。 抽象方法的格式為:abstract function abstractMethod();

接口是通過 interface 關鍵字來聲明的,接口中的成員常量和方法都是 public 的,方法可以不寫關鍵字 public, 接口中的方法也是沒有方法體。接口中的方法也天生就是要被子類實現的。

抽象類和接口實現的功能十分相似,最大的不同是接口能實現多繼承。在應用中選擇抽象類還是接口要看具體實現。 子類繼承抽象類使用 extends,子類實現接口使用 implements。

24、類中如何定義常量, 如何類中調用常量,如何在類外調用常量

類中的常量也就是成員常量,常量就是不會改變的量,是一個恒 值。定義常量使用關鍵字 const,例如:const PI = 3.1415326;

無論是類內還是類外,常量的訪問和變量是不一樣的,常量不需 要實例化對象,

訪問常量的格式都是類名加作用域操作符號(雙冒號)來調用, 即:類名:: 類常量名。

25、以下代碼的執行結果是:

echo class b something

類 b 繼承自類 a,兩個類都定義了構造函數,由于二者名字相同,

所以子類中的構造函數覆蓋了父類的構造函數,要想子類對象實例化時也執行父類的構造函數,需要在子類構造函數中使用parent::__construct()來顯示調用父類構造函數。

26、sql 語句應該考慮哪些安全性?

防止 Sql 注入,對特殊字符進行轉義、過濾或者使用預編譯的 sql 語句綁定變量。

最小權限原則,特別是不要用 root 賬戶,為不同的類型的動作或 者組建使用不同的賬戶。

當 sql 運行出錯時,不要把數據庫返回的錯誤信息全部顯示給用 戶,以防止泄露服務器和數據庫相關信息。

27、如何用命令把 mysql 里的數據備份出來

(1). 導出一張表

mysqldump -u 用戶名 -p 密碼 庫名 表名 > 文件名(如 D:/a.sql)

(2). 導出多張表

mysqldump-u用戶名-p密碼 庫名 表名1表名2表名3>文件名(如 D:/a.sql)

(3). 導出所有表

mysqldump -u 用戶名 -p 密碼 庫名 > 文件名(如 D:/a.sql)

(4). 導出一個庫

mysqldump -u 用戶名 -p 密碼 -B 庫名 > 文件名(如 D:/a.sql)

28、MySQL 數據庫中的字段類型 varchar 和 char 的主要區別? 那種字段的查找效率要高,為什么?

區別一,定長和變長

char 表示定長,長度固定,varchar 表示變長,即長度可變

當所插入的字符串超出它們的長度時,視情況來處理,如果是嚴格模式,則會拒絕插入并提示錯誤信息,如果是寬松模式,則會截取

然后插入。如果插入的字符串長度小于定義長度時,則會以不同的方

式來處理,如char(10) ,表示存儲的是10個字符,無論你插入的

是多少,都是 10 個,如果少于 10 個,則用空格填滿。而 varchar(10) ,

小于 10 個的話,則插入多少個字符就存多少個。

varchar 怎么知道所

存儲字符串的長度呢?實際上,對于 varchar 字段來說,需要使用一

個(如果字符串長度小于 255)或兩個字節(長度大于 255)來存儲字符串的長度。

區別之二,存儲的容量不同

對 char 來說,最多能存放的字符個數 255,和編碼無關。

而 varchar 呢,最多能存放 65,532 個字符。

varchar 的最大有效長度由最大行大小和使用的字符集確定,整體最大長度是 65,532 字節,最大有效長度是 65532 字節,在 varchar 存字符串的時候,第一個字節是空的,不存任何的數據,然后還需要兩個字節來存放字符串的長度。所以有效長度就是 65535 - 1 - 2= 65532

由字符集來確定,字符集分單字節和多字節

Latin1 一個字符占一個字節,最多能存放 65532 個字符

GBK 一個字符占兩個字節, 最多能存 32766 個字符

UTF8 一個字符占三個字節, 最多能存 21844 個字符

注意,char 和 varchar 后面的長度表示的是字符的個數,而不是字節數。

兩相比較,char 的效率高,沒有碎片,尤其更新比較頻繁的時候,方便數據文件指針的操作。但不夠靈活,在實際使用時,應根據實際需求來選用合適的數據類型。

29、IP 該如何存儲?

最簡單的辦法是使用字符串(varchar)來保存,如果從效率考慮 的話,可以將 ip 保存為整型(unsignedint) ,使用 php 或 mysql 提供的函數將 ip 轉換為整型,然后存儲即可。

PHP 函數:long2ip()和 ip2long()

MySQL 函數:inet_aton()和 inet_ntoa

30、請簡述項目中優化 sql 語句執行效率的方法,從哪些方面,sql語句性能如何分析?

1) 盡量選擇較小的列

2) 將where中用的比較頻繁的字段建立索引

3) select 子句中避免使用‘*’

4) 避免在索引列上使用計算、not in 和<>等操作

5) 當只需要一行數據的時候使用limit1

5) 保證單表數據不超過200W,適時分割表。

6)選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段 設置 not null 例如'省份,性別',最好設置為 enum

針對查詢較慢的語句,可以使用explain 來分析該語句具體的執

行情況。

31、今有雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一; 百錢買雞百只,問雞翁,母,雛個幾何?

題目大意:公雞 5 文錢一只,母雞 3 文錢一只,小雞 1 文錢 3 只,

現在用 100 文錢共買了 100 只雞,

問:在這 100 只雞中,公雞,母雞和小雞是多少只?(設每種至少一只)

32、

打印九九乘法表

33、寫程序冒泡排序(數組排序)

內層每循環一次,較大的數會往后挪一位

外層每循環一次,最大的數會排到最后面

$order_array=array(5,4,3,6,7,1,2,10,8,9);function bubble_order($arr){//得到長度

$count_num=count($arr);for($k=1;$k

for($i=0;$i$arr[$i+1]){//相鄰比較

$tem=$arr[$i];$arr[$i]=$arr[$i+1];$arr[$i+1]=$tem;

}

}

}return $arr;

}$new_order_arr=bubble_order($order_array);

34、HTTP 響應狀態碼常見的有那些,代表什么意思

響應狀態碼:

常見狀態碼

35、簡述在 MySQL 數據庫中 MyISAM 和 InnoDB 的區別

區別主要有以下幾個:

構成上,MyISAM 的表在磁盤中有三個文件組成,分別是表定義文 件(.frm) 、數據文件(.MYD) 、索引文件(.MYI),而 InnoDB 的 表由表定義文件(.frm)、表空間數據和日志文件組成。

安全方面,MyISAM 強調的是性能,其查詢效率較高,但不支持事 務和外鍵等安全性方面的功能,而 InnoDB 支持事務和外鍵等高級功 能,查詢效率稍低。

36、反轉數組函數的實現

/**

* 反轉數組

* @param array $arr

* @return array*/

function reverse($arr)

{$n = count($arr);$left = 0;$right = $n - 1;while ($left < $right) {$temp = $arr[$left];$arr[$left++] = $arr[$right];$arr[$right--] = $temp;

}return $arr;

}

37、打亂數組

/**

* 打亂數組

* @param array $arr

* @return array*/

function custom_shuffle($arr)

{$n = count($arr);for ($i = 0; $i < $n; $i++) {$rand_pos = mt_rand(0, $n - 1);if ($rand_pos != $i) {$temp = $arr[$i];$arr[$i] = $arr[$rand_pos];$arr[$rand_pos] = $temp;

}

}return $arr;

}

38、Memcache與Redis的區別

Memcache

該產品本身特別是數據在內存里邊的存儲,如果服務器突然斷電,則全部數據就會丟失

單個key(變量)存放的數據有1M的限制

存儲數據的類型都是String字符串類型

本身沒有持久化功能

可以使用多核(多線程)

Redis

數據類型比較豐富:String、List、Set、Sortedset、Hash

有持久化功能,可以把數據隨時存儲在磁盤上

本身有一定的計算功能

單個key(變量)存放的數據有1GB的限制

39、最左前綴原則

有一個復合索引:INDEX(`a`, `b`, `c`)

使用方式能否用上索引

select * from users where a = 1 and b = 2

能用上a、b

select * from users where b = 2 and a = 1

能用上a、b(有MySQL查詢優化器)

select * from users where a = 2 and c = 1

能用上a

select * from users where b = 2 and c = 1

不能

總結

以上是生活随笔為你收集整理的php mysql常见面试题_PHP常见面试题总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。