06/04/2021, 14:45

PHP Note Online - Hiển thị và thêm/sửa/xoá ghi chú - Ứng dụng Note và Chat với PHP

Xin chào tất cả cac bạn, đây là bài thứ 5 trong loạt bài series hướng dẫn xây dựng ứng dụng ghi chú online bằng PHP OOP và Ajax. Ở bài hôm trước, chúng ta đã tạo xong ba chức năng là đăng ký, đăng nhập và đăng xuất. Trong bài học hôm nay, mình sẽ hướng dẫn các bạn các hiển thị và thêm/sửa/xoá ...

Xin chào tất cả cac bạn, đây là bài thứ 5 trong loạt bài series hướng dẫn xây dựng ứng dụng ghi chú online bằng PHP OOP và Ajax. Ở bài hôm trước, chúng ta đã tạo xong ba chức năng là đăng ký, đăng nhập và đăng xuất. Trong bài học hôm nay, mình sẽ hướng dẫn các bạn các hiển thị và thêm/sửa/xoá ghi chú nhé ! Bài này là bài quan trọng nhất và cũng là bài dài nhất nên mình mong các bạn đọc từ từ và làm theo từng bước. Không nói dài dòng nữa bây giờ chúng ta vào việc chính thôi.

1. Hiển thị danh sách ghi chú

File templates/list-note.php sẽ đảm nhận phần này, các bạn chỉ việc mở file đó lên và copy nội dung sau :

 

<div class="container">
	<div class="row">
		<div class="col-md-12">
			<h3 class="text-primary">Danh sách các note</h3>
			<div class="list-group">
				<?php

				// Lênh SQL lấy danh sách note theo ID user
				$sql_get_data_list_note = "SELECT * FROM notes WHERE user_id = '$data_user[id_user]' ORDER BY id_note DESC";

				// Nếu có 
				if ($db->num_rows($sql_get_data_list_note))
				{
					// In danh sách ghi chú
					foreach ($db->fetch_assoc($sql_get_data_list_note, 0) as $key => $data_list_note) {
						$date_created = $data_list_note['date_created'];
							$day_created = substr($date_created, 8, 2); // Ngày tạo
							$month_created = substr($date_created, 5, 2); // Tháng tạo
							$year_created = substr($date_created, 0, 4); // Năm tạo
							$hour_created = substr($date_created, 11, 2); // Giờ tạo
							$min_created = substr($date_created, 14, 2); // Phút tạo

						// Chấm 3 chấm khi nội dung ghi chú dài hơn 300 ký tự
						if (strlen($data_list_note['body']) > 300)
						{
							$data_list_note['body'] = substr($data_list_note['body'], 0, 300).' ...';
						}
						else
						{
							$data_list_note['body'] = $data_list_note['body'];
						}

						echo '
							<a href="index.php?ac=edit_note&&id='.$data_list_note['id_note'].'" class="list-group-item ">
								<h4 class="list-group-item-heading">'.$data_list_note['title'].'</h4>
								<p class="list-group-item-text">'.$data_list_note['body'].'</p>
								<small> Tạo ngày
									'.$day_created.' tháng
									'.$month_created.' năm
									'.$year_created.' lúc
									'.$hour_created.':'.$min_created.'
								</small>
							 </a>			
						';
					}												
				}
				// Ngược lại không có
				else
				{
					// Hiển thị thông báo
					echo '
						<div class="alert alert-info">Hiện tại bạn chưa có note nào.</div>
					';
				}

				?>
			</div>
		</div>
	</div>
</div>

Bây giờ các bạn chạy thử xem, nếu nó thông báo chưa có note thì thành công rồi nhé, vì trong table notes mình chưa có dữ liệu mà :) Tiếp theo chúng ta sẽ viết các chức năng tương tác với ghi chú.

 

2. Thêm ghi chú

Layout

Các bạn mở file templates/create-note-form.php lên dán dán nội dung này vào :

 

