By GokiSoft.com| 16:00 10/05/2021|
Học PHP

[Share Code] Quản lý sản phẩm full source code - Lập trình PHP/MySQL

#add-product.php


<?php
require_once ('form-product.php');
$id = getGET('id');
if ($id > 0) {
	//Edit
	$thisProduct = executeResult("select * from product where id = ".$id, true);
} else {
	//Them moi
	$thisProduct = null;
}
?>

<!DOCTYPE html>
<html>
<head>
	<title>Add Product</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>
</head>
<body>
	<div class="container">
		<div class="panel panel-primary">
			<div class="panel-heading">
				<h2 class="text-center">Add Product</h2>
			</div>
			<div class="panel-body">
				<form method="post" enctype="multipart/form-data">
					<div class="form-group">
					  <label for="title">Title:</label>
					  <input required="true" type="text" class="form-control" id="title" name="title" value="<?=($thisProduct != null)?$thisProduct['title']:''?>">
					  <input type="text" name="id" value="<?=($thisProduct != null)?$thisProduct['id']:''?>" hidden>
					</div>
					<div class="form-group">
					  <label for="thumbnail">Thumbnail:</label>
					  <input type="file" class="form-control" id="thumbnail" name="thumbnail">
					  <img src="<?=($thisProduct != null)?$thisProduct['thumbnail']:''?>" style="max-height: 200px;">
					</div>
					<div class="form-group">
					  <label for="content">Content:</label>
					  <textarea class="form-control" rows="5" id="content" name="content"><?=($thisProduct != null)?$thisProduct['content']:''?></textarea>
					</div>
					<a href="product-list.php"><button type="button" class="btn btn-default">Back product list</button></a>
					<button class="btn btn-success">Save</button>
				</form>
			</div>
		</div>
	</div>
</body>
</html>


#utility.php


<?php
function moveFileToPhotos($key) {
	// var_dump($_FILES);
	// die();
	//Duong dan chua file da duoc upload len Server
	$target_dir = "photos/";

	// $file              = $_FILES[$key]['name'];

	// $path              = pathinfo($file);
	// $filename          = $path['filename'];
	// $ext               = $path['extension'];
	$filename = $_FILES[$key]['name'];

	//Form -> a.png -> server -> luu a.png toi duong dan $temp_name
	$temp_name = $_FILES[$key]['tmp_name'];

	$path_filename_ext = $target_dir.$filename;

	//Form -> a.png -> server (tmp_name: aaa) -> file_exists(photos/a.png) -> false -> move -> photos/a.png -> exist
	//Form -> a.png -> server (tmp_name: bbb) -> file_exists(photos/a.png) -> true -> stop

	//Risk:
	//A -> login -> addProduct -> upload a.png -> server (tmp_name: aaa) -> file_exists(photos/a.png) -> false -> move -> photos/a.png -> exist
	//A -> login -> addProduct -> upload a.png (cung ten -> anh khac) -> server (tmp_name: bbb) -> file_exists(photos/a.png) -> true -> stop -> Error nghiep vu.
	if (file_exists($path_filename_ext)) {
		// echo "Sorry, file already exists.";
	} else {
		//move a.png ($temp_name) -> photos/a.png ($path_filename_ext)
		move_uploaded_file($temp_name, $path_filename_ext);
		// echo "Congratulations! File Uploaded Successfully.";
	}
	return $path_filename_ext;
}


#readme.txt


- Tìm hiểu về kết nối CSDL (database)
	- insert/update/delete & select

- Mini project:
	- Xây dựng 1 trang quản trị bán mỹ phẩm: thêm/sửa/xoá sản phẩm
	- Frontend:
		- Trang chủ: Xem thông tin sản phẩm.

====================================================
Phân tích dự án:
	- Admin:
		- product-list.php
		- add-product.php
	- Frontend:
		- index.php -> Hiển thị danh sách sản phẩm

Các bước để phát triển dự án:
B1. Xây dựng được database.
- T2008A

create table product (
	id int primary key auto_increment,
	title varchar(50),
	thumbnail varchar(500),
	content text,
	created_at datetime,
	updated_at datetime
)

B2. Phát triển các chức năng.
- Admin:
	- add-product.php


#product-list.php


<?php
require_once ('database-helper.php');

$productList = executeResult('select * from product');
?>
<!DOCTYPE html>
<html>
<head>
	<title>Product List</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>
</head>
<body>
	<div class="container">
		<div class="panel panel-primary">
			<div class="panel-heading">
				<h2 class="text-center">Product List</h2>
			</div>
			<div class="panel-body">
				<a href="add-product.php"><button class="btn btn-success">Add Product</button></a>
				<table class="table table-bordered">
					<thead>
						<tr>
							<th>No</th>
							<th>Thumbnail</th>
							<th>Title</th>
							<th>Updated At</th>
							<th></th>
							<th></th>
						</tr>
					</thead>
					<tbody>
