php面試題

防止SQL注入

簡單回答:防止——利用即有的應用、功能,將(惡意)SQL命令發送到到后臺數據庫引擎。

防止SQL注入漏洞可以用哪些函數?

  • addslashes()
  • mysql_escape_string()

SQL注入產生的原因:

程序開發過程中不注意規范書寫sql語句和對特殊字符進行過濾,導致客戶端可以通過全局變量POST和GET提交一些sql語句正常執行。

防止SQL注入的方式:

  • 開啟配置文件中的magic_quotes_gpcmagic_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優化方法?

  1. 索引。
  2. 緩存。
  3. 避免join
  4. 靜態頁面
  5. 選取最適用的字段屬性:字段長度和非空
  6. 優化查詢語句
  • 設計良好的數據庫結構,允許部分數據冗余,盡量避免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的步驟:

  1. 啟動session:使用session_start()函數來啟動。
  2. 注冊會話:直接給$_SESSION數組添加元素即可。
  3. 使用會話:判斷session是否為空或者是否已經注冊,如果已經存在則像普通數組使用即可。
  4. 刪除會話:

1.可以使用unset刪除單個session;

2.使用$_SESSION=array()的方式,一次注銷所有的會話變量;

3.使用session_destroy()函數來徹底銷毀session。

cookie有什么用?怎么使用?

  1. 記錄用戶訪問的部分信息
  1. 在頁面間傳遞變量
  2. 將所查看的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分)

  1. 有效使用緩存,增加緩存命中率
  2. 使用負載均衡
  3. 對靜態文件使用CDN進行存儲和加速
  4. 想法減少數據庫的使用
  5. 查看出現統計的瓶頸在哪里
  6. 數據庫讀寫分離,優化數據表
  7. 使用不同主機分流主要流量

如何修改SESSION的生存時間. (1分)

session_set_cookie_params

一般有三年以上php開發經驗去百度、騰訊面試,常會接觸的面試題小總結一下:

  1. 簡單做一下自我介紹,? 然后談一下近三年來你的得意之作?
  2. 面試官看過你的簡歷,會問一些你做的項目的用戶量、pv、吞吐量、相關難點和解決方法等
  3. 數據庫設計經驗,為什么進行分表? 分庫?
    一般多少數據量開始分表? 分庫? 分庫分表的目的? 什么是數據庫垂直拆分? 水平拆分? 分區等等?可以舉例說明
  4. web開發方面會遇到哪些緩存? 分別如何優化?
  5. 給你256M的內存,對10G的文件進行排序(文件每行1個數字),如何實現?
    對10G的文件進行查找如何實現?
    統計10G文件每個關鍵字出現的次數如何實現?
  6. 假如你現在是12306火車訂票的設計師,你該如何設計滿足全國人民訂票?
  7. 假如有1億用戶的訪問量,你的服務器架構是怎樣的? 用戶信息的存儲方案如何設計?
  8. 如果你是技術組長,所帶團隊任務進度無法完成你該如何解決?
    如果在進度排滿的前提下插入任務,你該如何保證總進度不延期?
    如果有的工程師今天預定任務沒有完成,你該如何解決?
  9. 從你的經驗方面談一下如何構建高性能web站點? 需要哪些環節? 步驟? 每個步驟需要注意什么如何優化等?
  10. 為什么要對數據庫進行主從分離?
  11. 如何處理多服務器共享session?
  12. 一個10G的表,你用php程序統計某個字段出現的次數,思路是?
  13. 會告訴你一個nginx日志例子,用你認為最佳的編程語言統計一下http響應時間超過1秒的前10個url?
  14. 給你一個mysql配置文件,用你認為最佳的編程語言解析該文件?
  15. 給你兩個路徑a和b,寫一個算法或思路計算a和b差距幾層并顯示a和b的交集?
  16. 給你一個url,在nginx配置一下rewrite指定到某個具體路徑?
  17. 一個php文件的解釋過程是? 一般加速php有哪些? 提高php整體性能會用到哪些技術?
  18. session和cookie生存周期區別? 存儲位置區別?
  19. chrome號稱為多線程的,所以多線程和多進程的區別為?
  20. php在2011年底出現hash碰撞,hash碰撞原理為? 如何進行修復?
  21. web不安全因素有哪些? 分別如何防范?
  22. 假如兩個單鏈表相交,寫一個最優算法計算交點位置,說思路也可以?
  23. 假如你是技術組長? 如何提高團隊效率?
  24. nginx負載均衡有哪些? 如果其中一臺服務器掛掉,報警機制如何實現?
  25. 不優化前提下,apache一般最大連接數為? nginx一般最大連接數為? mysql 每秒insert ? select ? update ? delete?
  26. mysql 數據類型有哪些 ? 分別占用多少存儲空間 ?
  27. nginx設置緩存js、css、圖片等信息,緩存的實現原理是?
  28. 如何提高緩存命中率? 如何對緩存進行顆粒化?
  29. php的內存回收機制是?
  30. 我的所有問題都問完了,你有什么問題問我沒有?

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防范:
  1. 合理規范api請求方式,GET,POST
  1. 對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條記錄
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。