<div class="container">
	<div class="row">
		<div class="col-md-12">
			<h3 class="text-primary">Tạo note mới</h3>
			<form method="POST" onsubmit="return false;" id="formCreateNote">
				<div class="form-group">
	    			<label for="user_signin">Tiêu đề</label>
	    			<input type="text" class="form-control" id="title_create_note">
	  			</div>
	  			<div class="form-group">
	    			<label for="pass_signin">Nội dung</label>
	    			<textarea class="form-control" id="body_create_note" rows="5"></textarea>
	  			</div>
	  			<a href="index.php" class="btn btn-default">
	  				<span class="glyphicon glyphicon-arrow-left"></span> Trở về
	  			</a>
	  			<button class="btn btn-primary" id="submit_create_note">
	  				<span class="glyphicon glyphicon-ok"></span> Tạo note
	  			</button>
	  			<br><br>
	  			<div class="alert alert-danger hidden"></div>
			</form>
		</div>
	</div>
</div>

Trong đó: #formCreateNote là form tạo ghi chú.

 

Viết Ajax gửi dữ liệu

File js/functions/note.js sẽ đảm nhận gửi dữ liệu của cả 3 chức năng thêm/sửa/xoá luôn, nên giờ các bạn mở file này lên và chèn đoạn code tạo note này vào trước:

 

// Bắt sự kiện khi click vào nút tạo
$('#submit_create_note').on('click', function() {
	// Gán các giá trị trong form tạo note vào các biến
	$title_create_note = $('#title_create_note').val();
	$body_create_note = $('#body_create_note').val();
	$ac = 'create'; // Hành động

	// Nếu một trong các biến này rỗng
	if ($title_create_note == '' || $title_create_note == '')
	{
		// Hiển thị thông báo lỗi
		$('#formCreateNote .alert').removeClass('hidden');
		$('#formCreateNote .alert').html('Vui lòng điền đầy đủ thông tin bên trên.');
	}
	// Ngược lại
	else
	{
		// Thực thi gửi dữ liệu bằng Ajax
		$.ajax({
			url : 'note.php', // Đường dẫn file nhận dữ liệu
			type : 'POST', // Phương thức gửi dữ liệu
			// Các dữ liệu
			data : {
				title_create_note : $title_create_note,
				body_create_note : $body_create_note,
				ac : $ac
			// Thực thi khi gửi dữ liệu thành công
			}, success : function(data) {
				$('#formCreateNote .alert').removeClass('hidden');
				$('#formCreateNote .alert').html(data);
			}
		});
	}
});

 

Viết PHP xử lý dữ liệu

 File note.php sẽ là file tiếp nhận dữ liệu và xử lý cả 3 luồng chức năng theo hành động được gửi đến. Các bạn có thể hiển theo sơ đồ dưới đây:

structure dl note online app jpg

Tiếp theo các bạn mở file note.php lên, rồi copy đoạn code sau và paste vào file :

 

<?php

// Kết nối database, session, general info
require_once 'core/init.php';

// Nếu không tồn tại $user
if (!$user)
{
	header('Location: index.php'); // Di chuyển đến trang chủ
}

// Nếu tồn tại hành động nào đó gửi đến
if (isset($_POST['ac']))
{	
	$ac = $_POST['ac'];
	// Nếu hành động là create
	if ($ac == 'create')
	{
		// Nhận dữ liệu và gán vào các biến đồng thời xử lý chuỗi
		$title_create_note = $db->real_escape_string(@$_POST['title_create_note']);
		$body_create_note = $db->real_escape_string(@$_POST['body_create_note']);

		$title_create_note = trim(htmlentities($title_create_note));
		$body_create_note = htmlentities($body_create_note);

		// Các biến chứa code JS về thông báo
		$show_alert = "<script>$('#formCreateNote .alert').removeClass('hidden');</script>";
		$hide_alert = "<script>$('#formCreateNote .alert').addClass('hidden');</script>";
		$success_alert = "<script>$('#formCreateNote .alert').attr('class', 'alert alert-success');</script>";

		// Lệnh SQL tạo note
		$sql_create_note = "INSERT INTO notes VALUES (
			'',
			'$data_user[id_user]',
			'$title_create_note',
			'$body_create_note',
			'$date_current'
		)";
		// Thực thi truy vấn
		$db->query($sql_create_note);

		// Hiển thị thông báo và di chuyển đến trang edit của note vừa tạo
		echo $show_alert.$success_alert." Tạo note thành công
			<script>
				location.href = 'index.php?ac=edit_note&&id=".$db->insert_id()."';
			</script>
		";
	}
	// Nếu hành động là edit
}

