前端點滴(JS核心)(二)---- Ajax基礎(二)、使用 Ajax 實現多表聯動

Ajax 基礎(二)

1. Json

(1)什麼是Josn

json本質就是字符串,只不過這個字符串的格式有要求,格式要符合js中的數組或對象的格式。
比如:

{
"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
}

(2)Json 的用處

json在web開發中,它起到的作用和xml和的作用一樣。具體來說,json可以當做配置文件,json文件可以存儲數據,可用作測試接口數據,json可以當做兩種編程語言交換數據的媒介。
在這裏插入圖片描述

(3)Json和PHP進行轉換

爲什麼要進行數據的轉換?
原因:就是在 Ajax 中PHP的數據和JS的數組不一樣,所以要轉換成JSON格式,然後再返回。

  1. 將 PHP 數據轉換成 Json 格式數據 (json_encode(php數據)
<?php
$arr = ['apple','banana','pear'];
class A{
    public $name = 'chen';
    public $age = 20;
}
$tmp = [];
 $tmp['example'] = [
    0=>(object)['name'=>'yaodao','age'=>20],
    1=>(object)['name'=>'jack','age'=>25]
];


$obj = new A;
echo (json_encode($tmp));
echo '<br>';
echo(json_encode($arr));
echo '<br>';
echo(json_encode($obj));
?>

結果:
在這裏插入圖片描述
2. 將 Json 格式的數據轉換成 PHP 數據(json_decode(json格式數據)

<?php
$arr = ['apple','banana','pear'];
class A{
    public $name = 'chen';
    public $age = 20;
}
$tmp = [];
 $tmp['example'] = [
    0=>(object)['name'=>'yaodao','age'=>20],
    1=>(object)['name'=>'jack','age'=>25]
];


$obj = new A;
$str1 = json_encode($tmp);
$str2 = json_encode($arr);
$str3 = json_encode($obj);

print_r (json_decode($str1));
echo '<br>';
print_r(json_decode($str2));
echo '<br>';
print_r(json_decode($str3));
?>

結果:
在這裏插入圖片描述

(4)Json和JavaScript進行轉換

  1. 將 JavaScript 數據轉換成 Json 格式數據(JSON.stringify(JavaScript數據)
    <script>
        var arr = ['apple','banana','pear'];
        var obj = {name:'jack',age:20};
        var tmp = {example:[{name:'chen',age:20},{name:'yaodao',age:25},{name:'jack',age:30}]}    
        
        console.log(JSON.stringify(arr));
        console.log(JSON.stringify(obj));
        console.log(JSON.stringify(tmp));
    </script>

結果:
在這裏插入圖片描述

  1. 將 Json 數據格式轉換成 JavaScript 數據(JSON.parse(json格式數))(eval() 方法函數)
    <script>
        var arr = ['apple','banana','pear'];
        var obj = {name:'jack',age:20};
        var tmp = {example:[{name:'chen',age:20},{name:'yaodao',age:25},{name:'jack',age:30}]}    
        
        var json1 = JSON.stringify(arr);
        var json2 = JSON.stringify(obj);
        var json3 = JSON.stringify(tmp);

        console.log(JSON.parse(json1));
        console.log(JSON.parse(json2));
        console.log(JSON.parse(json3));
    </script>

結果:
在這裏插入圖片描述

(5)總結

利用 json 媒介進行數據交互。
在這裏插入圖片描述
沒有通過 Json 進行數據交互的情況:

JavaScript代碼:

<script>
window.onload = function(){
            var xhr = new XMLHttpRequest();
            xhr.open('get','test.php',true);
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4 && xhr.status == 200){
                    var res = xhr.responseText;
                    console.log(res);
                }
            }
        }
</script>

PHP代碼:

<?php
$tmp = [];
 $tmp['example'] = [
    0=>(object)['name'=>'yaodao','age'=>20],
    1=>(object)['name'=>'jack','age'=>25]
];

print_r($tmp);  // php中只能使用print_r輸出數組
?>

輸出結果:
在這裏插入圖片描述
通過 Json 進行數據交互的情況:

JavaScript代碼:

<script>
window.onload = function(){
            var xhr = new XMLHttpRequest();
            xhr.open('get','test.php',true);
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4 && xhr.status == 200){
                    var res = xhr.responseText;
                    // console.log(res);
                    var realRes = JSON.parse(res);
                    console.log(realRes);
                }
            }
        }
