前端筆記之服務器&Ajax(中)MySQL基礎操作&PHP操作數據庫&Ajax


一、數據庫基礎

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語句,保存數據
$sql = "SELECT * FROM banji0922";
//執行sql語句
$result = mysql_query($sql);

$arr = array(); //空數組
//循環把$resultl類數組對象變為數組
while($row = mysql_fetch_array($result)) {
array_push($arr,$row);
};
$result = array("result"=>$arr);
//變為JSON形式
$resultJson= json_encode($result);
echo $resultJson;
?>

 

 

<?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


 


免責聲明!

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



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