2019PHP面試題最全面歸納總結


1、請選擇以下代碼運行的結果: <?php if ('1e3' == '1000') echo 'LOL'; ?>

  A 無任何輸出結果      B   LOL        C 不執行且報錯

解析:1e3 是 科學計數法 實數的指數形式 為1乘以10的三次方,故‘1e3’=='1000'是成立的,輸出echo ‘LOL’;

 

 

2、請選出以下代碼運行的結果: <?php $a = "aabbzz"; $a++; echo $a; ?>

  A b            B aabbzz            C aabcaa

解析: 字符串字母相加其實就是在末尾字母加一 如:$a = "a"; $a++;答應結果就是 b,$a=''aa';結果就是ab 故$a = "aabb";打印結果就是 aabc ,如$a = "aabbz";結果就是 aabca,因為Z是末尾字母故加一變為a,向前一位進一,b就變為c,故結果為C;

3,寫出一下程序的輸出結果:<?php    

$data = ['a','b','c']; 

foreach($data as $k=>$v){

    $v = &$data[$k];

}

>

A $data = ['a','b','c'];            B $data = ['b','b','c'];             C $data = ['b','c','c']; 

解析:這里有個考點要記得 就是&是引用;修改引用變量的值,那么空間的值也會改變,第一次循環 得到$v=&$data[0]=>'a',第二次循環$v=&$data[1]=>'b',可見第一次引用的$data[0]的值已經被改變,所以此時的$data[0]=b,此時$v引用的$data[1],進入第三次循環 此時$v又變為 $v=&$data[2]=>'c',,$v又一次改變,引用的$data[1]的值也被改變為C,所以此時的$data[1]=c,這樣循環結束 $data[0]=>'b', $data[1]=>'c', $data[2]=>'c',

    3,寫出一下程序的輸出結果:<?php $a= 0.1; $b = 0.7;if($a+$b ==0.8){ echo true; }else{ echo false; } >

    A 空;     B true;      C false;     D、1;  E、0;  F:報錯

    解析:這里的考點有兩個:1,echo false和true的值;2、浮點類型不能用於精確計算;首先浮點類型的數據不能用於計算,他會將浮點類型轉為二進制,所以有一定的損耗,故它無限接近於0.8,也就是0.79999999...,所以echo 應該是個false;echo false;結果是空;echo true;結果是1;

    4,用PHP寫出顯示客戶端的IP和服務端的IP

    echo $_SERVER[‘REMOTE_ADDR’];//客戶端IP

    echo gethostbyname(“www.baidu.com”)//服務端

    5,以下表達式的結果是:

$a= 0;

$b= 0;

if($a= 3>0 || $b= 3>0){

$a++;

$b++;

}

echo $a,$b;

A報錯;    B:1,1;    (要是真的只有兩個選項該多好肯定大家都選B)

解析:此題考查的是運算符的優先級問題,首先在此題中比較運算符>邏輯運算符>賦值,所以1,先看 3>0為true,2,因為是||運算所以后面的$b=3>0 形成短路作用,這時的$a=true,$b=0;

  故$a++;為1;$b++;為1這里解釋下布爾類型運算不影響布爾類型結果;但是$b=0;$b++;就改變為1, echo true;結果為1,

6.PHP中如何優化多個if...esleif語句的情況
        解析:首先盡可能將表達式可能性越大的越往前面放,其次如果我們判斷的內容比較復雜且 判斷的值只是字符串,整型,浮點 那么就可以用switch...case來代替

7.

val1= 5;
$val2 = 10;
function foo(&$my_val){
    global $val1;
    $val1+=2;//7
    $val2 =4;//4
    $my_val +=3;//8
    return $val2;//4
}
$my_val = 5;
echo foo($my_val)."\n";//4
echo $my_val;//8
echo $val1."\n".$val2;//7   10
$bar = 'foo';
$my_val =10;
echo $bar($my_val)."\n";//4s

 

8.用正則 寫出以139開頭的手機號碼