?>

 

OK, bây giờ các bạn chạy và thử tạo một note xem, nếu nó insert vào table notes là thành công rồi đấy !

3. Sửa ghi chú

Layout

Các bạn mở file templates/edit-note-form.php lên và dán đoạn code sau :

 

<?php

// Lệnh SQL lấy dữ liệu note theo ID
$sql_get_data_note = "SELECT * FROM notes WHERE user_id = '$data_user[id_user]' AND id_note = '$get_id'";

// Lấy dữ liệu
$data_note = $db->fetch_assoc($sql_get_data_note, 1);

$date_created = $data_note['date_created'];
	$day_created = substr($date_created, 8, 2); // Ngày tạo
	$month_created = substr($date_created, 5, 2); // Tháng tạo
	$year_created = substr($date_created, 0, 4); // Năm tạo
	$hour_created = substr($date_created, 11, 2); // Giờ tạo
	$min_created = substr($date_created, 14, 2); // Phút tạo

?>
<div class="container">
	<div class="row">
		<div class="col-md-12">
			<h3 class="text-primary">Chỉnh sửa note</h3>
			<div class="alert alert-info">Đã tạo vào ngày
			<?php
				// Hiển thị ngày tháng tạo
				echo $day_created.' tháng
					 '.$month_created.' năm
					 '.$year_created.' lúc
					 '.$hour_created.':'.$min_created;
			?>
			</div>
			<form method="POST" onsubmit="return false;" id="formEditNote">
				<div class="form-group">
	    			<label for="user_signin">Tiêu đề</label>
	    			<input type="text" class="form-control" id="title_edit_note" value="<?php echo $data_note['title'];  ?>">
	  			</div>
	  			<div class="form-group">
	    			<label for="pass_signin">Nội dung</label>
	    			<textarea class="form-control" id="body_edit_note" rows="5"><?php echo $data_note['body'];  ?></textarea>
	  			</div>
	  			<input type="hidden" value="<?php echo $data_note['id_note']; ?>" id="id_edit_note">
	  			<a href="index.php" class="btn btn-default">
					<span class="glyphicon glyphicon-arrow-left"></span> Trở về
				</a>
	  			<button class="btn btn-danger pull-right" data-toggle="modal" data-target="#modalDeleteNote">
					<span class="glyphicon glyphicon-trash"></span> Xoá
				</button>
	  			<button class="btn btn-primary" id="submit_edit_note">
					<span class="glyphicon glyphicon-ok"></span> Lưu
				</button>
	  			<br><br>
	  			<div class="alert alert-danger hidden"></div>
			</form>
		</div>
	</div>
</div>

Trong đó:

 

  • #formEditNote là form sửa ghi chú.
  • #id_edit_note là field ẩn sẽ chứa ID lấy từ trên thanh địa chỉ để gửi dữ liệu (Xem ở bước Sửa ghi chú phần Viết Ajax gửi dữ liệu).
  • Trong layout này có cả nút Xoá ghi chú luôn rồi.

Viết Ajax gửi dữ liệu

Tiếp theo các bạn chèn tiếp nội dung bên dưới vào file js/functions/note.js.

 

