前端筆記之伺服器&Ajax(中)MySQL基礎操作&PHP運算元據庫&Ajax

mufengsm發表於2019-04-15

一、資料庫基礎

1.1什麼是資料庫?

什麼是資料庫?

答:就是一個很大的一個檔案,只不過這個檔案可以通過一些‘命令’運算元據;

    增、刪、改、查資料

 

資料庫等於持久資料和資料操作的一個統稱。

資料庫是按照資料結構來組織、儲存及管理資料的倉庫。

資料庫有哪些? MySQLSQL serverOracle 都是關係型資料管理系統(RDBMS)。

SQL儲存資料相對較小,最為常用的資料庫就是MySQL(開源、免費)

Orecal大型資料庫(不開源、收錢)

NOSQL

Mongodb

運算元據庫也有自己的語言,這個語言叫結構化查詢語言。結構化查詢語言(Structured Query Language)簡稱SQL。用於存取資料以及查詢、更新和管理關聯式資料庫系統;同時也是資料庫指令碼檔案的副檔名。


 

1.2 MySQL 的操作

因為安裝了PHPnow。所以每一個同學的計算機中都有資料庫。

想運算元據庫可以通過php操作,也可以通過視覺化的資料庫管理軟體操作。

我們用的視覺化的資料庫管理軟體是Sqlyog

SQLyog 是一個快速而簡潔的圖形化管理MYSQL資料庫的工具,它能夠在任何地點有效地管理你的資料庫,由業界著名的Webyog公司出品。

資料庫的結構層次組成:資料庫 > > 欄位(條目),每個資料庫的表中必須有一個主鍵。

 

 

1、連線資料庫,輸入使用者名稱和密碼

使用者的密碼就是你安裝PHPNOW的時候,也安裝mySQL,密碼123456

 

 

2、認識sqlYog的圖形介面

 

 

3、建立自己的資料庫

 

 

4、建立資料庫名字和設定字符集

 

 

5點選資料庫的“+”,你會發現資料庫當中有表,在資料庫中建立表。

 

 

