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