By GokiSoft.com|
18:33 26/01/2024|
Học PHP
[Share Code] Bài tập - Tạo website bán hàng lư niệm - Login - Lập trình PHP/MySQL - C2307L
Bài tập - Tạo website bán hàng lư niệm - Login - Lập trình PHP/MySQL
#config.php
<?php
session_start();
define('HOSTING', 'localhost');
// define('USERNAME', 'gokisoft');
define('USERNAME', 'root');
// define('PWD', 'iv@*NIFyTdKEgh]D');
define('PWD', '');
define('DATABASE', 'gift_db');
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
function initDatabase() {
//Tao CSDL
$sql = "create database if not exists gift_db";
$conn = mysqli_connect(HOSTING, USERNAME, PWD);
mysqli_set_charset($conn, 'utf8');
//B2. Thuc hien insert du lieu vao CSDL
mysqli_query($conn, $sql);
//B3. Dong ket noi
mysqli_close($conn);
//Tao tables
$sql = 'create table if not exists gift (
id int primary key auto_increment,
title varchar(150),
thumbnail varchar(500),
content longtext,
price float,
created_at datetime,
updated_at datetime,
id_user int
)';
query($sql);
$sql = 'create table if not exists users (
id int primary key auto_increment,
fullname varchar(50),
email varchar(150) unique,
password varchar(100),
token varchar(255) unique
)';
query($sql);
}
/**
* Query: insert, update, delete
*/
function query($sql) {
// $conn = mysqli_connect('localhost:3307', 'gokisoft', 'iv@*NIFyTdKEgh]D', 'c2307l');
$conn = mysqli_connect(HOSTING, USERNAME, PWD, DATABASE);
mysqli_set_charset($conn, 'utf8');
//B2. Thuc hien insert du lieu vao CSDL
// $sql = "insert into users (fullname, email, phone_number, address, created_at, updated_at) values ('TRAN VAN AAA', 'tranvana@gmail.com', '1234567890', 'Ha Noi', '2023-01-02 09:30:00', '2023-01-02 09:30:00')";
// $sql = "delete from users where id = ".$id;
mysqli_query($conn, $sql);
//B3. Dong ket noi
mysqli_close($conn);
}
function select($sql) {
$conn = mysqli_connect(HOSTING, USERNAME, PWD, DATABASE);
mysqli_set_charset($conn, 'utf8');
//B2. Thuc hien insert du lieu vao CSDL
// $sql = "insert into users (fullname, email, phone_number, address, created_at, updated_at) values ('TRAN VAN AAA', 'tranvana@gmail.com', '1234567890', 'Ha Noi', '2023-01-02 09:30:00', '2023-01-02 09:30:00')";
// $sql = "select * from users";
$resultset = mysqli_query($conn, $sql);
$dataList = [];
while(($row = mysqli_fetch_array($resultset, 1)) !== null) {
$dataList[] = $row;
}
//B3. Dong ket noi
mysqli_close($conn);
return $dataList;
}
function getPost($key) {
if(isset($_POST[$key])) {
return $_POST[$key];
}
return "";
}
#readme.txt
B1. Tao CSDL
create database if not exists gift_db
create table if not exists gift (
id int primary key auto_increment,
title varchar(150),
thumbnail varchar(500),
content longtext,
price float,
created_at datetime,
updated_at datetime,
id_user int
)
create table if not exists users (
id int primary key auto_increment,
fullname varchar(50),
email varchar(150) unique,
password varchar(100),
token varchar(255) unique
)
B2. Tao project
Tao cau truc du an
structure
- index.php -> trang chu
- config.php -> Ket noi CSDL
- modules
- users
login.php
register.php
- gift
index.php
add.php
edit.php
delete.php
Hoàn thành các thành phân cơ bản của dự án
Yêu cầu: Login thành công -> keep login này trong 1 tuần, 1 tháng, 1 năm, ... Thì chúng ta làm như nào???
Giải pháp login:
Login Form -> Nhập thông tin -> Lên server
- FAIL: Login lại
- SUCCESS:
B1. Lưu vào session -> login lần sau nhanh -> Tồn tại trong 2-10 phút -> Hết phiên
B2. Tạo 1 token sau khi login thành công
- Lưu vào cookie (set thời gian 1 tuần, 1 tháng, 1 năm, ...)
- Lưu vào database (users -> token của người dùng đó)
Cơ chế là gì:
TH1. Check session -> tự động login thành công
TH2. session không tồn tại
- Lấy token trong cookie
- Kiểm tra token có tồn tại trong CSDL -> khớp với người dùng nào
- Lưu vào session -> Login thành công
#init.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Init DataBase Page</title>
</head>
<body>
<?php
require_once('config.php');
initDatabase();
?>
<h1 style="text-align: center;">Init database success!</h1>
<p>
<a href="index.php">Home</a>
</p>
</body>
</html>
#index.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Qua Tang Page</title>
</head>
<body>
<p>
<a href="modules/user/login.php">Login Page</a>
</p>
<p>
<a href="modules/gift">Gift Page</a>
</p>
<p>
<a href="init.php">Init Database Page</a>
</p>
</body>
</html>
#gift.php
<?php
class Gift {
public $id;
public $title;
public $thumbnail;
public $content;
public $price;
public $createdAt;
public $updatedAt;
public $idUser;
public function findAll($idUser) {
$sql = "select * from gift where id_user = ".$idUser;
echo $sql;
return select($sql);
}
public function findAllPDO($idUser) {
//B1. Mo ket noi toi CSDL
$conn = new PDO("mysql:host=".HOSTING.";dbname=".DATABASE, USERNAME, PWD);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//B2. Truy van
$stmt = $conn->prepare("select * from gift where id_user = :id_user");
$stmt->bindParam(":id_user", $idUser);
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
$result = $stmt->fetchAll();
// var_dump($result);
//B3. Dong ket noi toi CSDL
$conn = null;
return $result;
}
}
#users.php
<?php
class Users {
public $id;
public $fullname;
public $email;
public $password;
public $token;
public $hashPwd;
public function processForm() {
$this->id = getPost('id');
$this->fullname = getPost('fullname');
$this->email = getPost('email');
$this->password = getPost('password');
$this->token = getPost('token');
//Cung la 1 mat khau $this->password. Nhung tai cac thoi diem khac nhau thi password_hash -> tao ra cac hash khac nhau
$this->hashPwd = password_hash($this->password, PASSWORD_DEFAULT);
}
public function autoLogin() {
if(isset($_SESSION['user'])) {
return $_SESSION['user'];
}
if(isset($_COOKIE['token'])) {
$token = $_COOKIE['token'];
$sql = "select * from users where token = '$token'";
$dataList = select($sql);
if($dataList != null && count($dataList) > 0) {
$_SESSION['user'] = $dataList[0];
return $_SESSION['user'];
}
}
return null;
}
public function login() {
//$this->email = ' or email is not null or email = '
//sql injection -> Fixed
$sql = "select * from users where email = '".$this->email."'";
// echo $sql;
$dataList = select($sql);
if($dataList != null && count($dataList) > 0) {
$hashPwd = $dataList[0]['password'];
//Verify $this->password & $hashPwd -> Co phai la 1 khong
$verify = password_verify($this->password, $hashPwd);
if($verify) {
//Login thanh cong
$_SESSION['user'] = $dataList[0];
$token = $dataList[0]['id'].password_hash($dataList[0]['id'], PASSWORD_DEFAULT).password_hash($dataList[0]['email'], PASSWORD_DEFAULT);
setcookie('token', $token, time() + 30 * 24 * 60 * 60, '/');
$sql = "update users set token = '".$token."' where id = ".$dataList[0]['id'];
// echo $sql;
query($sql);
// die();
return true;
}
}
return false;
}
public function register() {
$sql = "insert into users(fullname, email, password) values ('".$this->fullname."', '".$this->email."', '".$this->hashPwd."')";
query($sql);
}
}
#login.php
<?php
require_once('../../config.php');
require_once('../../models/users.php');
$title = "";
if(!empty($_POST)) {
$user = new Users();
$user->processForm();
$check = $user->login();
if($check) {
header('Location: ../gift');
die();
} else {
$title = "TAI KHOAN KHONG TON TAI";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Latest compiled and minified CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Latest compiled JavaScript -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<style type="text/css">
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12 mt-3">
<form method="post">
<h1 style="mau: red"><?=$title?></h1>
<div class="form-group">
<label>Email: </label>
<input type="text" name="email" placeholder="Enter email" class="form-control">
</div>
<div class="form-group">
<label>Password: </label>
<input type="password" name="password" placeholder="Enter pwd" class="form-control">
</div>
<div class="form-group">
<button class="btn btn-success">Login</button>
<p>
<a href="register.php">Create a new account</a>
</p>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
#register.php
<?php
require_once('../../config.php');
require_once('../../models/users.php');
$title = "";
if(!empty($_POST)) {
$user = new Users();
$user->processForm();
$user->register();
header('Location: login.php');
die();
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Register Page</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Latest compiled and minified CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Latest compiled JavaScript -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<style type="text/css">
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12 mt-3">
<form method="post">
<div class="form-group">
<label>Email: </label>
<input required type="text" name="email" placeholder="Enter email" class="form-control">
</div>
<div class="form-group">
<label>Full Name: </label>
<input required type="text" name="fullname" placeholder="Enter fullname" class="form-control">
</div>
<div class="form-group">
<label>Password: </label>
<input required type="password" name="password" placeholder="Enter pwd" class="form-control">
</div>
<div class="form-group">
<button class="btn btn-success">Login</button>
<p>
<a href="login.php">Login page</a>
</p>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
#index.php
<?php
require_once('../../config.php');
require_once('../../models/gift.php');
require_once('../../models/users.php');
$userModel = new Users();
$user = $userModel->autoLogin();
if($user == null) {
header('Location: ../user/login.php');
}
$idUser = $_SESSION['user']['id'];
$gift = new Gift();
//original
// $dataList = $gift->findAll($idUser);
//sql injection
// $dataList = $gift->findAll("0 or id_user > 0 or id_user = ".$idUser);
//original
$dataList = $gift->findAllPDO($idUser);
//test sql injection vs PDO
$dataList = $gift->findAllPDO("0 or id_user > 0 or id_user = ".$idUser);
?>
<!DOCTYPE html>
<html>
<head>
<title>Gift Page</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Latest compiled and minified CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Latest compiled JavaScript -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<style type="text/css">
.form-group {
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<h1 style="mau: red; text-align: center">Welcome <?=$_SESSION['user']['fullname']?></h1>
<div class="col-md-12 mt-3">
<a href="add.php"><button class="btn btn-success" style="float: left;">Them moi</button></a>
<form method="get">
<input type="text" name="s" placeholder="Tim kiem ..." class="form-control" style="width: 200px; float: right;">
</form>
</div>
<div class="col-md-12">
<div class="card mt-3">
<div class="card-header bg-info text-white">
DANH SACH GIFT
</div>
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>STT</th>
<th>Tieu De</th>
<th>Gia</th>
<th>Ngay Sua</th>
<th style="width: 180px;"></th>
</tr>
</thead>
<tbody>
<?php
$count = 0;
foreach ($dataList as $item) {
echo '<tr>
<td>'.(++$count).'</td>
<td>'.$item['title'].'</td>
<td>'.$item['price'].'</td>
<td>'.$item['updated_at'].'</td>
<td>
<a href="edit.php?id='.$item['id'].'"><button class="btn btn-warning">Sua</button></a>
<a href="delete.php?id='.$item['id'].'"><button class="btn btn-danger">Xoa</button></a>
</td>
</tr>';
}
?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
#delete.php
#edit..php
#add.php
Tags:
Phản hồi từ học viên
5
(Dựa trên đánh giá ngày hôm nay)