[Android] JSon trong Android – Phần 2: Xuất JSon từ Database bằng Php

Chào các bạn, trong phần 2 này mình sẽ hướng dẫn các bạn tạo Database, viết các lệnh truy vấn dữ liệu và xuất JSon từ database.

Bài viết có liên quan đến một số kiến thức của MySQL và php nên các bạn chú ý, nếu bạn chưa từng biết đến nó thì cũng không sao, rất đơn giản thôi.

Mình sẽ hướng dẫn các bạn tạo database trên Hostinger cho dễ dàng và đồng bộ.

Tạo cơ sở dữ liệu

Các bạn vào mục Database -> MySQL Database để tạo database:

database in hostinger

Nhập tên databse, tên user và password vậy là xong.

tao database

Sau khi tạo xong, các bạn click vào database vừa tạo và chọn phpMyAdmin để sang giao diện phpMyAdmin.
Bây giờ chúng ta bắt đầu tạo các bảng cho database. Ứng dụng của chúng ta là Old Lover (Người yêu cũ), vậy sẽ cần tạo 2 bảng: Một bảng user lưu danh sách người dùng, và một bảng old_lover lưu danh sách người yêu cũ của người dùng.

Bảng user gồm 2 trường là:

nick -> kiểu: varchar(50)	định dạng: utf8_unicode_ci	là khóa chính
pass -> kiểu: varchar(50)	định dạng: utf8_unicode_ci

Bảng old_lover gồm 6 trường:

id	-> kiểu:int(11)		AUTO_INCREMENT là khóa chính
nick	-> kiểu: varchar(50)	định dạng: utf8_unicode_ci		
name -> kiểu: varchar(50)	định dạng: utf8_unicode_ci
begin_date -> kiểu: varchar(10)
end_date -> kiểu: varchar(10)
phone -> kiểu: varchar(15)

Trong đó begin_date và end_date là ngày bắt đầu yêu và ngày chia tay =)). chúng ta không dùng để so sánh gì mà chỉ để hiển thị nên dùng varchar chứ không dùng date hoặc datetime nhé.

Sau khi tạo xong database, các bạn vào mục insert và chèn một số bản ghi cho các bảng. Ví dụ của mình như thế này:
Bảng user:
table user

Bảng old_lover:
table old_lover

Dùng php kết nối database và xuất JSon

Trong phần này chúng ta bắt đầu đụng đến ngôn ngữ lập trình Php, nó tương tự như java, chỉ có điều cấu trúc lệnh hơi khác chút xíu.

Các bạn và mục File -> Quản lý file
file

Giao diện quản lý file hiển thị ra sẽ giống như trên máy tính của bạn, các bạn có thể viết luôn các file php tại đây hoặc tạo các thư mục mới để chứa chúng cũng được, mình sẽ tạo thư mục mobile ở đây, tạo tiếp thư mục old-lover trong mobile

old-lover folder

Chúng ta sẽ đi từng bước một: Cấu hình -> Kết nối -> Viết lệnh truy vấn -> Xuất JSon

Viết file cấu hình

Lưu ý: Từ thời điểm này trở đi mình dùng database và host trên blog của mình, các bạn dùng Hostinger thì database, user,… sẽ có dạng u520716618_lover,… như bên trên chúng ta đã đặt
Chúng ta sẽ viết 1 file để cấu hình về tên database, user, pass phục vụ cho việc kết nối. Trong folder old-lover các bạn tạo 1 file tên là config.php với nội dung sau:

<?php
	define("DB_HOST", "localhost");
	define("DB_USER", "mobile-demo-json");
	define("DB_PASSWORD", "mobile-demo-json");
	define("DB_DATABASE", "mobile-demo-json");
?>

Trong đó các bạn cần sửa lại cho phù hợp với tên user của database, tên database, password mà các bạn đã đặt ở bước tạo database. Ở đây host hiện tại so với nơi file php đặt là localhost, user và pass của mình đều là mobile-demo-json

Viết file kết nối database

Tiếp theo chúng ta tạo 1 file tên là db_connect.php để thực hiện kết nối database với nội dung:

<?php
     
    class DB_Connect {
     
        // constructor
        function __construct() {
     
        }
     
        // destructor
        function __destruct() {
            // $this->close();
        }
     
        // Connecting to database
        public function connect() {
            require_once 'config.php';
            $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
            mysql_set_charset('utf8', $con);
            mysql_select_db(DB_DATABASE);
            return $con;
        }
     
        public function close() {
            mysql_close();
        }
     
    } 
?>

Viết file chứa các hàm thao tác với database

File này gồm tất cả các hàm để thao tác với database như select, insert, update,…
Các bạn tạo file db_functions.php với nội dung:

<?php

    class DB_Functions {

        private $db;

        // constructor
        function __construct() {
            include_once './db_connect.php';
            $this->db = new DB_Connect();
            $this->db->connect();
        }
        
        public function selectall($sql){
            $result=mysql_query($sql);
            while($row=@mysql_fetch_assoc($result)){
                $result_all[]=$row;
            }
            mysql_free_result($result);
            return @$result_all;
        }
        
        public function selectone($sql){
            $result=mysql_query($sql);
            $resultone=@mysql_fetch_assoc($result);
            mysql_free_result($result);
            return $resultone;
        }
        
        function numrow($sql){
            $result=mysql_query($sql);
            $row=mysql_num_rows($result);
            mysql_free_result($result);
            return $row;
        }

        function update($table,$data,$where){
            $sql='';
            foreach($data as $key => $value){
                $sql .=", $key = '".mysql_real_escape_string($value)."'";
            }

            $sql='UPDATE '.$table. ' SET '.trim($sql, ',').' WHERE ' .$where;
            return mysql_query($sql);
        }

        function insert($table, $data){
            $field_list='';
            $value_list='';
            foreach($data as $key => $value){
                $field_list .=",$key";
                $value_list .=",'".mysql_real_escape_string($value)."'";
            }

            $sql='INSERT INTO '.$table.'('.trim($field_list, ',').') VALUES ('.trim($value_list, ',').')';
            return mysql_query($sql);
        }

        function delete($table,$where){
            $sql="DELETE FROM $table WHERE $where";
            return mysql_query($sql);
        }
    }

?>

Các hàm này chắc mình không cần giải thích nhiều, một số điều mình thấy đáng chú ý như sau:

  • Hàm __construct() là hàm khởi tạo, và nó cũng để kết nối tới database luôn nên ta cần include (bao gồm) file db_connect.php trong này.

  • Các câu lệnh lấy bản ghi mình dùng mysql_fetch_assoc vì nó cho phép chúng ta lấy các bản ghi theo tên cột trong bảng, nếu bạn dùng mysql_fetch_array thì sẽ lấy cả theo tên cột và số thứ tự của cột trong bảng và khi đó JSon của chúng ta xuất ra sẽ dư thừa không cần thiết, làm nó trở nên nặng nề.

  • Mình có dùng mysql_real_escape_string để nối các giá trị đi kèm theo key của nó trong hàm update, insert. Lệnh này cho phép chúng ta giữ nguyên giá trị và tránh lỗi cú pháp của lệnh truy vấn sql ngay cả khi trong nó có một số ký tự đặc biệt.

Viết file xuất JSon

Đây là file cuối cùng của chúng ta, file mà sẽ tương tác trực tiếp với android.
Chúng ta sẽ có 4 thao tác như sau:
– Đăng nhập
– Đăng ký
– Lấy danh sách người yêu cũ
– Thêm người yêu cũ vào danh sách

Vì vậy chúng ta cũng sẽ có 4 biến để điều hướng các hành động này khi nhận được yêu cầu từ android.

<?php header('Content-Type: application/json; charset=utf-8'); ?>

<?php
    
    $METHOD_LOGIN = 1;
    $METHOD_REGISTER = 2;
    $METHOD_GET_OLD_LOVER = 3;
    $METHOD_ADD_OLD_LOVER = 4;

    include_once 'db_functions.php';

    $db = new DB_Functions();

    $nick = $_POST['nick'];    
    $method = $_POST['method'];

    // for test from web browser
    $test = $_GET['test'];
    if($test==true){
        $nick = $_GET['nick'];
        $method = $METHOD_GET_OLD_LOVER;
    }
    
    if($method == $METHOD_LOGIN) {
        $sql = "SELECT * FROM user WHERE nick = '$nick'";
        $rs = $db->selectone($sql);

        if($rs['pass'] == $_POST['pass']){
            $result['login'] = true;
        }else{
            $result['login'] = false;
        }
    }

    if($method == $METHOD_REGISTER) {
        $data = array();
        $data['nick'] = $nick;
        $data['pass'] = $_POST['pass'];
        
        $rs = $db->insert('user', $data);
        if($rs){
            $result['register'] = true;
        }else{
            $result['register'] = false;
        }
    }

    if($method == $METHOD_GET_OLD_LOVER) {
        $sql = "SELECT * FROM old_lover WHERE nick = '$nick'";
        $result = $db->selectall($sql);
    }

    if($method == $METHOD_ADD_OLD_LOVER){
        $data = array();
        $data['nick'] = $nick;
        $data['name'] = $_POST['name'];
        $data['phone'] = $_POST['phone'];
        $data['begin_date'] = $_POST['begin_date'];
        $data['end_date'] = $_POST['end_date'];

        $rs = $db->insert('old_lover', $data);
        if($rs){
            $result['add'] = true;
        }else{
            $result['add'] = false;
        }
    }
      
    $json = json_encode($result, JSON_PRETTY_PRINT); 
    // $json = json_encode($result); // use on hostinger
    print_r($json);
?>

Code trong file này cũng hoàn toàn dễ hiểu, mình chỉ lưu ý là mình có dùng biến $test được lấy bằng giao thứ GET, tức là lấy ngay trên đường dẫn trình duyệt để test dữ liệu. Các bạn có thể test bằng cách truy cập vào link sau để test danh sách người yêu cũ của mình:
https://www.cachhoc.net/mobile/demo-json/lover.php?test=true&nick=quan

Vậy là xong rồi. Trong bài tiếp theo chúng ta bắt đầu chuyển sang thao tác phía Android.

Bài viết được thực hiện trong loạt bài hướng dẫn JSon trong Android bởi nguyenvanquan7826