[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ộ.
Nội dung
Tạo cơ sở dữ liệu
Các bạn vào mục Database -> MySQL Database để tạo database:
Nhập tên databse, tên user và password vậy là xong.
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:
Bảng 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
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
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
Chỗ file php cuối dùng để xuất json thì đặt tên file này là gì vậy bạn ơi.
Với bạn cho hỏi thêm có phải cái cách mà server trả về dữ liệu là đang dùng dạng RestFul web service có phải ko ?
File đó là file lover.php nhé.
Mình cũng không biết tẻn của cách này là gì nữa bạn ah. :))
Mình làm thử nhưng nó lại báo lỗi ở phần mysql_connect()… mình không pít sửa sao cho nó chạy. À mình chạy trên Hostinger free.
Phía trước DB_DATABASE và DB_USER có cần thêm “u425550055_ “vào không bạn
ví dụ:
Có chứ bạn. Mình đã chú ý bên trên rồi mà.
anh có thể chỉ giúp em cấu trúc của link https://www.cachhoc.net/mobile/demo-json/lover.php?test=true&nick=quan được ko ạ?
Bạn click vào link là xem được cấu trúc của nó mà, mình xuất ra dạng cấu trúc dễ nhin rồi đó.
ý em ko phải là cấu trúc Json. mà là cấu trúc của đường link ấy. em đang muốn trả link về chó clien truy cập.
Cái link đó thì tùy bạn mà, link của file, xong đến các biến bạn đặt ấy. Bạn để ý ở cuối “.php?key2=value1&key2=value2” thì các key và value là các biến bạn muốn truyền
https://www.cachhoc.net/ (hostting)
mobile/ (folder)
demo-json/ (cái này là gì ạ)
lover.php?test=true&nick=quan ( và đây nữa ạ)
đó cũng là folder mà 🙂
anh ơi. cho em tài liệu hàm delete được ko ạ? và cho em hỏi 1 chút em muốn select user by id thì sử lý điều kiện như hàm delete ổn ko ạ?
Hàm delete bên trên mình có nói rồi đó. Bạn cứ để điều kiện vào thôi. Ví dụ như hàm bên trên mình viết thì bạn làm thế này:
delete(‘tb_user’,’id = ‘ . $id){
A cho e hỏi: E muốn làm thêm 1 chức năng lấy thông tin của 1 người thôi ạ.Tức là client truyền 1 ID lên,server nhận ID đó rồi trả về thông tin của 1 người đó thôi.Thì phải viết thêm hàm và một biến nhận ID như thế nào nữa ạ.E cảm ơn và mong a đừng xóa bài em ạ 🙂
Bạn làm tương tự cái lấy toàn bộ nhưng chỉ lấy 1 người thôi. Trong file database.php mình có viết 1 hàm selectone đó bạn. Bạn cho lệnh select theo id vào hàm đó là được.
A cho em hỏi : Chỗ Tạo Database User a đặt là lover sao chỗ file Config,php lại là mobile-demo-json ạ? E k rõ chỗ này nên của em vẫn chưa chạy dc.
Ah, do mình dùng database và host từ blog của mình nên vậy. Các bạn tạo ở hostinger thì database, user sẽ dạng u2345_lover như bên trên đã tạo.
Cho e hỏi tiếp. biến $method a dùng method POST. tức là khi client mà gửi request lên. Đường link chỉ có thế này thôi: https://www.cachhoc.net/mobile/demo-json/lover.php . Đúng k a? chưa xem bài trước nhưng e muốn tò mò trước để hiểu rõ hơn 2 method này ạ ?
À e nhầm, “Chưa xem bài tiếp theo”
Đúng rồi bạn.
a có thể viết tiếp hàm Đăng xuất cho server luôn được không ạ? .Em làm được đăng nhập,đăng ký rồi,nhưng không biết đăng xuất thế nào?
Đăng xuất thì dễ thôi bạn, Bạn cho back trở lại giao diện đăng nhập và xóa dữ liệu (user & pass) trong ShrePreferce của Android là được
Em nghĩ nó phải đồng bộ với server chứ nhỉ. Nếu làm như thế thì có khi k cần xóa dữ liệu user cũng được.Vì đăng nhập e để là 1 Activity. khi đăng nhập thành công thì chuyển vào Activty khác.Nên nếu quay ra đăng nhập thì giao diện Activity nó vẫn như chưa đăng nhập :v
ukm, chỉ cần như thế thôi.
“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” CHO MÌNH HỎI NGU CÁI CHỔ NÀY
// for test from web browser
$test = $_GET[‘test’];
if($test==true){
$nick = $_GET[‘nick’];
$method = $METHOD_GET_OLD_LOVER;
}
THAY ‘test’ BẰNG ĐƯỜNG DẪN TỚI HOST HAY LÀ TỚI TẬN FILE love.php VẬY THANKS NHIỀU.
Cho mình hỏi làm sao để tạo json dạng gson trong php
Mình ko hiểu ý của bạn lắm? Nếu muốn xuất json thì bạn cứ dùng php rồi echo ra.
Bạn cho ms hỏi là cái file cuối cùng viết để xuất JS ra cũng để cùng với thư mục của 3file connect tới db bên trên ạ.
Đúng rồi bạn
Cho mình hỏi vấn đề như sau.
Nếu Field trong database nó có chữ mã html thì khi mình xuất ra JSON và view ra thì nó view mã nguồn của các thẻ html đó chứ nó ko format luôn. Mình có cách nào để giải quyết không ?
Ví du: trong bài viết mình có hình ảnh, khi xuất ra JSON nó hiện dòng mã chứ ko hiện hình
Json nó là thế, chỉ có text chứ không có gì khác nhé bạn.