$str = '13812345678';
$pattern = '/^139\d{8}$/';
preg_match($pattern,$str,$macth);
var_dump($macth);

 

9.用PHP方式對目錄進行遍歷
$dir = './test';

function loopDir($dir){
$handle = opendir($dir);
while(false !==($file =readdir($handle))){
if($file!='.'&&$file!='..'){
echo $file."<br>";
if(filetype($dir.'/'.$file)=='dir'){
loopDir($dir.'/'.$file);
}
}
}
}

loopDir($dir);
10請簡單敘述 CGI fastCGI h和 PHP-FPM的區別
CGI 代表為了聯系PHP 和websevae 的一個橋梁
fastCGI 是CGI的改良版
PHP-FPM 進程管理器
 

 

 

 

 

 

 

  

----------------------------------------------------------------------------------------------------------------------------------

1,冒泡排序很實用要記得

function maopao($arr){
    $len = count($arr);
    $n = count($arr)-1;
    for($i=0;$i<$len;$i++){
        for($j=0;$j<$n;$j++){
            if($arr[$j]<$arr[$j+1]){
                $temp = $arr[$j+1];
                $arr[$j+1] = $arr[$j];
                $arr[$j] =$temp;
            }
        }
    }
    return $arr;
}

2,快速排序

function quick_sort($array) {

    if (count($array) <= 1) return $array;

    $key = $array[0];

    $left_arr = array();

    $right_arr = array();

    for ($i=1; $i<count($array); $i++){

        if ($array[$i] <= $key)

            $left_arr[] = $array[$i];

        else

            $right_arr[] = $array[$i];

    }

    $left_arr = quick_sort($left_arr);

    $right_arr = quick_sort($right_arr);

    return array_merge($left_arr, array($key), $right_arr);

}

3、請說明 PHP 中傳值與傳引用的區別,什么時候傳值什么時候傳引用?

按值傳遞:函數范圍內對值的任何改變在函數外部都會被忽略

按引用傳遞:函數范圍內對值的任何改變在函數外部也能反映出這些修改

優缺點:按值傳遞時,php必須復制值。特別是對於大型的字符串和對象來說,這將會是一個代價很大的操作。

    按引用傳遞則不需要復制值,對於性能提高很有好處。

4、MySQL數據庫中的字段類型varchar和char的主要區別是什么?

   char和varchar最大的不同就是一個是固定長度,一個是可變長度.由於是可變長度,因此存儲的是實際字符串再加上一個記錄字符串長度的字節。如果分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.

   varchar(M)和char(M),M都表示字符數.varchar的最大長度為65535個字節,不同的編碼所對應的最大可存儲的字符數不同.char最多可以存放255個字符,不同的編碼最大可用字節數不同

5、對於大流量的網站,采用什么樣的方法來解決訪問量問題?

    1. 確認服務器硬件是否足夠支持當前的流量
    2. 優化數據庫訪問。
    3. 禁止外部的盜鏈。
    4. 控制大文件的下載。
    5. 使用不同主機分流主要流量
    6. 使用流量分析統計軟件
    7. 盡量使用靜態頁,緩存

6、什么是面向對象?主要特征是什么?

面向對象是程序的一種設計方式,它利於提高程序的重用性,使程序結構更加清晰。主要特征:封裝、繼承、多態。

7、SESSION 與 COOKIE的區別是什么?

SESSION存儲在服務器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴於cookie進行傳遞。禁用cookie后,session還可以使用,在存儲session的文件中,生成sessionID,通過get傳參的方式將sessionID傳到要實現session共享的頁面,讀取sessionID,從而從session中獲取數據。