</script>

PHP代碼:

<?php
$tmp = [];
 $tmp['example'] = [
    0=>(object)['name'=>'yaodao','age'=>20],
    1=>(object)['name'=>'jack','age'=>25]
];

// print_r($tmp);
echo json_encode($tmp);
?>

輸出結果:
在這裏插入圖片描述

二、使用Ajax實現多表聯動

1. 準備

一、下載

  1. Navicat Premium 12 用於操作數據庫。
    鏈接: https://pan.baidu.com/s/19s13smuDcTeaDTAU0UqG7Q
    提取碼: 94md
    複製這段內容後打開百度網盤手機App,操作更方便哦
  2. 教程 用於操作數據庫。

二、下載數據庫文件 test.sql
鏈接: https://pan.baidu.com/s/19s13smuDcTeaDTAU0UqG7Q
提取碼: 94md
複製這段內容後打開百度網盤手機App,操作更方便哦

三、打開 wampserver、apache,打開 Navicat Premium 12 導入 test.sql數據庫文件

  1. 在本地數據庫中新建一個數據庫 test 。(爲了方便操作)
    在這裏插入圖片描述
  2. 在新建的數據庫中運行下載好的 sql 文件
    在這裏插入圖片描述
  3. 操作完畢,進行數據表觀察。
    在這裏插入圖片描述
  4. C 層數據庫基本操作

連接數據庫

  • 獲取數據庫數據:select * from 數據表 where 條件;
    例子:
/* 查詢所有的省:*/ select * from sheng;
/* 查詢河北省中的市: */ select * from shi where ProvinceCode = 130000;
/* 查詢石家莊市的縣: */ select * from xian where CityCode = 130100;
  • 添加數據庫數據:insert into 數據表(數據屬性) values(數據屬性值)
  • 刪除數據庫數據:delete from 數據表 where 條件
  • 修改數據庫數據:update 數據表 set 修改的數據 where 條件

2. 創建文件

(1)加載省份

HTML

    <select id="sheng">
        <option value="0">--請選擇省份--</option>
    </select>
    <select id="shi">
        <option value="0">--請選擇市--</option>
    </select>
    <select id="xian">
        <option value="0">--請選擇縣、區--</option>
    </select>

PHP(05city.php)

<?php
/* 連接數據庫 */
$pdo = new PDO('mysql:host=localhost; dbname=test; charset=utf8','root');

$type = $_GET['type'];
if($type == 'sheng'){
/* 獲取省份 */
$sql = 'select * from sheng';
}

/* 準備查詢語句 */
/* 注意php中調用方法不用(.)點語法,而是使用(->)箭頭語法,php中的點語法用於字符串連接,相當於+ */
$stmt = $pdo->prepare($sql);

/* 執行查詢語句,並返回結果集 */
$stmt->execute();

/* 獲取結果集中所有的數據,返回一個 php 格式數組 */
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);

/* 使用 json 媒介進行 php 格式轉換 */
echo json_encode($res);
?>

JavaScript

var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if(xhr.readyState==4 && xhr.status==200){
            //接收服務器返回的數據
            var result = xhr.responseText;
            var res = JSON.parse(result);
            //console.log(res); //JS數組
            var sheng = document.getElementById('sheng');
            for(var i in res){
                var option = document.createElement('option');
                option.setAttribute('value', res[i].Pcode);
                option.innerText = res[i].Pname;
                sheng.appendChild(option);
            }
        }
    };
    xhr.open('get', '05city.php?type=sheng', true);
    xhr.send();

(2)獲取對應的市

JavaScript

