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常见面试题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是SaaS? 定义软件即服务
- 下一篇: HTTP 403详解