8、對緩存技術的了解

    1、緩存技術是將動態內容緩存到文件中,在一定時間內訪問動態頁面直接調用緩存文件,而不必重新訪問數據庫。 2、使用memcache可以做緩存。

  9、表單中get和post提交方式的區別?

    get是顯式的,數據從url中可以看到,傳輸的數據量小,安全性低; post是隱式的,傳送的數據量較大,安全性較高

  10、優化mysql數據庫的方法

    1,數據表中的數據類型的優化  如選擇合適的字段,選擇效率快速的字段 

    2,索引優化

    3、SQL語句的優化

      (1)優化查詢過程中的數據訪問如使用limit、使用返回列不用*

      (2)優化長難句的查詢語句 變復雜為簡單、切分查詢、分解關聯查詢

      (3)優化特定類型的查詢語句如優化count()、優化關聯查詢、優化子查詢、優化Group by、優化li'mit

    4、存儲引擎的優化

      (1)盡量使用InnoDB存儲引擎,因為它支持事務、外鍵、使用獨立表空間、使用的是行級鎖、

    5、數據表結構的設計優化

      (1)分區操作 如通過特定的策略對數據進行物理拆分、對用戶透明的、partition by

      (2)分庫分表  如水平拆分(以行級進行拆分)、垂直拆分(列及拆分)

    6、數據架構的優化

      (1)主從復制

      (2)讀寫分離

      (3)雙主熱備

      (4)負載均衡  通過LVS的三種模式實現的、Mycat數據庫中間件實現的

  11、語句include和require的區別是什么?

    require是無條件包含,也就是如果一個流程里加入require,無論條件成立與否都會先執行require,當文件不存在或者無法打開的時候,會提示錯誤,並且會終止程序執行

    include有返回值,而require沒有(可能因為如此require的速度比include快),如果被包含的文件不存在的化,那么會提示一個錯誤,但是程序會繼續執行下去

  12、redis和memcacahe、mongoDB的區別?

    都是非關系型數據庫,性能都非常高,但是mongoDB和memcache、redis是不同的兩種類型。后兩者主要用於數據的緩存,前者主要用在查詢和儲存大數據方面,是最接近數據庫的文檔型的非關系數據庫。

    從數據存儲位置上來分,memcache的數據存在內存中,而redis既可以存儲在內存中,也可以存儲的到磁盤中,達到持久化存儲的功能,memcache一旦斷電,數據全部丟失,redis可以利用快照和AOF把數據存到磁盤中,當恢復時又從磁盤中讀取到內存中,當物理內存使用完畢后,可以把數據寫入到磁盤中。

    從存儲數據的類型上來分,memcache和redis存儲的方式都是鍵值對,只不過redis值的類型比較豐富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存儲的是字符串。

  13、PHP的基本變量類型

    四種標量類型:boolean (布爾型)、integer (整型)、float (浮點型, 也稱作 double)、string (字符串)

    兩種復合類型:array (數組)、object (對象)

    最后是兩種特殊類型:resource(資源)、NULL(NULL)

  14、靜態化如何實現的?偽靜態如何實現?

    1、 靜態化指的是頁面靜態化,也即生成實實在在的靜態文件,也即不需要查詢數據庫就可以直接從文件中獲取數據,指的是真靜態。
      實現方式主要有兩種:

        一種是我們在添加信息入庫的時候就生成的靜態文件,也稱為模板替換技術。

        一種是用戶在訪問我們的頁面時先判斷是否有對應的緩存文件存在,如果存在就讀緩存,不存在就讀數據庫,同時生成緩存文件。

    2、偽靜態不是真正意義上的靜態化,之所以使用偽靜態,主要是為了SEO推廣,搜索引擎對動態的文件獲取難度大,不利於網站的推廣。實習原理是基於Apache或Nginx的rewrite機智
  主要有兩種方式:

      一種是直接在配置虛擬機的位置配置偽靜態,這個每次修改完成后需要重啟web服務器。

      另一種采用分布式的,可以在網站的根目錄上創建.htaccess的文件,在里面配置相應的重寫規則來實現偽靜態,這種每次重寫時不需要重啟web服務器,且結構上比較清晰。

  16、如何處理負載,高並發