/* 切換sheng時,獲取其對應的Pcode值,後通過對應的Pcode值查詢對應的市 */
document.getElementById('sheng').onchange = function () {
        //省切換的時候,要獲取Pcode值,即option的value值
        var pcode = this.value; //類似於 130000
        xhr.onreadystatechange = function () {
            if(xhr.readyState==4 && xhr.status==200){
                //接收服務器返回的數據
                var result = xhr.responseText;
                var res = JSON.parse(result);
                //console.log(res); //JS數組

                var shi = document.getElementById('shi');
                //把市的option放到select中之前,先重置select裏面的內容
                shi.innerHTML = '<option value="0">--請選擇市--</option>';
                document.getElementById('xian').innerHTML = '<option value="0">--請選擇縣--</option>';
                for(var i in res){
                    var option = document.createElement('option');
                    option.setAttribute('value', res[i].Ccode);
                    option.innerText = res[i].Cname;
                    shi.appendChild(option);
                }
            }
        };
        xhr.open('get', '05city.php?type=shi&Pcode='+pcode, true);
        xhr.send();

PHP(05city.php)

<?php
/* 連接數據庫 */
$pdo = new PDO('mysql:host=localhost; dbname=test; charset=utf8','root');

$type = $_GET['type'];
if($type == 'sheng'){
	/* 獲取省份 */
	$sql = 'select * from sheng';
}elseif($type == 'shi'){
	/* 獲取對應的市 */
	$Pcode = $_GET['Pcode'];
	$sql = 'select * from shi where ProvinceCode = '.$Pcode;
}

/* 準備查詢語句 */
/* 注意php中調用方法不用(.)點語法,而是使用(->)箭頭語法,php中的點語法用於字符串連接,相當於+ */
$stmt = $pdo->prepare($sql);

/* 執行查詢語句,並返回結果集 */
$stmt->execute();

/* 獲取結果集中所有的數據,返回一個 php 格式數組 */
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);

/* 使用 json 媒介進行 php 格式轉換 */
echo json_encode($res);

(3)獲取對應的區

JavaScript

/* 切換shi時,獲取其對應的Ccode值,後通過對應的Ccode值查詢對應的市 */
 document.getElementById('shi').onchange = function () {
        //市切換的時候,要獲取Ccode值,即option的value值
        var ccode = this.value; //類似於 130000
        xhr.onreadystatechange = function () {
            if(xhr.readyState==4 && xhr.status==200){
                //接收服務器返回的數據
                var result = xhr.responseText;
                var res = JSON.parse(result);
                //console.log(res); //JS數組

                var xian = document.getElementById('xian');
                //把縣的option放到select中之前,先重置select裏面的內容
                xian.innerHTML = '<option value="0">--請選擇縣--</option>';
                for(var i in res){
                    var option = document.createElement('option');
                    option.setAttribute('value', res[i].Acode);
                    option.innerText = res[i].Aname;
                    xian.appendChild(option);
                }
            }
        };
        xhr.open('get', '05city.php?type=xian&Ccode='+ccode, true);
        xhr.send();

PHP(05city.php)

<?php
/* 連接數據庫 */
$pdo = new PDO('mysql:host=localhost; dbname=test; charset=utf8','root');

$type = $_GET['type'];
if($type == 'sheng'){
	/* 獲取省份 */
	$sql = 'select * from sheng';
}elseif($type == 'shi'){
	/* 獲取對應的市 */
	$Pcode = $_GET['Pcode'];
	$sql = 'select * from shi where ProvinceCode = '.$Pcode;
}elseif($type == 'xian'){
	/* 獲取對應的縣、區 */
	$Ccode = $_GET['Ccode'];
	$sql = 'select * from xian where CityCode = '.$Ccode;
}

/* 準備查詢語句 */
/* 注意php中調用方法不用(.)點語法,而是使用(->)箭頭語法,php中的點語法用於字符串連接,相當於+ */
$stmt = $pdo->prepare($sql);

/* 執行查詢語句,並返回結果集 */
$stmt->execute();

/* 獲取結果集中所有的數據,返回一個 php 格式數組 */
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);

/* 使用 json 媒介進行 php 格式轉換 */
echo json_encode($res);

(4)完整代碼

HTML

    <select id="sheng">
        <option value="0">--請選擇省份--</option>
    </select>
    <select id="shi">
        <option value="0">--請選擇市--</option>
    </select>
    <select id="xian">
        <option value="0">--請選擇縣、區--</option>
    </select>

JavaScript

<script>
    /************************ 頁面加載完畢,獲取省 *********************************/
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if(xhr.readyState==4 && xhr.status==200){
            //接收服務器返回的數據
            var result = xhr.responseText;
            var res = JSON.parse(result);
            //console.log(res); //JS數組
            var sheng = document.getElementById('sheng');
            for(var i in res){
                var option = document.createElement('option');
                option.setAttribute('value', res[i].Pcode);
                option.innerText = res[i].Pname;
                sheng.appendChild(option);
            }
        }
    };
    xhr.open('get', '05city.php?type=sheng', true);
    xhr.send();

    /************************ 省切換的時候,獲取市 *********************************/
    document.getElementById('sheng').onchange = function () {
        //省切換的時候,要獲取Pcode值,即option的value值
        var pcode = this.value; //類似於 130000
        xhr.onreadystatechange = function () {
            if(xhr.readyState==4 && xhr.status==200){
                //接收服務器返回的數據
                var result = xhr.responseText;
                var res = JSON.parse(result);
                //console.log(res); //JS數組

                var shi = document.getElementById('shi');
                //把市的option放到select中之前,先重置select裏面的內容
                shi.innerHTML = '<option value="0">--請選擇市--</option>';
                document.getElementById('xian').innerHTML = '<option value="0">--請選擇縣--</option>';
                for(var i in res){
                    var option = document.createElement('option');
                    option.setAttribute('value', res[i].Ccode);
                    option.innerText = res[i].Cname;
                    shi.appendChild(option);
                }
            }
        };
        xhr.open('get', '05city.php?type=shi&Pcode='+pcode, true);
        xhr.send();
    };

    /************************ 切換市,獲取縣 *********************************/
    document.getElementById('shi').onchange = function () {
        //市切換的時候,要獲取Ccode值,即option的value值
        var ccode = this.value; //類似於 130000
        xhr.onreadystatechange = function () {
            if(xhr.readyState==4 && xhr.status==200){
                //接收服務器返回的數據
                var result = xhr.responseText;
                var res = JSON.parse(result);
                //console.log(res); //JS數組

                var xian = document.getElementById('xian');
                //把縣的option放到select中之前,先重置select裏面的內容
                xian.innerHTML = '<option value="0">--請選擇縣--</option>';
                for(var i in res){
                    var option = document.createElement('option');
                    option.setAttribute('value', res[i].Acode);
                    option.innerText = res[i].Aname;
                    xian.appendChild(option);
                }
            }
        };
        xhr.open('get', '05city.php?type=xian&Ccode='+ccode, true);
        xhr.send();
    };
</script>

PHP(05city.php)

<?php
//連接數據庫
$pdo = new PDO('mysql:host=localhost; dbname=test; charset=utf8','root');

//獲取type
$type = $_GET['type'];
if($type == 'sheng'){
    //寫SQL
    $sql = 'select * from sheng';
} elseif ($type == 'shi'){
    $Pcode = $_GET['Pcode'];
    //寫SQL
    $sql = 'select * from shi where ProvinceCode = '.$Pcode;
} elseif ($type == 'xian'){
    $Ccode = $_GET['Ccode'];
    $sql = 'select * from xian where CityCode = '.$Ccode;
}
////////////////////////////////////////////
//預處理
$stmt = $pdo->prepare($sql); //返回值是PDOStatement對象,結果集對象
//如果SQL中有佔位符(? 或 :xxx),則需要使用bindValue綁定值
//執行
$stmt->execute();
//獲取結果
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
//echo '<pre>';
//print_r($data);
echo json_encode($data);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章