By GokiSoft.com|
15:23 14/06/2021|
Học PHP
[Share Code] Hướng dẫn tạo dự án API trong PHP - Server & Client Lập trình PHP/MySQL
#product.php
<?php
session_start();
header('Access-Control-Allow-Origin: *');
require_once ('../db/dbhelper.php');
require_once ('../utils/utility.php');
#utility.php
<?php
function fixSqlInjection($str) {
// abc\okok -> abc\\okok
//abc\okok (user) -> abc\okok (server) -> sql (abc\okok) -> xuat hien ky tu \ -> ky tu dac biet -> error query
//abc\okok (user) -> abc\okok (server) -> convert -> abc\\okok -> sql (abc\\okok) -> chinh xac
$str = str_replace('\\', '\\\\', $str);
//abc'okok -> abc\'okok
//abc'okok (user) -> abc'okok (server) -> sql (abc'okok) -> xuat hien ky tu \ -> ky tu dac biet -> error query
//abc'okok (user) -> abc'okok (server) -> convert -> abc\'okok -> sql (abc\'okok) -> chinh xac
$str = str_replace('\'', '\\\'', $str);
return $str;
}
function authenToken() {
if (isset($_SESSION['user'])) {
return $_SESSION['user'];
}
$token = getCOOKIE('token');
if (empty($token)) {
return null;
}
$sql = "select users.* from users, login_tokens where users.id = login_tokens.id_user and login_tokens.token = '$token'";
$result = executeResult($sql);
if ($result != null && count($result) > 0) {
$_SESSION['user'] = $result[0];
return $result[0];
}
return null;
}
function getPOST($key) {
$value = '';
if (isset($_POST[$key])) {
$value = $_POST[$key];
}
return fixSqlInjection($value);
}
function getCOOKIE($key) {
$value = '';
if (isset($_COOKIE[$key])) {
$value = $_COOKIE[$key];
}
return fixSqlInjection($value);
}
function getGET($key) {
$value = '';
if (isset($_GET[$key])) {
$value = $_GET[$key];
}
return fixSqlInjection($value);
}
function md5Security($pwd) {
return md5(md5($pwd).MD5_PRIVATE_KEY);
}
#dbhelper.php
<?php
require_once ('config.php');
/**
* Su dung voi cau lenh query: insert, update, delete -> ko tra ve ket qua.
*/
function execute($sql) {
//Mo ket noi toi database
$conn = mysqli_connect(HOST, USERNAME, PASSWORD, DATABASE);
mysqli_set_charset($conn, 'utf8');
//Xu ly cau query
mysqli_query($conn, $sql);
//Dong ket noi database
mysqli_close($conn);
}
/**
* Su dung voi cau lenh query: select.
*/
function executeResult($sql, $isSingleRecord = false) {
//Mo ket noi toi database
$conn = mysqli_connect(HOST, USERNAME, PASSWORD, DATABASE);
mysqli_set_charset($conn, 'utf8');
// echo $sql;
//Xu ly cau query
$resultset = mysqli_query($conn, $sql);
// var_dump($resultset);
// die();
if ($isSingleRecord) {
$data = mysqli_fetch_array($resultset, 1);
} else {
$data = [];
while (($row = mysqli_fetch_array($resultset, 1)) != null) {
$data[] = $row;
}
}
/**
* TH: param2 = 1
* $row = [
* 'id' => 1,
* 'title' => '1 - Android Tivi Sony 4K 55 inch KD-55X8000H',
* 'thumbnail' => '12321',
* ...
* ];
*
* TH: param2 = 2
* $row = [1, '1 - Android Tivi Sony 4K 55 inch KD-55X8000H', '12321', ...];
*/
//Dong ket noi database
mysqli_close($conn);
return $data;
}
#config.php
<?php
define('HOST', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', '');
define('DATABASE', 'T2008A');
define('MD5_PRIVATE_KEY', '2342kuhskdfsd23(&kusdhfjsgJYGJGsfdf384');
#authen.php
<?php
session_start();
header('Access-Control-Allow-Origin: *');
require_once ('../db/dbhelper.php');
require_once ('../utils/utility.php');
$action = getPOST('action');
switch ($action) {
case 'login':
doLogin();
break;
case 'logout':
doLogout();
break;
case 'register':
doRegister();
break;
case 'list':
doUserList();
break;
}
function doLogout() {
$token = getCOOKIE('token');
if (empty($token)) {
$res = [
"status" => 1,
"msg" => "Logout success!!!"
];
echo json_encode($res);
return;
}
// Xoa token khoi database
$sql = "delete from login_tokens where token = '$token'";
execute($sql);
// Xoa token khoi cookie
setcookie('token', '', time()-7*24*60*60, '/');
$res = [
"status" => 1,
"msg" => "Logout success!!!"
];
echo json_encode($res);
session_destroy();
}
function doLogin() {
$email = getPOST('email');
$password = getPOST('password');
$password = md5Security($password);
$sql = "select * from users where email = '$email' and password = '$password'";
$user = executeResult($sql, true);
if ($user != null) {
$email = $user['email'];
$id = $user['id'];
$token = md5Security($email.time().$id);
// setcookie('status', 'login', time()+7*24*60*60, '/');
setcookie('token', $token, time()+7*24*60*60, '/');
// save database
$sql = "insert into login_tokens (id_user, token) values ('$id', '$token')";
execute($sql);
$res = [
"status" => 1,
"msg" => "Login success!!!"
];
} else {
$res = [
"status" => -1,
"msg" => "Login failed!!!"
];
}
echo json_encode($res);
}
function doRegister() {
$username = getPOST('username');
$fullname = getPOST('fullname');
$email = getPOST('email');
$password = getPOST('password');
$address = getPOST('address');
$sql = "select * from users where username = '$username' or email = '$email'";
$result = executeResult($sql);
if ($result == null || count($result) == 0) {
$password = md5Security($password);
$sql = "insert into users(fullname, username, email, password, address) values ('$fullname', '$username', '$email', '$password', '$address')";
execute($sql);
$res = [
"status" => 1,
"msg" => "Create new account success!!!"
];
} else {
$res = [
"status" => -1,
"msg" => "Email|Username existed!!!"
];
}
echo json_encode($res);
}
function doUserList() {
$user = authenToken();
// var_dump($user);
// die();
if ($user == null) {
$res = [
"status" => -1,
"msg" => "Not login!!!",
"userList" => []
];
echo json_encode($res);
return;
}
$sql = "select * from users";
$result = executeResult($sql);
$res = [
"status" => 1,
"msg" => "success!!!",
"userList" => $result
];
echo json_encode($res);
}
#readme.txt
Xây dựng dự án sử dụng API
- Backend: (PHP) -> logic nghiệp vụ
- Client:
- Mobile, PC Application
- Frontend -> HTML/CSS/JS
========================================
Mini Project:
- Backend:
API
Authen:
- login
- register
- userList
- update/delete/add => Tự viết thêm => Bài tập
Product:
- productList
- add/update/delete => Tự viết thêm => Bài tập
- Client: Web Client -> Goi API
login page
register page
userList page
productList page
Triển khai:
B1. Xậy dựng database.
- Tao Tables: users, products
- Fake du lieu
B2. Phân tịch API
BASE_URL: http://localhost/aptech/T2008A/lesson07/server/
Authen:
API: login
- URL: api/authen.php
- Method: POST
- Request: {
"action": "login",
"email": "tranvandiep.it@gmail.com",
"password": "123456"
}
- Response: {
"status": 1 (1: success, 2 failed),
"msg": "Error ???"
}
API: login
- URL: api/authen.php
- Method: POST
- Request: {
"action": "logout"
}
- Response: {
"status": 1 (1: success, 2 failed),
"msg": "Error ???"
}
API: register
- URL: api/authen.php
- Method: POST
- Request: {
"action": "register",
"fullname": "TRAN VAN DIEP",
"username": "dieptv",
"email": "tranvandiep.it@gmail.com",
"password": "123456",
"address": "Ha Noi"
}
- Response: {
"status": 1 (1: success, 2 failed),
"msg": "Error ???"
}
API: userList
- URL: api/authen.php
- Method: POST
- Request: {
"action": "list"
}
- Response: {
"status": 1 (1: success, 2 failed),
"msg": "Error ???",
"userList": [
{
"id": "1",
"fullname": "TRAN VAN DIEP",
"username": "dieptv",
"email": "tranvandiep.it@gmail.com",
"address": "Ha Noi"
}, {
"id": "2",
"fullname": "TRAN VAN DIEP",
"username": "dieptv",
"email": "tranvandiep.it@gmail.com",
"address": "Ha Noi"
}
]
}
Product:
API: productList
- URL: api/product.php
- Method: POST
- Request: {
"action": "list"
}
- Response: {
"status": 1 (1: success, 2 failed),
"msg": "Error ???",
"productList": [
{
"id": "1",
"title": "Bai viet",
"thumbnail": "URL",
"updated_at": "2021-06-12 12:02"
}, {
"id": "2",
"title": "Bai viet",
"thumbnail": "URL",
"updated_at": "2021-06-12 12:02"
}
]
}
B3. Code Server Backend
- Xay dung 1 khung chuong trinh
- db
- config.php
- dbhelper.php
- utils
- utility.php
- api
- authen.php
- product.php
#users.html
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src = "js/config.js"></script>
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">
<h2 class="text-center">User List Manager (<a href="#logout" onclick="logout()">Logout</a>)</h2>
</div>
<div class="panel-body">
<table class="table table-bordered">
<thead>
<tr>
<th>No</th>
<th>Full Name</th>
<th>User Name</th>
<th>Email</th>
<th>Address</th>
<th style="width: 50px;"></th>
<th style="width: 50px;"></th>
</tr>
</thead>
<tbody id="userList"></tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
$.post(BASE_URL + API_AUTHEN, {
'action': AUTHEN_USER_LIST
}, function(data) {
var obj = JSON.parse(data)
console.log(obj)
if(obj.status == 1) {
//Hien thi danh sach users
userList = obj.userList
for(i=0;i<userList.length;i++) {
item = userList[i]
$('#userList').append(`<tr>
<td>${i+1}</td>
<td>${item['fullname']}</td>
<td>${item['username']}</td>
<td>${item['email']}</td>
<td>${item['address']}</td>
<td><button class="btn btn-warning">Edit</button></td>
<td><button class="btn btn-danger">Delete</button></td>
</tr>`)
}
} else {
window.open('login.html', '_self')
}
})
})
function logout() {
$.post(BASE_URL + API_AUTHEN, {
'action': AUTHEN_LOGOUT
}, function(data) {
window.open('login.html', '_self')
})
}
</script>
</body>
</html>
#register.html
<!DOCTYPE html>
<html>
<head>
<title>Register Page</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src = "js/config.js"></script>
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">
<h2 class="text-center">Create New Account</h2>
</div>
<div class="panel-body">
<form method="post">
<div class="form-group">
<label for="usr">Full Name (<font color="red">*</font>):</label>
<input required="true" type="text" class="form-control" id="fullname" name="fullname">
</div>
<div class="form-group">
<label for="usr">User Name (<font color="red">*</font>):</label>
<input required="true" type="text" class="form-control" id="username" name="username">
</div>
<div class="form-group">
<label for="email">Email (<font color="red">*</font>):</label>
<input required="true" type="email" class="form-control" id="email" name="email">
</div>
<div class="form-group">
<label for="pwd">Password (<font color="red">*</font>):</label>
<input required="true" type="password" class="form-control" id="pwd" name="password">
</div>
<div class="form-group">
<label for="confirmation_pwd">Confirmation Password (<font color="red">*</font>):</label>
<input required="true" type="password" class="form-control" id="confirmation_pwd" name="confirmation_pwd">
</div>
<div class="form-group">
<label for="address">Address:</label>
<input type="text" class="form-control" id="address" name="address">
</div>
<p>
<a href="login.html">I have a account</a>
</p>
<button type="submit" class="btn btn-success">Register</button>
</form>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
$('form').submit(function() {
var pwd = $('#pwd').val()
var confirmPwd = $('#confirmation_pwd').val()
if(pwd != confirmPwd) {
alert('Mat khau khong khop, vui long kiem tra lai!!!')
return false
}
$.post(BASE_URL + API_AUTHEN, {
'action': AUTHEN_REGISTER,
'fullname': $('[name=fullname]').val(),
'username': $('[name=username]').val(),
'email': $('[name=email]').val(),
'password': $('[name=password]').val(),
'address': $('[name=address]').val()
}, function(data) {
obj = JSON.parse(data)
if(obj.status == 1) {
window.open('login.html', '_self')
} else {
alert(obj.msg)
}
})
return false
})
})
</script>
</body>
</html>
#login.html
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src = "js/config.js"></script>
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">
<h2 class="text-center">Login</h2>
</div>
<div class="panel-body">
<form method="post">
<div class="form-group">
<label for="email">Email (<font color="red">*</font>):</label>
<input required="true" type="email" class="form-control" id="email" name="email">
</div>
<div class="form-group">
<label for="pwd">Password (<font color="red">*</font>):</label>
<input required="true" type="password" class="form-control" id="pwd" name="password">
</div>
<p>
<a href="register.html">Create new account</a>
</p>
<button type="submit" class="btn btn-success">Login</button>
</form>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
$('form').submit(function() {
var email = $('[name=email]').val()
var password = $('[name=password]').val()
$.post(BASE_URL + API_AUTHEN, {
'action': AUTHEN_LOGIN,
'email': email,
'password': password
}, function(data) {
// console.log(data)
var obj = JSON.parse(data)
if(obj.status == 1) {
window.open('users.html', '_self')
} else {
alert(obj.msg)
}
})
return false
})
})
</script>
</body>
</html>
#config.js
var BASE_URL = 'http://localhost/aptech/T2008A/lesson07/server/';
// Authen API
var API_AUTHEN = 'api/authen.php';
var AUTHEN_LOGIN = 'login';
var AUTHEN_REGISTER = 'register';
var AUTHEN_LOGOUT = 'logout';
var AUTHEN_USER_LIST = 'list';
// Product API
Tags:
Phản hồi từ học viên
5
(Dựa trên đánh giá ngày hôm nay)