1、HTML靜態化
效率最高、消耗最小的就是純靜態化的html頁面,所以我們盡可能使我們的 網站上的頁面采用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。
2、圖片服務器分離
把圖片單獨存儲,盡量減少圖片等大流量的開銷,可以放在一些相關的平台上,如七牛等
3、數據庫集群和庫表散列及緩存
數據庫的並發連接為100,一台數據庫遠遠不夠,可以從讀寫分離、主從復制,數據庫集群方面來着手。另外盡量減少數據庫的訪問,可以使用緩存數據庫如memcache、redis。
4、鏡像:
盡量減少下載,可以把不同的請求分發到多個鏡像端。
5、負載均衡:
Apache的最大並發連接為1500,只能增加服務器,可以從硬件上着手,如F5服務器。當然硬件的成本比較高,我們往往從軟件方面着手。

17、Mysql的讀寫分離?

讀寫分離的實現原理就是在執行SQL語句的時候,判斷到底是讀操作還是寫操作,把讀的操作轉向到讀服務器上(從服務器,一般是多台),寫的操作轉到寫的服務器上(主服務器,一般是一台,視數據量來看)。

18、說一下單引號雙引號?

  單引號內部的變量不會執行, 雙引號會執行

    單引號解析速度比雙引號快。

    單引號只能解析部分特殊字符,雙引號可以解析所有特殊字符。

  19、PHP7的新特性?重點

標量類型聲明:PHP 7 中的函數的形參類型聲明可以是標量了。在 PHP 5 中只能是類名、接口、array 或者 callable (PHP 5.4,即可以是函數,包括匿名函數),現在也可以使用 string、int、float和 bool 了。

  返回值類型聲明:增加了對返回類型聲明的支持。 類似於參數類型聲明,返回類型聲明指明了函數返回值的類型。可用的類型與參數聲明中可用的類型相同。

  NULL 合並運算符:由於日常使用中存在大量同時使用三元表達式和 isset()的情況,NULL 合並運算符使得變量存在且值不為NULL, 它就會返回自身的值,否則返回它的第二個操作數。

  use 加強:從同一 namespace 導入的類、函數和常量現在可以通過單個 use 語句 一次性導入了

  匿名類:現在支持通過new class 來實例化一個匿名類

  20、PHP 數組排序

sort() - 以升序對數組排序

rsort() - 以降序對數組排序

asort() - 根據值,以升序對關聯數組進行排序

ksort() - 根據鍵,以升序對關聯數組進行排序

arsort() - 根據值,以降序對關聯數組進行排序

krsort() - 根據鍵,以降序對關聯數組進行排序

21、PHP支持多繼承嗎?

  不支持。PHP中只允許單繼承,父類可以被一個子類用關鍵字“extends”繼承。

22PHP如何實現多繼承嗎?

  可以使用 interface 或 trait 實現 。

    1.使用 interface 聲明類不能被實例化,並且屬性必須是常量,方法不能有方法體 

    2.trait 聲明的類不能被實例化,由use引入,會覆蓋父類的相同屬性及方法,如果有多個use,那么按順序下面的覆蓋最上面的相同的屬性及方法

  23、優化MYSQL數據庫的方法

(1)選擇最有效率的表名順序

(2)WHERE子句中的連接順序

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

(4)用Where子句替換HAVING子句

(5)通過內部函數提高SQL效率

(6)避免在索引列上使用計算。

(7)提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。

(1).選取最適用的字段屬性,應該盡量把字段設置為NOT NULL

(2).使用連接(JOIN)來代替子查詢(Sub-Queries)

(3).使用聯合(UNION)來代替手動創建的臨時表

(4).盡量少使用 LIKE 關鍵字和通配符

(5).使用事務和外鍵

  25、MySQL主從備份的原理?

  mysql支持單向、異步復制,復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。

26、error_reporting() 的作用?

  設置 PHP 的報錯級別並返回當前級別。

  27、如何修改session的生存時間

在php.ini 中設置 session.gc_maxlifetime = 1440 //默認時間