// Bắt sự kiện khi click vào nút Sửa
$('#submit_edit_note').on('click', function() {
	// Gán các giá trị trong form tạo note vào các biến
	$title_edit_note = $('#title_edit_note').val();
	$body_edit_note = $('#body_edit_note').val();
	$ac = 'edit'; // Hành động
	$id_edit_note = $('#id_edit_note').val(); // Lấy ID trong field ẩn

	// Nếu một trong các biến này rỗng
	if ($title_edit_note == '' || $title_edit_note == '')
	{
		// Hiển thị thông báo lỗi
		$('#formEditNote .alert').removeClass('hidden');
		$('#formEditNote .alert').html('Vui lòng điền đầy đủ thông tin bên trên.');
	}
	// Ngược lại
	else
	{
		// Thực thi gửi dữ liệu bằng Ajax
		$.ajax({
			url : 'note.php', // Đường dẫn file nhận dữ liệu
			type : 'POST', // Phương thức gửi dữ liệu
			// Các dữ liệu
			data : {
				title_edit_note : $title_edit_note,
				body_edit_note : $body_edit_note,
				ac : $ac,
				id_edit_note : $id_edit_note
			// Thực thi khi gửi dữ liệu thành công
			}, success : function(data) {
				$('#formEditNote .alert').html(data);
			}
		});
	}
});

 

Viết PHP xử lý dữ liệu

Như mình đã nói ở trên file note.php sẽ đảm nhận cả 3 chức năng nên mình cũng sẽ code xử lý sửa ghi chú trong file này, các bạn mở file đó lên và chèn vào bên dưới dòng // Nếu hành động là edit.

 

else if ($ac == 'edit')
{
	// Nhận dữ liệu và gán vào các biến đồng thời xử lý chuỗi
	$title_edit_note = $db->real_escape_string(@$_POST['title_edit_note']);
	$body_edit_note = $db->real_escape_string(@$_POST['body_edit_note']);
	$id_edit_note = $db->real_escape_string(@$_POST['id_edit_note']);

	$title_edit_note = trim(htmlentities($title_edit_note));
	$body_edit_note = htmlentities($body_edit_note);
	$id_edit_note = trim(htmlentities($id_edit_note));

	// Các biến chứa code JS về thông báo
	$show_alert = "<script>$('#formEditNote .alert').removeClass('hidden');</script>";
	$hide_alert = "<script>$('#formEditNote .alert').addClass('hidden');</script>";
	$success_alert = "<script>$('#formEditNote .alert').attr('class', 'alert alert-success');</script>";

	// Lệnh SQL kiểm tra có tồn tại ID note
	$sql_check_id_exist = "SELECT id_note, user_id FROM notes WHERE user_id = '$data_user[id_user]' AND id_note = '$id_edit_note'";

	// Nếu có
	if ($db->num_rows($sql_check_id_exist))
	{
		// Lệnh SQL chỉnh sửa note
		$sql_edit_note = "UPDATE notes SET
			body = '$body_edit_note',
			title = '$title_edit_note' 
			WHERE user_id = '$data_user[id_user]' AND id_note = '$id_edit_note'
		";
		// Thực thi truy vấn
		$db->query($sql_edit_note);
		// Giải phóng kết nối
		$db->close();

		// Hiển thị thông báo và tải lại trang
		echo $show_alert.$success_alert." Đã chỉnh sửa note
			<script>
				location.reload();
			</script>
		";
	}
	// Ngược lại không 
	else
	{
		// Hiển thị thông báo lỗi
		echo $show_alert.'Bạn đã cố tình sửa chữa ID note, nhưng rất tiếc ID note này không tồn tại hoặc không thuộc quyền sở hữu của bạn.';
	}
}
// Nếu hành động là delete

Trong code trên mình có kiểm tra sự tồn tại và quyền sở hữu của ID note, vì mình dùng một field ẩn gán ID từ trên thanh địa chỉ để gửi dữ liệu đến file xử lý, tin tặc có thể lợi dụng khe hở này để chèn một mã độc vào field ẩn này để tấn công site chúng ta.

 