<?php
$count = 0;
foreach ($productList as $item) {
	echo '<tr>
			<td>'.(++$count).'</td>
			<td><img src="'.$item['thumbnail'].'" style="width: 160px"/></td>
			<td>'.$item['title'].'</td>
			<td>'.$item['updated_at'].'</td>
			<td><a href="add-product.php?id='.$item['id'].'"><button class="btn btn-warning">Edit</button></a></td>
			<td><button onclick="deleteProduct('.$item['id'].')" class="btn btn-danger">Delete</button></td>
		</tr>';
}
?>
					</tbody>
				</table>
			</div>
		</div>
	</div>
<script type="text/javascript">
	function deleteProduct(id) {
		option = confirm('Are you sure to delete this product?')
		if(!option) return

		$.post('form-product.php', {
			'action': 'delete',
			'id': id
		}, function(data) {
			location.reload()
		})
	}
</script>
</body>
</html>


#form-product.php


<?php
require_once ('database-helper.php');
require_once ('utility.php');

$title = $thumbnail = $content = '';

if (!empty($_POST)) {
	$action = getPOST('action');

	switch ($action) {
		case 'delete':
			deleteProduct();
			break;

		default:
			$id = getPOST('id');
			if ($id > 0) {
				updateProduct();
			} else {
				addProduct();
			}

			break;
	}
}

function deleteProduct() {
	$id  = getPOST('id');
	$sql = "delete from product where id = $id";
	execute($sql);
}

function updateProduct() {
	$title = getPOST('title');

	if (isset($_FILES['thumbnail']['name']) && $_FILES['thumbnail']['name'] != '') {
		$thumbnail = moveFileToPhotos('thumbnail');
	} else {
		$thumbnail = '';
	}
	// $thumbnail = moveFileToPhotos('thumbnail');

	$content = getPOST('content');
	$id      = getPOST('id');

	if (!empty($title) && !empty($content)) {
		$created_at = $updated_at = date('Y-m-d H:i:s');
		if (empty($thumbnail)) {
			$sql = "update product set title = '$title', content = '$content', updated_at = '$updated_at' where id = " .$id;
		} else {
			$sql = "update product set title = '$title', thumbnail = '$thumbnail', content = '$content', updated_at = '$updated_at' where id = " .$id;
		}

		execute($sql);
	}
}

function addProduct() {
	$title     = getPOST('title');
	$thumbnail = moveFileToPhotos('thumbnail');
	$content   = getPOST('content');

	if (!empty($title) && !empty($content)) {
		$created_at = $updated_at = date('Y-m-d H:i:s');
		$sql        = "insert into product(title, thumbnail, content, created_at, updated_at) values ('$title', '$thumbnail', '$content', '$created_at', '$updated_at')";
		// echo $sql;
		execute($sql);
	}
}


#database-helper.php


<?php
require_once ('config.php');

//insert, update, delete
function execute($sql) {
	//save data -> database (product)
	//B1. Mo ket noi toi database
	$conn = mysqli_connect(HOST, USERNAME, PASSWORD, DATABASE);
	mysqli_set_charset($conn, 'utf8');

	//B2. Thuc thi query (select, insert, update, delete)
	mysqli_query($conn, $sql);

	//B3. Dong ket noi database
	mysqli_close($conn);
}

function executeResult($sql, $isSingle = false) {
	//save data -> database (product)
	//B1. Mo ket noi toi database
	$conn = mysqli_connect(HOST, USERNAME, PASSWORD, DATABASE);
	mysqli_set_charset($conn, 'utf8');

	//B2. Thuc thi query (select, insert, update, delete)
	$resultset = mysqli_query($conn, $sql);

	if ($isSingle) {
		$data = mysqli_fetch_array($resultset, 1);
	} else {
		$data = [];

		while (($row = mysqli_fetch_array($resultset, 1)) != null) {
			$data[] = $row;
		}
	}

	//B3. Dong ket noi database
	mysqli_close($conn);

	return $data;
}

function removeSpecialCharacter($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 getPOST($key) {
	$value = '';
	if (isset($_POST[$key])) {
		$value = $_POST[$key];
	}
	return removeSpecialCharacter($value);
}

function getGET($key) {
	$value = '';
	if (isset($_GET[$key])) {
		$value = $_GET[$key];
	}
	return removeSpecialCharacter($value);
}


#config.php


<?php
define('HOST', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', '');
define('DATABASE', 'T2008A');


Tags:

Phản hồi từ học viên

5

(Dựa trên đánh giá ngày hôm nay)