6、需要設定表名字(gz0920);設定字符集(UTF8

其餘的設定都為預設

 

 

給(gz0920)表新增欄位;

注意:①int代表的是整數  varchar字串

      ②一個表當中主鍵只能有一個非空自增

 

 

資料庫表的欄位

 


1.3 SQL語言運算元據庫

資料庫增刪改查操作(CRUD

C 增加(create

R 查詢(read

U 更改(update

D 刪除(delete

sql可以通過後臺語言(PHPJSPaps.net)執行運算元據庫。SQL 語句對大小寫不敏感

sql語句手冊:http://www.w3school.com.cn/sql/sql_and_or.asp


 

●查詢

 SELECT 欄位 FROM 表名

 

 SELECT * FROM banji0922

 

 

 SELECT * FROM banji0922 WHERE sex=""

 

 

 SELECT * FROM banji0922 WHERE xingbie = "" AND nianling > 60 ;

 

 

 SELECT * FROM banji0922 WHERE xingbie = "" ORDER BY nianling DESC;

 

DESC是降序;ASC 是升序

 

 

SELECT  欄位 FROM  表名

SELECT xingming FROM gz1125 

 

提示:查詢與語句SELECT  *  FROM gz1125 單詞一般都是大寫,後面新增的是表名稱,因為表中才有資料。

 


 

●增加

INSERT INTO語句插入條目:

 INSERT INTO 表名稱 VALUES (1, 2,....)

 

我們也可以指定所要插入資料的列:

 INSERT INTO table_name (1, 2,...) VALUES (1, 2,....)

 

 INSERT INTO  banji0922 VALUE(11,"王安石",99,"","6543432534");

 

 

不想插入所有的條目,必須羅列響應的欄位:

 INSERT INTO banji0922 (xingming,qqhao) VALUE ("李大釗","3465342");

 

 

下面的是錯誤演示:

 INSERT INTO banji0922  VALUE ("李大釗","3465342");

 


 

●更改

語法:

SET   表示設定

WHERE 表示條件

 UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值

 

更改多個條目,用逗號隔開:

 UPDATE 表名稱 SET 列名稱 = 新值,列名稱 = 新值 WHERE 列名稱 = 某值

 

 UPDATE banji0922 SET nianling = 200 WHERE xingming = "李大釗";

 

 

 UPDATE banji0922 SET xingbie = "" WHERE nianling > 20;

 


 

●刪除

DELETE FROM 表名稱 WHERE 列名稱 =

DELETE FROM banji0922 WHERE xingming = "李大釗";

 

刪除整個表:

 DELETE FROM banji0922;

 



WHERE條件

 

●備份資料庫

 

恢復資料:將我們生產的sql檔案拖拽到資料庫中,點選執行多條sql語句按鈕,再重新整理資料庫列表。

 SELECT * FROM banji0922

 SELECT * FROM banji0922 WHERE xingbie = ""

 INSERT INTO banji0922 ( xingming,nianling)VALUE ("王羲之",300)

 UPDATE banji0922 SET nianling = 30  WHERE  xingming = "王羲之"

 DELETE FROM banji0922 WHERE xingming = "王羲之";

 


二、PHP運算元據庫

概述:對於後臺而已,經常做的一件事情就是儲存資料,運算元據庫,PHP屬於後端語言,因此也有運算元據庫的方法。

<?php
    // 連線資料庫 引數  : 地址 、 使用者名稱 、 密碼
    mysql_connect("localhost","root",123456);
    // 選擇操作哪個資料庫
    mysql_select_db("student");
    // 設定編碼
    mysql_query("SET NAMES UTF8");
    // 寫執行的sql語句,快捷鍵  ctrl+k+u
    $sql = "INSERT INTO banji0922 VALUE (13,'海子',20,'男','123465454')";
    // 執行sql語句
    mysql_query($sql);
?>

 

 要從資料庫中所有的條目顯示到頁面上:

<meta charset="UTF-8" />
<?php
    // 連線資料庫 引數  : 地址 、 使用者名稱 、 密碼
    mysql_connect("localhost","root",123456);
    // 選擇哪個資料庫
    mysql_select_db("student");
    // 識別中文字元
    mysql_query("SET NAMES UTF8");
    // 寫執行的sql語句
    // 快捷鍵  ctrl+k+u
    $sql = "SELECT * FROM banji0922";
    // 執行sql
    $result = mysql_query($sql);
    // 把$result類陣列物件變成陣列
    $row = mysql_fetch_array($result);
    // 輸出
    print_r($row);
?>

Array ( [0] => 1 [id] => 1 [1] => 諸葛亮 [xingming] => 諸葛亮 [2] => 80 [nianling] => 80 [3] => [xingbie] => [4] => 23456789 [qqhao] => 23456789 )

print_r後只顯示資料庫中第一條資訊

 

查詢資料庫:

<?php
    // 連線資料庫 引數  : 地址 、 使用者名稱 、 密碼
    mysql_connect("localhost","root",123456);
    // 選擇哪個資料庫
    mysql_select_db("student");
    // 識別中文字元
    mysql_query("SET NAMES UTF8");
    // 寫執行的sql語句
    // 快捷鍵  ctrl+k+u
    $sql = "SELECT * FROM banji0922";
    // 執行sql
    $result = mysql_query($sql);
    // 把$result類陣列物件變成陣列
    $row = mysql_fetch_array($result);
    // 輸出
    print_r($row);
    // 把$result類陣列物件變成陣列
    $row = mysql_fetch_array($result);
    // 輸出
    print_r($row);
   ……………………
?>

 

<?php
   mysql_connect("localhost","root",123456);
   mysql_select_db("student");
   mysql_query("SET NAMES UTF8");
   //資料庫返回的資料(物件)
   $result = mysql_query("SELECT * FROM gz0920");
   //將結果轉換為陣列
   while ($array = mysql_fetch_array($result)) {
       print_r($array["xingming"]);
       echo "<br/>";
   }
?>

提示:

①資料庫返回的結果是一個物件,因此需要用mysql_fetch_array($result)變為陣列;

②遍歷資料取到你想要的資料


 

三、複習

概述:對於客戶端而言,當在位址列輸入網址回車的時候,會向伺服器發起一個上行請求(GETPOST),網頁中幾乎90%都是GET請求,登入、註冊...可以用POST,它兩者不同的地址:

GET請求是以偽裝URL的形式(?k=v&k=v)向伺服器傳遞一些額外資料;

POST請求是以報文體的形式向伺服器傳遞資料

 

報文:報文頭(客戶端的瀏覽器的資訊)+ 報文體(一般為空)

 

get:一般用於資訊的獲取使用url傳遞引數。對所送的資料有位元組數限制。(本質上:以少換多)。Get請求是向伺服器獲取訊息。

post:一般用於儲存或修改伺服器上的額資源的。對所傳送的資料沒有位元組限制。Post請求所有都是通過form表單形式提交的。Post請求可以看成向伺服器推送訊息。(資訊量大,換回來的少)

 

一個完整的URL包括哪些部分:

http://www.baidu.com:8080/news/2017-12-09/index.php?newsid=344532&pagenum=12#name

l http:// 協議部分

www.baidu.com  域名

:8080   埠

/news/2017-12-09/    虛擬目錄,從域名的第一個/”到最後一個“/

index.php    檔名

?newsid=344532&pagenum=12  引數部分 從?開始到#”之前結束

l #name  #開始到最後,hash


四、Ajax開發

4.1 Ajax介紹

Ajax Asynchronous Javascript And XML”(非同步 JavaScript XML),是指一種建立互動式網頁應用的網頁開發技術。

 Ajax = 非同步 JavaScript  XML標準通用標記語言的子集)。

 Ajax 是一種用於建立快速動態網頁的技術。

 Ajax 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。

通過在後臺與伺服器進行少量資料交換,Ajax 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

傳統的網頁(不使用 Ajax)如果需要更新內容,必須過載整個網頁頁面。

 

 到底什麼是Ajax

它不是一個技術(多門技術的集合),它可以悄悄的向伺服器請求資料,伺服器也可以悄悄的向客戶端響應返回資料,最終實現整個頁面沒有重新載入,而實現頁面中區域性重新整理資料。

2005 年初,許多事件使得 Ajax 被大眾所接受。Google 在它著名的互動應用程式中使用了非同步通訊,如GoogleGoogle 地圖、Google搜尋應用Ajax技術

 


4.2 Ajax效果

概述:對現在的開發人員而言,“遍地”都是Ajax

 

例如163郵箱的註冊,當你在郵箱地址文字輸入框當中輸入完手機號之後,客戶端會向伺服器悄悄的傳遞資料,伺服器也會悄悄的響應,給你返回資料;整體的網頁沒有更新的情況下,實現區域性重新整理資料;例如微博的點贊等......

 


4.3 Asynchronoussynchronous

概述:耗時間相對長一些的語句,我們稱之為“非同步語句”:AjaxsetInterval()setTimeout()animate()Nodejs都是非同步語句。非同步語句耗時都比較長,所以會先執行後面同步的語句(如果先執行非同步語句,程式就被阻塞了)。

經驗:只要有回撥函式的都是非同步語句。

 

遇到非同步語句,會先放一邊,執行後面同步的語句,回頭再執行自己

var f = 0;
setInterval(function(){
   f++
   console.log(f);
},1000)
console.log("哈哈");

 

同步語句一般耗時不長,依次從上往下的順序執行

for(var i = 0; i < 10; i++){
   console.log(i)
}
console.log("哈哈");

4.4程式和執行緒

概述:什麼是程式,一個應用就是一個程式。

 

什麼是執行緒?執行緒就是程式的基本單位,也就說,程式是由多個執行緒組成的(主執行緒),JS是單執行緒。


4.5 jQueryAjax

jQueryget請求語法:

$.get(url, [data], [callback], [type])

 

案例:當單擊按鈕的時候,將伺服器中的資料顯示到標籤中,並且不重新整理頁面:

$("button").click(function(){
    //發起一個GET請求
    $.get("data/result.txt", function(data){
        $("p").html(data)
    })
});
//用定時器證明這個頁面沒有重新載入
var i = 0;
setInterval(function(){
    i++;
    $("h1").html(i)
},100)

注意:

 所有的檔案都必須在伺服器中。

 必須是http請求過來的。

請求的頁面若不是通過http開啟的,會報錯,這個報錯就是著名的跨域報錯。

 

 jQuery中的$.get,幫我們做了什麼事情?

傳送了http請求,請求介面中的資料。然後伺服器收到http請求,開始執行http響應,txt中的內容在http的報文體中攜帶到瀏覽器中。被$.get的回撥函式接收。回撥函式的data就是http響應的報文體中的引數。


4.5.1 Ajax實現註冊功能

註冊業務:客戶端會向伺服器傳遞一些資料,伺服器會儲存這個資料,如果使用者名稱已經被註冊了,提示該使用者名稱已經被註冊。

注意:別忘記建立資料庫

 

前端html:

<body>
    <p>賬戶:<input type="text" id="user" /><b class="info"></b></p>
    <p>密碼:<input type="password" id="pwd" /></p>
    <button>註冊</button>
</body>
<script type="text/javascript" src="js/jquery-2.2.4.min.js"></script>
<script type="text/javascript">
    $("button").click(function(){
        $.post("php/reg.php", {
            "name": $('#user').val(),
            "password": $('#pwd').val()
        }, function(data){
            if(data == 1){
                alert("註冊成功");
            }else{
                alert("註冊失敗");
            }
        })
    });

    //文字框輸入內容時,實時查詢使用者名稱是否存在
    $("#user").on('input',function(){
        $.get("php/search.php?name=" + $(this).val(), function(data){
            if(data == 1){
                $('.info').css('color','green').html("恭喜你可以註冊");
            }else{
                $('.info').css('color','red').html("使用者名稱已被註冊");
            }
        })
    })

    //失去焦點隱藏info
    $('#user').blur(function(){
        $('.info').hide()
    })
</script>

 

reg.php註冊:

<?php
    //獲取前端傳過來的資料
    $name = $_POST["name"];
    $password = $_POST["password"];

    //連線資料庫,引數:資料庫地址、使用者名稱、密碼
    mysql_connect('localhost', 'root', '123456');
    //選擇要操作的資料庫
    mysql_select_db("student");
    //設定編碼
    mysql_query("SET NAMES utf8");
    //寫執行插入的SQL語句,儲存到資料庫的表中
    $sql = "INSERT INTO stuuser (name, password) VALUES ('$name','$password')";
    //執行SQL語句,會返回成功插入的結果(條數)
    $result = mysql_query($sql);

    if($result){
        echo 1; //插入成功返回1給前端
    }else{
        echo 0; //插入失敗返回0給前端
    }

?>

 

search.php查詢資料庫:

<?php
    //獲取前端傳過來的資料
    $name = $_GET["name"];

    //連線資料庫,引數:資料庫地址、使用者名稱、密碼
    mysql_connect('localhost', 'root', '123456');
    //選擇要操作的資料庫
    mysql_select_db("student");
    //設定編碼
    mysql_query("SET NAMES utf8");
    //寫執行插入的SQL語句,儲存到資料庫的表中
    $sql = "SELECT * FROM stuuser WHERE name='$name'";
    //執行SQL語句,會返回成功查詢的結果
    $result = mysql_query($sql);
    //查詢資料庫條目的個數,並返回
    $count = mysql_num_rows($result);

    //給前端返回一個結果:能不能註冊
    if($count == 0){
        echo 1; //如果資料庫不存在,返回1給客戶端驗證
    }else{
        echo 0;
    }
?>

4.5.2 jQueryget請求方法

語法:

$.get(url, [data], [callback], [type])

 

 jQueryget請求語法:有兩種方法傳遞資料,但最終引數都是以query string的方式傳遞給服務端

示例1:
$.get("介面地址?k=v&k=v",function(data){

});
示例2:
$.get("介面地址",{k:v, k:v},function(data){

});

4.5.3jQuerypost請求方法

 

jQuerypost請求的語法:引數依然是以報文體的形式傳遞到伺服器中

$.post(url, [data], [callback], [type])


4.5.4 $.ajax()方法

$.ajax()方法有以下常用引數:

 url: 要求為string型別的引數,(預設為當前頁面地址)傳送請求地址。

 type:要求為string型別的引數,請求方式(getpost),預設為get

 data:要求為objectstring型別的引數,傳送到服務端的資料

 success:請求成功的回撥函式

 dataType:伺服器返回資料的型別,例如:xmlstringhtmljson

 error:請求失敗後的回撥函式

 complete:請求成功或失敗的都會執行的回撥函式


五、原生JavaScriptAjax

5.1原生Ajax發起HTTP請求

XMLHttpRequest()物件手冊:

http://www.w3school.com.cn/xmldom/dom_http.asp

https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest

概述:原生Ajax要使用JavaScript的內建建構函式。

所有現代瀏覽器(IE7+FirefoxChromeSafariOpera)都支援XMLHttpRequest()物件。

var xhr = new XMLHttpRequest();

字面上意思:即XML”通過HTTP傳送請求,這個函式的例項有能力傳送非同步的HTTP請求。

 

老版本的IE5IE6不支援XMLHttpRequest(),要使用 ActiveXObject()物件:

var xhr = ActiveXObject("msxml2.0.XMLHTTP");
var h1 = document.getElementsByTagName('h1')[0];
var btn = document.getElementsByTagName('button')[0];
btn.onclick = function(){
   //進行能力檢測,初始化xhr物件
   if(window.XMLHttpRequest){
       //高階瀏覽器版本的寫法
       var xhr = new XMLHttpRequest();
   }else{
       //低版本IE相容寫法
       var xhr = ActiveXObject("msxml2.0.XMLHTTP");
   }
   //引數1:請求方式
   //引數2:請求地址
   //引數3:是否非同步,true非同步,false同步
   //但是,請求沒有真正的傳送,僅僅只是配置了開啟的傳送“視窗”。
   xhr.open("get", "data/result.txt", true);
   //因為原生Ajax不是jQuery,jQuery中ajax有回撥函式能獲取資料,但原生沒有回撥函式
   //只能監聽事件(監聽服務端返回的資料)
   xhr.onreadystatechange = function () {
       console.log(xhr)
       //判斷就緒狀態(0~4)是否等於4,如果是HTTP響應以及完全接收
       if(xhr.readyState == 4 && xhr.status == 200 ||  xhr.status == 304){
           h1.innerHTML = xhr.responseText; //接收服務端返回的資料
       }
   }
   //最後傳送請求
   xhr.send(null); //報文體:get請求偽裝url地址報文體為空,如果是post請求就需要傳引數
}

屬性

readyState(就緒狀態)

status(狀態碼)

responseText(資料)

方法

open(method,url,asyn)  

send()

監聽事件

onreadystatechange

 

配置傳送請求:

xhr.open("get","data/result.txt", true);

引數1:請求方式

引數2:訪問資料的介面地址

引數3:是否非同步,true非同步,false同步

但是,請求沒有真正的傳送,僅僅只是配置了開啟的傳送“視窗”。

此時xhr.send()方法發出請求,send的引數是請求的報文體,get請求不需要報文體,所以就是空。

post請求中有引數就在send()中傳遞。

 

JS原生Ajax沒有提供回撥函式,表示伺服器的資料回來沒有,此時需要一個監聽事件,是就緒狀態改變事件:

當就緒狀態發生變化時觸發,onreadystatechange事件:

xhr.onreadystatechange = function(){
      console.log(xhr.readyState)
}

 

就緒狀態的變化:

0:請求未初始化(還沒呼叫opend()方法)

1:請求引數已經準備,尚未傳送請求(呼叫open,還沒呼叫send

2:請求已傳送,尚未接收響應,正在處理中(呼叫open,和send方法,通常現在可以從響應獲取報文頭)

3:正在解析響應內容,資料已經回來一部分(不是完整的)現在可以從響應中獲取報文頭和一部分報文體

4:響應內容解析完成,資料全部回來了,可以在客戶端使用了


 

5.2處理原生Ajax相容方法

處理相容有兩種方法:

處理相容有兩種方法:
if ...else判斷
try...catch
if(window.XMLHttpRequest){
    //高階瀏覽器版本的寫法
    var xhr = new XMLHttpRequest();
}else{
    //低版本IE相容寫法
    var xhr = ActiveXObject("msxml2.0.XMLHTTP");
}

try裡面的程式碼沒有錯誤就執行try,try裡面有錯誤就執行catch

try {
    var xhr = new XMLHttpRequest();
}
catch(err) {
    var xhr = ActiveXObject("msxml2.0.XMLHTTP");
}

5.3 HTTP Status Code

參考:

http://blog.csdn.net/dufufd/article/details/53112184

http://www.runoob.com/http/http-status-codes.html

常見的狀態碼:
HTTP: Status 200 – 伺服器成功返回網頁
HTTP: Status 304 - 所請求的資源未修改,伺服器返回此狀態碼時,不會返回任何資源
HTTP: Status 404 – 請求的網頁不存在
HTTP: Status 503 – 服務不可用
HTTP: Status 1xx (臨時響應)->表示臨時響應並需要請求者繼續執行操作的狀態程式碼。
HTTP Status 2xx (成功)->表示成功處理了請求的狀態程式碼;
HTTP Status 4xx (請求錯誤)->這些狀態程式碼表示請求可能出錯,妨礙了伺服器的處理。
HTTP Status 5xx (伺服器錯誤)->這些狀態程式碼表示伺服器在嘗試處理請求時發生內部錯誤。這些錯誤可能是伺服器本身的錯誤,而不是請求出錯
if(xhr.readyState == 4 && xhr.status == 200 ||  xhr.status == 304){

}

5.4 Ajax快取問題

概述:瀏覽器是有快取機制的,你會發現訪問過一些網頁,再次訪問的時候會快很多,因為它有一些資源被快取到本地,它會在本次查詢,如果沒有才會去伺服器中請求信的資料。

如何防止快取,此時可以通過每次訪問的時候帶一個不同的隨機引數即可:

xhr.open("get","result/info.txt?time="+Math.random(),true);
xhr.open("get","result/info.txt?time="+(new Date()-0),true);

 

5.5 URI方法

encodeURIComponentdecodeURIComponent都是瀏覽器內建的方法,相容性很好。

在電腦術語中,統一資源識別符號(Uniform Resource Identifier,或URI)是一個用於標識某一網際網路資源名稱的字串。 

 

http://127.0.0.1/09-Ajax%E9%98%B2%E6%AD%A2%E7%BC%93%E5%AD%98.html

概述:雖然在位址列中你看到了漢字,但是會發現,瀏覽器已經幫我們進行轉碼,所以賦值之後就看見以上結果了,雖然瀏覽器已經幫我們做了這件事,我還是要講一下轉碼和解碼的問題,因為瀏覽器的底層就是用這兩個方法實現轉碼和解碼的。

 

將漢字轉碼為URI

encodeURIComponent("習大大")

 

將轉碼的漢字解碼:

decodeURIComponent("%E4%B9%A0%E5%A4%A7%E5%A4%A7")

線上工具:https://www.bejson.com/


 

5.6原生AjaxPOST請求-註冊功能

表單資料編碼格式有一個正式的MIME型別:application/x-www-form-urlencoded

當使用post請求提交這種順序表單時,必須設定Content-type請求頭為這個值模仿表單資料的提交。

<body>
    <p><input type="text" id="user"><b id="info"></b></p>
    <p><input type="text" id="pwd"></p>
    <button id="btn">註冊</button>
</body>
<script type="text/javascript">
     var btn = document.getElementById('btn');
     var user = document.getElementById('user');
     var pwd = document.getElementById('pwd');

     //實時查詢是否可以註冊
     user.oninput = function(){
        //進行能力檢測,初始化xhr物件
        if(window.XMLHttpRequest){
            //高階瀏覽器版本的寫法
            var xhr = new XMLHttpRequest();
        }else{
            //低版本IE相容寫法
            var xhr = ActiveXObject("msxml2.0.XMLHTTP");
        }

        xhr.open("get", "php/search.php?name=" + user.value, true);

        //只能監聽事件(監聽服務端返回的資料)
        xhr.onreadystatechange = function () {
            //判斷就緒狀態(0~4)是否等於4,如果是HTTP響應以及完全接收
            if(xhr.readyState == 4 && xhr.status == 200 ||  xhr.status == 304){
               if(xhr.responseText == 1){
                    info.style.color = "green";
                    info.innerHTML = "恭喜你可以註冊";
               }else {
                    info.style.color = "red";
                    info.innerHTML = "使用者名稱已被註冊";
               }
            }
        }
        //最後傳送請求
        xhr.send(null); //報文體:get請求偽裝url地址報文體為空,如果是post請求就需要傳引數
     }


     //註冊賬號,儲存資料庫中
     btn.onclick = function(){
        if(window.XMLHttpRequest){
            var xhr = new XMLHttpRequest();
        }else{
            var xhr = ActiveXObject("msxml2.0.XMLHTTP");
        }

        xhr.open("post", "php/reg.php", true);
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded")
        //監聽服務端返回的資料
        xhr.onreadystatechange = function (){
            if(xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304){
                if(xhr.responseText == 1){
                    alert("註冊成功");
                }else{
                    alert("註冊失敗");
                }
            }
        }       
        //最後傳送請求:get請求偽裝url地址報文體為空,如果是post請求就需要傳引數
        xhr.send("name="+user.value +"&password="+pwd.value);
     }
</script>

 


5.7封裝QueryString函式

因為原生的Ajax發起請求需要拼接字串,所以為了方便原生Ajax向伺服器傳資料封裝QueryString函式

//JSON形式的資料:
var obj = {
   name: "哈哈",
   password:456
}

//需要通過下面的方法拼接成get引數字串:
function queryString(data){
   var arr = []; //用陣列儲存k=v
   for(var k in data){
       arr.push(k + "=" + data[k]); //迴圈遍歷儲存到陣列中
       // arr.push(k + "=" + encodeURIComponent(obj[k]));
   }
   return arr.join("&"); //用&符號分割字串
}
console.log(queryString(obj))

封裝好方法後,可以在getpost請求中直接使用JSON引數:

GET使用方式:

xhr.open("get", "php/search.php?" + queryString({name:user.value}), true);

 

POST使用方式:

xhr.send(queryString({name:user.value, password:pwd.value}));

注意:

 原生POST請求,向伺服器傳遞資料,不能在地址的後面拼接字串;

 需要在send()傳遞資料,因為send方法相當於是報文體

 POST要設定請求頭setRequestHeader('content-type','application/x-www-form-urlencoded')

 請求頭的設定只能在open函式與send函式之間,其餘的地方不可以,會報錯;

原生Ajax在開發中不會使用,但是面試的時候經常會問到就緒狀態(0-4


 

相關文章