代碼實現 123

$lifeTime = 24 * 3600; // 保存一天

session_set_cookie_params($lifeTime);

session_start();

28、常見的 PHP 安全性攻擊

SQL注入:用戶利用在表單字段輸入SQL語句的方式來影響正常的SQL執行。
防止

使用mysql_real_escape_string()過濾數據

手動檢查每一數據是否為正確的數據類型

使用預處理語句並綁定變量

參數化SQL:是指在設計與數據庫鏈接並訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值,用@或?來表示參數。

XSS攻擊 :跨站點腳本攻擊,由用戶輸入一些數據到你的網站,其中包括客戶端腳本(通常JavaScript)。如果你沒有過濾就輸出數據到另一個web頁面,這個腳本將被執行。
防止:為了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。

CSRF:跨站點請求偽造,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但是是偽造的
防止:一般來說,確保用戶來自你的表單,並且匹配每一個你發送出去的表單。有兩點一定要記住:

對用戶會話采用適當的安全措施,例如:給每一個會話更新id和用戶使用SSL。

生成另一個一次性的令牌並將其嵌入表單,保存在會話中(一個會話變量),在提交時檢查它。 如laravel中的 _token

代碼注入:代碼注入是利用計算機漏洞通過處理無效數據造成的。問題出在,當你不小心執行任意代碼,通常通過文件包含。寫得很糟糕的代碼可以允許一個遠程文件包含並執行。如許多PHP函數,如require可以包含URL或文件名。
防止代碼注入

過濾用戶輸入

在php.ini中設置禁用allow_url_fopen和allow_url_include。這將禁用require/include/fopen的遠程文件

--------------------------------------------------------------------------------------------------------

1、__FILE__表示什么意思?

   文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。

2、如何獲取客戶端的IP地址?

   1 $_SERVER[‘REMOTE_ADDR’]

3、寫出使用header函數跳轉頁面的語句

   1 Header(‘location:index.php’);

4、$str是一段html文本,使用正則表達式去除其中的所有js腳本

    $pattern = ‘/<script.*>\.+<\/script>/’;

  Preg_replace($pattern,’’,$str);

5、mvc是什么?相互間有什么關系?

答:mvc是一種開發模式,主要分為三部分:m(model),也就是模型,負責數據的操作;v(view),也就是視圖,負責前后台的顯示;c(controller),也就是控制器,負責業務邏輯

客戶端請求項目的控制器,如果執行過程中需要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據通過視圖顯示出來

6、oop是什么?

答:oop是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。

1、封裝性:也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。於是開發人員只 需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現MVC分工合作,也能有效避免程序間相互依賴,實現代碼模塊間松藕合。

2、繼承性:就是子類自動繼承其父級類中的屬性和方法,並可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。PHP只支持單繼承,也就是說一個子類只能有一個父類。

3、多態性:子類繼承了來自父級類中的屬性和方法,並對其中部分方法進行重寫。於是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。多態性增強了軟件的靈活性。

1、易維護

采用面向對象思想設計的結構,可讀性高,由於繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。

2、質量高

在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求並具有較高的質量。

3、效率高

在軟件開發時,根據設計的需要對現實世界的事物進行抽象,產生類。使用這樣的方法解決問題,接近於日常生活和自然的思考方式,勢必提高軟件開發的效率和質量。

4、易擴展

由於繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。

7、smarty是什么,有什么作用?

答:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一

它分離了邏輯代碼和外在的顯示,提供了一種易於管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離,我們公司使用的是TP框架,已經封裝好了smarty模板,所以沒有單獨使用過。

8.TP的特性有哪些?

1.多表查詢非常方便,在model中幾句代碼就可以完成對多表的關聯操作

2.融合了smarty模板,使前后台分離

3.支持多種緩存技術,尤其對memcache技術支持非常好

4.命名規范,模型,視圖,控制器嚴格遵循命名規則,通過命名一一對應

5.支持多種url模式