alert bug attack note online app jpg

OK, giờ các bạn chạy và chỉnh sửa thử xem được không nhé !

3. Xoá ghi chú

Layout

(Xem ở bước Sửa ghi chú phần Layout).

Viết Ajax gửi dữ liệu

Các bạn mở file js/functions/note.js lên và chèn tiếp đoạn code bên dưới vào:

 

// Bắt sự kiện khi click vào nút Xoá
$('#submit_delete_note').on('click', function() {
	$ac = 'delete'; // Hành động
	$id_edit_note = $('#id_edit_note').val(); // Lấy ID trong field ẩn

	// Thực thi gửi dữ liệu bằng Ajax
	$.ajax({
		url : 'note.php', // Đường dẫn file nhận dữ liệu
		type : 'POST', // Phương thức gửi dữ liệu
		// Các dữ liệu
		data : {
			ac : $ac,
			id_edit_note : $id_edit_note
		// Thực thi khi gửi dữ liệu thành công
		}, success : function(data) {
			$('#modalDeleteNote .alert').html(data);
		}
	});
});

 

Viết PHP xử lý dữ liệu

Tiếp theo, các bạn mở file note.php lên và chẻn nội dung này bên dưới dòng // Nếu hành động là delete.

 

else if ($ac == 'delete')
{
	// Nhận dữ liệu và gán vào các biến đồng thời xử lý chuỗi
	$id_edit_note = $db->real_escape_string(@$_POST['id_edit_note']);
	$id_edit_note = trim(htmlentities($id_edit_note));

	// Các biến chứa code JS về thông báo
	$show_alert = "<script>$('#modalDeleteNote .alert').removeClass('hidden');</script>";
	$hide_alert = "<script>$('#modalDeleteNote .alert').addClass('hidden');</script>";
	$success_alert = "<script>$('#modalDeleteNote .alert').attr('class', 'alert alert-success');</script>";
		
	// Lệnh SQL kiểm tra có tồn tại ID note và thuộc quyền sở hữu
	$sql_check_id_exist = "SELECT id_note, user_id FROM notes WHERE user_id = '$data_user[id_user]' AND id_note = '$id_edit_note'";

	// Nếu có
	if ($db->num_rows($sql_check_id_exist))
	{
		// Lệnh SQL xoá note
		$sql_delete_note = "DELETE FROM notes WHERE user_id = '$data_user[id_user]' AND id_note = '$id_edit_note'";
		// Thực thi truy vấn
		$db->query($sql_delete_note);
		// Giải phóng kết nối
		$db->close();

		// Hiển thị thông báo và trở về trang chủ
		echo $show_alert.$success_alert." Xoá note thành công.
			<script>
				location.href = 'index.php';
			</script>
		";
	}
	// Ngược lại không 
	else
	{
		// Hiển thị thông báo lỗi
		echo $show_alert.'Bạn đã cố tình sửa chữa ID note, nhưng rất tiếc ID note này không tồn tại hoặc không thuộc quyền sở hữu của bạn.';
	}
}

Trong đoạn code này mình cũng kiểm tra sự tồn tại và quyền sở hữu của ID note như ở bước Sửa ghi chú phần Viết PHP xử lý dữ liệu vậy, vì chức năng này minh cũng lấy ID note từ field ẩn.

 

Woa ! Xong rồi bây giờ các bạn chạy và trải nghiệm thành quả trong suốt bài học này nhé !

4. Lời kết

Bài này phải nói là dài kinh khủng nhưng nếu chia cắt nhỏ ra thì sẽ rất khó hiểu và nó không được logic cho lắm nên các bạn chịu khó xíu nhé ! :) Bài học sau sẽ nhẹ hơn nhiều, mình sẽ hướng dẫn các bạn viết chức năng đổi mật khẩu và kết thúc series này luôn. Hẹn gặp lại và chúc các bạn thành công !

Trịnh Tiến Mạnh

27 chủ đề

6824 bài viết

0