1. Tệp PHP

PHP có một số hàm tích hợp để xử lý JSON. PHP cho phép chúng ta mã hóa và giải mã JSON bằng  các hàm json_encode()json_decode()

  • Hàm json_encode() trả về biểu diễn JSON của một giá trị. Nói cách khác, nó chuyển đổi biến PHP (chứa mảng) thành JSON.
  • Hàm json_decode() giải mã chuỗi JSON. Nói cách khác, nó chuyển đổi chuỗi JSON thành một biến PHP.

Ta có thể thao khảo thêm tại Xử lý JSON trong PHP

Ví dụ: các đối tượng trong PHP có thể được chuyển đổi thành JSON bằng cách sử dụng hàm PHP json_encode() :

<?php
$myObj = new stdClass();
$myObj->name = "Thành";
$myObj->age = 19;
$myObj->city = "Hà Nội";

$myJSON = json_encode($myObj);

echo $myJSON;
?>

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

<?php
$myArr = array("Thành", "Nam", "Sơn", "Laptrinhtudau");

$myJSON = json_encode($myArr);

echo $myJSON;
?>

Sử dụng Js trên máy client và sử dụng thêm AJAX để yêu cầu tệp PHP từ ví dụ trên:

<!DOCTYPE html>
<html>
<body>

<h2>Nhận dữ liệu JSON từ máy chủ PHP</h2>
<p id="demo"></p>

<script>
const xmlhttp = new XMLHttpRequest();

xmlhttp.onload = function() {
  const myObj = JSON.parse(this.responseText);
  document.getElementById("demo").innerHTML = myObj.name;
}
xmlhttp.open("GET", "demo_file.php");
xmlhttp.send();
</script>

</body>
</html>

Sử dụng Js trên máy client và sử dụng thêm  AJAX để yêu cầu tệp PHP từ ví dụ mảng ở trên:

<!DOCTYPE html>
<html>
<body>

<h2>Nhận dữ liệu JSON từ máy chủ PHP</h2>
<p>Chuyển đổi dữ liệu thành một mảng JavaScript:</p>
<p id="demo"></p>

<script>
const xmlhttp = new XMLHttpRequest();
xmlhttp.onload = function() {
  const myObj = JSON.parse(this.responseText);
  document.getElementById("demo").innerHTML = myObj[2];
}
xmlhttp.open("GET", "demo_file_array.php");
xmlhttp.send();
</script>

</body>
</html>

2. Cơ sở dữ liệu PHP

PHP là ngôn ngữ lập trình phía máy chủ và có thể được sử dụng để truy cập cơ sở dữ liệu. Hãy tưởng tượng ta có một cơ sở dữ liệu trên máy chủ của mình và muốn gửi một yêu cầu đến nó từ máy khách, nơi ta yêu cầu 10 hàng đầu tiên trong bảng được gọi là customers . Trên máy khách, tạo một đối tượng JSON mô tả số hàng bạn muốn trả về. Trước khi ta gửi yêu cầu đến máy chủ, chuyển đổi đối tượng JSON thành một chuỗi và gửi nó dưới dạng tham số đến url của trang PHP.

Ví dụ:

<!DOCTYPE html>
<html>
<body>

<h2>Nhận dữ liệu JSON từ máy chủ PHP</h2>
<p>JSON nhận được từ tệp PHP:</p>

<p id="demo"></p>

<script>
const dbParam = JSON.stringify({"limit":10});

const xmlhttp = new XMLHttpRequest();
xmlhttp.onload = function() {
  document.getElementById("demo").innerHTML = this.responseText;
}
xmlhttp.open("GET", "json_demo_db.php?x=" + dbParam);
xmlhttp.send();
</script>

</body>
</html>

Với ví dụ trên ta có thể hiểu cách làm của nó như sau:

  • Xác định một đối tượng chứa thuộc tính và giá trị limit
  • Chuyển đổi đối tượng thành một chuỗi JSON
  • Gửi một yêu cầu đến tệp PHP với chuỗi JSON là tham số
  • Chờ đến khi yêu cầu trả về kết quả dưới dạng JSON
  • Cuối cùng hiển thị kết quả nhận được từ file PHP

Nội dung tệp PHP sẽ như sau:

<?php
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_GET["x"], false);

$conn = new mysqli("myServer", "myUser", "myPassword", "Northwind");
$stmt = $conn->prepare("SELECT name FROM customers LIMIT ?");
$stmt->bind_param("s", $obj->limit);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);

echo json_encode($outp);
?>

Tệp PHP này đã:

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

Ta sẽ chuyển đổi kết quả nhận được từ tệp PHP thành một đối tượng Js và trong trường hợp này là một mảng Js

<!DOCTYPE html>
<html>
<body>

<h2>Nhận dữ liệu JSON từ máy chủ PHP</h2>
<p id="demo"></p>

<script>
const obj = { "limit":10 };
const dbParam = JSON.stringify(obj);
const xmlhttp = new XMLHttpRequest();
xmlhttp.onload = function() {
  myObj = JSON.parse(this.responseText);
  let text = ""
  for (let x in myObj) {
    text += myObj[x].name + "<br>";
  }
  document.getElementById("demo").innerHTML = text;
};
xmlhttp.open("GET", "json_demo_db.php?x=" + dbParam);
xmlhttp.send();
</script>

<p>Hãy thử thay đổi thuộc tính "Limit" từ 10 thành 5.</p>

</body>
</html>

3. Sử dụng phương thức Post trong PHP

Khi gửi dữ liệu đến máy chủ, cách tốt nhất là sử dụng phương thức POST. Ta có thể xem kỹ hơn ở bài Phương thức Get và Post trong PHP

Để gửi AJAX bằng phương thức POST , hãy chỉ định phương thức và tiêu đề chính xác. Dữ liệu được gửi đến máy chủ bây giờ phải là một đối số cho phương thức send()

Ví dụ:

<!DOCTYPE html>
<html>
<body>

<h2>Sử dụng HTTP POST để lấy dữ liệu JSON từ máy chủ PHP</h2>

<p id="demo"></p>

<script>
const dbParam = JSON.stringify({"limit":10});
const xmlhttp = new XMLHttpRequest();
xmlhttp.onload = function() {
  myObj = JSON.parse(this.responseText);
  let text = "";
  for (let x in myObj) {
    text += myObj[x].name + "<br>";
  }
  document.getElementById("demo").innerHTML = text;
}
xmlhttp.open("POST", "json_demo_db_post.php");
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("x=" + dbParam);
</script>

<p>Hãy thử thay đổi thuộc tính Limit từ 10 thành 5.</p>

</body>
</html>

Sự khác biệt duy nhất trong tệp PHP là phương thức lấy dữ liệu được truyền.

<?php
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_POST["x"], false);

$conn = new mysqli("myServer", "myUser", "myPassword", "Northwind");
$stmt = $conn->prepare("SELECT name FROM customers LIMIT ?");
$stmt->bind_param("s", $obj->limit);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);

echo json_encode($outp);
?>