6.內置ajax返回方法,包括xml,json,html等

7.支持應用擴展,類庫擴展,驅動擴展等

9.請介紹一下laravel框架?

答: laravel框架的設計思想比較先進,非常適合應用各種開發模式,作為一個框架,它為你准備好了一切,composer是php的未來,沒有composer,php肯定要走向沒落

laravel框架最大的特點和優秀之處就是集合了php比較新的特點,以及各種各樣的設計模式,Ioc模式,依賴注入等

10.請簡述一下數據庫的優化?

答:數據庫的優化可以從四個方面來優化:

1.從結構層: web服務器采用負載均衡服務器,mysql服務器采用主從復制,讀寫分離

2.從儲存層: 采用合適的存儲引擎,采用三范式

3.從設計層: 采用分區分表,索引,表的字段采用合適的字段屬性,適當的采用逆范式,開啟mysql緩存

4.sql語句層:結果一樣的情況下,采用效率高,速度快節省資源的sql語句執行

  

11.怎么保證促銷商品不會超賣?

答:這個問題是我們當時開發時遇到的一個難點,超賣的原因主要是下的訂單的數目和我們要促銷的商品的數目不一致導致的,每次總是訂單的數比我們的促銷商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現:

第一種方案:在每次下訂單前我們判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大於0的商品的庫存,當時我們使用ab進行壓力測試,當並發超過500,訪問量超過2000時,還是會出現超賣現象。所以被我們否定了。

第二種方案:使用mysql的事務加排他鎖來解決,首先我們選擇數據庫的存儲引擎為innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高並發測試時,對數據庫的性能影響很大,導致數據庫的壓力很大,最終也被我們否定了。

第三種方案:使用文件鎖實現。當用戶搶到一件促銷商品后先觸發文件鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得I/O開銷很大。

最后我們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操作起來很方便,而且效率極高,最終我們采取這種方式來實現

12.商城秒殺的實現?

答:搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個:

1 高並發對數據庫產生的壓力

2 競爭狀態下如何解決庫存的正確減少("超賣"問題)

對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作數據庫,例如使用Redis。第二個問題,我們可以使用redis隊列來完成,把要秒殺的商品放入到隊列中,因為pop操作是原子的,即使有很多用戶同時到達,也是依次執行,文件鎖和事務在高並發下性能下降很快,當然還要考慮其他方面的東西,比如搶購頁面做成靜態的,通過ajax調用接口,其中也可能會出現一個用戶搶多次的情況,這時候需要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高並發情況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫數據庫,將用戶入結果隊列。

22.購物車的原理?

答:購物車相當於現實中超市的購物車,不同的是一個是實體車,一個是虛擬車而已。用戶可以在購物網站的不同頁面之間跳轉,以選購自己喜愛的商品,點擊購買時,該商品就自動保存到你的購物車中,重復選購后,最后將選中的所有商品放在購物車中統一到付款台結賬,這也是盡量讓客戶體驗到現實生活中購物的感覺。服務器通過追蹤每個用戶的行動,以保證在結賬時每件商品都物有其主。

要涉及以下幾點:

    1、把商品添加到購物車,即訂購

    2、刪除購物車中已定購的商品

    3、修改購物車中某一本圖書的訂購數量

    4、清空購物車

    5、顯示購物車中商品清單及數量、價格

實現購物車的關鍵在於服務器識別每一個用戶並維持與他們的聯系。但是HTTP協議是一種“無狀態(Stateless)”的協議,因而服務器不能記住是誰在購買商品,當把商品加入購物車時,服務器也不知道購物車里原先有些什么,使得用戶在不同頁面間跳轉時購物車無法“隨身攜帶”,這都給購物車的實現造成了一定的困難。

目前購物車的實現主要是通過cookie、session或結合數據庫的方式。下面分析一下它們的機制及作用

$data = ['a','b','c'];foreach($data as $k=>$v){    $v = &$data[$k];}print_r($data);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM