PHP JSON

JSON 的常规用途是从 web 服务器读取数据,然后在网页中显示这些数据。

本章向您讲解如何在客户端与 PHP 服务器之间交换 JSON 数据。

Tệp PHP

PHP 提供处理 JSON 的内建函数。

通过使用 PHP 函数 json_encode(),PHP 中的对象可转换为 JSON:

Tệp PHP

<?php
$myObj->name = "Bill Gates";
$myObj->age = 62;
$myObj->city = "Seattle";
$myJSON = json_encode($myObj);
echo $myJSON;
?>

Hiển thị tệp PHP

JavaScript máy khách

Đây là JavaScript trên máy khách, sử dụng gọi AJAX để yêu cầu tệp PHP trong ví dụ trên:

thực thể

sử dụng JSON.parse() Chuyển đổi kết quả thành đối tượng JavaScript:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
         myObj = JSON.parse(this.responseText);
         document.getElementById("demo").innerHTML = myObj.name;
     });
});
xmlhttp.open("GET", "demo_file.php", true);
xmlhttp.send();

Thử trực tiếp

Mảng PHP

Khi sử dụng hàm json_encode() thì mảng trong PHP cũng sẽ được chuyển đổi thành JSON:

Tệp PHP

<?php
$myArr = array("Bill Gates", "Steve Jobs", "Elon Musk");
$myJSON = json_encode($myArr);
echo $myJSON;
?>

Hiển thị tệp PHP

JavaScript máy khách

Đây là JavaScript trên máy khách, sử dụng gọi AJAX để yêu cầu tệp PHP trong ví dụ trên:

thực thể

Vui lòng sử dụng JSON.parse() Chuyển đổi kết quả thành mảng JavaScript:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
         myObj = JSON.parse(this.responseText);
         document.getElementById("demo").innerHTML = myObj[2];
     });
});
xmlhttp.open("GET", "demo_file_array.php", true);
xmlhttp.send();

Thử trực tiếp

Cơ sở dữ liệu PHP

PHP là ngôn ngữ lập trình máy chủ, nên được sử dụng cho các thao tác chỉ có thể được thực hiện bởi máy chủ, chẳng hạn như truy cập cơ sở dữ liệu.

Hãy tưởng tượng có một cơ sở dữ liệu trên máy chủ, chứa dữ liệu khách hàng, sản phẩm và nhà cung cấp.

Lúc này, bạn cần yêu cầu máy chủ để lấy mười bản ghi đầu tiên trong bảng "khách hàng":

thực thể

Vui lòng sử dụng JSON.stringify() Chuyển đổi đối tượng JavaScript thành JSON:

obj = { "table":"customers", "limit":10 };
dbParam = JSON.stringify(obj);
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
     if (this.readyState == 4 && this.status == 200) {
        document.getElementById("demo").innerHTML = this.responseText;
    });
});
xmlhttp.open("GET", "demo_json_db.php?x=" + dbParam, true);
xmlhttp.send();

Thử trực tiếp

Giải thích ví dụ:

  • Định nghĩa đối tượng chứa thuộc tính table và thuộc tính limit.
  • Chuyển đổi đối tượng này thành chuỗi JSON.
  • Gửi yêu cầu đến tệp PHP này, với JSON làm tham số.
  • Chờ đến khi yêu cầu trả về kết quả (dưới dạng JSON).
  • Hiển thị kết quả nhận được từ tệp PHP.

Xem tệp PHP

Tệp PHP

<?php
header("Content-Type: application/json; charset=UTF-8");
$obj =  json_decode($_GET["x"], false);
$conn = new mysqli("myServer", "myUser", "myPassword", "Northwind");
$result = $conn->query("SELECT name FROM ".$obj->$table." LIMIT ".$obj->$limit);
$outp = array();
$outp = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($outp);
?>

Giải thích tệp PHP:

  • Chuyển đổi yêu cầu thành đối tượng bằng cách sử dụng hàm PHP json_decode().
  • Truy cập cơ sở dữ liệu, lấp đầy mảng bằng dữ liệu yêu cầu.
  • Thêm mảng vào đối tượng bằng cách sử dụng json_encode() Chức năng trả về đối tượng này bằng JSON.

Duyệt kết quả

Chuyển đổi kết quả nhận được từ tệp PHP thành đối tượng JavaScript, hoặc trong ví dụ này, một mảng JavaScript:

thực thể

sử dụng JSON.parse() Chuyển đổi JSON thành đối tượng JavaScript:

...
xmlhttp.onreadystatechange = function() {
     if (this.readyState == 4 && this.status == 200) {
         myObj = JSON.parse(this.responseText);
         for (x in myObj) {
             txt += myObj[x].name + "<br>";
        });
         document.getElementById("demo").innerHTML = txt;
    });
});
 ...

Thử trực tiếp

PHP phương thức = POST

Khi gửi dữ liệu lên máy chủ, tốt nhất thường là sử dụng phương thức HTTP POST.

Nếu muốn sử dụng phương thức POST để gửi yêu cầu AJAX, hãy chỉ định phương thức này và phần đầu chính xác.

Dữ liệu gửi lên máy chủ hiện tại phải là .send(); tham số của phương thức:

thực thể

obj = { "table":"customers", "limit":10 };
dbParam = JSON.stringify(obj);
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
     if (this.readyState == 4 && this.status == 200) {
         myObj = JSON.parse(this.responseText);
         for (x in myObj) {
             txt += myObj[x].name + "<br>";
        });
         document.getElementById("demo").innerHTML = txt;
    });
});
xmlhttp.open("POST", "demo_json_db.php", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("x=" + dbParam);

Thử trực tiếp

Tệp PHP duy nhất khác nhau là phương pháp lấy dữ liệu được truyền tải.

Tệp PHP

sử dụng $_POST thay vì $_GET

<?php
header("Content-Type: application/json; charset=UTF-8");
$obj =  json_decode($_POST["x"], false);
$conn = new mysqli("myServer", "myUser", "myPassword", "Northwind");
$result = $conn->query("SELECT name FROM ".$obj->$table." LIMIT ".$obj->$limit);
$outp = array();
$outp = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($outp);
?>