-
Notifications
You must be signed in to change notification settings - Fork 0
/
news.sql
762 lines (650 loc) · 487 KB
/
news.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
-- phpMyAdmin SQL Dump
-- version 4.9.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Aug 09, 2020 at 07:23 PM
-- Server version: 10.4.8-MariaDB
-- PHP Version: 7.3.10
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `news`
--
-- --------------------------------------------------------
--
-- Table structure for table `accounts`
--
CREATE TABLE `accounts` (
`Id` int(11) NOT NULL,
`Username` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Password_hash` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`DateRegister` datetime NOT NULL,
`DateExpired` datetime DEFAULT NULL,
`TypeAccount` int(4) NOT NULL,
`IsGoogle` tinyint(1) NOT NULL DEFAULT 0,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `accounts`
--
INSERT INTO `accounts` (`Id`, `Username`, `Password_hash`, `DateRegister`, `DateExpired`, `TypeAccount`, `IsGoogle`, `IsDelete`) VALUES
(1, 'admin123', '$2a$08$GkmYMgW5ix6jXx4OLKK6MOEpcGFq9yVjHIaT113wGxl3PybFowvj.', '2020-06-23 20:14:59', '2112-12-21 21:12:21', 4, 0, 0),
(2, 'writer001', '$2a$08$..NebGDcFO5Yss31a4StEuABDOJQ0nW5jQseD2knkVm2vOTETNx3W', '2020-08-04 00:00:00', NULL, 2, 0, 0),
(3, 'writer002', '$2a$08$po2EIajcBbv9u.UsQ7cIZeeyTz0Dy97A4IodroF/7Wx.SQB0952.q', '2020-08-04 00:00:00', NULL, 2, 0, 0),
(4, 'editor001', '$2a$08$bYsgif9NR6xNrrOW9MbW1eSLoy3mdK/kYgZeEVh0Wl0K/UhcphFim', '2020-08-04 00:00:00', NULL, 3, 0, 0),
(5, 'vinhquoc001', '$2a$08$srczdbbVmr8gWWiyfpnTJuKviE6eAgofuxcRomMHuu4VqKxG0GB8K', '2020-08-04 00:00:00', '2020-08-11 15:45:00', 1, 0, 0),
(6, 'baoquoc001', '$2a$08$fwFU74pxV1Da/P5M2JzYUexOrdfDYAOXXZXiLXh05DS2NcuioEJda', '2020-08-04 00:00:00', NULL, 1, 0, 0);
-- --------------------------------------------------------
--
-- Table structure for table `categories`
--
CREATE TABLE `categories` (
`Id` int(11) NOT NULL,
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Url` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Description` text COLLATE utf8_unicode_ci DEFAULT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `categories`
--
INSERT INTO `categories` (`Id`, `Name`, `Url`, `Description`, `IsDelete`) VALUES
(1, 'Web Fontend', 'webfontend', 'Dùng cho các bài viết về thiết kế giao diện trên website', 0),
(2, 'Web Backend', 'webbackend', 'Cho Editor Nguyễn Thái Học quản lý chuyên mục web-backend quản lý các bài viết quản lý db hay các xử lý khác', 0),
(3, 'Database', 'database', '', 0),
(4, 'Mobile Dev', 'devmobile', '', 0),
(5, 'db', 'db', '', 1),
(6, 'Programming', 'programming', '', 0);
-- --------------------------------------------------------
--
-- Table structure for table `categories_sub`
--
CREATE TABLE `categories_sub` (
`Id` int(11) NOT NULL,
`IdCategoriesMain` int(11) NOT NULL,
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Url` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Description` text COLLATE utf8_unicode_ci DEFAULT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `categories_sub`
--
INSERT INTO `categories_sub` (`Id`, `IdCategoriesMain`, `Name`, `Url`, `Description`, `IsDelete`) VALUES
(1, 3, 'CSDL căn bản', 'dbbasic', '', 1),
(2, 3, 'Học MySQL', 'mysql', '', 0),
(3, 3, 'SQL Sever', 'sqlsever', '', 0),
(4, 3, 'Oracle', 'oracle', '', 1),
(5, 3, 'MongoDB', 'mongo', '', 0),
(6, 4, 'React Native', 'reactnative', 'React native', 0),
(7, 4, 'IOS', 'ios', 'IOS', 0),
(8, 4, 'Android', 'android', 'android phổ biên hiện nay', 0),
(9, 6, 'C++', 'c-plus-plus', 'C++', 0),
(10, 6, 'python', 'python', 'python', 0),
(11, 6, 'java', 'java', 'java\r\n', 0),
(12, 6, 'C#', 'c-shape', 'c#', 0),
(13, 6, 'golang', 'golang', 'Golang', 0),
(14, 2, 'PHP', 'php', 'PHP\r\n', 0),
(15, 2, 'Nodejs', 'node-js', 'Nodejs', 0),
(16, 2, 'Laravel', 'laravel', '', 0),
(17, 1, 'Javascirpt', 'js', '', 0),
(18, 1, 'jQuery', 'jquery', '', 0),
(19, 1, 'UX-UI', 'ux-ui', '', 0),
(20, 6, 'Lập trình web', 'lap-trinh-web', '', 0);
-- --------------------------------------------------------
--
-- Table structure for table `comments`
--
CREATE TABLE `comments` (
`Id` int(11) NOT NULL,
`Content` text COLLATE utf8_unicode_ci DEFAULT NULL,
`DatetimeComment` datetime NOT NULL,
`IdAccount` int(11) NOT NULL,
`IdPost` int(11) NOT NULL,
`IsCheck` tinyint(1) NOT NULL DEFAULT 0,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- --------------------------------------------------------
--
-- Table structure for table `editoraccount`
--
CREATE TABLE `editoraccount` (
`Id` int(11) NOT NULL,
`IdAccount` int(11) NOT NULL,
`IdCategories` int(11) NOT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `editoraccount`
--
INSERT INTO `editoraccount` (`Id`, `IdAccount`, `IdCategories`, `IsDelete`) VALUES
(1, 4, 2, 0);
-- --------------------------------------------------------
--
-- Table structure for table `feedback`
--
CREATE TABLE `feedback` (
`Id` int(11) NOT NULL,
`Note` text COLLATE utf8_unicode_ci DEFAULT NULL,
`DatetimeApproval` datetime NOT NULL,
`IdEditorAccount` int(11) NOT NULL,
`IdPost` int(11) NOT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `feedback`
--
INSERT INTO `feedback` (`Id`, `Note`, `DatetimeApproval`, `IdEditorAccount`, `IdPost`, `IsDelete`) VALUES
(1, 'Chỉnh lại content', '2020-08-07 04:17:57', 1, 4, 0);
-- --------------------------------------------------------
--
-- Table structure for table `information`
--
CREATE TABLE `information` (
`Id` int(11) NOT NULL,
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Nickname` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`Avatar` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`DOB` date NOT NULL,
`Email` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`Phone` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
`IdAccount` int(11) NOT NULL,
`Sex` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `information`
--
INSERT INTO `information` (`Id`, `Name`, `Nickname`, `Avatar`, `DOB`, `Email`, `Phone`, `IdAccount`, `Sex`) VALUES
(1, 'Administration', 'Super Man', 'avatar2.png\r\n', '2020-06-23', '[email protected]', '0987654321', 1, 0),
(2, 'Lương Thế Vinh', 'Vinh Chém Gió', NULL, '2020-08-01', NULL, NULL, 2, 0),
(3, 'Nguyễn Anh Khương', 'Khương Viết Lách', NULL, '2020-01-03', NULL, NULL, 3, 0),
(4, 'Nguyễn Thái Học', NULL, NULL, '2020-03-06', NULL, NULL, 4, 0),
(5, 'Nguyễn Quốc Vinh', NULL, NULL, '2020-04-02', NULL, NULL, 5, 0),
(6, 'Huỳnh Quốc Bảo', NULL, NULL, '1999-01-01', NULL, NULL, 6, 0);
-- --------------------------------------------------------
--
-- Table structure for table `postdetails`
--
CREATE TABLE `postdetails` (
`Id` int(11) NOT NULL,
`IdPost` int(11) NOT NULL,
`IdAccount` int(11) NOT NULL,
`IsPremium` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `postdetails`
--
INSERT INTO `postdetails` (`Id`, `IdPost`, `IdAccount`, `IsPremium`) VALUES
(1, 1, 1, 1),
(2, 2, 1, 0),
(3, 3, 1, 1),
(4, 4, 1, 0),
(5, 5, 1, 0),
(6, 6, 1, 0),
(7, 7, 1, 1),
(8, 8, 1, 0),
(9, 9, 1, 1),
(10, 10, 1, 0),
(11, 11, 1, 0),
(12, 12, 1, 0),
(13, 13, 1, 0),
(14, 14, 1, 0),
(15, 15, 1, 0),
(16, 16, 1, 0),
(17, 17, 1, 0),
(18, 18, 1, 0),
(19, 19, 1, 0),
(20, 20, 1, 1),
(21, 21, 1, 0),
(22, 22, 1, 0),
(23, 23, 2, 0);
-- --------------------------------------------------------
--
-- Table structure for table `posts`
--
CREATE TABLE `posts` (
`Id` int(11) NOT NULL,
`Title` varchar(255) CHARACTER SET utf8 NOT NULL,
`Url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`Content_Summary` text CHARACTER SET utf8 NOT NULL,
`Content_Full` text CHARACTER SET utf8 NOT NULL,
`DatePost` date NOT NULL,
`Avatar` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Views` int(11) NOT NULL,
`DatetimePost` datetime NOT NULL,
`IdCategories` int(11) NOT NULL,
`IdStatus` int(11) NOT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `posts`
--
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(1, 'Một số hàm Javascript hữu ích về Array và Object', 'mot-so-ham-javascript-huu-ich-ve-array-va-object-1596797762549', 'Một số hàm Javascript hữu ích về Array và Object', '<p><img src=\"http://localhost:3000/public/img/ImagePost/1/mceu_21889914111596797375378.jpg\" /></p>\r\n<h2 id=\"_1-filter-0\">1. filter()</h2>\r\n<p>Tạo một mảng mới dựa trên các <code>items</code> từ bảng cũ qua một số điều kiện lọc nhất định:</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<p>Tạo một bản mảng các sinh viên có độ tuổi được uống chất có cồn:</p>\r\n<div id=\"crayon-5f2e824c9eee2916319444-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">studentsAge</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">[</span><span class=\"crayon-cn\">17</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">16</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">18</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">19</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">21</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">17</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eee2916319444-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">ableToDrink</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">studentsAge</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">filter</span><span class=\"crayon-sy\">(</span> <span class=\"crayon-v\">age</span> <span class=\"crayon-o\">=</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">age</span> <span class=\"crayon-o\">></span> <span class=\"crayon-cn\">18</span> <span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eee2916319444-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// ableToDrink will be equal to [19, 21]</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_2-map-1\">2. map()</h2>\r\n<p>Tạo một mảng mới bằng cách tùy chỉnh giá trị từ mảng khác.</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<p>Tạo một mảng và thêm vào trước mỗi phần tử ký hiệu <code>$</code>.</p>\r\n<div id=\"crayon-5f2e824c9eeea863853722-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">numbers</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">[</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">4</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eeea863853722-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">dollars</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">numbers</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">map</span><span class=\"crayon-sy\">(</span> <span class=\"crayon-v\">number</span> <span class=\"crayon-o\">=</span><span class=\"crayon-o\">></span> <span class=\"crayon-s\">\'$\'</span> <span class=\"crayon-o\">+</span> <span class=\"crayon-v\">number</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eeea863853722-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// dollars will be equal to [\'$2\', \'$3\', \'$4\', \'$5\']</span></div>\r\n<h2 id=\"_3-reduce-2\">3. reduce()</h2>\r\n<p>Làm giảm bớt đi tất cả các phần tử trong mảng trở thành một giá trị đơn.</p>\r\n<p>Giá trị trả về có thể là bất cứ loại nào (object, array, string, integer)</p>\r\n<div class=\"td-a-rec td-a-rec-id-content_inline tdi_11_cf4 td_block_template_1\">\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n</div>\r\n<p><strong>Ví dụ:</strong></p>\r\n<p>Tính tổng giá trị trong mảng</p>\r\n<div id=\"crayon-5f2e824c9eeee397572911-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">numbers</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">[</span><span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">10</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">15</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eeee397572911-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">total</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">numbers</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">reduce</span><span class=\"crayon-sy\">(</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-v\">accumulator</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">currentValue</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">=</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">accumulator</span> <span class=\"crayon-o\">+</span> <span class=\"crayon-v\">currentValue</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eeee397572911-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// total will be equal to 30</span></div>\r\n<p>Ngoài ra <code>reduce()</code> còn có thể gom nhóm đối tượng bởi một thuộc tính, xóa các <code>item</code> bị lặp, flatten một mảng, …</p>\r\n<h2 id=\"_4-foreach-3\">4. forEach()</h2>\r\n<p>Thực hiện các <code>job</code> như nhau đối với từng phần tử trong mảng.</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<p>In ra các phần tử của mảng</p>\r\n<div id=\"crayon-5f2e824c9eef1599901263-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">emotions</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">[</span><span class=\"crayon-s\">\'happy\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'sad\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'angry\'</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eef1599901263-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">emotions</span><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">forEach</span><span class=\"crayon-sy\">(</span> <span class=\"crayon-v\">emotion</span> <span class=\"crayon-o\">=</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">emotion</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eef1599901263-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// Will log the following:</span></div>\r\n<div id=\"crayon-5f2e824c9eef1599901263-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// \'happy\'</span></div>\r\n<div id=\"crayon-5f2e824c9eef1599901263-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// \'sad\'</span></div>\r\n<div id=\"crayon-5f2e824c9eef1599901263-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// \'angry\'</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<h2 id=\"_5-some-4\">5. some()</h2>\r\n<p>Duyệt các phần tử trong mảng, khi có phần tử thỏa mãn điều kiện thì sẽ kết thúc vòng lặp và trả về giá trị <code>true</code></p>\r\n<div id=\"crayon-5f2e824c9eef3382670975-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">userPrivileges</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">[</span><span class=\"crayon-s\">\'user\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'user\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'user\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'admin\'</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eef3382670975-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">containsAdmin</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">userPrivileges</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">some</span><span class=\"crayon-sy\">(</span> <span class=\"crayon-v\">element</span> <span class=\"crayon-o\">=</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">element</span> <span class=\"crayon-o\">===</span> <span class=\"crayon-s\">\'admin\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eef3382670975-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// containsAdmin will be equal to true</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_6-every-5\">6. every()</h2>\r\n<p>Tương tự như với hàm <code>some()</code>, nhưng hảm chỉ trả ra <code>true</code> khi tất cả các thuộc tính trong mảng đều thỏa mãn điều kiện</p>\r\n<div id=\"crayon-5f2e824c9eef6721276797-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">ratings</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">[</span><span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">4</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eef6721276797-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">goodOverallRating</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">ratings</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">every</span><span class=\"crayon-sy\">(</span> <span class=\"crayon-v\">rating</span> <span class=\"crayon-o\">=</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">rating</span> <span class=\"crayon-o\">>=</span> <span class=\"crayon-cn\">3</span> <span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eef6721276797-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// goodOverallRating will be equal to true</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_7-includes-6\">7. includes()</h2>\r\n<p>Kiểm tra mảng có chứa phần tử đưa vào hay không, return <code>true</code> nếu mảng có chứa phần tử đó.</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<p>Kiểm tra nếu hàm nó chứa từ <code>waldo</code></p>\r\n<div id=\"crayon-5f2e824c9eef8160134205-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">names</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">[</span><span class=\"crayon-s\">\'sophie\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'george\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'waldo\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'stephen\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'henry\'</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e824c9eef8160134205-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">includesWaldo</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">names</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">includes</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'waldo\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e824c9eef8160134205-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\">// includesWaldo will be equal to true</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_8-arrayfrom-7\">8. Array.from()</h2>\r\n<p>Tạo một mảng mới dựa trên một mảng khác hoặc chuỗi (string).</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<p>Tạo một mảng từ một chuỗi</p>\r\n<div id=\"crayon-5f2e824c9eefb038029586-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">newArray</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-t\">Array</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">from</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'hello\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eefb038029586-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// newArray will be equal to [\'h\', \'e\', \'l\', \'l\', \'o\']</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">Tạo một mảng mới mà có giá trị gấp đôi đối với giá trị tương ứng của mảng đã cho.</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2e824c9eefe543637508-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">doubledValues</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-t\">Array</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">from</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">[</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">4</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">6</span><span class=\"crayon-sy\">]</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">number</span> <span class=\"crayon-o\">=</span><span class=\"crayon-o\">></span> <span class=\"crayon-e \">number *</span> <span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9eefe543637508-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// doubleValues will be equal to [4, 8, 12]</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<h2 id=\"_9-objectvalues-8\">9. Object.values()</h2>\r\n<p>Trả về một mảng các giá trị đối tượng (Object)</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<div id=\"crayon-5f2e824c9ef00790717408-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">icecreamColors</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef00790717408-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">chocolate</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'brown\'</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef00790717408-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">vanilla</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'white\'</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef00790717408-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">strawberry</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'red\'</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef00790717408-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e824c9ef00790717408-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e824c9ef00790717408-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">colors</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-t\">Object</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">values</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">icecreamColors</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef00790717408-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// colors will be equal to [\"brown\", \"white\", \"red\"]</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<h2 id=\"_10-objectkeys-9\">10. Object.keys()</h2>\r\n<p>Trả về một mảng các <code>key</code> của đối tượng (Object)</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<div id=\"crayon-5f2e824c9ef03620942868-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">icecreamColors</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef03620942868-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">chocolate</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'brown\'</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef03620942868-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">vanilla</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'white\'</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef03620942868-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">strawberry</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'red\'</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef03620942868-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e824c9ef03620942868-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e824c9ef03620942868-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">types</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-t\">Object</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">keys</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">icecreamColors</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef03620942868-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// types will be equal to [\"chocolate\", \"vanilla\", \"strawberry\"]</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<h2 id=\"_11-objectentries-10\">11. Object.entries()</h2>\r\n<p>Trả về một mảng mà nó chứa các cặp <code>key</code> – <code>value</code> của đối tượng</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<div id=\"crayon-5f2e824c9ef06673413900-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">weather</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">rain</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">temperature</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">24</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">humidity</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">33</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">entries</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-t\">Object</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">entries</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">weather</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// entries will be equal to</span></div>\r\n<div id=\"crayon-5f2e824c9ef06673413900-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// [[\'rain\', 0], [\'temperature\', 24], [\'humidity\', 33]]</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_12-objectfreeze-11\">12. Object.freeze()</h2>\r\n<p>Ngăn chặn việc chỉnh sửa các thuộc tính hiện có hoặc bổ sung thêm thuộc tính của đối tượng</p>\r\n<p>Mọi người thường nghĩ từ khóa <code>const</code> cũng làm được thế, tuy nhiên, <code>const</code> vẫn cho phép bạn chỉnh sửa đối tượng</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<p>Ngăn chặn việc chỉnh sửa thuộc tính <code>name</code></p>\r\n<div id=\"crayon-5f2e824c9ef08162731535-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">frozenObject</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef08162731535-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">name</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'Robert\'</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef08162731535-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e824c9ef08162731535-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e824c9ef08162731535-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">Object</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">freeze</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">frozenObject</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef08162731535-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e824c9ef08162731535-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">frozenObject</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">name</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-s\">\'Henry\'</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef08162731535-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// frozenObject will be equal to { name: \'Robert\' }</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<h2 id=\"_13-objectseal-12\">13. Object.seal()</h2>\r\n<p>Ngăn chặn việc thêm thuộc tính mới vào đối tượng, nhưng vẫn có thể sửa đổi thuộc tính hiện có.</p>\r\n<p><strong>Ví dụ:</strong></p>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">sealedObject</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">name</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\'Robert\'</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">Object</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">seal</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">sealedObject</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">sealedObject</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">name</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-s\">\'Bob\'</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">sealedObject</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">wearsWatch</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-t\">true</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e824c9ef0b214750703-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// sealedObject will be equal to { name: \'Bob\' }</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_ket-luan-13\">Kết luận</h2>\r\n<p>Bài viết của mình đến đây là hết rồi, hi vọng sẽ hữu ích nhiều như tiêu đề đối với các bạn lập trình viên. Cảm ơn mọi người đã quan tâm !!</p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/mot-so-ham-javascript-huu-ich-ve-array-va-object.html\">https://techtalk.vn/mot-so-ham-javascript-huu-ich-ve-array-va-object.html</a></p>\r\n</div>\r\n</div>\r\n<p><code></code></p>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n<p><code></code></p>\r\n</div>\r\n</div>\r\n<p><code></code></p>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/1/mceu_21889914111596797375378.jpg', 0, '2020-08-07 21:00:00', 17, 2, 0),
(2, 'Một số hàm Javascript hữu ích về Array và Object 2', 'mot-so-ham-javascript-huu-ich-ve-array-va-object-2-1596733748515', 'Một số hàm Javascript hữu ích về Array và Object', '1dsadsadsadsa', '2020-08-07', 'null', 0, '0000-00-00 00:00:00', 17, 4, 1),
(3, '101 lý do bạn nên học ngôn ngữ SQL', '101-ly-do-ban-nen-hoc-ngon-ngu-sql-1596799663488', '101 lý do bạn nên học ngôn ngữ SQL', '<p><img src=\"http://localhost:3000/public/img/ImagePost/3/mceu_73900406211596799647277.png\" /></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Trong hàng ngàn, hàng vạn thông tin dữ liệu, lỡ đâu bạn muốn tìm 1 loại dữ liệu cần thiết thì bạn sẽ làm gì? Đúng là có rất nhiều cách lọc và tìm dữ liệu nhưng không phải cách nào cũng có nhiều điểm lợi như khi bạn sử dụng ngôn ngữ SQL đâu nha! Dưới đây là một vài lợi ích khi học ngôn ngữ SQL mà mình đã đúc kết ra.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Tốc độ khai thác dữ liệu nhanh</strong></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Chỉ vài thao tác đơn giản là bạn đã có thể tìm được thông tin dữ liệu mà bạn cần một cách nhanh chóng. Đã vậy thông tin bạn nhận được còn rất chi tiết cụ thể như thời gian, thông tin update…</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Nhiều công ty cần Dev SQL</strong></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Tỷ lệ tuyển dụng ở các công ty tuyển dụng lập trình viên như itvec, <a href=\"https://topdev.vn/\" target=\"_new\" rel=\"follow\" data-wpel-link=\"exclude\">topdev.vn</a>, topitwork tuyển dụng vị trí dev SQL là nhiều nhất. So với các vị trí Dev Java hay PHP, JS, Python, C+… thì SQL được nhiều công ty ưu tiên tuyển nhiều nhất.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Dễ chỉnh sửa</strong></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Điểm mình thích nhất khi sử dụng SQL cũng chính là điểm mạnh nhất của nó, đó là dễ dàng chỉnh sửa. Bạn sẽ kiểm tra và thao tác dữ liệu dễ dàng hơn. Hơn nữa, dữ liệu được lưu trữ trong SQL là động, nghĩa là bạn có thể sửa đổi và thao tác bất cứ lúc nào bằng một số truy vấn SQL cơ bản.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Có chức năng kết hợp từ nguồn</strong></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Đối với các loại ngôn ngữ lập trình khác việc kết hợp dữ liệu từ hai nguồn trở lên có thể tốn nhiều thời gian và là một công việc khó khăn. Tuy nhiên, SQL làm cho quá trình này dễ dàng hơn bằng cách hỗ trợ “merges” đơn giản.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Dễ dàng quản lý dữ liệu</strong></p>\r\n<div class=\"td-a-rec td-a-rec-id-content_inline tdi_11_aa8 td_block_template_1\">\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n</div>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Ngôn ngữ SQL hỗ trợ bạn quản lý các nhóm dữ liệu lớn một cách dễ dàng và hết sức đơn giản. Dù bạn vẫn có thể sử dụng các bảng tính truyền thống để quản lý các vùng dữ liệu vừa và nhỏ, nhưng bạn sẽ cần một giải pháp khác như SQL để xử lý nhóm hồ sơ quá lớn.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Dễ quản lý</strong></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">SQL là công cụ khá hữu ích đối với các Dev nào đang quản lý một máy chủ, hoặc tạo máy chủ của riêng. Nhiều máy chủ sử dụng các cơ sở dữ liệu như MySQL hoặc SQL Server để lưu trữ dữ liệu. Bằng cách tự làm quen với SQL và các truy vấn tương ứng của nó, bạn có thể dễ dàng điều sử dụng các web dữ liệu khác khó sử dụng hơn.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Đơn giản thuận tiện như Excel</strong></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Sử dụng tốt các công cụ văn phòng như excel, word, thì việc biết được SQL sẽ giúp bạn rất nhiều trong quá trình làm việc đòi hỏi sự chuyên môn và linh hoạt cao. Đặc biệt là xu hướng kinh doanh trên dữ liệu “data-driven”.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>SQL phổ biến, ứng dụng nhiều</strong></p>\r\n<p dir=\"ltr\" data-xf-p=\"1\">Các công ty hiện nay đa số đều lưu trữ dữ liệu bằng hệ quản trị cơ sở dữ liệu nên việc biết SQL sẽ giúp bạn có nhiều cơ hội và sự thăng tiến hơn trong nghề nghiệp.</p>\r\n<p dir=\"ltr\" data-xf-p=\"1\"><strong>Gợi ý các loại sách về ngôn ngữ SQL dùng để nâng cao kiến thức</strong></p>\r\n<ul>\r\n<li dir=\"ltr\">SQL For Dummies: Hướng dẫn cách sử dụng SQL để xây dựng hệ thống quản lý cơ sở dữ liệu, thiết kế database, truy xuất thông tin khi cần…</li>\r\n<li dir=\"ltr\">Oracle PL/SQL For Dummies: giải đáp tất tần tật các câu hỏi của những người mới bắt đầu về PL/SQL, kèm hướng dẫn thực hành cụ thể.</li>\r\n<li dir=\"ltr\">Oracle PL/SQL Programming: hiểu hơn về lập trình PL/SQL và có những kiến thức nhất định về cách làm việc hiệu quả với PL/SQL thông qua các ví dụ minh họa.</li>\r\n<li dir=\"ltr\">Learn About Oracle Database: Trang chủ của Oracle là nơi tổng hợp nhiều các kiến thức liên quan đến SQL, PL/SQL và Oracle Database.</li>\r\n</ul>', '2020-08-07', '/../public/img/ImagePost/3/mceu_73900406211596799647277.png', 0, '2020-08-08 02:00:00', 3, 2, 0),
(4, '5 ý tưởng thiết kế cơ bản không thể thiếu cho các Dev Frontend', '5-y-tuong-thiet-ke-co-ban-khong-the-thieu-cho-cac-dev-frontend-1596800118041', 'Là 1 nhà thiết kế đồ họa, đắm mình vào việc gõ code làm cho mình có 1 chút nản chí và còn cảm thấy tí đáng sợ nữa. Quá trình coding của mình là ...', '<p><img src=\"http://localhost:3000/public/img/ImagePost/4/mceu_77665655011596799778178.jpg\" /></p>\r\n<p>Là 1 nhà thiết kế đồ họa, đắm mình vào việc gõ code làm cho mình có 1 chút nản chí và còn cảm thấy tí đáng sợ nữa. Quá trình coding của mình là 1 câu chuyện khá là khác lạ. Mình bắt đầu dự án của mình với suy nghĩ của 1 người khách hàng. Bằng cách như vậy, mình có thể định dạng được phông nền của ứng dụng mình làm và tìm ra chức năng gì mình có thể thêm vào. Từ đó, mình tạo ra wireframe. Cái wireframe này đã cho phép mình thấy các layout của những ứng dụng mà mình tạo. Sau đó, mình bắt đầu tập code. Mình bắt đầu bằng cách dựng chức năng và test xem nếu tất cả chúng nó có hoạt động ổn không. Cuối cùng, mình bắt đầu code phần frontend và sử dụng các framework CSS khác nhau để thiết kế các ứng dụng của bản thân. </p>\r\n<h2>1. Wireframe</h2>\r\n<p><img src=\"https://techtalk.vn/wp-content/uploads/2020/03/techtalk-frontend-concepts.jpeg\" /></p>\r\n<p>Thuật ngữ mang ý nghĩa để phác họa các vị trí của các nút nhấp, hình ảnh, và văn bản với số lượng các chi tiết tối thiểu nhất. Điều này cho phép bạn nghĩ trực quan về vẻ ngoài mà bạn muốn sản phẩm cuối cùng của mình được trông như thế nào. Nó còn cho phép bạn để thấy với đôi mắt trần của mình cách mà nhiều trang hay yếu tố bạn có thể cần để dựng vào code của mình. </p>\r\n<h3>2. Composition</h3>\r\n<h4><span style=\"font-size: 12pt;\">Composition là khi các yếu tố được sắp xếp để nhìn theo 1 cách nhất định. Mình có 1 ý tưởng bạn nên làm quen bản thân với grid system. Nó được dùng với hầu hết các framework CSS, như Bootstrap và Foundation. Có độ tương phản với kích thước và màu sắc để giúp thông tin liền mạch hơn. Cách tốt nhất là bạn nên có 1 tiêu điểm để sản phẩm của bạn được nhìn và cảm giác có ý nghĩa hơn. </span></h4>\r\n<p><img src=\"https://techtalk.vn/wp-content/uploads/2020/03/tech-talk-frontend-concepts.png\" /></p>\r\n<h4>3. Sự lặp đi lặp lại </h4>\r\n<p>Sự lặp đi lặp lại có nghĩa là tái sử dụng cùng / tương tự 1 hình ảnh / style xuyên suốt thiết kế của bạn. Ví dụ: nếu bạn đang sử dụng nút nhấp tròn về hình thức, style nút nhấp tròn đó nên nhất quán mỗi khi nút nhấp xuất hiện trên trang của bạn. </p>\r\n<h5>4. Màu sắc</h5>\r\n<p>Luôn luôn có 1 bảng màu cho công việc của bạn. Điều này sẽ giúp cho công việc của bạn trông gắn kết, chu đáo và dễ nhìn. Có nhiều bộ công cụ / trang web ngoài kia mà có thể tạo ra bảng màu. Và cái mà mình hay sử dụng chính là <a href=\"http://colormind.io/\" target=\"_new\" rel=\"nofollow external noopener noreferrer\" data-wpel-link=\"external\">‘color Mind’</a> hay <a href=\"https://coolors.co/\" target=\"_new\" rel=\"nofollow external noopener noreferrer\" data-wpel-link=\"external\">‘coolors’</a>.<br /><br /><em>Tip: </em>Chỉ dùng tối đa 3 màu. 1 màu chính, 1 màu phụ và 1 màu để nhấn. Dùng công thức ‘60-30-10’. 60% nên là màu thương hiệu của riêng bạn, 30% sẽ là màu phụ và 10% cho màu nhấn.</p>\r\n<h6><span style=\"font-size: 14pt;\"><em>5. Typography</em></span></h6>\r\n<p>Typography được xem như là 1 nghệ thuật sắp đặt để người xem dễ đọc, và thoải mái hơn khi nhìn vào, trong lúc đang truyền đạt thông tin. Vài kiểu cơ bản của các yếu tố typography mà bạn đã thấy trong code như là:</p>\r\n<div id=\"crayon-5f2e8b840b3f2456175796-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">h1</span><span class=\"crayon-o\">></span> <span class=\"crayon-r\">This</span> <span class=\"crayon-e\">would </span><span class=\"crayon-e\">be </span><span class=\"crayon-e\">the </span><span class=\"crayon-e\">largest </span><span class=\"crayon-v\">text</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">h1</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e8b840b3f2456175796-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">h2</span><span class=\"crayon-o\">></span> <span class=\"crayon-r\">This</span> <span class=\"crayon-e\">would </span><span class=\"crayon-e\">be </span><span class=\"crayon-e\">the </span><span class=\"crayon-e\">second </span><span class=\"crayon-e\">largests </span><span class=\"crayon-v\">text</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">h2</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e8b840b3f2456175796-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">strong</span><span class=\"crayon-o\">></span> <span class=\"crayon-r\">This</span> <span class=\"crayon-e\">would </span><span class=\"crayon-e\">be </span><span class=\"crayon-v\">bold</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">strong</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e8b840b3f2456175796-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">p</span><span class=\"crayon-o\">></span> <span class=\"crayon-r\">This</span> <span class=\"crayon-e\">would </span><span class=\"crayon-e\">be </span><span class=\"crayon-e\">the </span><span class=\"crayon-e\">smallest </span><span class=\"crayon-e\">size </span><span class=\"crayon-e\">of </span><span class=\"crayon-v\">font</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">p</span><span class=\"crayon-o\">></span></span></div>\r\n<p>Đây là nơi mà composition được đưa vào sử dụng. Đầu tiên, bạn cần phải hiểu rõ về thông tin quan trọng nhất bạn muốn người dùng nhìn thấy là gì. Và với thông tin này, bạn rất có thể sẽ phải đặt 1 tag h1 hay có thể là làm văn bản <strong>đậm </strong>lên cho nó nổi bật giữa đám đông. </p>\r\n<p>1 cách khác để sử dụng typography là bắt cặp 2 font chữ tuy khác nhưng cùng chung 1 nhà với nhau để tạo nên độ tương phản. Và cặp đôi phổ biến nhất chính là ‘san-serit typeface’ cặp với ‘serif font face’. </p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/5-y-tuong-thiet-ke-co-ban-khong-the-thieu-cho-cac-dev-frontend.html\">https://techtalk.vn/5-y-tuong-thiet-ke-co-ban-khong-the-thieu-cho-cac-dev-frontend.html</a></p>', '2020-08-07', '/../public/img/ImagePost/4/mceu_77665655011596799778178.jpg', 0, '2020-08-08 03:00:00', 19, 3, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(5, 'Tính năng nổi bật trong Javascript mà bạn cần biết: Optional Chaining', 'tinh-nang-noi-bat-trong-javascript-ma-ban-can-biet-optional-chaining-1596800446349', 'Optional chaining là một kỹ thuật giúp ta làm việc với Javascript dễ dàng hơn. Nó cũng cần thiết như Fat Arrow Functions hoặc ‘let’ và ‘const’. Thế Option Chaining hoạt động ra sao? nó giải quyết những vấn đề gì? Hãy cùng mình nghiên cứu để hiểu rõ hơn nhé.', '<p><img src=\"http://localhost:3000/public/img/ImagePost/5/mceu_84556536721596800219368.jpg\" /></p>\r\n<p><strong>Optional chaining là một kỹ thuật giúp ta làm việc với Javascript dễ dàng hơn. Nó cũng cần thiết như Fat Arrow Functions hoặc ‘let’ và ‘const’. Thế Option Chaining hoạt động ra sao? nó giải quyết những vấn đề gì? Hãy cùng mình nghiên cứu để hiểu rõ hơn nhé.</strong></p>\r\n<h2 id=\"_dat-van-de-0\">Đặt vấn đề</h2>\r\n<p>Hãy tưởng tượng: Bạn lấy data từ API, và object trả về dạng Deeply Nested Objects, lúc này ta cần phải thông qua rất nhiều object properties để lấy được properties trong cùng.</p>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// API response object</span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">person</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">details</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">name</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">firstName</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\"Michael\"</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">lastName</span><span class=\"crayon-o\">:</span> <span class=\"crayon-s\">\"Lampe\"</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">jobs</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">[</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-s\">\"Senior Full Stack Web Developer\"</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-s\">\"Freelancer\"</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">]</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// Getting the firstName</span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">personFirstName</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">person</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">details</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">name</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">firstName</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e2e202640337-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div class=\"crayon-line\">Với cách trên thì việc lấy firstName thật sự không tốt. Một giải pháp tốt hơn có thể như thế này:</div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2e8d6431e3a364750342-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">// Checking if firstName exists</span></div>\r\n<div id=\"crayon-5f2e8d6431e3a364750342-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">if</span><span class=\"crayon-sy\">(</span> <span class=\"crayon-v\">person</span> <span class=\"crayon-o\">&&</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e3a364750342-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">person</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">details</span> <span class=\"crayon-o\">&&</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e3a364750342-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">person</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">details</span><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">name</span> <span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e3a364750342-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">personFirstName</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">person</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">details</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">name</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">firstName</span> <span class=\"crayon-o\">||</span> <span class=\"crayon-s\">\'stranger\'</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e3a364750342-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\"><span class=\"crayon-sy\" style=\"font-family: helvetica, arial, sans-serif;\">Như bạn thấy trong ví dụ trên, thậm chí những việc đơn giản như get firstName của một người sao lại phức tạp đến thế. Vì vậy, đây là lý do tại sao chúng ta có các frameworks như <code>lodash</code> để dễ dàng thực hiện những việc này.</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">_</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">get</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">person</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'details.name.firstName\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'stranger\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<p><code>lodash</code> làm cho code dễ đọc hơn, nhưng cũng khiến bạn phụ thuộc nhiều vào codebase của bạn. Bạn cần updated nó, và nếu làm việc trong team thì bạn cần phải giải thích và hướng dẫn cách sử dụng nó cho team bạn. Vì vậy, đây cũng không phải là giải pháp hợp lý.</p>\r\n<h2 id=\"_giai-phap-1\">Giải pháp</h2>\r\n<p>Optional chaining là giải pháp cho tất cả vấn đề đó.</p>\r\n<h3 id=\"_1-cach-thuc-hoat-dong-2\">1. Cách thức hoạt động</h3>\r\n<p>Optional chaining giới thiệu cú pháp mới mà thoạt nhìn sẽ lạ đối với bạn, nhưng chỉ sau vài phút bạn sẽ quen với nó.</p>\r\n<p style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">personFirstName</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">person</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">details</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">name</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">firstName</span><span class=\"crayon-sy\">;</span></span></p>\r\n<p>Như ở ví dụ bên trên, ta thấy xuất hiện cú pháp <code>?.</code> Nếu có một cú pháp <code>?.</code> đặt trước person, tức là ta đang kiểm tra xem person đó có tồn tại hay không? Hoặc trong nhiều trường hợp person có giá trị null hoặc undefined thì sao? Lúc này sẽ không return về error mà chỉ trả về undefined. Vì thế, personFirstName sẽ có giá trị undefined. Câu hỏi cũng tương tự cho detail? và name? Nếu có bất kì thuộc tính cha nào có giá trị null hoặc undefined, thì personFirstName sẽ trả về undefined. Đây được gọi là Short-circuiting. Khi javascript tìm thấy null hoặc undefined, nó sẽ short circuit và ngừng đi sâu hơn.</p>\r\n<h3 id=\"_2-default-values-3\">2. Default values</h3>\r\n<p>Chúng ta cần tìm hiểu về <code>Nullish coalescing operator</code> . Nghe có vẻ khó học đây. Hi thật sự không khó lắm đâu. Hãy xem ví dụ bên dưới:</p>\r\n<p style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">personFirstName</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">person</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">details</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">name</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">firstName</span> <span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">?</span> <span class=\"crayon-s\">\'stranger\'</span><span class=\"crayon-sy\">;</span></span></p>\r\n<p>Cú pháp <code>Nullish coalescing operator</code> biểu diễn dưới dạng <code>??</code> Nó cũng khá dễ đọc. Nếu bên vế trái có giá trị undefined, khi đó personFirstName sẽ có giá trị bên phải <code>??</code> tức là ‘stranger’.</p>\r\n<h3 id=\"_3-dynamic-properties-4\">3. Dynamic properties</h3>\r\n<p>Đôi khi ta muốn truy cập đến một dynamic value. Nó có thể là array hoặc là dynamic property của một object.</p>\r\n<div id=\"crayon-5f2e8d6431e4b596258094-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">jobNumber</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8d6431e4b596258094-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">secondJob</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">person</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">jobs</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">[</span><span class=\"crayon-v\">jobNumber</span><span class=\"crayon-sy\">]</span> <span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">?</span> <span class=\"crayon-s\">\'none\'</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<p>Ở ví dụ bên trên có thể hiểu <code>jobs?.[jobNumber]</code> tức là <code>jobs[jobNumber]</code> nhưng nó sẽ không trả về error mà thay vào đó sẽ return về <code>none</code>.</p>\r\n<h3 id=\"_4-function-or-method-call-5\">4. Function or method call</h3>\r\n<p>Thỉnh thoảng ta làm việc với object mà không biết nó có phải là method hay không. Ở đây ta có thể sử dụng cú pháp <code>?.()</code> hoặc với arguments <code>?.({ some: \'args\'})</code> . Nếu method này không tồn tại trên object, nó sẽ return undefined.</p>\r\n<p style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">const</span> <span class=\"crayon-v\">currentJob</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">person</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">jobs</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">getCurrentJob</span><span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">?</span><span class=\"crayon-sy\">?</span> <span class=\"crayon-s\">\'none\'</span><span class=\"crayon-sy\">;</span></span></p>\r\n<p>Nếu không có function getCurrentJob thì currentJob sẽ có giá trị none.</p>\r\n<h3 id=\"_5-bat-dau-su-dung-6\">5. Bắt đầu sử dụng</h3>\r\n<p>Bây giờ chưa support cho các browser-nhưng Babel hỗ trợ. Plugin babel.js khác dễ tích hợp nếu bạn đã thiết lập Babel. Bạn có thể tham khảo <a href=\"https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining\" target=\"_blank\" rel=\"noopener noreferrer nofollow external\" data-wpel-link=\"external\">babel-plugin-proposal-optional-chaining </a>để cài đặt cũng như cách dùng.</p>\r\n<h2 id=\"_loi-ket-7\">Lời kết</h2>\r\n<p>Mình nghĩ với Option Chaining sẽ làm cho code javascript dễ đọc hơn rất nhiều và cũng ít bị lỗi hơn nữa. Bạn cũng có thể tìm hiểu kĩ hơn về Option Chaining tại <a href=\"https://github.com/tc39/proposal-optional-chaining\">proposal </a>.</p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/tinh-nang-noi-bat-trong-javascript-ma-ban-can-biet-optional-chaining.html\">https://techtalk.vn/tinh-nang-noi-bat-trong-javascript-ma-ban-can-biet-optional-chaining.html</a></p>\r\n</div>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/5/mceu_84556536721596800219368.jpg', 0, '2020-08-08 06:00:00', 17, 2, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(6, 'Xử lý bất đồng bộ trong JavaScript', 'xu-ly-bat-dong-bo-trong-javascript-1596800944152', 'Xử lý bất đồng bộ trong JavaScript', '<p><img src=\"http://localhost:3000/public/img/ImagePost/6/mceu_52720705311596800527596.png\" /></p>\r\n<h2 id=\"_i-dong-bo-va-bat-dong-bo-0\">I. Đồng bộ và bất đồng bộ</h2>\r\n<h3 id=\"_1-khai-niem-1\">1) Khái niệm</h3>\r\n<ul>\r\n<li>Synchronous (đồng bộ) là một quy trình xử lý các công việc theo một thứ tự đã được lập sẵn. Công việc sau được bắt đầu thực hiện chỉ khi công việc thứ nhất hoàn thành. Quá trình đồng bộ là một quá trình rất phổ biến trong thực tế. Ví dụ dây chuyền sản xuất sản phẩm trong các nhà máy, hay lộ trình học tập của một học sinh từ lớp 1 đến lớp 12, … Trong lập trình, một chương trình đồng bộ là một chương trình được thực hiện theo từng câu lệnh từ trên xuống dưới, từ trái qua phải, câu lệnh sau được thực hiện chỉ khi câu lệnh trước đã hoàn thành. Đa số các ngôn ngữ biên dịch đều tuân theo quy tắc lập trình đồng bộ ví dụ C++, Java, …Vì thế chỉ cần biên dịch một câu lệnh sai là cả chương trình sẽ dừng lại và báo lỗi.</li>\r\n<li>Ngược lại, với Asynchronous (bất đồng bộ), nhiều công việc có thể được thực hiện cùng lúc. Và nếu công việc thứ hai kết thúc trước, nó có thể sẽ cho ra kết quả trước cả câu lệnh thứ nhất. Vì thế, đôi khi kết quả của các câu lệnh sẽ không trả về đúng theo đúng thứ tự như trực quan của nó.</li>\r\n</ul>\r\n<h3 id=\"_2-so-sanh-uu-nhuoc-diem-cua-lap-trinh-dong-bo-va-bat-dong-bo-2\">2) So sánh ưu nhược điểm của lập trình đồng bộ và bất đồng bộ</h3>\r\n<ul>\r\n<li>Lập trình đồng bộ có ưu điểm là chương trình sẽ chạy theo đúng thứ tự từ trên xuống, và sẽ phát dừng lại ngay khi gặp một câu lệnh lỗi. Điều này sẽ khiến chương trình dễ kiểm soát và dễ phát hiện ra lỗi hơn.</li>\r\n<li>Lập trình đồng bộ cũng có một nhược điểm là hiệu suất chương trình sẽ chậm. Có rất nhiều câu lệnh cần phải thao tác với các dữ liệu bên ngoài nên nó cần có một thời gian chờ để nhận được dữ liệu trước khi hoạt động bình thường. Như thế thời gian thực hiện của chương trình sẽ bằng tổng thời gian chờ của các câu lệnh và thời gian hoạt động bình thường của các câu lệnh đó. Ở một số ngôn ngữ đồng bộ đa luồng, vấn đề này được xử lý bằng cách bổ sung một luồng để thực hiện các câu lệnh khác. Luồng ban đầu sẽ chờ kết quả của luồng bổ sung, sau đó hai luồng sẽ đồng bộ hóa để kết hợp lại kết quả của chúng.</li>\r\n<li>Lập trình không đồng bộ có cách khác để giải quyết vấn đề trên. Chúng cho phép các hành động được thực hiện cùng lúc. Do đó, sẽ tối ưu được thời gian chờ của các câu lệnh vì các câu lệnh sẽ được “chờ cùng nhau”. Ở ví dụ sau, câu lệnh 1 và 2 đã “cùng nhau chờ” 0,4s, do đó thời gian thực hiện chương trình giảm được 0,4s.\r\n<p>Ở hình sau, đường màu đỏ thể hiện thời gian chờ của một câu lệnh, đường màu xanh dày thể hiện thời gian thực hiện bình thường của lệnh đó.</p>\r\n<img src=\"https://images.viblo.asia/0f44c12e-bfa3-4904-8795-8a824ebf0dbb.png\" /></li>\r\n<li>Tuy nhiên, lập trình không đồng bộ cũng có nhược điểm. Do các câu lệnh không đồng bộ có thể sẽ không được thực hiện theo đúng thứ tự từ trên xuống theo quy trình nên đòi hỏi chúng ta cần có các kỹ thuật để kiểm soát chúng. Ví dụ cụ thể ở đoạn mã sau:</li>\r\n</ul>\r\n<div id=\"crayon-5f2e8e8226bba658468112-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">setTimeout</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">,</span><span class=\"crayon-cn\">1000</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bba658468112-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e8e8226bba658468112-4\" class=\"crayon-line crayon-striped-line\">Câu lệnh thứ hai trả về kết quả trước câu lệnh thứ nhất.</div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_ii-bat-dong-bo-trong-javascript-3\">II. Bất đồng bộ trong JavaScript</h2>\r\n<p><span style=\"color: #e03e2d;\"><a style=\"color: #e03e2d;\" href=\"https://topdev.vn/blog/7-khai-niem-javascript-co-ban/\">Javascript </a></span>là ngôn ngữ lập trình bất đồng bộ và chỉ chạy trên một luồng. Sự bất đồng bộ trong javascript xuất hiện khi nó thao tác với các WebAPI (ajax, setTimeout(), … ). Khi một câu lệnh thao tác với WebAPI, nó sẽ mất một khoảng thời gian để chờ các dữ liệu trả về từ WebAPI, do đó ở trong luồng chính của <span style=\"color: #e03e2d;\"><a style=\"color: #e03e2d;\" href=\"https://topdev.vn/blog/7-khai-niem-javascript-co-ban/\" target=\"_new\" rel=\"follow\" data-wpel-link=\"exclude\">javascript</a></span>, nó sẽ ở trong trạng thái chờ. Tuy nhiên chương trình sẽ không bỏ trống khoảng thời gian chờ đó, chương trình sẽ tiếp tục thực hiện các câu lệnh tiếp theo. Đó là lý do <span style=\"color: #e03e2d;\"><a style=\"color: #e03e2d;\" href=\"https://topdev.vn/blog/7-khai-niem-javascript-co-ban/\">Javascript </a></span>là ngôn ngữ bất đồng bộ. Sau đây chúng ta sẽ tìm hiểu kĩ hơn về cách <span style=\"color: #e03e2d;\"><a style=\"color: #e03e2d;\" href=\"https://topdev.vn/blog/7-khai-niem-javascript-co-ban/\">javascript </a></span>hoạt động với các trường hợp bất đồng bộ.</p>\r\n<p><img src=\"https://images.viblo.asia/4f5918b4-39b4-4887-807c-ac734fa0061e.png\" /></p>\r\n<p>Một câu lệnh trong javascript khi được thực hiện nó phải trải qua sự kiểm soát các các đối tượng: Timer, Message Queue, Event Loop, CallStack. Đầu tiên, nếu một câu lệnh được gọi thao tác với WebAPI, nó sẽ được chuyển đến hàng đợi Timer. Sau khi hết thời gian chờ nó sẽ được chuyển đến Message Queue. Call Stack là ngăn xếp rất quen thuộc trong lập trình. Khi một hàm được gọi, hàm đó được thêm vào ngăn xếp và hàm đó sẽ được lấy ra khỏi ngăn xếp khi hàm đó thực thiện xong. Event Loop sẽ kiểm tra khi nào trong Call Stack trống thì sẽ chuyển câu lệnh trong Message Queue vào trong Call Stack.</p>\r\n<h2 id=\"_iii-xu-ly-bat-dong-bo-trong-javascript-4\">III. Xử lý bất đồng bộ trong JavaScript</h2>\r\n<p>Để làm cho các câu lệnh thực hiện theo đúng thứ tự của nó, chúng ta có 3 phương án giải quyết phổ biến : Call Back, Promise, Asyn/Await</p>\r\n<p>Tham khảo thêm:<span style=\"color: #e03e2d;\"> <a style=\"color: #e03e2d;\" href=\"https://topdev.vn/blog/callback-promise-async-await-hay-observable-cho-xu-ly-bat-dong-bo/\" target=\"_new\" rel=\"follow\" data-wpel-link=\"exclude\">Xử lý Bất đồng bộ bằng Callback, Promise, Async Await hay Observable?</a></span></p>\r\n<h3 id=\"_1-call-back-5\">1) Call Back</h3>\r\n<p>Call Back là một hàm được truyền vào một hàm khác với tư cách như một tham số của hàm đó. Ví dụ như:</p>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">nauGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">callback</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">nauNuocSoi</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">vatLongGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">callback</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">luocGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\">//</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">nuongGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\">//</span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">nauGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">luocGa</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bc6190429125-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">nauGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">nuongGa</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><span style=\"font-family: helvetica, arial, sans-serif;\"><span class=\"crayon-sy\">Ở đoạn mã trên, chúng ta thấy rằng, hàm luocGa và nuongGa được dùng như tham số trong hàm nauGa Với Javascript, một ngôn ngữ hướng sự kiện, call back được sử dụng rất nhiều khi xử lý các sự kiện, ví dụ như</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2e8e8226bcc521535229-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">$</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'#button\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">click</span><span class=\"crayon-sy\">(</span><span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bcc521535229-3\" class=\"crayon-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">alert</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"hê nô\"</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bcc521535229-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">Chúng ta có thể áp dụng call back để đồng bộ hóa các đoạn mã không đồng bộ. Ví dụ như ở đoạn mã trên. Nấu nước sôi cần một khoảng thời gian chờ nước sôi, chúng ta không phải làm gì. Ta có thể biểu diễn thời gian chờ này bằng hàm setTimeout() trong javascript.</div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2e8e8226bd0196328291-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">soCheGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">nauNuocSoi</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">vatLongGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">nauNuocSoi</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">setTimeout</span><span class=\"crayon-sy\">(</span><span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"nau nuoc soi\"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">1000</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">vatLongGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"vat long ga\"</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bd0196328291-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">soCheGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">Và nếu như theo đúng cách chạy của Javascript thì hành động vặt lông gà sẽ được thực hiện trước hành động nấu nước sôi. (à, quên mất, nấu nước sôi là để nhúng gà vào vặt lông chứ không phải để luộc gà đâu nhé ) .Mà nếu chúng ta vặt lông gà luôn mà không cần nhúng nước nóng thì tội cho bác gà quá. Vì thế để cho gà có thể ra đi thanh thản chúng ta cần đồng bộ hóa lại quy trình bằng callback như sau</div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2e8e8226bd4948294854-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\"> </span><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">soCheGa</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">callback</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">nauNuocSoi</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">vatLongGa</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">nauNuocSoi</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">callback</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">setTimeout</span><span class=\"crayon-sy\">(</span><span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"nau nuoc soi\"</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">callback</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">1000</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bd4948294854-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">Tuy nhiên, Callback cũng có nhược điểm. Đó là khi chúng ta muốn nhiều hành động bất đồng bộ thực hiện theo đúng thứ tự liên tiếp nhau, chúng ta phải gọi nhiều hàm callback lồng vào nhau nhiều lần, gây ra đoạn code rất khó kiểm soát và không tối ưu. Đây gọi là tình trạng Callback Hell. Ví dụ như muốn in các số từ 1 đến 10, mà mỗi hành động in đều là một hàm bất đồng bộ</div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2e8e8226bda810593464-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">number</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">callback</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">setTimeout</span><span class=\"crayon-sy\">(</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">number</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">callback</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">Math</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">floor</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">Math</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">random</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">*</span> <span class=\"crayon-cn\">100</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">+</span> <span class=\"crayon-cn\">1</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">printAll</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">4</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">6</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">7</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">8</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">9</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-22\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">10</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-23\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-24\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-25\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-26\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-27\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-28\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-29\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-30\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-31\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-32\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-33\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bda810593464-34\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h3 id=\"_2-promise-6\">2) Promise</h3>\r\n<p>Promise là một đối tượng bao hàm một hàm chứa các đoạn code không đồng bộ. Hàm này chứa 2 tham số là hai hàm callback để giải quyết sau khi mã đồng bộ thực hiện thành công hay thất bại. Promise cung cấp cho ta hai phương thức xử lý sau khi đoạn mã bất đồng bộ thực hiện thành công hoặc thất bại. Hàm then() dùng để xử lý sau khi mã bất đồng bộ được thực hiện thành công và hàm catch() dùng để xử lý sau khi mã bất đồng bộ thực hiện thất bại</p>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">number</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-r\">new</span> <span class=\"crayon-e\">Promise</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">resolve</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">reject</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">setTimeout</span><span class=\"crayon-sy\">(</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">if</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">&</span><span class=\"crayon-v\">lt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">reject</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-st\">else</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">number</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">resolve</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-cn\">1000</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226bdf255924250-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">reject</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"number &lt; 0\"</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">Phương thức then có thể thực thi một hàm, một Promise hay một đối tượng. Nếu chúng ta dùng then để trả về một Promise thì ta có thể tận dụng để xử lý tình trạng Callback Hell</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2e8e8226be3374599033-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">4</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">6</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">7</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-st\">then</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">8</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be3374599033-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">reject</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"number &lt; 0\"</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<p>Tuy nhiên, dù Promise đã giải quyết được vấn đề Callback Hell, nhưng chúng ta có thể thấy, đoạn mã vẫn chưa thực sự rõ ràng và dễ hiểu. Trong phương thức chúng ta vẫn phải truyền vào một hàm, mà hàm đó trả về một hàm khác có giá trị trả về là 1 Promise. Chúng ta tạm gọi đây là tình trạng Promise Hell.</p>\r\n<h3 id=\"_3-asynawait-7\">3) Asyn/Await</h3>\r\n<p>Async / Await là một tính năng ngôn ngữ là một phần của tiêu chuẩn ES8. Từ khóa Async để khai báo rằng hàm này sẽ xử lý các hàm bất đồng bộ, nó sẽ chờ kết quả của các hàm bất đồng bộ được trả về sau đó mới thực hiện tiếp. Hàm bất đồng bộ đó phải trả về một Promise và được khai báo với từ khóa Await</p>\r\n<div id=\"crayon-5f2e8e8226be7337093761-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">number</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-r\">new</span> <span class=\"crayon-e\">Promise</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">resolve</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">reject</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">setTimeout</span><span class=\"crayon-sy\">(</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">=&</span><span class=\"crayon-v\">gt</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">console</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">log</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">number</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">resolve</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">,</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">Math</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">floor</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">Math</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">random</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">*</span> <span class=\"crayon-cn\">100</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\">+</span> <span class=\"crayon-cn\">1</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">async </span><span class=\"crayon-t\">function</span> <span class=\"crayon-e\">printAll</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">await </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">await </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">await </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">4</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">await </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">await </span><span class=\"crayon-e\">printNumber</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">6</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e8e8226be7337093761-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">printAll</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<p>Đến đây thì chúng ta đã thấy Asyn/Await đã giải quyết triệt để được tình trạng Callback Hell cũng như Promise Hell.</p>\r\n<h2 id=\"_iv--tong-ket-8\">IV . Tổng kết</h2>\r\n<p>Qua một hồi luyên thuyên thì chúng ta rút ra kết luận là: Lập trình bất đồng bộ có hiệu suất tốt hơn lập trình đồng bộ. Tuy nhiên, trong nhiều trường hợp chúng ta vẫn phải thực thi các đoạn mã một cách đồng bộ. Trong JavaScript, chúng ta có ba kĩ thuật là Callback, Promise, Asyn/Await. Callback phù hợp trong các trường hợp xử lý đơn giản hơn (như đồng bộ 2, 3 hàm bất đồng bộ) vì nó dễ hiểu. Asyn/Await phù hợp cho các trường hợp phức tạp như cần đồng bộ quá nhiều hàm bất đồng bộ.</p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/xu-ly-bat-dong-bo-trong-javascript.html\">https://techtalk.vn/xu-ly-bat-dong-bo-trong-javascript.html</a></p>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/6/mceu_52720705311596800527596.png', 0, '2020-08-08 08:00:00', 17, 2, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(7, 'Lỗ hổng trong hàm input() trong Python 2.x', 'lo-hong-trong-ham-input-trong-python-2x-1596816054850', 'Bài viết này nhằm mục đích giải thích và khám phá các lỗ hổng trong hàm input() ở phiên bản Python 2.x. Trong phiên bản Python 3, hàm raw_input() đã bị xóa và chức năng của nó đã được chuyển sang một hàm tích hợp mới được gọi là input().', '<p><img src=\"http://localhost:3000/public/img/ImagePost/7/mceu_57976332611596814950197.jpg\" /></p>\r\n<p><strong>Bài viết này nhằm mục đích giải thích và khám phá các lỗ hổng trong hàm input() ở phiên bản Python 2.x. Trong phiên bản Python 3, hàm raw_input() đã bị xóa và chức năng của nó đã được chuyển sang một hàm tích hợp mới được gọi là input().</strong></p>\r\n<h2><strong>Các cách nhập dữ liệu trong Python 2.x</strong></h2>\r\n<p>Có hai phương thức phổ biến để nhận đầu vào trong Python 2.x:</p>\r\n<ol>\r\n<li>Sử dụng hàm <strong>input():</strong> Hàm này lấy và giữ nguyên giá trị và kiểu đầu vào như bạn nhập mà không thay đổi bất kỳ kiểu nào.</li>\r\n<li>Sử dụng hàm <strong>raw_input()</strong>: Hàm này <strong>chuyển đổi một cách rõ ràng</strong> đầu vào được nhập thành kiểu string.</li>\r\n</ol>\r\n<p>Chúng ta hãy sử dụng chương trình sau để xác định sự khác biệt giữa hai hàm trên:</p>\r\n<div id=\"crayon-5f2ec58eb1967504080677-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># Python 2.x program to show differences between </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># input() and rawinput()function </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># 3 inputs using raw_input() function, </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># after which data type of the value </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># entered is displayed </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">s1</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Enter input to test raw_input() function: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">print </span><span class=\"crayon-e\">type</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">s1</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">s2</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Enter input to test raw_input() function: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">print </span><span class=\"crayon-e\">type</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">s2</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">s3</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Enter input to test raw_input() function: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">print </span><span class=\"crayon-e\">type</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">s3</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># 3 inputs using input() function, </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># after which data type of the value </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># entered is displayed </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">s4</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Enter input to test input() function: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">print </span><span class=\"crayon-e\">type</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">s4</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-22\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-23\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">s5</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Enter input to test input() function: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-24\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">print </span><span class=\"crayon-e\">type</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">s5</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-25\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-26\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">s6</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Enter input to test input() function: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1967504080677-27\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">print </span><span class=\"crayon-e\">type</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">s6</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">code </span><span class=\"crayon-v\">lang</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"python\"</span> <span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\" language-python\"</span><span class=\"crayon-o\">></span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\"><strong><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\">Đầu vào:</span></span></strong></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2ec58eb1970540545232-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-i\" style=\"font-family: verdana, geneva, sans-serif;\">Hello</span></div>\r\n<div id=\"crayon-5f2ec58eb1970540545232-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-cn\" style=\"font-family: verdana, geneva, sans-serif;\">456</span></div>\r\n<div id=\"crayon-5f2ec58eb1970540545232-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">[</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">,</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">,</span><span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">]</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1970540545232-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-cn\" style=\"font-family: verdana, geneva, sans-serif;\">45</span></div>\r\n<div id=\"crayon-5f2ec58eb1970540545232-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-s\" style=\"font-family: verdana, geneva, sans-serif;\">\"goodbye\"</span></div>\r\n<div id=\"crayon-5f2ec58eb1970540545232-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">[</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">,</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">,</span><span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">]</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><strong>Kết quả:</strong></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2ec58eb1974962934834-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Enter </span><span class=\"crayon-e\">input </span><span class=\"crayon-st\">to</span> <span class=\"crayon-e\">test </span><span class=\"crayon-e\">raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-t\">function</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\"><</span><span class=\"crayon-i\">type</span> <span class=\"crayon-s\">\'str\'</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2ec58eb1974962934834-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Enter </span><span class=\"crayon-e\">input </span><span class=\"crayon-st\">to</span> <span class=\"crayon-e\">test </span><span class=\"crayon-e\">raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-t\">function</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\"><</span><span class=\"crayon-i\">type</span> <span class=\"crayon-s\">\'str\'</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2ec58eb1974962934834-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Enter </span><span class=\"crayon-e\">input </span><span class=\"crayon-st\">to</span> <span class=\"crayon-e\">test </span><span class=\"crayon-e\">raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-t\">function</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\"><</span><span class=\"crayon-i\">type</span> <span class=\"crayon-s\">\'str\'</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2ec58eb1974962934834-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2ec58eb1974962934834-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Enter </span><span class=\"crayon-e\">input </span><span class=\"crayon-st\">to</span> <span class=\"crayon-e\">test </span><span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-t\">function</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\"><</span><span class=\"crayon-i\">type</span> <span class=\"crayon-s\">\'int\'</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2ec58eb1974962934834-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Enter </span><span class=\"crayon-e\">input </span><span class=\"crayon-e\">totest </span><span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-t\">function</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\"><</span><span class=\"crayon-i\">type</span> <span class=\"crayon-s\">\'str\'</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2ec58eb1974962934834-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Enter </span><span class=\"crayon-e\">input </span><span class=\"crayon-st\">to</span> <span class=\"crayon-e\">test </span><span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-t\">function</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\"><</span><span class=\"crayon-i\">type</span> <span class=\"crayon-s\">\'list\'</span><span class=\"crayon-o\">></span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">code </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"\"</span><span class=\"crayon-o\">></span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<p><strong><em>Lưu ý:</em></strong><em> Trong khi nhập chuỗi đầu vào trong hàm input(), chúng ta phải đính kèm theo giá trị trong dấu ngoặc kép. Điều này là không bắt buộc trong hàm raw_input()</em></p>\r\n<h2><strong>Lỗ hổng trong phương thức input()</strong></h2>\r\n<p>Lỗ hổng trong phương thức input() nằm ở thực tế là biến truy cập vào các giá trị của đầu vào có thể được truy cập bởi bất kỳ ai chỉ bằng cách sử dụng tên của biến hoặc phương thức. Hãy khám phá từng cái một:</p>\r\n<ul>\r\n<li><strong>Tên biến làm tham số đầu vào:</strong> Biến có giá trị của biến đầu vào có thể truy cập trực tiếp vào giá trị của biến đầu vào.</li>\r\n</ul>\r\n<div id=\"crayon-5f2ec58eb1984868042707-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\">\r\n<div id=\"crayon-5f2ec58eb1976408547645-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># Python 2.x program to show Vulnerabilities </span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-3\" class=\"crayon-line\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># in input() function using a variable </span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-5\" class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">import </span><span class=\"crayon-e\">random </span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-6\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">secret_number</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">random</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">randint</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">,</span><span class=\"crayon-cn\">500</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-7\" class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-i\">print</span> <span class=\"crayon-s\">\"Pick a number between 1 to 500\"</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">while</span> <span class=\"crayon-t\">True</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-9\" class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">res</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Guess the number: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-10\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">if</span> <span class=\"crayon-v\">res</span><span class=\"crayon-o\">==</span><span class=\"crayon-v\">secret_number</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-11\" class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-i\">print</span> <span class=\"crayon-s\">\"You win\"</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-12\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">break</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-13\" class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">else</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-14\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-i\">print</span> <span class=\"crayon-s\">\"You lose\"</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1976408547645-15\" class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">continue</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">code </span><span class=\"crayon-v\">lang</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"python\"</span> <span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\" language-python\"</span><span class=\"crayon-o\">></span></span></div>\r\n</div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"><strong>Đầu vào:</strong></div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2ec58eb1987836642700-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\">15</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><strong>Kết quả:</strong></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\">\r\n<div id=\"crayon-5f2ec58eb1989190445445-2\" class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2ec58eb197c450641773-2\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-i\">Pick</span> <span class=\"crayon-i\">a</span> <span class=\"crayon-e\">number </span><span class=\"crayon-i\">between</span> <span class=\"crayon-cn\">1</span> <span class=\"crayon-st\">to</span> <span class=\"crayon-cn\">500</span></span></div>\r\n<div id=\"crayon-5f2ec58eb197c450641773-3\" class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Guess </span><span class=\"crayon-e\">the </span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">You </span><span class=\"crayon-e\">lose</span></span></div>\r\n<div id=\"crayon-5f2ec58eb197c450641773-4\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Guess </span><span class=\"crayon-e\">the </span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">:</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n</div>\r\n</div>\r\n</div>\r\n<div class=\"crayon-line crayon-striped-line\"><strong>Đầu vào:</strong></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">secret</span><span class=\"crayon-sy\">_</span>number</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"><strong>Kết quả</strong></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2ec58eb1981568051278-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-i\">Pick</span> <span class=\"crayon-i\">a</span> <span class=\"crayon-e\">number </span><span class=\"crayon-i\">between</span> <span class=\"crayon-cn\">1</span> <span class=\"crayon-st\">to</span> <span class=\"crayon-cn\">500</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1981568051278-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Guess </span><span class=\"crayon-e\">the </span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">You </span><span class=\"crayon-i\">win</span></span></div>\r\n</div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">Như có thể thấy, trong trường hợp thứ hai, biến “secret_number” có thể được nhập trực tiếp làm đầu vào và kết quả luôn là “You won”. Nó đánh giá biến như thể một số được nhập trực tiếp, có nghĩa là nó luôn trả về giá trị kiểu True Boolean. Trong khi sử dụng raw_input, điều đó là không thể vì nó không cho phép đọc biến trực tiếp.</div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<ul>\r\n<li><strong>Tên hàm là tham số:</strong> Lỗ hổng nằm ở đây khi chúng ta thậm chí có thể cung cấp tên của hàm là các giá trị đầu vào và biến truy cập mà thực chất là không được cho phép truy cập.</li>\r\n</ul>\r\n<div id=\"crayon-5f2ec58eb1984868042707-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># Python 2.x program to demonstrate input() function </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># vulnerability by passing function name as parameter </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">secret_value</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-cn\">500</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># function that returns the secret value </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">def </span><span class=\"crayon-e\">secretfunction</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-v\">secret_value</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># using raw_input() to enter the number </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">input1</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Raw_input(): Guess secret number: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># input1 will be explicitly converted to a string </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">if</span> <span class=\"crayon-v\">input1</span> <span class=\"crayon-o\">==</span> <span class=\"crayon-v\">secret_value</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-i\">print</span> <span class=\"crayon-s\">\"You guessed correct\"</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">else</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-i\">print</span> <span class=\"crayon-s\">\"wrong answer\"</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\"># using input() to enter the number </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">input2</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\"Input(): Guess the secret number: \"</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: verdana, geneva, sans-serif;\"> </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-22\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: verdana, geneva, sans-serif;\">#input2 is evaluated as it is entered </span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-23\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">if</span> <span class=\"crayon-v\">input2</span> <span class=\"crayon-o\">==</span> <span class=\"crayon-v\">secret_value</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-24\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-i\">print</span> <span class=\"crayon-s\">\"You guessed correct\"</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-25\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">else</span><span class=\"crayon-o\">:</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1984868042707-26\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-i\">print</span> <span class=\"crayon-s\">\"wrong answer\"</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">code </span><span class=\"crayon-v\">lang</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"python\"</span> <span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\" language-python\"</span><span class=\"crayon-o\">></span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"><strong>Đầu vào:</strong></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2ec58eb1987836642700-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-cn\" style=\"font-family: verdana, geneva, sans-serif;\">400</span></div>\r\n<div id=\"crayon-5f2ec58eb1987836642700-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">secretfunction</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\"><strong><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">Kết quả:</span></span></strong></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2ec58eb1989190445445-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">Guess </span><span class=\"crayon-e\">secret </span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">wrong </span><span class=\"crayon-e\">answer</span></span></div>\r\n<div id=\"crayon-5f2ec58eb1989190445445-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">Guess </span><span class=\"crayon-e\">the </span><span class=\"crayon-e\">secret </span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">You </span><span class=\"crayon-e\">guessed </span><span class=\"crayon-i\">correct</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<p>Trong bộ đầu vào/đầu ra này, chúng ta có thể thấy rằng khi chúng ta sử dụng hàm raw_input, chúng ta nhất thiết phải nhập đúng số. Tuy nhiên, trong khi sử dụng hàm input(), chúng ta thậm chí có thể cung cấp tên của một hàm hoặc một biến và trình thông dịch sẽ đánh giá điều đó.<br />Lấy ví dụ, ở đây, đầu vào cho hàm input() đã được đặt dưới dạng tên của hàm ‘secretfunction()’. Trình thông dịch đánh giá việc gọi hàm này và trả về số bí mật mà chúng ta muốn tìm và do đó điều kiện của chúng ta đánh giá là đúng, mặc dù chúng ta không nhập số bí mật đó.</p>\r\n<p><strong>Đầu vào:</strong></p>\r\n<div id=\"crayon-5f2ec58eb198b025463362-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">secretfunction</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ec58eb198b025463362-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">secret</span><span class=\"crayon-sy\">_</span>value</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\"><strong><span style=\"font-family: verdana, geneva, sans-serif;\">Kết quả:</span></strong></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2ec58eb198e524655471-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Raw_input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">Guess </span><span class=\"crayon-e\">secret </span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">wrong </span><span class=\"crayon-e\">answer</span></span></div>\r\n<div id=\"crayon-5f2ec58eb198e524655471-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">Input</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">Guess </span><span class=\"crayon-e\">the </span><span class=\"crayon-e\">secret </span><span class=\"crayon-v\">number</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">You </span><span class=\"crayon-e\">guessed </span><span class=\"crayon-i\">correct</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<p>Như đã giải thích ở điểm đầu tiên, trong ví dụ này, chúng ta cũng có thể chỉ cần nhập tên biến ‘secret_number’ ở đầu vào cho hàm ‘input()’ và chúng ta đã có thể có quyền truy cập vào giá trị mật.<br />Tuy nhiên, trong khi cố gắng gọi hàm secretfunction() trong đầu vào cho hàm raw_input(), nó sẽ cho chúng ta sai khi trình thông dịch chuyển đổi đối số của chúng ta thành chuỗi và không đánh giá nó như một lệnh gọi hàm.</p>\r\n<p><strong>Ngăn chặn lỗ hổng đầu vào</strong></p>\r\n<p>Điều luôn tốt hơn là sử dụng hàm raw_input() trong phiên bản python 2.x và sau đó chuyển đổi rõ ràng đầu vào thành bất kỳ kiểu nào chúng ta cần. Ví dụ: nếu chúng ta muốn lấy đầu vào là một số nguyên, chúng ta có thể làm như sau:</p>\r\n<p>[Đoạn code]</p>\r\n<p>Điều này ngăn chặn các cuộc gọi hoặc đánh giá độc hại của các hàm.</p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/lo-hong-trong-ham-input-trong-python-2-x.html\">https://techtalk.vn/lo-hong-trong-ham-input-trong-python-2-x.html</a></p>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/7/mceu_57976332611596814950197.jpg', 0, '2020-08-08 05:00:00', 10, 2, 0),
(8, 'Đầu ra sử dụng hàm print() trong Python', 'dau-ra-su-dung-ham-print-trong-python-1596737111434', 'Cách đơn giản nhất để tạo đầu ra là sử dụng hàm print() trong đó bạn có thể truyền không hoặc nhiều biểu thức được phân tách bằng dấu phẩy. Hàm này chuyển đổi các biểu thức bạn truyền thành string trước khi hiển thị trên màn hình.', 'đasadasdasdsadas', '2020-08-07', '/../public/img/ImagePost/8/mceu_63885753111596736429484.jpg', 0, '2020-08-14 08:00:00', 10, 4, 0),
(9, 'Lấy dữ liệu đầu vào từ chương trình console trong Python', 'lay-du-lieu-dau-vao-tu-chuong-trinh-console-trong-python-1596739600376', 'Lấy dữ liệu đầu vào từ chương trình console trong Python', 'đasadasdsadas', '2020-08-07', '/../public/img/ImagePost/9/mceu_38155663711596738708237.jpg', 0, '2020-08-14 09:00:00', 10, 4, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(10, 'Giới thiệu về iostream: cout, cin và endl', 'gioi-thieu-ve-iostream-cout-cin-va-endl-1596752895575', 'Trong bài học này, chúng ta sẽ nói nhiều hơn về std :: cout, thứ mà chúng ta đã sử dụng trong chương trình Hello Word!. Chúng ta sẽ tìm hiểu cách lấy giá trị đầu vào từ người dùng, thứ mà chúng ta sẽ sử dụng để làm cho các chương trình có thể tương tác được.', '<p><img src=\"http://localhost:3000/public/img/ImagePost/10/mceu_52672240211596752510704.jpg\" /></p>\r\n<p><strong>Trong bài học này, chúng ta sẽ nói nhiều hơn về std :: cout, thứ mà chúng ta đã sử dụng trong chương trình Hello Word!. Chúng ta sẽ tìm hiểu cách lấy giá trị đầu vào từ người dùng, thứ mà chúng ta sẽ sử dụng để làm cho các chương trình có thể tương tác được.</strong></p>\r\n<h2><span id=\"1_Thu_vien_iostream\" class=\"ez-toc-section\"><strong>1. Thư viện iostream</strong></span></h2>\r\n<p>Thư viện <strong>iostream</strong> là một trong các thư viện chuẩn của C ++ liên quan đến đầu vào và đầu ra. Chúng ta sẽ sử dụng các hàm trong thư viện này để nhận đầu vào từ bàn phím và xuất dữ liệu ra console. Phần <strong>io</strong> của <strong>iostream</strong> là viết tắt của input / output.</p>\r\n<p>Để sử dụng hàm được định nghĩa trong thư viện iostream, chúng ta cần include thư viện iostream ở đầu của bất kỳ file code nào muốn sử dụng các hàm iostream, Ví dụ như vậy:</p>\r\n<div id=\"crayon-5f2e7bc37e064400983789-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: georgia, palatino, serif;\">#include <iostream></span></div>\r\n<div id=\"crayon-5f2e7bc37e064400983789-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e064400983789-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: georgia, palatino, serif;\">// rest of code that uses iostream functionality here</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2><span id=\"2_stdcout\" class=\"ez-toc-section\"><strong>2. std::cout</strong></span></h2>\r\n<p>Thư viện iostream chứa một vài biến được đinh nghĩa trước để chúng ta sử dụng. Một trong những thứ hữu ích nhất là std :: cout, cho phép chúng ta gửi dữ liệu đến console để được in ra văn bản. cout là viết tắt của “character output”.</p>\r\n<p>Chương trình Hello world:</p>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: georgia, palatino, serif;\">#include <iostream> // for std::cout</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-t\">int</span> <span class=\"crayon-e\">main</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">{</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Hello world!\"</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-c\">// print Hello world! to console</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e06e845761287-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\">\r\n<p>Trong chương trình này, chúng ta đã bao gồm iostream để chúng ta có quyền truy cập vào std :: cout. Bên trong hàm main của chương trình, chúng ta sử dụng std :: cout, cùng với toán tử chèn (<<), để gửi văn bản Hello world! đến console.</p>\r\n<p>std :: cout không chỉ có thể in văn bản, nó còn có thể in số:</p>\r\n<div id=\"crayon-5f2e7bc37e071857884877-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: georgia, palatino, serif;\">#include <iostream> // for std::cout</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e071857884877-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e071857884877-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-t\">int</span> <span class=\"crayon-e\">main</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e071857884877-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">{</span></div>\r\n<div id=\"crayon-5f2e7bc37e071857884877-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-cn\">4</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-c\">// print 4 to console</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e071857884877-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e071857884877-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e071857884877-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><strong>Kết quả:</strong></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\">4</span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\"><span style=\"font-family: georgia, palatino, serif;\">Ở đây, một ví dụ khác, nơi chúng tôi in cả văn bản và giá trị của một biến trong cùng một câu lệnh:</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2e7bc37e081311090645-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: georgia, palatino, serif;\">#include <iostream> // for std::cout</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e081311090645-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e081311090645-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-t\">int</span> <span class=\"crayon-e\">main</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e081311090645-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">{</span></div>\r\n<div id=\"crayon-5f2e7bc37e081311090645-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-t\">int</span> <span class=\"crayon-e\">x</span><span class=\"crayon-sy\">{</span> <span class=\"crayon-cn\">5</span> <span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e081311090645-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"x is equal to: \"</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-v\">x</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e081311090645-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e081311090645-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n</div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">Chương trình này in:</div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif; color: #e67e23;\"><span class=\"crayon-i\">x</span> <span class=\"crayon-st\">is</span> <span class=\"crayon-e\">equal </span><span class=\"crayon-st\">to</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">5</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<h2><span id=\"3_stdendl\" class=\"ez-toc-section\"><strong>3. std::endl</strong></span></h2>\r\n<p>Bạn mong đợi chương trình này sẽ in cái gì?</p>\r\n<div id=\"crayon-5f2e7bc37e086463985654-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: georgia, palatino, serif;\">#include <iostream> // for std::cout</span></div>\r\n<div id=\"crayon-5f2e7bc37e086463985654-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e086463985654-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-t\">int</span> <span class=\"crayon-e\">main</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e086463985654-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">{</span></div>\r\n<div id=\"crayon-5f2e7bc37e086463985654-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Hi!\"</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e086463985654-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"My name is Alex.\"</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e086463985654-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e086463985654-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><span class=\"crayon-sy\">Bạn có thể ngạc nhiên với kết quả:</span></div>\r\n</div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-v\">Hi</span><span class=\"crayon-o\">!</span><span class=\"crayon-e\">My </span><span class=\"crayon-e\">name </span><span class=\"crayon-st\">is</span> <span class=\"crayon-v\">Alex</span><span class=\"crayon-sy\">.</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<p>Nếu chúng ta muốn in ra các dòng một cách riêng biệt ra console, chúng ta cần cho console biết khi nào nên di chuyển con trỏ đến dòng tiếp theo.</p>\r\n<p>Một cách để làm điều đó là sử dụng std :: endl. Khi dùng std :: cout, std :: endl sẽ in ra một ký tự xuống dòng mới ra console (khiến con trỏ đi đến đầu dòng tiếp theo). Trong bối cảnh này, endl là viết tắt của “end line”.</p>\r\n<p>Ví dụ:</p>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-p\" style=\"font-family: georgia, palatino, serif;\">#include <iostream> // for std::cout and std::endl</span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-t\">int</span> <span class=\"crayon-e\">main</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">{</span></div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Hi!\"</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">endl</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-c\">// std::endl will cause the cursor to move to the next line of the console</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"My name is Alex.\"</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">endl</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">return</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e7bc37e08b511870616-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<p><strong> Kết quả:</strong></p>\r\n<div id=\"crayon-5f2e7bc37e08d447603307-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-v\">Hi</span><span class=\"crayon-o\">!</span></div>\r\n<div id=\"crayon-5f2e7bc37e08d447603307-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-e\">My </span><span class=\"crayon-e\">name </span><span class=\"crayon-st\">is</span> <span class=\"crayon-v\">Alex</span><span class=\"crayon-sy\">.</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><span class=\"crayon-sy\">Nguồn: <a href=\"https://techtalk.vn/gioi-thieu-ve-iostream-cout-cin-va-endl.html\">https://techtalk.vn/gioi-thieu-ve-iostream-cout-cin-va-endl.html</a></span></div>\r\n</div>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/10/mceu_52672240211596752510704.jpg', 0, '2020-08-09 01:00:00', 9, 2, 0),
(11, 'Một coder không có kĩ năng design cũng có thể tạo ra ứng dụng Web với 32 công cụ tiện lợi sau', 'mot-coder-khong-co-ki-nang-design-cung-co-the-tao-ra-ung-dung-web-voi-32-cong-cu-tien-loi-sau-1596739967714', 'Một coder không có kĩ năng design cũng có thể tạo ra ứng dụng Web với 32 công cụ tiện lợi sau', 'ádasdasdsadsa', '2020-08-07', '/../public/img/ImagePost/11/mceu_69698602111596739826111.jpg', 0, '2020-08-07 06:00:00', 20, 4, 0),
(12, 'Tìm hiểu về Synchronous và Asynchronous trong Javascript', 'tim-hieu-ve-synchronous-va-asynchronous-trong-javascript-1596740367942', 'JavaScript là ngôn ngữ lập trình Single-thread (đơn luồng), có nghĩa là tại 1 thời điểm chỉ có thể xử lý 1 lệnh.', 'dsadsadasdasda', '2020-08-07', '/../public/img/ImagePost/12/mceu_72251564811596740052676.png', 0, '2020-08-27 04:09:00', 17, 4, 0),
(13, 'Một số lệnh Javascript console hữu ích', 'mot-so-lenh-javascript-console-huu-ich-1596740726879', 'Một số lệnh Javascript console hữu ích', 'dsadsadsadsadas', '2020-08-07', '/../public/img/ImagePost/13/mceu_28981532311596740413432.png', 0, '2020-08-07 06:00:00', 17, 4, 0),
(14, 'Tối ưu hóa câu lệnh WHERE trong MySQL', 'toi-uu-hoa-cau-lenh-where-trong-mysql-1596817101185', 'Trong phần này sẽ nói về việc tối ưu hóa có thể thực hiện khi xử lý mệnh đề WHERE. Các ví dụ...', '<p><img src=\"http://localhost:3000/public/img/ImagePost/14/mceu_74792378211596816721372.jpg\" /></p>\r\n<p>Trong phần này sẽ nói về việc tối ưu hóa có thể thực hiện khi xử lý mệnh đề WHERE. Các ví dụ trong bài viết sử dụng mệnh đề SELECT, tuy nhiên việc tối ưu này có thể áp dụng cho cả câu lệnh WHERE trong DELETE và UPDATE.</p>\r\n<p style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\">Lưu ý: Series về tối ưu mình đang làm nên có nhiều chỗ tối ưu liên quan mình sẽ đề cập sau. Nên việc tối ưu WHERE ở đây mới chỉ là 1 phần.</span></p>\r\n<p>Bạn hay có thói quen viết các điều kiện giống như làm phép toán, gom các toán tử vào trong ngoặc để thực hiện nhanh hơn. Nhưng SQL thực hiện các tối ưu tương tự, vì vậy bạn cần phải tránh thực hiện điều này bằng cách biến đổi về phép toán dễ hiểu và dễ bảo trì hơn.</p>\r\n<ul>\r\n<li>Phá ngoặc</li>\r\n</ul>\r\n<div id=\"crayon-5f2ecdd49fed3385530843-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-i\">a</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">b</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-i\">c</span> <span class=\"crayon-st\">OR</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">(</span><span class=\"crayon-i\">a</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">b</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-i\">c</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">d</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fed3385530843-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\">-></span> <span class=\"crayon-sy\">(</span><span class=\"crayon-i\">a</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-i\">b</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">c</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-st\">OR</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-i\">a</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-i\">b</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-i\">c</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">d</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<ul>\r\n<li>Sắp xếp lại phép toán cho dễ hiểu hơn</li>\r\n</ul>\r\n<div id=\"crayon-5f2ecdd49fee2605092040-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">a</span><span class=\"crayon-o\"><</span><span class=\"crayon-i\">b</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-v\">c</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">a</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">5</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fee2605092040-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\">-></span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">></span><span class=\"crayon-cn\">5</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-i\">c</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">a</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">5</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<ul>\r\n<li>Rút gọn điều kiện về ít hơn</li>\r\n</ul>\r\n<div id=\"crayon-5f2ecdd49fee6468313970-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">b</span><span class=\"crayon-o\">>=</span><span class=\"crayon-cn\">5</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-st\">OR</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">6</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-cn\">5</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">5</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-st\">OR</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">7</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-cn\">5</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">6</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fee6468313970-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\">-></span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">5</span> <span class=\"crayon-st\">OR</span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">6</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<ul>\r\n<li>Biểu thức không đổi được sử dụng bởi các index và được đánh giá chỉ một lần. Ví dụ như table có INDEX(A, B, C, D)</li>\r\n</ul>\r\n<p style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">a</span><span class=\"crayon-o\"><</span><span class=\"crayon-i\">b</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-v\">c</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">a</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">5</span> <span class=\"crayon-i\">Ch</span>ỉ <span class=\"crayon-i\">s</span>ử <span class=\"crayon-i\">d</span>ụ<span class=\"crayon-i\">ng</span> đượ<span class=\"crayon-i\">c</span> <span class=\"crayon-e\">index </span><span class=\"crayon-i\">cho</span> <span class=\"crayon-cn\">1</span> <span class=\"crayon-i\">trong</span> <span class=\"crayon-cn\">2</span> <span class=\"crayon-i\">ph</span>é<span class=\"crayon-i\">p</span> <span class=\"crayon-st\">to</span>á<span class=\"crayon-e\">n</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-v\">a</span><span class=\"crayon-o\"><</span><span class=\"crayon-i\">b</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">b</span><span class=\"crayon-o\">=</span><span class=\"crayon-v\">c</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-i\">ho</span>ặ<span class=\"crayon-i\">c</span> <span class=\"crayon-v\">a</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">5</span></span></p>\r\n<p>Còn lại biểu thức tương đương b>5 AND b=c AND a=5 có thể sử dụng được tất cả các index cho cả biểu thức</p>\r\n<ul>\r\n<li>COUNT(<em>) trên một bảng mà không sử dụng WHERE được trả về trực tiếp từ thông tin bảng trong bảng MyISAM và bảng MEMORY. Điều này cũng tương tự với bất kì biểu thức NOT NULL nào được sử dụng với 1 bảng. Hiểu đơn giản là COUNT(</em>) với bảng đơn thì nó tự động lấy trong bảng MYISAM có sẵn chứ không phải truy vấn lại toàn bộ dữ liệu trong bảng nữa.</li>\r\n<li>HAVING được gộp với WHERE nếu bạn không sử dụng GROUP BY hoặc là các hàm aggregate (COUNT(), MIN(), ..).</li>\r\n<li>Với mỗi bảng trong 1 câu lệnh join, 1 câu lệnh WHERE đơn giản hơn được khởi tạo để ước lượng cho bảng và bỏ qua các dòng càng sớm càng tốt</li>\r\n<li>Tất cả các bảng ‘Không đổi’ được đọc đầu tiên trước các bảng còn lại trong truy vấn. Một bảng ‘Không đổi’ là 1 trong số các bảng sau:</li>\r\n</ul>\r\n<ol>\r\n<li>Bảng trống (không có dữ liệu) hoặc bảng có 1 row</li>\r\n<li>Một bảng với câu lệnh WHERE có điều kiện là PRIMARY KEY hoặc UNIQUE index. cái mà tất cả các index được so sánh với 1 biểu thức và được định nghĩa là NOT NULL. Ví dụ như:</li>\r\n</ol>\r\n<div id=\"crayon-5f2ecdd49feeb163558208-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e \">SELECT *</span> <span class=\"crayon-i\">FROM</span> <span class=\"crayon-i\">t</span> <span class=\"crayon-e\">WHERE </span><span class=\"crayon-v\">primary_key</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feeb163558208-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e \">SELECT *</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-v\">t1</span><span class=\"crayon-sy\">,</span><span class=\"crayon-e\">t2</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feeb163558208-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-e\">WHERE </span><span class=\"crayon-v\">t1</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">primary_key</span><span class=\"crayon-o\">=</span><span class=\"crayon-cn\">1</span> <span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">t2</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">primary_key</span><span class=\"crayon-o\">=</span><span class=\"crayon-v\">t1</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">id</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<ul>\r\n<li>Thứ tự JOIN được chọn bằng cách thử tất cả các trường hợp có thể. Nếu tất cả các cột trong ORDER BY và GROUP BY ở cùng 1 bảng, thì bảng đó được ưu tiên JOIN trước</li>\r\n<li>Nếu có 1 câu lệnh ORDER BY và 1 câu lệnh khác là GROUP BY hoặc có ORDER BY và GROUP BY chứa các cột ở các bảng khác với bảng đầu tiên ở hàng đợi join. 1 bảng tạm sẽ được tạo.</li>\r\n<li>Mỗi chỉ mục (index) của bảng được truy vấn, thì chỉ mục tốt nhất sẽ được sử dụng cho dù chúng ta nghĩ rằng việc quét bảng hiệu quả hơn. Ở mỗi lần, việc quét được sử dụng dựa trên bất kì index nào được mở rộng hơn 30% bảng đó, nhưng số phần trăm đó không xác định được việc lựa chọn giữa việc sử dụng index hay quét bảng. Trình tối ưu hóa bây giờ phức tạp hơn và dựa trên ước tính của nó dựa trên các yếu tố bổ sung như kích thước bảng, số lượng hàng và kích thước khối I / O.</li>\r\n<li>Trong một số trường hợp, MySQL có thể đọc thẳng các row từ index thậm chí là không động đến dữ liệu từ bảng. Nếu tất cả các cột được sử dụng từ index là số, chỉ có index tree (index tree) được sử dụng để giải quyết truy vấn.</li>\r\n<li>Trước khi mỗi row được trả về, nếu không đúng trong mệnh đề HAVING thì sẽ được bỏ qua</li>\r\n</ul>\r\n<p style=\"padding-left: 80px;\"><span style=\"font-family: \'arial black\', sans-serif;\">Sau đây là 1 vài truy vấn cực nhanh:</span></p>\r\n<div id=\"crayon-5f2ecdd49feef198126107-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">SELECT </span><span class=\"crayon-e\">COUNT</span><span class=\"crayon-sy\">(</span><span class=\"crayon-o\">*</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-v\">tbl_name</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-3\" class=\"crayon-line\" style=\"padding-left: 120px;\"></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">SELECT </span><span class=\"crayon-e\">MIN</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">,</span><span class=\"crayon-e\">MAX</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-v\">tbl_name</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-5\" class=\"crayon-line\" style=\"padding-left: 120px;\"></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">SELECT </span><span class=\"crayon-e\">MAX</span><span class=\"crayon-sy\">(</span><span class=\"crayon-v\">key_part2</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-7\" class=\"crayon-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-e\">WHERE </span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-o\">=</span><span class=\"crayon-v\">constant</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 120px;\"></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-9\" class=\"crayon-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-i\">SELECT</span> <span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-e\">ORDER </span><span class=\"crayon-e\">BY </span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-sy\">,</span><span class=\"crayon-v\">key_part2</span><span class=\"crayon-sy\">,</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-i\">LIMIT</span> <span class=\"crayon-cn\">10</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-11\" class=\"crayon-line\" style=\"padding-left: 120px;\"></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-i\">SELECT</span> <span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name</span></span></div>\r\n<div id=\"crayon-5f2ecdd49feef198126107-13\" class=\"crayon-line\" style=\"padding-left: 120px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-e\">ORDER </span><span class=\"crayon-e\">BY </span><span class=\"crayon-e\">key_part1 </span><span class=\"crayon-v\">DESC</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-e\">key_part2 </span><span class=\"crayon-v\">DESC</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-i\">LIMIT</span> <span class=\"crayon-cn\">10</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 120px;\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 80px;\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<ul>\r\n<li class=\"crayon-line\">MySQL thực hiện các truy vấn sau chỉ sử dụng index tree, giả sử rằng các cột được lập chỉ mục là số:</li>\r\n</ul>\r\n<div id=\"crayon-5f2ecdd49fef2810023096-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">SELECT </span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-sy\">,</span><span class=\"crayon-e\">key_part2 </span><span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name </span><span class=\"crayon-e\">WHERE </span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-o\">=</span><span class=\"crayon-v\">val</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fef2810023096-3\" class=\"crayon-line\" style=\"padding-left: 80px;\"></div>\r\n<div id=\"crayon-5f2ecdd49fef2810023096-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">SELECT </span><span class=\"crayon-e\">COUNT</span><span class=\"crayon-sy\">(</span><span class=\"crayon-o\">*</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fef2810023096-5\" class=\"crayon-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-e\">WHERE </span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-o\">=</span><span class=\"crayon-e\">val1 </span><span class=\"crayon-st\">AND</span> <span class=\"crayon-v\">key_part2</span><span class=\"crayon-o\">=</span><span class=\"crayon-v\">val2</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fef2810023096-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"></div>\r\n<div id=\"crayon-5f2ecdd49fef2810023096-7\" class=\"crayon-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\">SELECT </span><span class=\"crayon-e\">key_part2 </span><span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name </span><span class=\"crayon-e\">GROUP </span><span class=\"crayon-e\">BY </span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 80px;\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<ul>\r\n<li class=\"crayon-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">Các câu lệnh dưới đây sử dụng việc index để trả về các dòng kèm sắp xếp mà không cần phải ORDER BY riêng:</span></span></li>\r\n</ul>\r\n<div id=\"crayon-5f2ecdd49fef5583636799-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-i\">SELECT</span> <span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fef5583636799-3\" class=\"crayon-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-e\">ORDER </span><span class=\"crayon-e\">BY </span><span class=\"crayon-v\">key_part1</span><span class=\"crayon-sy\">,</span><span class=\"crayon-v\">key_part2</span><span class=\"crayon-sy\">,</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fef5583636799-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"></div>\r\n<div id=\"crayon-5f2ecdd49fef5583636799-5\" class=\"crayon-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-i\">SELECT</span> <span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-e\">FROM </span><span class=\"crayon-e\">tbl_name</span></span></div>\r\n<div id=\"crayon-5f2ecdd49fef5583636799-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-e\">ORDER </span><span class=\"crayon-e\">BY </span><span class=\"crayon-e\">key_part1 </span><span class=\"crayon-v\">DESC</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-e\">key_part2 </span><span class=\"crayon-v\">DESC</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">Nguồn: <a href=\"https://techtalk.vn/toi-uu-hoa-cau-lenh-where-trong-mysql.html\">https://techtalk.vn/toi-uu-hoa-cau-lenh-where-trong-mysql.html</a></span></span></div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/14/mceu_74792378211596816721372.jpg', 0, '2020-08-08 10:00:00', 2, 2, 0),
(15, 'Những chú ý khi chọn MySQL làm database', 'nhung-chu-y-khi-chon-mysql-lam-database-1596741189213', 'Những chú ý khi chọn MySQL làm database', '1dsadsadsadsadsaad', '2020-08-07', '/../public/img/ImagePost/15/mceu_39124580911596741078883.jpg', 0, '0000-00-00 00:00:00', 2, 4, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(16, 'Mô tả SQL Injection là gì và cách kiểm tra', 'mo-ta-sql-injection-la-gi-va-cach-kiem-tra-1596742018770', 'Mô tả SQL Injection là gì và cách kiểm tra', '<p><img src=\"http://localhost:3000/public/img/ImagePost/16/mceu_25404604711596741545202.png\" /></p>\r\n<p>Bài viết mô tả về sql injection và cách để kiểm tra ứng dụng web có bị lỗi sql injection hay không.</p>\r\n<p>SQL injection được coi là một trong những cách tấn công phổ biến nhất vì nó có thể mang lại hậu quả nghiêm trọng và có hại cho hệ hệ thống và dữ liệu nhạy cảm của bạn</p>\r\n<p><img src=\"http://localhost:3000/public/img/ImagePost/16/imagetools1.jpg\" width=\"752\" height=\"396\" /></p>\r\n<h2 id=\"sql-injection-là-gì\">SQL Injection là gì?</h2>\r\n<p>SQL injection là một kỹ thuật tấn công vào hệ thống cơ sở dữ liệu của ứng dụng (web, mobile hoặc desktop …) thông qua việc kẻ tấn công lợi dụng lỗ hổng kiểm tra dữ liệu đầu vào và thi hành các câu lệnh SQL bất hợp pháp. Hậu quả của hành động này có thể đáng báo động.</p>\r\n<p>Như chính tên của nó, mục đích của cuộc tấn công SQL injection là tiêm mã SQL bất hợp pháp, độc hại vào ứng dụng.</p>\r\n<p>Trong các ứng dụng có dữ liệu này được chỉ định đi đến cơ sở dữ liệu như:</p>\r\n<ul>\r\n<li>Biểu mẫu (form) đăng nhập – người dùng nhập dữ liệu đăng nhập</li>\r\n<li>Biểu mẫu tìm kiếm – người dùng nhập dữ liệu tìm kiếm</li>\r\n</ul>\r\n<p>Thay vì nhập dữ liệu chính xác, kẻ tấn cống sẽ nhập một câu lệnh truy vấn độc hại bất kỳ nào vào, thì có khả năng xảy ra một số thiệt hại nghiêm trọng đối với cơ sở dữ liệu và toàn bộ hệ thống.</p>\r\n<p>SQL injection được thực hiện với ngôn ngữ lập trình SQL. SQL (Structured Query Language) được sử dụng để quản lý dữ liệu được giữ trong cơ sở dữ liệu được lưu trong cơ sở dữ liệu. Do đó, trong cuộc tấn công SQL injection này, câu lệnh của SQL được sử dụng như một mã độc hại.</p>\r\n<p>Đây được coi là tấn công phổ biến nhất, vì cơ sở dữ liệu được sử dụng hầu hết cho tất cả các công nghệ.</p>\r\n<h2 id=\"hậu-quả-khi-bị-tấn-công-sql-injection\">Hậu quả khi bị tấn công SQL injection</h2>\r\n<p>Mục đích chính của tấn công này là hack cơ sở dữ liệu của hệ thống, vì hầu hết hệ thống hiện nay đều có cơ sở dữ liệu để lưu thông tin. Do đó hậu quả của cuộc tấn công này thực sự rất lớn.</p>\r\n<div class=\"td-a-rec td-a-rec-id-content_inline tdi_11_f20 td_block_template_1\">\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n</div>\r\n<p>Những điều sau đây có thể là kết quả của tấn công SQL injection:</p>\r\n<ul>\r\n<li>Hack tài khoản của người khác.</li>\r\n<li>Ăn cắp và sao chép dữ liệu nhạy cảm của trang web hoặc hệ thống.</li>\r\n<li>Thay đổi dữ liệu của hệ thống, gây ra sai lệch dữ liệu.</li>\r\n<li>Kẻ tấn công có thể đăng nhập với tư cách người dùng hợp pháp, ngay cả với tư cách quản trị viên.</li>\r\n<li>Kẻ tấn công có thể xem thông tin cá nhân thuộc về người dùng khác, ví dụ: chi tiết về hồ sơ (profile) của người dùng khác, chi tiết về giao dịch của họ, v.v..</li>\r\n<li>Kẻ tấn công có thể thay đổi thông tin cấu hình ứng dụng và dữ liệu của những người dùng khác.</li>\r\n<li>Kẻ tấn công có thể sửa đổi cấu trúc cơ sở dữ liệu; thậm chí xóa các bảng trong cơ sở dữ liệu của ứng dụng.</li>\r\n<li>Kẻ tấn công có thể kiểm soát máy chủ cơ sở dữ liệu và thực hiện các lệnh trên theo ý muốn.</li>\r\n</ul>\r\n<p>Những hậu quả được liệt kê ở trên thực sự có thể coi là nghiêm trọng, vì việc khôi phục cơ sở dữ liệu có thể tốn rất nhiều chi phí. Nó có thể khiến công ty mất danh tiếng. Do đó, việc bảo vệ hệ thống trước loại tấn công này và coi thử nghiệm bảo mật là một điều cần thiết hàng đầu và là một khoản đầu tư tốt cho danh tiếng sản phẩm và công ty.</p>\r\n<h2 id=\"bản-chất-của-tấn-công-sql-injection\">Bản chất của tấn công SQL injection</h2>\r\n<p>Để kiểm tra, trước tiên bạn cần tìm các phần hệ thống dễ bị tổn thương (vulnerable) và sau đó thử gửi một đoạn mã SQL độc hại thông qua các ô nhập dữ liệu đầu vào. Nếu hệ thống có lỗi này thì mã SQL độc hại được tiêm vào sẽ được gửi tới truy vấn cơ sở dữ liệu trong ứng dụng và thực thi nó.</p>\r\n<p>Bất kỳ vị trí nào có nhập dữ liệu đầu vào và có liên kết với cơ sở dữ liệu thì nên kiểm tra bằng cách: Thay vì nhập một dữ liệu chính xác tôi sẽ nhập bất kỳ một mã SQL độc hại nào và thấy hệ thống thực thi mã được nhập vào thì chính xác là đã gặp lỗi SQL injection.</p>\r\n<p>Để thực hiện cuộc tấn công này, phải thay đổi hành động và mục đích của một truy vấn cơ sở dữ liệu thích hợp với từng hoàn cảnh. Một trong những phương pháp khả thi để thực hiện nó là làm cho truy vấn luôn luôn đúng và sau đó chèn mã độc. Thay đổi truy vấn thành luôn luôn đúng có thể được thực hiện bằng một mã đơn giản <code>\' OR 1 = 1; --</code></p>\r\n<p>Người thực hiện kiểm tra nên ghi nhớ rằng trong khi kiểm tra xem việc đổi truy vấn thành luôn luôn đúng có thể được thực hiện hay không, thì nên thử các trích dẫn khác nhau – đơn và đôi. Dó đó , nếu đã thử một mã <code>\' OR 1=1;--</code>, cũng nên thử với <code>\" OR 1=1;--</code></p>\r\n<p><strong>Ví dụ:</strong> Hãy giả sử rằng có một truy vấn, đó là tìm kiếm từ đã nhập trong bảng cơ sở dữ liệu:</p>\r\n<p style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">select</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\">*</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">from</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-e\">notes </span><span class=\"crayon-v\">nt</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">where</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">nt</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">subject</span> <span class=\"crayon-o\">=</span> ‘<span class=\"crayon-v\">search</span><span class=\"crayon-sy\">_</span>word‘<span class=\"crayon-sy\">;</span></span></p>\r\n<p><span class=\"crayon-sy\">Thay vì tìm từ tìm kiếm, hãy nhập truy vấn SQL injection <code>\' OR 1=1;--</code>, thì truy vấn sẽ luôn luôn đúng. Và sẽ trở thành</span></p>\r\n<p style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">select</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\">*</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">from</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-e\">notes </span><span class=\"crayon-v\">nt</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">where</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">nt</span>.<span class=\"crayon-v\">subject</span> <span class=\"crayon-o\">=</span> ‘ ‘ <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">or</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"number\"</span><span class=\"crayon-o\">></span><span class=\"crayon-cn\">1</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"number\"</span><span class=\"crayon-o\">></span><span class=\"crayon-cn\">1</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span>;<span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"comment\"</span><span class=\"crayon-o\">></span><span class=\"crayon-o\">--</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></p>\r\n<p>Trong trường hợp này, tham số <code>subject</code> của người dùng được đóng với <code>\'</code> và sau đó chúng ra có mã <code>or 1=1</code>, điều này làm cho một truy vấn luôn luôn đúng. Với ký hiệu <code>--</code> sẽ <code>comment</code> phần còn lại của mã truy vấn sẽ, và phần mã phía sau sẽ không được thực thi. Đây là một trong những cách phổ biến nhất và dễ nhất để bắt đầu kiểm soát truy vấn.</p>\r\n<p><strong>Một số mã khác cũng có thể được sử dụng để làm cho truy vấn luôn luôn đúng, như:</strong></p>\r\n<ul>\r\n<li><code>‘ or ‘abc‘=‘abc‘;--</code></li>\r\n<li><code>‘ or ‘ ‘=‘ ‘;--</code></li>\r\n</ul>\r\n<p>Phần quan trọng nhất ở đây là sau khi có dấu phẩy, chúng ta có thể nhập bất kỳ mã độc nào, mà chúng ta muốn nó được thực thi. <strong>Ví dụ:</strong> Nó có thể là <code>‘ or 1=1; drop table users; --</code> Nếu câu lệnh tiêm trên được thực thi, thì bằng <code>users</code> trong cơ sở dữ liệu sẽ bị xóa. Nếu việc câu lệnh trên có thể chạy thì bất kỳ mã độc nào khác cũng có thể được viết vào. Trogn trường hợp này phụ thuộc vào kiến thức và mục đích của kẻ tấn công.</p>\r\n<h2 id=\"cách-kiểm-tra-sql-injection\">Cách kiểm tra SQL injection</h2>\r\n<p>Kiểm tra lỗ hổng này có thể được thực hiện rất dễ dàng. Đôi khi nó chỉ cần nhập một dấu hiệu bất thường nào như <code>‘ or “</code>. Nếu nó trả về bất kỳ thông báo bất ngờ (unexpected) nào, thì chúng ta chắc chắn rằng trường hợp này là SQL injection. <strong>Ví dụ:</strong>: Nếu nhận được thông báo lỗi như <code>Internal Server Error</code> trong kết quả tìm kiếm, thì có thể khẳng định rằng cuộc tấn công SQL injection này có thể xảy ra trong hệ thống.</p>\r\n<p><strong>Các kết quả khác, có thể thông báo rằng có thể tấn công SQL injection:</strong></p>\r\n<ul>\r\n<li>Trả về một trang trống.</li>\r\n<li>Không có thông báo lỗi hoặc thành công – chức năng và trang không phản ứng với đầu vào.</li>\r\n<li>Thông báo thành công cho mã độc được nhập vào.</li>\r\n</ul>\r\n<p>Hãy dựa vào trường hợp thực tế để đoán biết.</p>\r\n<p><strong>Ví dụ:</strong> Hãy kiểm tra xem cửa sổ đăng nhập có đễ bị tấn công đối với SQL injection không. Trong trường hợp này, trường username và mật khẩu, chỉ cần nhập dấu <code>\'</code> như ảnh bên dưới.</p>\r\n<p><img src=\"http://localhost:3000/public/img/ImagePost/16/mceu_50414669631596741864165.png\" /></p>\r\n<p>Nếu đầu vào trả về thông báo lỗi hoặc bất kỳ kết quả không phù hợp nào khác, thì có thể đoán chắc chắn rằng cuộc tấn công SQL injection có thể xảy ra. Thông báo lỗi giống với ảnh</p>\r\n<p><img src=\"http://localhost:3000/public/img/ImagePost/16/mceu_18547626841596741880130.png\" width=\"973\" height=\"149\" /></p>\r\n<p>Kiểm tra <code>SQL injection</code> bằng một trích dẫn <code>\'</code> là một cách đáng tin cậy để kiểm tra xem cuộc tấn công này có khả thi hay không.</p>\r\n<p>Nếu trích dẫn đơn <code>\'</code> không trả về bất kỳ kết quả không phù hợp nào, thì có thể thử nhập dấu nháy kép <code>\"</code> và kiểm tra kết quả.</p>\r\n<p>Ngoài ra, mã SQL để thay đổi truy vấn luôn luôn đúng <code>\'OR 1=1;--</code> có thể được coi là một cách để kiểm tra xem cuộc tấn công này có khả thi hay không. Nó đóng tham số và thay đổi truy vấn thành <code>True</code>. Do đó, nếu không được xác thực, đầu vào như vậy cũng có thể trả về bất kỳ kết quả không mong muốn nào và thông báo tương tự, và khẳng định rằng cuộc tấn công SQL injection có thể xảy ra trong trường hợp này.</p>\r\n<p>Kiểm tra các cuộc tấn công SQL có thể được thực hiện từ liên kết của trang web. Giả sử chúng tôi có một liên kết <code>http://35.190.155.168/cf5ef2940d/fetch?id=1</code> trả về nội dung của một file ảnh. Trong trường hợp này, <code>id</code> là tham số và <code>1</code> là giá trị của nó.</p>\r\n<p><img src=\"http://localhost:3000/public/img/ImagePost/16/mceu_43541375451596741931982.png\" /></p>\r\n<p><img src=\"http://localhost:3000/public/img/ImagePost/16/mceu_98933276961596741947717.png\" width=\"1002\" height=\"159\" /></p>\r\n<p>Không chỉ có thông báo lỗi không mong muốn mới có thể được coi là lỗ hổng SQL injejction. Nhiều người kiểm tra kiểm tra các cuộc tấn công có thể chỉ theo thông báo lỗi. Tuy nhiên, cần nhớ rằng, không có thông báo lỗi xác thực hoặc thông báo thành công nào cho mã cũng có thể là một dấu hiệu, rằng cuộc tấn công này khả thi.</p>\r\n<h2 id=\"tổng-kết\">Tổng kết</h2>\r\n<ul>\r\n<li>Qua bài viết mình đã giới thiệu về SQL injection, bản chất và cách kiểm tra một ứng dụng có lỗi SQL injection hay không.</li>\r\n<li>Từ đây có thể áp dụng để thực thi những câu lệnh SQL phức tạp hơn</li>\r\n</ul>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/mo-ta-sql-injection-la-gi-va-cach-kiem-tra.html\">techtalk.vn</a></p>', '2020-08-07', '/../public/img/ImagePost/16/mceu_25404604711596741545202.png', 0, '0000-00-00 00:00:00', 3, 4, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(17, 'Sử dụng trigger trong SQL qua ví dụ cơ bản', 'su-dung-trigger-trong-sql-qua-vi-du-co-ban-1596748031953', 'Sử dụng trigger trong SQL qua ví dụ cơ bản', '<p><img src=\"http://localhost:3000/public/img/ImagePost/17/mceu_36121736411596742086026.png\" /></p>\r\n<h2 id=\"_trigger-la-gi--0\">Trigger là gì ?</h2>\r\n<p>Hiểu đơn giản thì Trigger là một stored procedure không có tham số. Trigger thực thi một cách tự động khi một trong ba câu lệnh Insert, Update, Delete làm thay đổi dữ liệu trên bảng có chứa trigger. </p>\r\n<h2 id=\"_cu-phap-cua-trigger-1\">Cú pháp của Trigger</h2>\r\n<div id=\"crayon-5f2e52e650fb5386112302-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">CREATE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">TRIGGER</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-i\">t</span>ê<span class=\"crayon-v\">n_trigger</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">ON</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-i\">t</span>ê<span class=\"crayon-v\">n</span><span class=\"crayon-sy\">_</span>bả<span class=\"crayon-v\">ng</span></span></div>\r\n<div id=\"crayon-5f2e52e650fb5386112302-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">FOR</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-e\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-sy\">{</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">DELETE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">,</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">INSERT</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">,</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">UPDATE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e52e650fb5386112302-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">AS</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fb5386112302-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-i\">c</span>â<span class=\"crayon-v\">u</span><span class=\"crayon-sy\">_</span>lệ<span class=\"crayon-v\">nh</span><span class=\"crayon-sy\">_</span>sql</span></div>\r\n<div class=\"crayon-line\">\r\n<h2 id=\"_trigger-dung-lam-gi--2\">Trigger dùng làm gì ?</h2>\r\n<ul>\r\n<li>Trigger thường được sử dụng để kiểm tra ràng buộc (check constraints) trên nhiều quan hệ (nhiều bảng/table) hoặc trên nhiều dòng (nhiều record) của bảng.</li>\r\n<li>Ngoài ra việc sử dụng Trigger để chương trình có những hàm chạy ngầm nhằm phục vụ nhưng trường hợp hữu hạn và thường không sử dụng cho mục đích kinh doanh hoặc giao dịch.\r\n<h2 id=\"_bai-toan-dat-ra-3\">Bài toán đặt ra.</h2>\r\n<ul>\r\n<li>Bạn có 2 bảng kho hàng và đặt hàng liên kết với nhau bởi mã hàng.</li>\r\n</ul>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/0bfa534f-4e0a-41c1-93ea-eefed9e48688.jpg\" srcset=\"https://images.viblo.asia/retina/0bfa534f-4e0a-41c1-93ea-eefed9e48688.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/0bfa534f-4e0a-41c1-93ea-eefed9e48688.jpg\" /></p>\r\n<ul>\r\n<li>Khi người dùng đặt hàng hãy tự động cập nhật số lượng tồn trong bảng kho hàng.</li>\r\n</ul>\r\n</li>\r\n</ul>\r\n<h3 id=\"_giai-phap-4\">Giải pháp</h3>\r\n<ul>\r\n<li>Khi người dùng đặt hàng ta chỉ có 3 loại thao tác chính với CSDL là : <strong>Insert, Delete, Update</strong></li>\r\n<li>Vậy chỉ cần tạo <strong>3 trigger</strong> tương ứng là ok </li>\r\n<li>Người dùng <strong>đặt hàng</strong>: <strong>Số lượng còn trong kho = Số lượng còn – Số lượt đặt</strong></li>\r\n<li>Người dùng <strong>hủy</strong> không đặt hàng nữa: <strong>Số lượng còn trong kho = Số lượng còn + Số lượt đặt</strong></li>\r\n<li>Người dùng <strong>cập nhật</strong> Số lượng đặt => <strong>Số lượng còn tăng giảm tùy ý</strong></li>\r\n</ul>\r\n<h3 id=\"_van-de-5\">Vấn đề</h3>\r\n<ul>\r\n<li>Ở 2 trường hợp <strong>insert</strong> và <strong>delete</strong> ta thực hiện bình thường. Nhưng trong trường hợp <strong>update</strong> Số lượng hàng tồn sẽ sảy ra trong 3 trường hợp sau.</li>\r\n</ul>\r\n<ol>\r\n<li>Số lượng đặt ban đầu = 5 sau đó tăng lên 10 => số lượng trong kho sẽ giảm 10 tương ứng</li>\r\n<li>Số lượng đặt lúc này = 10 sau đó giảm xuống 3 => số lượng trong kho sẽ tăng 7 tương ứng</li>\r\n</ol>\r\n<ul>\r\n<li>Tận dụng việc trong sql câu lệnh <strong>update = Insert new row To Delete old row</strong> cõ nghĩa là khi thực hiện update CSDL trong sql sẽ chạy việc insert dữ liệu mới trước sau đó sẽ xóa đi bảng cũ.</li>\r\n</ul>\r\n<h3 id=\"_giai-quyet-van-de-6\">Giải quyết vấn đề</h3>\r\n<ul>\r\n<li style=\"list-style-type: none;\">\r\n<ul>\r\n<li style=\"list-style-type: none;\">\r\n<ul>\r\n<li>Tận dụng việc sử dụng Trigger luôn tồn tại 2 bảng <strong>inserted</strong> và <strong>deleted</strong> ta sẽ rút ra 1 công thức cập nhật trung trong mọi trường hợp</li>\r\n</ul>\r\n</li>\r\n</ul>\r\n</li>\r\n</ul>\r\n<p style=\"padding-left: 80px;\"><span style=\"font-family: helvetica, arial, sans-serif;\"><span class=\"crayon-v\">SLTonKhoCu</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">SLTonKhoCu</span> <span class=\"crayon-o\">-</span> <span class=\"crayon-v\">inserted</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">SLDatHang</span> <span class=\"crayon-o\">+</span> <span class=\"crayon-v\">deleted</span><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">SLDatHang</span></span></p>\r\n<h2 id=\"_thuc-hien-qua-vi-du-nho-7\">Thực hiện qua ví dụ nhỏ</h2>\r\n<ol>\r\n<li>Ban đầu thêm dữ liệu và select nó ra </li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/1b6a380e-ed71-4c91-9211-0f303d251e8f.jpg\" srcset=\"https://images.viblo.asia/retina/1b6a380e-ed71-4c91-9211-0f303d251e8f.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/1b6a380e-ed71-4c91-9211-0f303d251e8f.jpg\" /></p>\r\n<ol start=\"2\">\r\n<li>Đặt hàng 5 sản phẩm với mã là 1</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/5a74b671-67c2-4907-b545-ec8d21146159.jpg\" srcset=\"https://images.viblo.asia/retina/5a74b671-67c2-4907-b545-ec8d21146159.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/5a74b671-67c2-4907-b545-ec8d21146159.jpg\" /></p>\r\n<ol start=\"3\">\r\n<li>Cập nhật lên 10</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/2f0016c4-cf66-4157-9519-fc7e8c6bf256.jpg\" srcset=\"https://images.viblo.asia/retina/2f0016c4-cf66-4157-9519-fc7e8c6bf256.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/2f0016c4-cf66-4157-9519-fc7e8c6bf256.jpg\" /></p>\r\n<ol start=\"4\">\r\n<li>Cập nhật về 3</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/c9f6f792-3c76-411e-b31e-def08fdb0de2.jpg\" srcset=\"https://images.viblo.asia/retina/c9f6f792-3c76-411e-b31e-def08fdb0de2.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/c9f6f792-3c76-411e-b31e-def08fdb0de2.jpg\" /></p>\r\n<div class=\"td-a-rec td-a-rec-id-content_inline tdi_11_5e2 td_block_template_1\">\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n</div>\r\n<ol start=\"5\">\r\n<li>Cập nhật một số thông tin khác mà không liên quan đến số lượng</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/39354844-7fdd-483b-8afb-fd76d2ff183f.jpg\" srcset=\"https://images.viblo.asia/retina/39354844-7fdd-483b-8afb-fd76d2ff183f.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/39354844-7fdd-483b-8afb-fd76d2ff183f.jpg\" /></p>\r\n<ol start=\"6\">\r\n<li>Xóa đơn đặt hàng</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/d084beb6-3619-4b4d-ab40-4bb761bed742.jpg\" srcset=\"https://images.viblo.asia/retina/d084beb6-3619-4b4d-ab40-4bb761bed742.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/d084beb6-3619-4b4d-ab40-4bb761bed742.jpg\" /></p>\r\n<h2 id=\"_source-code-bai-toan--8\">Source code bài toàn </h2>\r\n<ol>\r\n<li>Trigger thêm</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/180efac6-8957-48a8-bc32-b2b468e20b79.jpg\" srcset=\"https://images.viblo.asia/retina/180efac6-8957-48a8-bc32-b2b468e20b79.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/180efac6-8957-48a8-bc32-b2b468e20b79.jpg\" /></p>\r\n<ol start=\"2\">\r\n<li>Trigger Xóa</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/b47c2e3d-6a33-4d3c-84c5-bd514cffda6f.jpg\" srcset=\"https://images.viblo.asia/retina/b47c2e3d-6a33-4d3c-84c5-bd514cffda6f.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/b47c2e3d-6a33-4d3c-84c5-bd514cffda6f.jpg\" /></p>\r\n<ol start=\"3\">\r\n<li>Trigger Sửa</li>\r\n</ol>\r\n<p><img class=\"medium-zoom-image\" src=\"http://localhost:3000/public/img/ImagePost/17/4fd20b47-fd9c-4106-b395-d62a1dfef081.jpg\" srcset=\"https://images.viblo.asia/retina/4fd20b47-fd9c-4106-b395-d62a1dfef081.jpg 2x\" alt=\"\" data-zoom-target=\"https://images.viblo.asia/1600/4fd20b47-fd9c-4106-b395-d62a1dfef081.jpg\" /></p>\r\n<div id=\"crayon-5f2e52e650fc7176294422-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token comment\"</span><span class=\"crayon-o\">></span><span class=\"crayon-c\">/* cập nhật hàng trong kho sau khi đặt hàng hoặc cập nhật */</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">CREATE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">TRIGGER</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">trg_DatHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">ON</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_DatHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">AFTER</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">INSERT</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">AS</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">BEGIN</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">UPDATE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">SET</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongTon</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongTon</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">></span><span class=\"crayon-o\">-</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">(</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">SELECT</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongDat</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">FROM</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">inserted</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">WHERE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">MaHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">FROM</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">JOIN</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">inserted</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">ON</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">inserted</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">END</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-v\" style=\"font-family: georgia, palatino, serif;\">GO</span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token comment\"</span><span class=\"crayon-o\">></span><span class=\"crayon-c\">/* cập nhật hàng trong kho sau khi cập nhật đặt hàng */</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">CREATE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">TRIGGER</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">trg_CapNhatDatHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">on</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_DatHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">after</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">update</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">AS</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">BEGIN</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">UPDATE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">SET</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongTon</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongTon</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">></span><span class=\"crayon-o\">-</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">(</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">SELECT</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongDat</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">FROM</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">inserted</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">WHERE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">MaHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">></span><span class=\"crayon-o\">+</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">(</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">SELECT</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongDat</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">FROM</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">deleted</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">WHERE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">MaHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">FROM</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-22\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">JOIN</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">deleted</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">ON</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">deleted</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-23\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">end</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-24\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-v\" style=\"font-family: georgia, palatino, serif;\">GO</span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-25\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token comment\"</span><span class=\"crayon-o\">></span><span class=\"crayon-c\">/* cập nhật hàng trong kho sau khi hủy đặt hàng */</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-26\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">create</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">TRIGGER</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">trg_HuyDatHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">ON</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_DatHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">FOR</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">DELETE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">AS</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-27\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">BEGIN</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-28\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">UPDATE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-29\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">SET</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongTon</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongTon</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">></span><span class=\"crayon-o\">+</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">(</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">SELECT</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">SoLuongDat</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">FROM</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">deleted</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">WHERE</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">MaHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-30\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">FROM</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-31\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">JOIN</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">deleted</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">ON</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">tbl_KhoHang</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span> <span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token operator\"</span><span class=\"crayon-o\">>=</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span> <span class=\"crayon-v\">deleted</span><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token punctuation\"</span><span class=\"crayon-o\">></span><span class=\"crayon-sy\">.</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">MaHang</span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-32\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-e\">span </span><span class=\"crayon-t\">class</span><span class=\"crayon-o\">=</span><span class=\"crayon-s\">\"token keyword\"</span><span class=\"crayon-o\">></span><span class=\"crayon-st\">END</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">span</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e52e650fc7176294422-33\" class=\"crayon-line\"></div>\r\n<div class=\"crayon-line\">\r\n<h2 id=\"_ket-luan-9\">Kết luận</h2>\r\n<p>Việc mà bạn sử dụng Trigger là không bắt buộc và chúng ta thường tưởng rằng vì thế mà chả ai dùng nó là hoàn toàn sai . Nhưng Trigger theo như mình tìm hiểu qua thì vẫn có rất nhiều nơi sẽ sử dụng nó vào mục đích riêng của họ.</p>\r\n<p>Cảm ơn vì các bạn đã đọc.</p>\r\n<p>Nguồn:<a href=\"https://techtalk.vn/su-dung-trigger-trong-sql-qua-vi-du-co-ban-2.html\"> techtalk.vn</a></p>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/17/mceu_36121736411596742086026.png', 0, '0000-00-00 00:00:00', 3, 4, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(18, 'Tìm hiểu về Stored-Procedure & Trigger trong SQL', 'tim-hieu-ve-stored-procedure--trigger-trong-sql-1596748857785', 'Tìm hiểu về Stored-Procedure & Trigger trong SQL', '<p><img src=\"http://localhost:3000/public/img/ImagePost/18/mceu_57736650411596746149257.png\" /></p>\r\n<h3><strong>1. Stored-Procedure:</strong></h3>\r\n<ul>\r\n<li>Là các chương trình trong SQL Server.</li>\r\n<li>Đặc tính:\r\n<ul style=\"list-style-type: square;\">\r\n<li>Cho phép truyền các tham số đầu vào và chấp nhận trả về các giá trị chứa trong các tham số hoặc trả về các trạng thái giá trị để gọi những thủ tục hoặc thực hiện các xử lý theo lô để biết việc thực hiện thành công hay thất bại, nếu thất bại thì có thể đưa ra nguyên nhân thấp bại.</li>\r\n<li>Bao gồm cả các lệnh gọi các thủ tục thực thi khác, chứa các lệnh SQL của chương trình để thực hiện các xử lý trong database.</li>\r\n</ul>\r\n</li>\r\n<li>Ta có thể dùng Transact–SQL EXCUTE để thực thi các stored procedure. Stored procedure khác với các hàm xử lý là giá trị trả về của chúng không chứa trong tên và chúng không được sử dụng trực tiếp trong biểu thức.</li>\r\n<li>So với các chương trình cục bộ, Stored procedure co ưu điểm hơn là:\r\n<ul style=\"list-style-type: square;\">\r\n<li><strong>Động</strong>: Stored procedure cho phép điều chỉnh chương trình cho phù hợp: Chúng ta có chỉ tạo stored procedure một lần và lưu trữ trong database một lần, trong chương trình chúng ta có thể gọi nó với số lần bất kỳ. Stored procedure có thể được chỉ rõ do một người nào đó tạo ra và sự thay đổi của chúng hoàn toàn độc lập với source code của chương trình.</li>\r\n<li><strong>Nhanh hơn</strong>: Stored procedure có khả năng phân tích cú pháp và tối ưu hóa trong lần thực thi đầu tiên và một phiên bản dịch của chúng trong đó sẽ được lưu trong bộ nhớ để sử dụng cho lần sau, nghĩa là trong những lần thực hiện sau chúng không cần phải phân tích cú pháp và tối ưu lại, mà chúng sẽ sử dụng kết quả đã được biên dịch trong lần đầu tiên. Do đó stored procedure có khả năng thực thi nhanh hơn là việc xử lý một đoạn lệnh Transact – SQL lớn, lặp.</li>\r\n<li><strong>Giảm thiểu bandwidth</strong>: Với một sử lý sử dụng Transact-SQL có tới hàng trăm câu lệnh đơn được đồng thời gửi đi dẫn tới tình trạng ngốn bandwidth hoặc có thể là quá tải. Stored procedure cải thiện được vấn đề này bằng cách gửi theo trình tự xử lý. Đồng thời stored procedure còn có thể phân tích cú pháp và tối ưu hóa cậu lệnh trong lần thực thi đầu, giúp cải thiện câu lệnh tốt hơn.</li>\r\n<li><strong>Bảo mật</strong>: Phân cấp quyền sử dụng cho các user, cấp quyền, giới hạn quyền cho các user thậm chí họ không được phép thực thi trực tiếp những stored procedure này. Khi đó sẽ hạn chế, loại bỏ các vấn đề xâm phạm dữ liệu không được cấp phép.</li>\r\n</ul>\r\n</li>\r\n<li>Định nghĩa về một stored procedure:\r\n<ul style=\"list-style-type: square;\">\r\n<li>Tên của stored procedure</li>\r\n<li>Các tham số</li>\r\n<li>Thân của stored procedure: bao gồm các lệnh của Transact-SQL dùng để thực thi procedure.</li>\r\n</ul>\r\n</li>\r\n<li>Cú pháp:</li>\r\n</ul>\r\n<div id=\"crayon-5f2e5662f0a52143569366\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e5662f0a52143569366-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\">CREATE</span> <span class=\"crayon-e\">PROCEDURE</span><span class=\"crayon-h\"> </span><span class=\"crayon-e\">procedure_name</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a52143569366-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\">--</span> <span class=\"crayon-e\">The</span> <span class=\"crayon-e\">variable</span> <span class=\"crayon-e\">parameter</span> <span class=\"crayon-st\">in</span><span class=\"crayon-o\">/</span><span class=\"crayon-e\">out</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a52143569366-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span><span class=\"crayon-sy\">@</span><span class=\"crayon-e\">parameter </span><span class=\"crayon-e\">data_type </span><span class=\"crayon-v\">input</span><span class=\"crayon-o\">/</span><span class=\"crayon-i\">output</span> <span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a52143569366-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-st\" style=\"font-family: \'arial black\', sans-serif;\">AS</span></div>\r\n<div id=\"crayon-5f2e5662f0a52143569366-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-e\" style=\"font-family: \'arial black\', sans-serif;\">Begin</span></div>\r\n<div id=\"crayon-5f2e5662f0a52143569366-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">[</span><span class=\"crayon-r\">Declare</span> <span class=\"crayon-e\">variables</span> <span class=\"crayon-st\">for</span> <span class=\"crayon-e\">processing</span><span class=\"crayon-sy\">]</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a52143569366-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span><span class=\"crayon-v\">Transact</span><span class=\"crayon-o\">-</span><span class=\"crayon-e\">SQL </span><span class=\"crayon-v\">statements</span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a52143569366-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-st\" style=\"font-family: \'arial black\', sans-serif;\">End</span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<ul>\r\n<li>Lưu ý: Trong SQL Server, có thể ghi tắt một số từ khóa mà tên có chiều dài hơn 4 ký tự.<br />\r\n<blockquote>\r\n<p>Ví dụ: <strong>có thể thay thế Create Procedure bằng Create Proc.</strong></p>\r\n</blockquote>\r\n</li>\r\n<li>Khai báo biến và gán giá trị cho biến, Ghi chú<br />\r\n<div id=\"crayon-5f2e5662f0a5c551951835\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e5662f0a5c551951835-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-o\">--</span> <span class=\"crayon-r\">Declare</span> <span class=\"crayon-e\">variables</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5c551951835-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-r\">DECLARE</span><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">@</span><span class=\"crayon-e\">parameter_name </span><span class=\"crayon-v\">data_type</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5c551951835-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-o\">--</span> <span class=\"crayon-e\">Assigning </span><span class=\"crayon-e\">values </span><span class=\"crayon-st\">to</span> <span class=\"crayon-e\">variables</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5c551951835-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-i\">SET</span> <span class=\"crayon-sy\">@</span><span class=\"crayon-v\">parameter_name</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e\">value</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5c551951835-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-i\">SELECT</span> <span class=\"crayon-sy\">@</span><span class=\"crayon-v\">parameter_name</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-v\">value</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5c551951835-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-o\">--</span> <span class=\"crayon-e\">Show </span><span class=\"crayon-e\">notice</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5c551951835-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-i\">print</span> <span class=\"crayon-i\">N</span><span class=\"crayon-s\">\'message\'</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5c551951835-9\" class=\"crayon-line\"></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n</li>\r\n<li>Notes: Biên dịch và gọi thực thi một stored-procedure</li>\r\n<li>Biên dịch : Chọn toàn bộ mã lệnh Tạo stored-procedure => Nhấn F5</li>\r\n<li>Gọi thực thi một store-Procedure đã được biên dịch bằng lệnh exec:<br />\r\n<div id=\"crayon-5f2e5662f0a5f828909361\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e5662f0a5f828909361-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\">EXECUTE </span><span class=\"crayon-v\">procedure_name</span> <span class=\"crayon-o\">--</span><span class=\"crayon-v\">Stored</span><span class=\"crayon-o\">-</span><span class=\"crayon-e\">proc </span><span class=\"crayon-e\">nonparametric</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a5f828909361-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\">EXEC </span><span class=\"crayon-e\">procedure_name </span><span class=\"crayon-v\">Para1_value</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">Para2_value</span><span class=\"crayon-sy\">,</span> … <span class=\"crayon-o\">--</span><span class=\"crayon-v\">Stored</span><span class=\"crayon-o\">-</span><span class=\"crayon-e\">proc </span><span class=\"crayon-e\">with </span><span class=\"crayon-i\">parameters</span></span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n</li>\r\n<li>Lệnh cập nhật Procedure<br />\r\n<div id=\"crayon-5f2e5662f0a62057079847\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e5662f0a62057079847-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\">ALTER</span> <span class=\"crayon-e\">PROCEDURE</span><span class=\"crayon-h\"> </span><span class=\"crayon-e\">procedure_name</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a62057079847-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">[</span> <span class=\"crayon-sy\">{</span><span class=\"crayon-sy\">@</span><span class=\"crayon-e\">parameter </span><span class=\"crayon-v\">data</span><span class=\"crayon-sy\">_</span>type <span class=\"crayon-sy\">}</span> <span class=\"crayon-sy\">]</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a62057079847-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">AS</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a62057079847-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">Begin</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a62057079847-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">[</span><span class=\"crayon-r\">Declare</span> <span class=\"crayon-e\">variables</span> <span class=\"crayon-st\">for</span> <span class=\"crayon-e\">processing</span><span class=\"crayon-sy\">]</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a62057079847-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span><span class=\"crayon-v\">Transact</span><span class=\"crayon-o\">-</span><span class=\"crayon-e\">SQL </span><span class=\"crayon-v\">statements</span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a62057079847-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">End</span></span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n</li>\r\n<li>Lệnh xóa Procedure<br />\r\n<div id=\"crayon-5f2e5662f0a64521163841\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\">DROP </span><span class=\"crayon-e\">PROCEDURE </span><span class=\"crayon-v\">procedure</span><span class=\"crayon-sy\">_</span>name</span></div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n</li>\r\n</ul>\r\n<h3><strong>2. Trigger:</strong></h3>\r\n<ul style=\"list-style-type: circle;\">\r\n<li>Mỗi khi có sự thay đổi về dữ liệu ở một bảng dữ liệu cụ thể nào đó hoặc các thao tác, xử lý sử dụng các lệnh như: insert, update, delete làm thay đổi Trigger sẽ được gọi. Khá giống với store procedure nhưng đặc biện hơn. Trigger có thể chứ các lệnh truy vấn từ các bảng khác hay những lệnh SQL phức tạp hơn store procedure rất nhiều.</li>\r\n<li>Ưu điểm, thuận lợi khi sử dụng trigger:\r\n<ul>\r\n<li><strong>Tự động</strong>: Trigger sẽ tự động được gọi: Trigger sẽ ngay tức được kích hoạt mỗi khi có sự thay đổi dữ liệu trên bảng dữ liệu.</li>\r\n<li>Trigger có thể thực hiện cascade khi việc thi hành có ảnh hưởng đến những bảng liên quan.</li>\r\n<li>Trigger có những hiệu lực ít bị hạn chế hơn so với ràng buộc giá trị nghĩa là có thể ràng buộc tham chiếu đến những cột của những bảng dữ liệu khác.</li>\r\n</ul>\r\n</li>\r\n<li>Khi trigger được kích hoạt bởi 1 lệnh Transact-SQL insert để thêm một bộ mới vào bảng ABC thì bộ mới này được lưu tạm thời vào một bảng tạm có tên là inserted có cùng cấu trúc với bảng ABC. Khi kết thúc trigger này thì bộ dữ liệu mới thật sự lưu xuống CSDL.</li>\r\n<li><strong>An toàn</strong>: Các bảng, các bộ dữ liệu bị xóa sẽ được chuyển tạm vào các bảng tạm deleted tương tự như đối với lệnh delete.</li>\r\n<li>Cú pháp\r\n<ul>\r\n<li style=\"list-style-type: none;\">\r\n<ul>\r\n<li>Lệnh tạo Trigger<br />\r\n<div id=\"crayon-5f2e5662f0a67832442560\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e5662f0a67832442560-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\">Create </span><span class=\"crayon-e\">Trigger </span><span class=\"crayon-e\">trigger_name </span><span class=\"crayon-e\">on </span><span class=\"crayon-e\">table_name</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a67832442560-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\"> </span><span class=\"crayon-st\">For</span><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">[</span><span class=\"crayon-v\">insert</span><span class=\"crayon-sy\">,</span><span class=\"crayon-v\">update</span><span class=\"crayon-sy\">,</span><span class=\"crayon-e\">delete</span><span class=\"crayon-sy\">]</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a67832442560-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">As</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a67832442560-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">Begin</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a67832442560-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span><span class=\"crayon-r\">Declare</span> <span class=\"crayon-e\">variables </span><span class=\"crayon-st\">for</span> <span class=\"crayon-v\">processing</span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a67832442560-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span><span class=\"crayon-v\">Transact</span><span class=\"crayon-o\">-</span><span class=\"crayon-e\">SQL </span><span class=\"crayon-v\">statements</span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e5662f0a67832442560-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-st\">End</span></span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n</li>\r\n<li>Lệnh xóa Trigger<br />\r\n<div id=\"crayon-5f2e5662f0a6a157927369\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\"> </div>\r\n<div class=\"crayon-main\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span style=\"font-family: \'arial black\', sans-serif;\"><span class=\"crayon-e\">Drop </span><span class=\"crayon-e\">Trigger </span><span class=\"crayon-v\">trigger</span><span class=\"crayon-sy\">_</span>Name</span></span></div>\r\n</div>\r\n</li>\r\n</ul>\r\n</li>\r\n</ul>\r\n</li>\r\n</ul>\r\n<p> </p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/tim-hieu-ve-stored-procedure-trigger-trong-sql-2.html\">techtalk.vn</a></p>', '2020-08-07', '/../public/img/ImagePost/18/mceu_57736650411596746149257.png', 0, '0000-00-00 00:00:00', 3, 4, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(19, 'Tìm hiểu về Migration trong Laravel', 'tim-hieu-ve-migration-trong-laravel-1596747974217', 'Tìm hiểu về Migration trong Laravel', '<p><img src=\"http://localhost:3000/public/img/ImagePost/19/mceu_75396245911596746188753.png\" width=\"455\" height=\"341\" /></p>\r\n<p>Xin chào các anh em. Mở đầu cho series <strong>Laravel và những điều thú vị về nó</strong> , hôm nay mình sẽ giới thiệu với các bạn về cách sử dụng Migrations trong Laravel.</p>\r\n<h2 id=\"_1gioi-thieu-chung-0\">1.Giới thiệu chung</h2>\r\n<p>Migration giống như một hệ thống quản lý phiên bản giống như Git nhưng dành cho cơ sở dữ liệu của bạn. Migration cho phép bạn định nghĩa các bảng trong CSDL, định nghĩa nội dung các bảng cũng như cập nhật thay đổi các bảng đó hoàn toàn bằng PHP. Đồng thời các thao tác với CSDL này còn có thể sử dụng trên các loại CSDL khác nhau như MySQL, SQL Server, Postgres, … mà không cần phải chỉnh sửa lại code theo CSDL sử dụng.<br />Điều kiện tiên quyết để chạy migration một cách thành công:</p>\r\n<ul>\r\n<li>Phải có kết nối với database .</li>\r\n<li>migrations muốn sử dụng được thì phải nằm trong thư mục App\\database\\migrations</li>\r\n</ul>\r\n<h2 id=\"_2thu-tao-mot-migration-thu-xem-sao-1\">2.Thử tạo một Migration thử xem sao</h2>\r\n<p>Để tạo một migration chúng ta có 2 cách để tạo, một là chúng ta sẽ vào database/migrations tạo một file mới trong đó. Nhưng cách này thường mọi người không dùng nhiều lắm, mọi người hay dùng cách thao tác với command line.<br />Để tạo một migration ta sẽ sử dụng câu lệnh <strong>make:migration</strong> File migration mới sẽ được đặt trong thư mục database/migrations</p>\r\n<p><img class=\"medium-zoom-image aligncenter\" src=\"https://images.viblo.asia/a9dc3662-29a1-4946-82b9-7b2337639f21.png\" srcset=\"https://images.viblo.asia/retina/a9dc3662-29a1-4946-82b9-7b2337639f21.png 2x\" alt=\"\" data-src=\"https://images.viblo.asia/a9dc3662-29a1-4946-82b9-7b2337639f21.png\" data-zoom-src=\"https://images.viblo.asia/full/a9dc3662-29a1-4946-82b9-7b2337639f21.png\" /></p>\r\n<p>Mỗi file migration được đặt tên bao gồm timestamp để xác định thứ tự migartion với nhau. Ví dụ để tạo mới một bảng posts mới trong CSDl ta sẽ sử dụng câu lệnh sau : <code>php artisan make:migration create_table_posts_table --create=posts.</code></p>\r\n<p>Khi ta nhấn enter thì ngay lập tức trong file sẽ được tạo trong folder database/migration và nội dung của file sẽ như sau:</p>\r\n<div id=\"crayon-5f2e579f8fc7d299269445\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e579f8fc7d299269445-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-sy\">?</span><span class=\"crayon-e\">php</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">use</span> <span class=\"crayon-v\">Illuminate</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Support</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Facades</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Schema</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">use</span> <span class=\"crayon-v\">Illuminate</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Database</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Schema</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Blueprint</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">use</span> <span class=\"crayon-v\">Illuminate</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Database</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Migrations</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Migration</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">class</span> <span class=\"crayon-e\">CreatePostsTable</span> <span class=\"crayon-r\">extends</span> <span class=\"crayon-e\">Migration</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">{</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\">/**</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * Run the migrations.</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> *</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * @return void</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> */</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-m\">public</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-e\">up</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">create</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'posts\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-i\">Blueprint</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">increments</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'id\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">timestamps</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-22\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-23\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\">/**</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-24\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * Reverse the migrations.</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-25\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> *</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-26\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * @return void</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-27\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> */</span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-28\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-m\">public</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-e\">down</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-29\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-30\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">dropIfExists</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'posts\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-31\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc7d299269445-32\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\">}</span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<p>Để thêm các trường của bảng posts trong CSDL ta sẽ thêm vào <code>function up()</code> trong file migration.</p>\r\n<div id=\"crayon-5f2e579f8fc85506733920\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e579f8fc85506733920-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-m\">public</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-e\">up</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">create</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'posts\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-i\">Blueprint</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">increments</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'id\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-t\">string</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'slide_url\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-t\">string</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'title\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-t\">string</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'content\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">timestamps</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc85506733920-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<p>Sau đó để tạo bảng trong CSDL thì chúng ta sẽ dùng câu lênh: <code>php artisan migrate</code><br />Bây giờ một vấn đề phát sinh la khi chúng ta nhanh tay migrate mà sực nhớ ra là chúng ta thiếu trường <strong>status</strong> của bảng posts . Đừng lo , chúng ta chỉ cần tạo một file migration mới với tham số trong command là –table=posts. Lệnh sẽ là :<br /><code>php artisan make:migration add_attribute_status_into_posts_table --table=posts</code></p>\r\n<div id=\"crayon-5f2e579f8fc89376705798\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e579f8fc89376705798-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-sy\">?</span><span class=\"crayon-e\">php</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">use</span> <span class=\"crayon-v\">Illuminate</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Support</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Facades</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Schema</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">use</span> <span class=\"crayon-v\">Illuminate</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Database</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Schema</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Blueprint</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">use</span> <span class=\"crayon-v\">Illuminate</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Database</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Migrations</span><span class=\"crayon-sy\">\\</span><span class=\"crayon-v\">Migration</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-t\">class</span> <span class=\"crayon-e\">AddAttributeStatusIntoPostsTable</span> <span class=\"crayon-r\">extends</span> <span class=\"crayon-e\">Migration</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">{</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\">/**</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * Run the migrations.</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> *</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * @return void</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> */</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-m\">public</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-e\">up</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">table</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'posts\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-i\">Blueprint</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">tinyInteger</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'status\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-22\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\">/**</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-23\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * Reverse the migrations.</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-24\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> *</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-25\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> * @return void</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-26\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-c\" style=\"font-family: verdana, geneva, sans-serif;\"> */</span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-27\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-m\">public</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-e\">down</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-28\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-29\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">dropColumn</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'status\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-30\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc89376705798-31\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\">}</span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<p>Và sau đó chúng ta lại migrate như bình thường.hihi<br />Nếu các bạn chạy lệnh php artisan migrate mà bị lỗi “class not found” thì hãy thử thực thi câu lệnh này: <code>composer dump-autoload</code> trước rồi lại migrate như bình thường nhé.</p>\r\n<h2 id=\"_chu-y-2\">Chú ý.</h2>\r\n<p>Suýt quên có ai để ý đến là khi chúng ta cài một project mới toanh thì đã có sẵn 2 file migration trong thư mục database/migration và khi ta migrate lần đâu tiên thì khi xem trong CSDL của chúng ta sẽ xuất hiện bảng migrations</p>\r\n<p style=\"padding-left: 80px;\"><br /><img class=\"medium-zoom-image aligncenter\" src=\"https://images.viblo.asia/1e588b76-f67b-4510-9ce9-3bc4ecd73a0e.png\" srcset=\"https://images.viblo.asia/retina/1e588b76-f67b-4510-9ce9-3bc4ecd73a0e.png 2x\" alt=\"\" data-src=\"https://images.viblo.asia/1e588b76-f67b-4510-9ce9-3bc4ecd73a0e.png\" data-zoom-src=\"https://images.viblo.asia/full/1e588b76-f67b-4510-9ce9-3bc4ecd73a0e.png\" /></p>\r\n<div class=\"td-a-rec td-a-rec-id-content_inline tdi_11_27e td_block_template_1\">\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n<div id=\"b-g-i-net-RExjRFZvMll1Vmc9\"></div>\r\n</div>\r\n<p>Các bạn chú ý đến <code>column batch</code>, cột này chúng ta có thể hiểu là migrations tạo ở lượt mấy, ví dụ như bảng migrations ở trên 3 migration có id 1 2 3 được migrate ở lần 1, migration có id = 4 được migrate ở lần 2,…<br />Các bạn có chú ý rằng tên migration không , nó thể hiện được thời gian mình tạo migration và 6 con số radom sau thời gian được ghi trong file migration thể hiện file migration nào được tạo trước, file migration nào được tạo sau.</p>\r\n<p>Một điều nữa là tại sao 1 project mới lại có 2 file sẵn migration ở trong database/migrations , mình đoán là người viết ra cái framework Laravel này tiên đoán được là một hệ thống bao giờ cũng có chức năng login/logout/regisster nên đã tạo sẵn cho mình 2 migration đấy =)))</p>\r\n<p>Thêm một điều nữa là khi chúng ta muốn migrate 1 file migration thôi thì chúng ta sẽ dùng câu lệnh: <code>php artisan migrate --path=...</code><br />VD: chúng ta chỉ muốn chạy file migration 2014_10_12_000000_create_users_table thì chúng ta có thể tạo 1 folder mới database/migrations/users chứa file migration trên và chạy lệnh php artisan migrate –path=database/migrations/users</p>\r\n<h2 id=\"_3rollbackmigrate-trong-mot-cau-lenh-3\">3.Rollback/Migrate trong một câu lệnh.</h2>\r\n<p>Câu lệnh <code>php artisan migrate:refresh</code> sẽ đầu tiên rollback lại toàn bộ migration của chương trình, và thực hiện câu lệnh migrate. Tức là thực hiện function down() xong rồi thực hiện function up() trong file migration.<br />Câu lệnh sẽ thực hiện tái cấu trúc toàn bộ database:<br /><code>php artisan migrate:refresh</code><br /><code>php artisan migrate:refresh --seed</code><br />Tham số <code>--seed</code> là để chạy tất cả các Seeder chúng ta sẽ tìm hiểu trong bài sau .<br />Nếu muốn thực hiện function down() với số lượng batch muốn rollback thì ta dùng câu lệnh: <code>php artisan migrate:rollback -step=n</code></p>\r\n<h2 id=\"_4schema-4\">4.Schema</h2>\r\n<p>Bây giờ chúng ta sẽ tìm hiểu kỹ hơn <code>Schema</code> facade thực thi như nào nhé. Trong file migration để dùng <code>Schema</code> thì chúng ta sẽ <code>use Illuminate\\Support\\Facades\\Schema</code>.<br />Nếu muốn tạo một bảng mới trong DB của mình thì chúng ta có thể sử dụng</p>\r\n<div id=\"crayon-5f2e579f8fc8b644058058\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e579f8fc8b644058058-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">create</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-i\">Blueprint</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc8b644058058-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">increments</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'id\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc8b644058058-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<p>Nếu các bạn muốn kiểm tra xem <code>table</code> hoặc <code>column</code> có tồn tại hay không thì ta dùng</p>\r\n<div id=\"crayon-5f2e579f8fc90604630922\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e579f8fc90604630922-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">if</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">hasTable</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc90604630922-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\">//</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc90604630922-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e579f8fc90604630922-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc90604630922-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-st\">if</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">hasColumn</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'email\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc90604630922-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\">//</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc90604630922-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: verdana, geneva, sans-serif;\">}</span></div>\r\n<div id=\"crayon-5f2e579f8fc90604630922-9\" class=\"crayon-line\"></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<p>Nếu muốn đổi tên bảng từ <code>post</code> sang <code>posts</code> thì ta dùng</p>\r\n<div id=\"crayon-5f2e579f8fc92768736273\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">rename</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'post\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'posts\'</span><span class=\"crayon-sy\">)</span></span></div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<p>Khi chúng ta muốn xóa bảng thì có thể sử dụng <code>Schema::drop()</code></p>\r\n<div id=\"crayon-5f2e579f8fc95690521592\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-plain-wrap\">\r\n<div id=\"crayon-5f2e579f8fc95690521592-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">drop</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc95690521592-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e579f8fc95690521592-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">dropIfExists</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">)</span></span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e579f8fc95690521592-5\" class=\"crayon-line\"></div>\r\n</div>\r\n<div class=\"crayon-main\"> </div>\r\n</div>\r\n<h3 id=\"_cac-kieu-column-5\">Các kiểu column.</h3>\r\n<table style=\"border-collapse: collapse; width: 62.0727%; height: 111px;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%; text-align: center;\"><span style=\"font-size: 14pt;\"><strong>Command</strong></span></td>\r\n<td style=\"width: 50%; text-align: center;\"><span style=\"font-size: 14pt;\"><strong>Description</strong></span></td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->bigIncrements(\'id\');</code></td>\r\n<td style=\"width: 50%;\">Tăng ID (primary key) sư dụng như “UNSIGNED BIG INTEGER”.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->bigInteger(\'votes\');</code></td>\r\n<td style=\"width: 50%;\">Tương đương với BIGINT.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->binary(\'data\');</code></td>\r\n<td style=\"width: 50%;\">Tương đương với BLOB.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->boolean(\'confirmed\');</code></td>\r\n<td style=\"width: 50%;\">Tương đương với BOOLEAN.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->char(\'name\', 4);</code></td>\r\n<td style=\"width: 50%;\">Tương đương với CHAR với độ dài cho trước.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->date(\'created_at\');</code></td>\r\n<td style=\"width: 50%;\">Tương đương với DATE.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->dateTime(\'created_at\');</code></td>\r\n<td style=\"width: 50%;\">Tương đương với DATETIME.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->dateTimeTz(\'created_at\');</code></td>\r\n<td style=\"width: 50%;\">Tương đương với DATETIME (with timezone).</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->decimal(\'amount\', 5, 2);</code></td>\r\n<td style=\"width: 50%;\">Tương đương với DECIMAL với độ chính sách và phần thập phân.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->double(\'column\', 15, 8);</code></td>\r\n<td style=\"width: 50%;\">Tương đương với DOUBLE với độ chính xác, 15 chữ số và 8 ký tự tính sau dấu phảy.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->enum(\'choices\', [\'foo\', \'bar\']);</code></td>\r\n<td style=\"width: 50%;\">Tương đương với ENUM.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->float(\'amount\', 8, 2);</code></td>\r\n<td style=\"width: 50%;\">Tương đương với FLOAT, 8 chữ số and 2 chữ số tính sau dấu phẩy.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->increments(\'id\');</code></td>\r\n<td style=\"width: 50%;\">Tăng ID (primary key) sử dụng như “UNSIGNED INTEGER”.</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->integer(\'votes\');</code></td>\r\n<td style=\"width: 50%;\">tương đương với INTEGER</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->ipAddress(\'visitor\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với IP address</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->json(\'options\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với JSON</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->jsonb(\'options\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với JSONB</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->longText(\'description\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với LONGTEXT</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->macAddress(\'device\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với MAC address</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->mediumInteger(\'numbers\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với MEDIUMINT</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->mediumText(\'description\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với MEDIUMTEXT</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->morphs(\'taggable\')</code></td>\r\n<td style=\"width: 50%;\">thêm INTEGER taggable_id và STRING taggable_type</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->nullableTimestamps()</code></td>\r\n<td style=\"width: 50%;\">giống với timestamps(), ngoại trừ việc cho phép sử dụng NULLs</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->rememberToken()</code></td>\r\n<td style=\"width: 50%;\">thêm remember_token như VARCHAR(100) NULL</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->smallInteger(\'votes\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với SMALLINT</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->softDeletes()</code></td>\r\n<td style=\"width: 50%;\">thêm deleted_at column để soft deletes</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->string(\'email\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với VARCHAR</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->string(\'name\', 100)</code></td>\r\n<td style=\"width: 50%;\">tương đương với VARCHAR có độ dài</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->text(\'description\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với TEXT</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->time(\'sunrise\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với TIME</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->timeTz(\'sunrise\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với TIME (với timezone)</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->tinyInteger(\'numbers\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với TINYINT</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->timestamp(\'added_on\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với TIMESTAMP</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->timestampTz(\'added_on\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với TIMESTAMP</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->timestamps()</code></td>\r\n<td style=\"width: 50%;\">thêm vào hai column created_at và updated_at</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 49.931%;\"><code>$table->uuid(\'id\')</code></td>\r\n<td style=\"width: 50%;\">tương đương với UUID</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<h3 id=\"_column-modifier-6\">Column Modifier</h3>\r\n<p>Nhiều khi chúng ta có thể muốn cột trong table có giá trị <code>null</code> hay <code>not null</code>, vì thế Laravel hỗ trợ các modifier<br />Ví dụ như ta muốn để cột <code>address</code> trong table <code>users</code> được phép <code>null</code></p>\r\n<div id=\"crayon-5f2e579f8fc98526829565-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">table</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc98526829565-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-t\">string</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'address\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">nullable</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e579f8fc98526829565-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: verdana, geneva, sans-serif;\"><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\">Và còn rất nhiều modifier nữa các bạn có thể tham khảo tại bảng dưới đây</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<table style=\"border-collapse: collapse; width: 65.2626%; height: 364px;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<th style=\"width: 32.9137%;\"><strong>Modifier</strong></th>\r\n<th style=\"width: 67.0863%;\"><strong>Description</strong></th>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">after(‘column’)</td>\r\n<td style=\"width: 67.0863%;\">Đặt column “after” một column khác (MySQL Only)</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">comment(‘my comment’)</td>\r\n<td style=\"width: 67.0863%;\">Thêm một comment cho column</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">default($value)</td>\r\n<td style=\"width: 67.0863%;\">Đặt giá trị “mặc định” vào column</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">first()</td>\r\n<td style=\"width: 67.0863%;\">Đặt column “first” vào trong bảng (MySQL Only)</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">nullable()</td>\r\n<td style=\"width: 67.0863%;\">Cho phép dữ liệu kiểu NULL có thể chèn vào column</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">storedAs($expression)</td>\r\n<td style=\"width: 67.0863%;\">Tạo một cột stored (MySQL Only)</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">unsigned()</td>\r\n<td style=\"width: 67.0863%;\">Đặt cột integer sang UNSIGNED</td>\r\n</tr>\r\n<tr>\r\n<td style=\"width: 32.9137%;\">virtualAs($expression)</td>\r\n<td style=\"width: 67.0863%;\">Tạo một cột virtual (MySQL Only)</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<h3 id=\"_modifying-columns-7\">Modifying Columns</h3>\r\n<p>Các bạn có thể mở terminal lên và cài thư viện <code>doctrine</code> để có thể sử dụng các hàm hữu ích trong nó.<code>composer require doctrine/dbal</code><br />Chúng ta thường hay mắc phảỉ sau khi migrate bảng rồi lại sực nhớ ra mình lại không muốn đặt tên cột như thế nữa. Để giải quyết vấn đề đó , thư viện <code>doctrine</code> có hàm xử lý được.</p>\r\n<div id=\"crayon-5f2e579f8fc9b906199985-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">table</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></div>\r\n<div id=\"crayon-5f2e579f8fc9b906199985-3\" class=\"crayon-line\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">renameColumn</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'from\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-s\">\'to\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e579f8fc9b906199985-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\">Hay một vấn đề nữa đó chính là mình muốn giới hạn giá trị kiểu dữ liệu của một cột</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2e579f8fc9e591342984-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">table</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></div>\r\n<div id=\"crayon-5f2e579f8fc9e591342984-3\" class=\"crayon-line\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-t\">string</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'name\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-cn\">50</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">nullable</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">change</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e579f8fc9e591342984-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h3 id=\"_foreign-key-constraints-8\">Foreign Key Constraints</h3>\r\n<p>Đôi khi chúng ta muốn tạo các rằng buộc cho các bảng, chúng ta có thể sử dụng cú pháp sau để rằng buộc cho 2 bảng:</p>\r\n<div id=\"crayon-5f2e579f8fca0272776999-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">table</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'posts\'</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-t\">function</span> <span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></div>\r\n<div id=\"crayon-5f2e579f8fca0272776999-3\" class=\"crayon-line\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-t\">integer</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'user_id\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">-></span><span class=\"crayon-t\">unsigned</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e579f8fca0272776999-4\" class=\"crayon-line crayon-striped-line\"></div>\r\n<div id=\"crayon-5f2e579f8fca0272776999-5\" class=\"crayon-line\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">table</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">foreign</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'user_id\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">references</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'id\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-o\">-></span><span class=\"crayon-e\">on</span><span class=\"crayon-sy\">(</span><span class=\"crayon-s\">\'users\'</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e579f8fca0272776999-6\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\">}</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\">Chú ý nếu không migrate mà không chạy được thì các bạn có thể tách ra làm 2 file migration để chạy.<br />Để drop một foreign ta dùng : <code>$table->dropForeign(\'posts_user_id_foreign\');</code><br />Chúng ta nên để ý quy tắc đặt tên foreign <code><tên_table>_<tên_khóa_ngoại>_foreign</code><br />Bạn có thể kích hoạt hay bỏ kích hoạt việc sử dụng foreign key constraint trong migration sử dụng hai hàm sau:</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2e579f8fca3700314309-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">enableForeignKeyConstraints</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div id=\"crayon-5f2e579f8fca3700314309-3\" class=\"crayon-line\"></div>\r\n<div id=\"crayon-5f2e579f8fca3700314309-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-v\">Schema</span><span class=\"crayon-o\">::</span><span class=\"crayon-e\">disableForeignKeyConstraints</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h2 id=\"_5ket-luan-9\">5.Kết luận</h2>\r\n<p>Mình đã giới thiệu cho các những cái gì cơ bản nhất về Migration trong Laravel , hẹn các trong bài viết sau. Mọi thắc mắc cần giải đáp hãy để lại comment ở phía dưới nhé!</p>\r\n<p>Nguồn:<a href=\"https://techtalk.vn/tim-hieu-ve-migration-trong-laravel.html\">techtalk.vn</a> </p>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n<p><code></code></p>', '2020-08-07', '/../public/img/ImagePost/19/mceu_75396245911596746188753.png', 0, '0000-00-00 00:00:00', 16, 4, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(20, 'Tìm hiểu về Comments trong C++ và ý nghĩa của nó', 'tim-hieu-ve-comments-trong-c-va-y-nghia-cua-no-1596750455078', 'Một bình luận(comment) là một ghi chú dễ đọc của lập trình viên được chèn trực tiếp vào code của chương trình. Nó sẽ bị bỏ qua bởi trình biên dịch và chỉ dành cho lập trình viên sử dụng.', '<p><strong>Một bình luận(comment) là một ghi chú dễ đọc của lập trình viên được chèn trực tiếp vào code của chương trình. Nó sẽ bị bỏ qua bởi trình biên dịch và chỉ dành cho lập trình viên sử dụng.</strong></p>\r\n<p><img src=\"http://localhost:3000/public/img/ImagePost/20/mceu_79274131911596750450464.jpg\" /></p>\r\n<p><strong>Trong C ++ có hai kiểu Comment khác nhau, cả hai đều phục vụ cùng một mục đích: để giúp các lập trình viên lưu giữ lại một vài thông tin nào đó để giúp đọc code dễ hiểu hơn.</strong></p>\r\n<h2><span id=\"1_Comment_don_dong\" class=\"ez-toc-section\"><strong>1. Comment đơn dòng</strong></span></h2>\r\n<p>Biểu tượng // là bắt đầu một <strong>Comment</strong> trong một dòng của C ++, thông báo cho trình biên dịch bỏ qua mọi thứ từ biểu tượng // đến cuối dòng. Ví dụ:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Hello world!\"</span><span class=\"crayon-sy\">;</span><span style=\"font-size: 12pt; color: #ced4d9;\"> <span class=\"crayon-c\">// Everything from here to the end of the line is ignored</span></span></span></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Thông thường, comment một dòng được sử dụng để nhận xét nhanh về một dòng code đó.</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid; height: 10px;\" border=\"1\">\r\n<tbody>\r\n<tr style=\"height: 10px;\">\r\n<td style=\"width: 49.931%; height: 10px;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e81c459628475-2\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Hello world!\\n\"</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// std::cout lives in the iostream library</span></span></div>\r\n<div id=\"crayon-5f2e59d35e81c459628475-3\" class=\"crayon-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"It is very nice to meet you!\\n\"</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// these comments make the code hard to read</span></span></div>\r\n<div id=\"crayon-5f2e59d35e81c459628475-4\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Yeah!\\n\"</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// especially when lines are different lengths</span></span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Có các comment ở bên phải của một dòng có thể làm cho cả code và comment khó đọc, đặc biệt nếu dòng đó dài. Nếu các dòng khá ngắn, các comment có thể được căn chỉnh (thường là dùng tab), như vậy:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e81f909430415-2\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Hello world!\\n\"</span><span class=\"crayon-sy\">;</span><span class=\"crayon-h\"> </span><span class=\"crayon-c\">// std::cout lives in the iostream library</span></span></div>\r\n<div id=\"crayon-5f2e59d35e81f909430415-3\" class=\"crayon-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"It is very nice to meet you!\\n\"</span><span class=\"crayon-sy\">;</span> <span class=\"crayon-c\">// this is much easier to read</span></span></div>\r\n<div id=\"crayon-5f2e59d35e81f909430415-4\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Yeah!\\n\"</span><span class=\"crayon-sy\">;</span></span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Tuy nhiên, nếu các dòng comment dài thì khi đặt comment ở bên phải có thể làm cho các dòng của bạn thực sự dài. Trong trường hợp đó, các comment một dòng thường được đặt ở phía trên của dòng code mà ta đang muốn comment:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e821581394123-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// std::cout lives in the iostream library</span></div>\r\n<div id=\"crayon-5f2e59d35e821581394123-3\" class=\"crayon-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Hello world!\\n\"</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e821581394123-4\" class=\"crayon-line crayon-striped-line\"></div>\r\n<div id=\"crayon-5f2e59d35e821581394123-5\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// this is much easier to read</span></div>\r\n<div id=\"crayon-5f2e59d35e821581394123-6\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"It is very nice to meet you!\\n\"</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e821581394123-7\" class=\"crayon-line\"></div>\r\n<div id=\"crayon-5f2e59d35e821581394123-8\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// don\'t you think so?</span></div>\r\n<div id=\"crayon-5f2e59d35e821581394123-9\" class=\"crayon-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span class=\"crayon-v\">cout</span> <span class=\"crayon-o\"><<</span> <span class=\"crayon-s\">\"Yeah!\\n\"</span><span class=\"crayon-sy\">;</span></span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p><em><strong>Chú ý:</strong></em></p>\r\n<p><em><strong>Các comment trên chỉ là ví dụ về việc comment đoạn code. Bởi vì các đoạn chương trình có một ý nghĩa cụ thể nào đó. Thay vào đó, chúng ta đặt comment vào đó để chứng minh các khái niệm hoặc là ý nghĩa cụ thể một cách, ngắn gọn súc tích cho một dòng code nào đó.</strong></em></p>\r\n<p><em><strong>Nếu bạn muốn biên dịch một đoạn code ở trên</strong> thì bạn cần phải biến nó thành một chương trình đầy đủ để nó biên dịch. Thông thường, chương trình đó sẽ trông giống như thế này:</em></p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e824137159667-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-p\" style=\"color: #e67e23; font-size: 14pt;\">#include </span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e824137159667-3\" class=\"crayon-line\"></div>\r\n<div id=\"crayon-5f2e59d35e824137159667-4\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span style=\"color: #2dc26b;\"><span class=\"crayon-t\">int</span> </span><span style=\"color: #236fa1;\"><span class=\"crayon-e\">main</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">)</span></span></span></div>\r\n<div id=\"crayon-5f2e59d35e824137159667-5\" class=\"crayon-line\"><span class=\"crayon-sy\" style=\"color: #ffffff; font-size: 14pt;\">{</span></div>\r\n<div id=\"crayon-5f2e59d35e824137159667-6\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-h\"> </span><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// Viết các dòng code trên vào đây hoặc những dòng code nào đó tuỳ ý bạn!</span></span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e824137159667-7\" class=\"crayon-line\"></div>\r\n<div id=\"crayon-5f2e59d35e824137159667-8\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-h\"> <span style=\"color: #ffffff;\"> </span></span><span class=\"crayon-st\">return</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e59d35e824137159667-9\" class=\"crayon-line\"><span class=\"crayon-sy\" style=\"color: #ffffff; font-size: 14pt;\">}</span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<h2><span id=\"2_Comment_nhieu_dong\" class=\"ez-toc-section\"><strong>2. Comment nhiều dòng</strong></span></h2>\r\n<p>Cặp /* và */ để biểu thị comment trên nhiều dòng kiểu C. Tất cả mọi thứ ở giữa các biểu tượng đó sẽ được bỏ qua khi biên dịch.</p>\r\n<div id=\"crayon-5f2e59d35e827727078690\" class=\"crayon-syntax crayon-theme-sublime-text crayon-font-monaco crayon-os-pc print-yes notranslate crayon-wrapped\" data-settings=\" minimize scroll-always wrap\">\r\n<div class=\"crayon-main\">\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e827727078690-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">/* This is a multi-line comment.</span></div>\r\n<div id=\"crayon-5f2e59d35e827727078690-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> This line will be ignored.</span></div>\r\n<div id=\"crayon-5f2e59d35e827727078690-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> So will this one. */</span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Vì mọi thứ giữa các biểu tượng đều bị bỏ qua, đôi khi bạn sẽ thấy các lập trình viên làm đẹp cho các comment đa dòng của họ như sau:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e829824691475-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">/* This is a multi-line comment.</span></div>\r\n<div id=\"crayon-5f2e59d35e829824691475-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> * the matching asterisks to the left</span></div>\r\n<div id=\"crayon-5f2e59d35e829824691475-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> * can make this easier to read</span></div>\r\n<div id=\"crayon-5f2e59d35e829824691475-5\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> */</span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Comment kiểu nhiều dòng không thể được lồng nhau. Do đó, sau đây sẽ có kết quả bất ngờ:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 0.899281%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e82c147042861-2\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ced4d9; font-size: 12pt;\"><span class=\"crayon-c\">/* This is a multi-line /* comment */</span> <span style=\"color: #3598db;\"><span class=\"crayon-r\">this</span> <span class=\"crayon-st\">is</span> <span class=\"crayon-st\">not</span></span> <span style=\"color: #e03e2d;\"><span class=\"crayon-e\">inside </span><span class=\"crayon-e\">the </span></span><span class=\"crayon-e \"><span style=\"color: #e03e2d;\">comment</span> *</span><span class=\"crayon-o\">/</span></span></div>\r\n<div id=\"crayon-5f2e59d35e82c147042861-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// The above comment ends at the first */, not the second */</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Khi trình biên dịch cố gắng biên dịch cái này, nó sẽ bỏ qua mọi thứ từ / * đến * /. Vì đây những dòng comment không phải ở bên trong * / thì không được coi là một phần của comment nhiều dòng, trình biên dịch sẽ cố gắng biên dịch nó. Điều đó chắc chắn sẽ dẫn đến một lỗi biên dịch.</p>\r\n<p>Đây là một nơi mà việc sử dụng cú pháp tô màu ký tự có thể thực sự hữu ích, vì comment có cách tô màu khác với các dòng bình thường nên chung ta sẽ dễ đang thấy rõ những gì là comment or không phải.</p>\r\n<p><em><strong>Cảnh báo</strong></em></p>\r\n<p><strong><em>Đừng sử dụng các comments nhiều dòng bên trong các comments nhiều dòng khác. Nên gộp các comment một dòng trong một comment nhiều dòng là được.</em></strong></p>\r\n<h2><span id=\"3_Su_dung_comment_dung_muc_dich\" class=\"ez-toc-section\"><strong>3. Sử dụng comment đúng mục đích</strong></span></h2>\r\n<p>Thông thường, comment nên được sử dụng khi nào?. Đối với một thư viện, chương trình hoặc hàm nhất định, các comment được sử dụng để mô tả những gì thư viện, chương trình hoặc hàm đó làm gì. Chúng thường được đặt ở đầu file hoặc thư viện hoặc ngay trước hàm. Ví dụ:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e82e547546723-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\">// This program calculates the student\'s final grade based on his test and homework scores.</span></div>\r\n<div id=\"crayon-5f2e59d35e82e547546723-3\" class=\"crayon-line\"></div>\r\n<div id=\"crayon-5f2e59d35e82e547546723-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\">// This function uses newton\'s method to approximate the root of a given equation.</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e82e547546723-5\" class=\"crayon-line\"></div>\r\n<div id=\"crayon-5f2e59d35e82e547546723-6\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\">// The following lines generate a random item based on rarity, level, and a weight factor.</span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Tất cả các comment này cung cấp cho người đọc biết về những gì thư viện, chương trình hoặc hàm đang cố gắng thực hiện mà không cần phải xem or đọc code. Người dùng (có thể là người khác hoặc bạn nếu bạn đang cố gắng sử dụng lại code mà bạn đã viết trước đó) có thể cho biết ngay code đó có liên quan đến những gì họ đang cố gắng thực hiện hay không. Điều này đặc biệt quan trọng khi làm việc trong một nhóm, nơi mà không phải ai cũng sẽ quen thuộc với tất cả các code của nhau.</p>\r\n<p>Thứ hai, trong một thư viện, chương trình hoặc hàm được mô tả ở trên, các comment có thể được sử dụng để mô tả cách sử dụng code đó để thực hiện gì đó.</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e831585128907-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\">/* To calculate the final grade, we sum all the weighted midterm and homework scores</span></div>\r\n<div id=\"crayon-5f2e59d35e831585128907-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\"> and then divide by the number of scores to assign a percentage. This percentage is</span></div>\r\n<div id=\"crayon-5f2e59d35e831585128907-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\"> used to calculate a letter grade. */</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p> </p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e834774271687-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// To generate a random item, we\'re going to do the following:</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e834774271687-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// 1) Put all of the items of the desired rarity on a list</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e834774271687-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// 2) Calculate a probability for each item based on level and weight factor</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e834774271687-5\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// 3) Choose a random number</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e834774271687-6\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// 4) Figure out which item that random number corresponds to</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"> </div>\r\n<div id=\"crayon-5f2e59d35e834774271687-7\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">// 5) Return the appropriate item</span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Những comment này cung cấp cho người dùng ý tưởng về cách mà code sẽ hoàn thành công việc của mình mà không cần phải hiểu từng dòng code riêng lẻ làm gì.</p>\r\n<p>Ở cấp độ câu lệnh, các comment nên được sử dụng để mô tả lý do tại sao code đang làm gì đó. Viết code mà có comment thì code đó không được tốt cho mấy. Nếu bạn từng viết code phức tạp đến mức cần một comment để giải thích những gì một câu lệnh đang làm, có lẽ bạn cần phải viết lại câu lệnh của bạn cho tới khi không cần comment nó.</p>\r\n<p>Dưới đây là một số ví dụ về comment xấu và comment tốt.</p>\r\n<p>Comment xấu:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 0.899281%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e836341752258-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #e67e23;\">// Set sight range to 0</span></div>\r\n<div id=\"crayon-5f2e59d35e836341752258-3\" class=\"crayon-line\"><span style=\"font-size: 12pt; color: #ced4d9;\"><span class=\"crayon-v\">sight</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Lý do: Chúng ta đã có thể tự thấy rằng biến trên đang được đặt thành 0 mà không cần nhìn vào comment.</p>\r\n<p>Comment tốt:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e839938504091-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #e67e23; font-size: 12pt;\">// The player just drank a potion of blindness and can not see anything</span></div>\r\n<div id=\"crayon-5f2e59d35e839938504091-3\" class=\"crayon-line\"><span style=\"color: #ced4d9; font-size: 12pt;\"><span class=\"crayon-v\">sight</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Lý do: Bây giờ chúng tôi biết lý do tại sao biến trên của người chơi đang được đặt thành 0</p>\r\n<p>Comment xấu:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e83b463443385-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #e67e23; font-size: 12pt;\">// Calculate the cost of the items</span></div>\r\n<div id=\"crayon-5f2e59d35e83b463443385-3\" class=\"crayon-line\"><span style=\"color: #ced4d9; font-size: 12pt;\"><span class=\"crayon-v\">cost</span> <span class=\"crayon-o\">=</span> <span class=\"crayon-e \">quantity *</span> <span class=\"crayon-cn\">2</span> <span class=\"crayon-o\">*</span> <span class=\"crayon-v\">storePrice</span><span class=\"crayon-sy\">;</span></span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Lý do: Chúng ta có thể thấy rằng đây là một tính toán chi phí, nhưng tại sao số lượng nhân với 2?</p>\r\n<p>Comment tốt:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 0.899281%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e83e568267194-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #e67e23;\">// We decided to use a linked list instead of an array because</span></div>\r\n<div id=\"crayon-5f2e59d35e83e568267194-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #e67e23;\">// arrays do insertion too slowly.</span></div>\r\n<div id=\"crayon-5f2e59d35e83e568267194-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #e67e23;\">// We\'re going to use Newton\'s method to find the root of a number because</span></div>\r\n<div id=\"crayon-5f2e59d35e83e568267194-5\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #e67e23;\">// there is no deterministic way to solve these equations.</span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Cuối cùng, các comment nên được viết theo cách dễ hiểu đối với một người không biết gì về code này.</p>\r\n<p><strong>Mẹo</strong>:</p>\r\n<p><em>Comment code của bạn một cách tự do, và viết comment của bạn như thể nói chuyện với một người không biết code đó làm gì. Đừng giả định rằng rằng bạn sẽ nhớ tại sao bạn đưa ra code này.</em></p>\r\n<h2><span id=\"4_Commenting_code\" class=\"ez-toc-section\"><strong>4. Commenting code</strong></span></h2>\r\n<p>Chuyển đổi một hoặc nhiều dòng code thành một comment được gọi là <strong>comment code</strong> của bạn. Điều này giúp bạn thuận tiện để (tạm thời) loại trừ các phần code mà bạn chưa cần tới khi chương trình biên dịch.</p>\r\n<p>Để comment một dòng code, chỉ cần sử dụng // comment để biến một dòng code thành comment tạm thời:</p>\r\n<p>Chưa comment:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid; height: 10px;\" border=\"1\">\r\n<tbody>\r\n<tr style=\"height: 10px;\">\r\n<td style=\"width: 0.899281%; height: 10px;\" colspan=\"2\" rowspan=\"2\"><span style=\"font-size: 14pt; color: #ffffff;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span style=\"color: #e67e23;\"><span class=\"crayon-v\">cout</span> </span><span class=\"crayon-o\"><<</span> <span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">;</span></span></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Comment:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\"><span style=\"color: #ced4d9; font-size: 12pt;\">// std::cout << 1;</span></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Để comment vài dòng code liên tiếp, hãy sử dụng // trên nhiều dòng code hoặc / * * / để biến khối code thành comment tạm thời.</p>\r\n<p>Chưa comment:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e845437216336-2\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span style=\"color: #e67e23;\"><span class=\"crayon-v\">cout</span> </span><span class=\"crayon-o\"><<</span> <span class=\"crayon-cn\">1</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e59d35e845437216336-3\" class=\"crayon-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span style=\"color: #e67e23;\"><span class=\"crayon-v\">cout</span> </span><span class=\"crayon-o\"><<</span> <span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e59d35e845437216336-4\" class=\"crayon-line crayon-striped-line\"><span style=\"color: #ffffff; font-size: 14pt;\"><span class=\"crayon-v\">std</span><span class=\"crayon-o\">::</span><span style=\"color: #e67e23;\"><span class=\"crayon-v\">cout</span> </span><span class=\"crayon-o\"><<</span> <span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">;</span></span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Comment:</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e847086987416-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\">// std::cout << 1;</span></div>\r\n<div id=\"crayon-5f2e59d35e847086987416-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\">// std::cout << 2;</span></div>\r\n<div id=\"crayon-5f2e59d35e847086987416-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"font-size: 12pt; color: #ced4d9;\">// std::cout << 3;</span></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Hoặc</p>\r\n<table style=\"border-collapse: collapse; width: 95.8678%; background-color: #000000; border-color: #000000; border-style: solid;\" border=\"1\">\r\n<tbody>\r\n<tr>\r\n<td style=\"width: 49.931%;\" colspan=\"2\" rowspan=\"2\">\r\n<div id=\"crayon-5f2e59d35e84a439801073-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">/*</span></div>\r\n<div id=\"crayon-5f2e59d35e84a439801073-3\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> std::cout << 1;</span></div>\r\n<div id=\"crayon-5f2e59d35e84a439801073-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> std::cout << 2;</span></div>\r\n<div id=\"crayon-5f2e59d35e84a439801073-5\" class=\"crayon-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\"> std::cout << 3;</span></div>\r\n<div id=\"crayon-5f2e59d35e84a439801073-6\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-c\" style=\"color: #ced4d9; font-size: 12pt;\">*/</span></div>\r\n<div id=\"crayon-5f2e59d35e84a439801073-7\" class=\"crayon-line\"></div>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<p>Có một vài lý do bạn muốn làm điều này:</p>\r\n<p>1) Bạn đã làm việc với một đoạn code nhưng nó chưa cần để biên dịch và bạn cần chạy chương trình ngay bây giờ. Trình biên dịch có thể bị lỗi nếu bạn cho phép chạy đoạn code đó. Comment code để biên dịch sẽ cho phép chương trình của bạn có thể chạy tốt. Khi bạn đã sẵn sàng, bạn có thể bỏ comment và tiếp tục làm việc với nó.</p>\r\n<p>2) Bạn đã viết code mới để biên dịch nhưng không hoạt động chính xác và bạn không có thời gian để sửa nó cho ngay bây giờ. Comment code bị hỏng sẽ đảm bảo code bị hỏng không thực thi và gây ra sự cố cho đến khi bạn có thể sửa code đó.</p>\r\n<p>3) Để tìm nguồn gốc của một lỗi. Nếu một chương trình không tạo ra kết quả mong muốn, đôi khi có thể hữu ích để vô hiệu hóa các phần của code của bạn để xem liệu bạn có thể cô lập những gì mà khiến cho nó không hoạt động chính xác không. Nếu bạn comment một hoặc nhiều dòng code và chương trình của bạn bắt đầu hoạt động như mong đợi (hoặc dừng sự cố), theo cách này thì bất cứ điều gì bạn comment cuối cùng là một phần của vấn đề. Sau đó, bạn có thể điều tra lý do tại sao những dòng code đó gây ra vấn đề.</p>\r\n<p>4) Bạn muốn thay thế một đoạn code bằng một đoạn code khác. Thay vì chỉ xóa code gốc, bạn có thể comment nó và để nó ở đó để tham khảo cho đến khi bạn chắc chắn rằng code mới của bạn hoạt động đúng. Khi bạn chắc chắn code mới của mình đang hoạt động, bạn có thể xóa code comment cũ. Nếu bạn code mới của bạn không hoạt động, bạn luôn có thể xóa code mới và bỏ comment của code cũ để trở lại những gì bạn đã có trước đó.</p>\r\n<p>Commnet code là một điều phổ biến phải làm trong khi phát triển, vì vậy nhiều IDE cung cấp hỗ trợ để comment một phần code và tô sáng nó lên. Cách bạn sử dụng chức năng này có thể thay đổi theo IDE.</p>\r\n<p><strong>Dành cho người dùng Visual Studio</strong></p>\r\n<p><strong>Bạn có thể comment hoặc bỏ comment bằng cách lựa chọn qua </strong>Edit menu > Advanced > Comment Selection (or Uncomment Selection).</p>\r\n<p><strong>Đối với Code :: Blocks</strong></p>\r\n<p><strong>Bạn có thể comment hoặc bỏ comment bằng cách lựa chọn qua Edit menu > Comment (or Uncomment, or Toggle comment, or any of the other comment tools).</strong></p>\r\n<p><strong><em>Chú ý</em></strong></p>\r\n<p><em><strong>Nếu bạn luôn sử dụng các </strong></em><strong>comment</strong><em><strong> một dòng cho các </strong></em><strong>comment</strong><em><strong> bình thường của mình, thì bạn có thể sử dụng các </strong></em><strong>comment</strong><em><strong> nhiều dòng để </strong></em><strong>comment</strong><em><strong> của bạn gọn hơn.</strong></em></p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/tim-hieu-ve-comments-trong-c-va-y-nghia-cua-no.html\">techtalk.vn</a></p>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/20/mceu_79274131911596750450464.jpg', 0, '0000-00-00 00:00:00', 9, 4, 0);
INSERT INTO `posts` (`Id`, `Title`, `Url`, `Content_Summary`, `Content_Full`, `DatePost`, `Avatar`, `Views`, `DatetimePost`, `IdCategories`, `IdStatus`, `IsDelete`) VALUES
(21, 'Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 11)', 'mot-vai-thu-thuat-css-ma-chinh-frontend-co-the-con-chua-biet-phan-11-1596749254105', 'Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 11 của series về Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết\r\n\r\nBắt đầu thôi nào!', '<p><img src=\"/public/img/ImagePost/21/mceu_54381026611596748987077.jpg\" /></p>\r\n<h3 id=\"_1-combo-drop-shadow--clip-path-code-chi-vai-dong-nhung-qua-la-chat-luong-not-cross-browser-0\">1. Combo <code>drop-shadow</code> + <code>clip-path</code> code chỉ vài dòng nhưng quá là chất lượng! [Not Cross-Browser]</h3>\r\n<p>Chắc hẳn bạn cũng không xa lạ gì với những dạng thiết kế có <strong>“mũi tên”</strong> như thế này</p>\r\n<p><img src=\"/public/img/ImagePost/21/dropdown-navigation.png\" /></p>\r\n<p>Với trường hợp có thêm cả <strong>shadow</strong> thì bạn phải kết hợp cả 2 <code>:before</code> và <code>:after</code>, thêm <code>box-shadow</code> rồi bạn phải căn chỉnh để làm sao che đi <strong>shadow</strong> bị thừa, tóm lại là cũng hơi vả 1 chút </p>\r\n<p>Nhưng thật là may khi CSS3 cho ra đời các thuộc tính mà khi chúng kết hợp với nhau, giúp chúng ta làm những thứ trước đây bị coi là khó, thì bây giờ trở nên dễ dàng hơn rất nhiều.</p>\r\n<p>Trở lại với ví dụ về style 1 cái tag name, thay vì 1 mớ code cho <code>:before</code>, bây giờ chỉ cần 1 dòng <code>clip-path: polygon(20px 0%, 100% 0%, 100% 100%, 20px 100%, 0 50%);</code> là xong rồi!</p>\r\n<h3 id=\"_2-dung-viet-css-trong-css-nua-1\">2. Đừng viết CSS trong “CSS” nữa!</h3>\r\n<p>Hãy sử dụng các CSS Preprocessors như SASS, LESS hay Stylus. Nó thực sự đem lại rất nhiều lợi ích như code viết đẹp hơn, code viết ít hơn, code dễ đọc hơn, dễ maintain hơn, làm việc với team dễ dàng hơn, và còn nhiều nhiều lợi ích nữa!</p>\r\n<p>Trong bài viết này mình chọn sử dụng CSS Preprocessors là SASS nhé! Các tính năng kể ra dưới đây đều có mặt ở các CSS Preprocessors, nếu có khác thì chỉ khác nhau về cú pháp thôi!</p>\r\n<h4>2.1 Variables</h4>\r\n<p>Không thể phủ nhận sự tiện ích mà biến mang lại, mọi thứ từ <code>color</code>, <code>font-size</code>, <code>font-family</code> được sử dụng ở rất nhiều nơi trên trang, thông qua việc gọi các giá trị kia bằng biến giúp code chúng ta chỉnh sửa rất nhanh, còn giúp kiểm soát được những tiêu chuẩn về màu sắc, kích thước của các components nữa.</p>\r\n<p>Mặc dù CSS cũng có cung cấp Variables nhưng lại không support ở nhiều browsers nên vẫn khó được phổ biến sử dụng ở nhiều dự án bằng như SASS được.</p>\r\n<div id=\"crayon-5f2e6dc104b63249148074-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">font</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">family</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">Helvetica</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">sans</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">serif</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">primary</span><span class=\"crayon-o\">:</span> <span class=\"crayon-p\">#333;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">secondary</span><span class=\"crayon-o\">:</span> <span class=\"crayon-p\">#eee;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-e\">body</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">font</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">family</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">font</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">family</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">primary</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">title</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">secondary</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b63249148074-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\">\r\n<h4>2.2 Nesting</h4>\r\n<p>Đây là tính năng mà quả thực mình thích nhất trong SASS, trước kia khi còn viết trong file <code>.css</code> mình phải luôn copy selector, tốn nhiều thời gian không kém. Với SASS đơn giản chỉ cần viết lồng vào nhau, viết code CSS lúc này nhanh hơn hẳn.</p>\r\n<div id=\"crayon-5f2e6dc104b71283491555-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-e\">nav</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">background</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">red</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: georgia, palatino, serif;\"> </span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">ul</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">margin</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">padding</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">0</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">list</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">style</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">none</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: georgia, palatino, serif;\"> </span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">li</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">display</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">inline</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">block</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: georgia, palatino, serif;\"> </span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-e\">a</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">display</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">block</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">padding</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">6px</span> <span class=\"crayon-cn\">12px</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">text</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">decoration</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">none</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-18\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-19\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-20\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div id=\"crayon-5f2e6dc104b71283491555-21\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div class=\"crayon-line\">\r\n<h4>2.3 Import</h4>\r\n<p>Tính năng import giúp chúng ta chia nhỏ code vào các file chức năng tương ứng, code được chia ra rất dễ đọc, maintain cũng dễ, và teamwork cũng giảm được conflict vì mỗi người viết vào mỗi file <code>.scss</code> khác nhau.</p>\r\n<p>Chia file, folder như thế nào là hợp lý, cái này thì tùy vào mỗi dự án, mỗi cá nhân hay tổ chức. Riêng mình thì học theo các tổ chức the 7-1 Pattern này, cảm thấy rất là OK! Rõ ràng và dễ hiểu!</p>\r\n<p><strong>_variables.scss</strong></p>\r\n<div id=\"crayon-5f2e6dc104b76455956231-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">font</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">family</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">Helvetica</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-v\">sans</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">serif</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b76455956231-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">primary</span><span class=\"crayon-o\">:</span> <span class=\"crayon-p\">#333;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b76455956231-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">secondary</span><span class=\"crayon-o\">:</span> <span class=\"crayon-p\">#eee;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b76455956231-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div class=\"crayon-line\"><strong>main.scss</strong></div>\r\n<div class=\"crayon-line\">\r\n<div id=\"crayon-5f2e6dc104b7a446749627-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">@</span><span class=\"crayon-e\">import </span><span class=\"crayon-v\">variables</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-e\">body</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">font</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">family</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">font</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">family</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">primary</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">title</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">color</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">secondary</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div id=\"crayon-5f2e6dc104b7a446749627-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"></div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<h4>2.4 Mixins</h4>\r\n<p>Có thể coi nó như kiểu function trong Javascript vậy, định nghĩa 1 mixin cho phép chúng ta truyền param vào và output ra CSS khá là dynamic.</p>\r\n<p>Lấy 1 ví dụ để dễ hiểu như thế này, như ở <a href=\"https://techtalk.vn/mot-vai-thu-thuat-css-ma-chinh-frontend-co-the-con-chua-biet-phan-8.html\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">phần 8</a> của series này mình nói về việc cắt text thành nhiều dòng, thay vì gọi trực tiếp ở những nơi cần truncate, nó trông quá dài dòng như này:</p>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">description</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">display</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\">-</span><span class=\"crayon-v\">webkit</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">box</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">webkit</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">box</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">orient</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">vertical</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">line</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">clamp</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">overflow</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">hidden</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">text</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">overflow</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">ellipsis</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">title</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">display</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\">-</span><span class=\"crayon-v\">webkit</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">box</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">webkit</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">box</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">orient</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">vertical</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">line</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">clamp</span><span class=\"crayon-o\">:</span> <span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">overflow</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">hidden</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">text</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">overflow</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">ellipsis</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-16\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\"><strong>Thì lúc này, nên sử dụng mixin để viết gọn gàng code lại như sau:</strong></span></div>\r\n<div class=\"crayon-line crayon-striped-line\">\r\n<div id=\"crayon-5f2e6dc104b83858791547-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-sy\">@</span><span class=\"crayon-e\">mixin </span><span class=\"crayon-e\">truncate</span><span class=\"crayon-sy\">(</span><span class=\"crayon-sy\">$</span><span class=\"crayon-v\">line</span><span class=\"crayon-sy\">)</span> <span class=\"crayon-sy\">{</span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">display</span><span class=\"crayon-o\">:</span> <span class=\"crayon-o\">-</span><span class=\"crayon-v\">webkit</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">box</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">webkit</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">box</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">orient</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">vertical</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">line</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">clamp</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">$</span><span class=\"crayon-v\">line</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">overflow</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">hidden</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">text</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">overflow</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">ellipsis</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">description</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-10\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">@</span><span class=\"crayon-e\">include </span><span class=\"crayon-e\">truncate</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">3</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-11\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-12\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-13\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">title</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-14\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">@</span><span class=\"crayon-e\">include </span><span class=\"crayon-e\">truncate</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">2</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e6dc104b83858791547-15\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><span class=\"crayon-sy\" style=\"font-family: helvetica, arial, sans-serif;\">Nguồn: <a href=\"https://techtalk.vn/mot-vai-thu-thuat-css-ma-chinh-frontend-co-the-con-chua-biet-phan-11.html\">techtalk.vn</a></span></div>\r\n</div>\r\n<div id=\"crayon-5f2e6dc104b7f534607312-17\" class=\"crayon-line\" style=\"padding-left: 40px;\"></div>\r\n</div>\r\n</div>\r\n</div>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/21/mceu_54381026611596748987077.jpg', 0, '2020-08-22 04:28:00', 19, 4, 0),
(22, 'Một vài thủ thuật CSS mà chính Frontend đỉnh không thể bỏ qua', 'mot-vai-thu-thuat-css-ma-chinh-frontend-dinh-khong-the-bo-qua-1596750825795', 'Một vài thủ thuật CSS mà chính Frontend đỉnh không thể bỏ qua', '<p><img src=\"/public/img/ImagePost/22/mceu_7662542921596750763121.png\" /></p>\r\n<h3 id=\"_1-may-em-yeu-lam-em-muon-tat-animation-tren-web-di-thi-phai-lam-sao-0\">Máy em yếu lắm, em muốn tắt animation trên web đi thì phải làm sao?</h3>\r\n<p>Trên các hệ điều hành dành cho Desktop và cả Mobile, các nhà phát hành đều đang hoàn thiện và cung cấp cho người dùng tính năng để “tắt đi bớt hiệu ứng (motion, animation)” trên hệ điều hành.</p>\r\n<p>Và hưởng ứng theo phong trào đấy, thì các trình duyệt cũng đang dần hoàn thiện và phát hành đến cho cộng đồng phát triển web 1 media query có tên <strong>prefers-reduced-motion</strong></p>\r\n<p>Tuy chưa được phổ biến ở tất cả các trình duyệt mà chúng ta thường phục vụ, trong đó có IE, nhưng vì đây là 1 tính năng hoạt động theo kiểu enhancement, tức là nếu được thêm trình duyệt nào đáp ứng thì càng tốt chừng đó. Vì nó không ảnh hưởng trực tiếp đến trải nghiệm của người dùng, nên nếu trình duyệt không support, thì cũng không có gì phải lo cả.</p>\r\n<p>Cơ chế hoạt động của tính năng này vô cùng dễ hiểu, giả sử bạn đang có 1 đoạn code CSS viết hiệu ứng <code>hover</code> thì cho cái hộp <code>transform</code> xoay 1 vòng:</p>\r\n<div id=\"crayon-5f2e74599f392823663970-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-i\">box</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e74599f392823663970-3\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span> <span class=\"crayon-i\">c</span>á<span class=\"crayon-i\">c</span> <span class=\"crayon-i\">thu</span>ộ<span class=\"crayon-i\">c</span> <span class=\"crayon-i\">t</span>í<span class=\"crayon-e\">nh </span><span class=\"crayon-i\">kh</span>á<span class=\"crayon-i\">c</span></span></div>\r\n<div id=\"crayon-5f2e74599f392823663970-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">transition</span><span class=\"crayon-o\">:</span> <span class=\"crayon-sy\">.</span><span class=\"crayon-cn\">5s</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e74599f392823663970-5\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-h\" style=\"font-family: georgia, palatino, serif;\"> </span></div>\r\n<div id=\"crayon-5f2e74599f392823663970-6\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-o\">&</span><span class=\"crayon-o\">:</span><span class=\"crayon-e\">hover</span> <span class=\"crayon-sy\">{</span></span></div>\r\n<div id=\"crayon-5f2e74599f392823663970-7\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-v\">transform</span><span class=\"crayon-o\">:</span> <span class=\"crayon-e\">rotate</span><span class=\"crayon-sy\">(</span><span class=\"crayon-cn\">1turn</span><span class=\"crayon-sy\">)</span><span class=\"crayon-sy\">;</span></span></div>\r\n<div id=\"crayon-5f2e74599f392823663970-8\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 40px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-h\"> </span><span class=\"crayon-sy\">}</span></span></div>\r\n<div id=\"crayon-5f2e74599f392823663970-9\" class=\"crayon-line\" style=\"padding-left: 40px;\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">}</span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<div class=\"crayon-line\"><span class=\"crayon-sy\" style=\"font-family: georgia, palatino, serif;\">Giả sử người dùng ở đây đang sử dụng MacOS, họ thường có xu hướng tick vào <code>Reduce Motion</code> để disable đi hiệu ứng.</span></div>\r\n<div class=\"crayon-line\">\r\n<p><em><strong>Đối với các HĐH khác, thì bạn có thể xem thêm phần User Preferences ở <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion\" target=\"_blank\" rel=\"noopener noreferrer nofollow external\" data-wpel-link=\"external\">link này</a> để biết cách chọn tính năng này.</strong></em></p>\r\n<p>Rồi khi quay lại web, họ muốn hiệu ứng <code>hover</code> kia không còn hoạt động nữa (cái <code>.box</code> kia không bị xoay vòng tròn nữa). Lúc này code của chúng ta sẽ cần dùng đến media query <code>prefers-reduced-motion</code> như sau:</p>\r\n<p><img src=\"/public/img/ImagePost/22/mceu_28896801431596750815078.jpg\" /></p>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/22/mceu_7662542921596750763121.png', 0, '0000-00-00 00:00:00', 19, 4, 0),
(23, 'Một vài kiến thức nền tảng về web', 'mot-vai-kien-thuc-nen-tang-ve-web-1596753153555', 'Một vài kiến thức nền tảng về web', '<p><img src=\"/../public/img/ImagePost/23/mceu_64869710211596753009612.jpg\" /></p>\r\n<h5>Nếu bạn mới chuẩn bị bắt đầu bước đầu tiên làm quen với <code>hacking</code> thì bài viết đầu tiền trong seri này rất cần thiết với bạn. Nó sẽ giúp bạn hiểu được <code>internet</code> hoạt động như thế nào.</h5>\r\n<p>Chúng ta có thể mô tả một cách tổng quan rằng internet là một hệ thống các thiết bị thông tin được kết nối với nhau và có thể gửi <code>tin nhắn</code> cho nhau. Một số các thiết bị chỉ có phép nhận các loại <code>message</code> nhất định, một số thì chỉ nhận <code>message</code> từ 1 danh sách các thiết bị được xác định. Nhưng tất cả các hệ thống trên <code>internet</code> đều có 1 địa chỉ ip mà mọi người đều có thể gửi <code>message</code> đến. Và các hệ thống này sẽ xác định những điều cần làm với các <code>message</code> này và cách phản hỏi lại chúng cho người gửi.</p>\r\n<ul>\r\n<li>Để các hệ thống khác nhau có thể xác định được cấu trúc của các <code>message</code> này để xử lý thì chúng sẽ sử dụng các giao thức chung. Ví dụ như giao thức <code>HTTP</code> và <code>HTTPS</code> định nghĩa giao thức mà các trình duyệt <code>internet</code> của bạn giao tiếp. Ví khi trình duyệt của bạn và máy chủ web đồng ý sử dụng giao thức này thì chúng có thể giao tiếp với nhau.</li>\r\n<li>Khi mà bạn gõ địa chỉ <code>http://www.google.com</code> vào trình duyệt của bạn thì các bước sẽ được thực hiện như sau:\r\n<ul style=\"list-style-type: circle;\">\r\n<li>Trình duyệt của bạn sẽ lấy ra <code>domain name</code> của trang web từ <code>url</code> là : <code>google.com</code></li>\r\n<li>Máy tính của bạn sẽ gửi yêu cầu <code>DNS</code> đến máy chủ được cài làm <code>DNS severs</code> của bạn. <code>DNS</code> sẽ giúp máy bạn phân giải <code>domain name</code> thành địa chỉ IP : <code>216.58.201.228:80</code></li>\r\n<li>Máy tính của bạn sẽ cố gắng cài đặt một kết nối <code>TCP</code> đến địa chỉ IP này trên cổng 80 (cổng mặc định sử dụng cho giao thức HTTP). ( Bạn có thể thử tự tạo kết nối TCP bằng cách chạy lệnh <code>nc 216.58.201.228 80</code> trên <code>teminal</code>.</li>\r\n<li>Nếu thành công thì trình duyệt sẽ gửi 1 <code>HTTP request</code> đại loại như:</li>\r\n</ul>\r\n</li>\r\n</ul>\r\n<div id=\"crayon-5f2e7dababff1623551633-2\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-v\">GET</span> <span class=\"crayon-o\">/</span> <span class=\"crayon-v\">HTTP</span><span class=\"crayon-o\">/</span><span class=\"crayon-cn\">1.1</span></span></div>\r\n<div id=\"crayon-5f2e7dababff1623551633-3\" class=\"crayon-line\" style=\"padding-left: 80px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-v\">Host</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">www</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">google</span><span class=\"crayon-sy\">.</span><span class=\"crayon-e\">com</span></span></div>\r\n<div id=\"crayon-5f2e7dababff1623551633-4\" class=\"crayon-line crayon-striped-line\" style=\"padding-left: 80px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-v\">Connection</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">keep</span><span class=\"crayon-o\">-</span><span class=\"crayon-e\">alive</span></span></div>\r\n<div id=\"crayon-5f2e7dababff1623551633-5\" class=\"crayon-line\" style=\"padding-left: 80px;\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-v\">Accept</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">application</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">html</span><span class=\"crayon-sy\">,</span> <span class=\"crayon-o\">*</span><span class=\"crayon-o\">/</span><span class=\"crayon-o\">*</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 80px;\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"><span style=\"font-family: helvetica, arial, sans-serif;\"><span class=\"crayon-o\">Sau đó nó sẽ đợi 1 phản hồi từ server kiểu như:</span></span></div>\r\n<div class=\"crayon-line\" style=\"padding-left: 40px;\"> </div>\r\n<div class=\"crayon-line\" style=\"padding-left: 80px;\">\r\n<div id=\"crayon-5f2e7dababffa895899243-2\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-v\">HTTP</span><span class=\"crayon-o\">/</span><span class=\"crayon-cn\">1.1</span> <span class=\"crayon-cn\">200</span> <span class=\"crayon-e\">OK</span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-3\" class=\"crayon-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-v\">Content</span><span class=\"crayon-o\">-</span><span class=\"crayon-v\">Type</span><span class=\"crayon-o\">:</span> <span class=\"crayon-v\">text</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">html</span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-4\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">html</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-5\" class=\"crayon-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">head</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-6\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">title</span><span class=\"crayon-o\">></span><span class=\"crayon-v\">Google</span><span class=\"crayon-sy\">.</span><span class=\"crayon-v\">com</span><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">title</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-7\" class=\"crayon-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">head</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-8\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-v\">body</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-9\" class=\"crayon-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span><span class=\"crayon-sy\">.</span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-10\" class=\"crayon-line crayon-striped-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">body</span><span class=\"crayon-o\">></span></span></div>\r\n<div id=\"crayon-5f2e7dababffa895899243-11\" class=\"crayon-line\"><span style=\"font-family: georgia, palatino, serif;\"><span class=\"crayon-o\"><</span><span class=\"crayon-o\">/</span><span class=\"crayon-v\">html</span><span class=\"crayon-o\">></span></span></div>\r\n<div class=\"crayon-line\"> </div>\r\n<p>Sau đó trình duyệt sẽ phân tích và render các tài nguyên được trả về như <code>HTML</code>, <code>CSS</code>, và <code>Javascript</code> thành trang web hiện thị cho người dùng.</p>\r\n<ul>\r\n<li>Ngoài ra các <code>request</code> này còn có các <code>method</code> (phương thức) khác nhau. Ví dụ như Post, Get, Put, …\r\n<ul>\r\n<li>Get: Truy xuất các thông tin tài nguyên được xác định theo yêu cầu.</li>\r\n<li>Head: Tương tự như Get nhưng server sẽ không trả về <code>request body</code> trong <code>response</code>.</li>\r\n<li>Post: Thường được sử dụng để gọi đến các chức năng để tạo 1 cái gì đó ví dụ như tạo comment trong các bài đăng, tạo tài khoản người dùng, … Tất nhiên các hành động này có thể server sẽ không thực hiện nếu như xảy ra lỗi hoặc không có quyền từ phía người dùng,…</li>\r\n<li>Put: Phương thức này thường được dùng để gọi các chức năng dùng để chỉnh sửa các nguồn tài nguyên có sẵn.</li>\r\n<li>Delete: Như tên gọi phương thức này để xóa một tài nguyên xác định trên server.</li>\r\n<li>Trace: Đây là một phương thức không phổ biến giúp client xem được những gì máy chủ trả về, và sử dụng để kiểm tra và chuẩn đoán thông tin.</li>\r\n<li>Connect: Thực sự dùng để sử dụng riêng với proxy.</li>\r\n<li>Options: Sử dụng để yêu cầu thông tin từ sever về các phương thức có thể sử dụng. Ví dụ gọi phương thức OPTIONS có thể giúp client biết được server chấp nhận các phương thức GET, POST, PUT, DELETE nhưng không chấp nhận các phương thức HEAD hoặc TRACE.</li>\r\n</ul>\r\n</li>\r\n</ul>\r\n<p>Trên đây là một số kiến thức nền tảng về Web mà TopDev đã chọn lọc để cung cấp cho các bạn, mong rằng các bạn thấy chúng hữu ích. Cảm ơn các bạn đã theo dõi bài viết.</p>\r\n<p>Nguồn: <a href=\"https://techtalk.vn/mot-vai-kien-thuc-nen-tang-ve-web.html\">https://techtalk.vn/mot-vai-kien-thuc-nen-tang-ve-web.html</a></p>\r\n</div>', '2020-08-07', '/../public/img/ImagePost/23/mceu_64869710211596753009612.jpg', 0, '0000-00-00 00:00:00', 20, 4, 0);
-- --------------------------------------------------------
--
-- Table structure for table `status_posts`
--
CREATE TABLE `status_posts` (
`Id` int(11) NOT NULL,
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `status_posts`
--
INSERT INTO `status_posts` (`Id`, `Name`, `IsDelete`) VALUES
(1, 'Đã được duyệt & chờ xuất bản', 0),
(2, 'Đã xuất bản', 0),
(3, 'Bị từ chối', 0),
(4, 'Chưa được duyệt', 0);
-- --------------------------------------------------------
--
-- Table structure for table `tags`
--
CREATE TABLE `tags` (
`Id` int(11) NOT NULL,
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`TagName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`ImgURL` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `tags`
--
INSERT INTO `tags` (`Id`, `Name`, `TagName`, `ImgURL`, `IsDelete`) VALUES
(1, 'Lập trình web cơ bản', 'laptrinhwebcoban', 'lap-trinh-web-co-ban-1596533110451.jpg', 0),
(2, 'Lập trình Fontend', 'laptrinhfontend', 'lap-trinh-fontend-1596533233911.png', 0),
(3, 'Thiết kế web', 'thietkeweb', 'thiet-ke-web-1596533386426.jpg', 0),
(4, 'Fontend Developer', 'fontenddev', 'fontend-developer-1596533503802.png', 0),
(5, 'Backend Developer', 'backenddev', 'backend-developer-1596533567469.png', 0),
(6, 'CodeIgniter', 'codeigniter', 'codeigniter-1596534786986.jpg', 0),
(7, 'Windows', 'windows', 'windows-1596534925231.jpg', 0),
(8, 'Linux', 'linux', 'linux-1596534979509.png', 0),
(9, 'Github', 'github', 'github-1596535135003.png', 0),
(10, 'Zend', 'zend', 'zend-1596535200720.png', 0),
(11, 'MacOS', 'macos', 'macos-1596535317022.jpg', 0),
(12, 'PHP', 'php', 'php-1596535386851.jpg', 0),
(13, 'Oppo A52', 'oppoa52', 'oppo-a52-1596535482643.jpg', 0),
(14, 'Windows XP', 'winxp', 'windows-xp-1596535555260.jpg', 1),
(15, 'Database', 'database', 'database-1596734518383.png', 0),
(16, 'UI', 'ui', 'ui-1596734656461.jpg', 0),
(17, 'Fresher', 'fresher', 'fresher-1596734698438.jpg', 0),
(18, 'CSS', 'css', 'css-1596734757972.png', 0),
(19, 'Fontend', 'fontend', 'fontend-1596734818044.png', 1),
(20, 'Software', 'software', 'software-1596735298366.jpg', 0),
(21, 'Bất đồng bộ', 'batdongbo', 'bat-dong-bo-1596735411193.jpg', 0),
(22, 'Developers', 'developers', 'developers-1596739678308.jpg', 0),
(23, 'Framework', 'framework', 'framework-1596814782400.png', 0);
-- --------------------------------------------------------
--
-- Table structure for table `tag_posts`
--
CREATE TABLE `tag_posts` (
`Id` int(11) NOT NULL,
`IdTag` int(11) NOT NULL,
`IdPost` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `tag_posts`
--
INSERT INTO `tag_posts` (`Id`, `IdTag`, `IdPost`) VALUES
(6, 5, 2),
(7, 1, 2),
(8, 4, 2),
(9, 2, 2),
(10, 3, 2),
(72, 15, 15),
(73, 5, 15),
(76, 5, 16),
(77, 15, 16),
(132, 1, 19),
(135, 5, 17),
(136, 15, 17),
(137, 1, 17),
(138, 2, 17),
(139, 3, 17),
(147, 5, 8),
(148, 20, 8),
(149, 5, 9),
(150, 20, 9),
(151, 1, 11),
(152, 2, 11),
(153, 11, 11),
(154, 16, 11),
(155, 17, 11),
(156, 21, 11),
(157, 22, 11),
(158, 5, 12),
(159, 16, 12),
(160, 1, 13),
(161, 22, 13),
(166, 5, 18),
(167, 17, 18),
(168, 20, 18),
(175, 1, 21),
(176, 2, 21),
(177, 3, 21),
(178, 4, 21),
(179, 16, 21),
(180, 18, 21),
(183, 5, 20),
(184, 18, 22),
(189, 1, 23),
(195, 1, 1),
(196, 2, 1),
(197, 3, 1),
(198, 4, 1),
(199, 5, 1),
(220, 5, 3),
(221, 15, 3),
(222, 1, 4),
(223, 2, 4),
(224, 4, 4),
(225, 16, 4),
(226, 17, 4),
(227, 18, 4),
(228, 1, 5),
(229, 5, 5),
(230, 18, 5),
(231, 20, 5),
(232, 5, 6),
(233, 21, 6),
(234, 5, 7),
(235, 22, 7),
(236, 5, 10),
(237, 22, 10),
(238, 23, 10),
(241, 5, 14),
(242, 15, 14),
(243, 22, 14);
-- --------------------------------------------------------
--
-- Table structure for table `token`
--
CREATE TABLE `token` (
`Id` int(11) NOT NULL,
`Email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`Token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`Expiration` datetime NOT NULL,
`Used` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `token`
--
INSERT INTO `token` (`Id`, `Email`, `Token`, `Expiration`, `Used`) VALUES
(1, '[email protected]', '59cb8b917dfee0c74808431a10996a17', '2020-07-28 21:47:08', 0);
-- --------------------------------------------------------
--
-- Table structure for table `typeaccount`
--
CREATE TABLE `typeaccount` (
`Id` int(11) NOT NULL,
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`IsDelete` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Dumping data for table `typeaccount`
--
INSERT INTO `typeaccount` (`Id`, `Name`, `IsDelete`) VALUES
(1, 'Subscriber', 0),
(2, 'Writer', 0),
(3, 'Editor', 0),
(4, 'Administrator', 0);
--
-- Indexes for dumped tables
--
--
-- Indexes for table `accounts`
--
ALTER TABLE `accounts`
ADD PRIMARY KEY (`Id`),
ADD KEY `Accounts_TypeAccount` (`TypeAccount`);
--
-- Indexes for table `categories`
--
ALTER TABLE `categories`
ADD PRIMARY KEY (`Id`);
--
-- Indexes for table `categories_sub`
--
ALTER TABLE `categories_sub`
ADD PRIMARY KEY (`Id`),
ADD KEY `IdCategoriesMain` (`IdCategoriesMain`);
--
-- Indexes for table `comments`
--
ALTER TABLE `comments`
ADD PRIMARY KEY (`Id`),
ADD KEY `Comment_Accounts` (`IdAccount`),
ADD KEY `Comment_Posts` (`IdPost`);
--
-- Indexes for table `editoraccount`
--
ALTER TABLE `editoraccount`
ADD PRIMARY KEY (`Id`,`IdAccount`,`IdCategories`) USING BTREE,
ADD KEY `EditorAccount_Accounts` (`IdAccount`),
ADD KEY `EditorAccount_Categories` (`IdCategories`);
--
-- Indexes for table `feedback`
--
ALTER TABLE `feedback`
ADD PRIMARY KEY (`Id`),
ADD KEY `Feedback_Account` (`IdEditorAccount`),
ADD KEY `Feedback_Posts` (`IdPost`);
--
-- Indexes for table `information`
--
ALTER TABLE `information`
ADD PRIMARY KEY (`Id`),
ADD KEY `Information_Accounts` (`IdAccount`);
--
-- Indexes for table `postdetails`
--
ALTER TABLE `postdetails`
ADD PRIMARY KEY (`Id`),
ADD KEY `IdPost` (`IdPost`),
ADD KEY `PostDetail_Account` (`IdAccount`);
--
-- Indexes for table `posts`
--
ALTER TABLE `posts`
ADD PRIMARY KEY (`Id`),
ADD UNIQUE KEY `Url` (`Url`),
ADD KEY `Posts_StatusPosts` (`IdStatus`),
ADD KEY `Posts_SubCategories` (`IdCategories`);
ALTER TABLE `posts` ADD FULLTEXT KEY `Title` (`Title`);
ALTER TABLE `posts` ADD FULLTEXT KEY `Content_Summary` (`Content_Summary`);
ALTER TABLE `posts` ADD FULLTEXT KEY `Content_Full` (`Content_Full`);
ALTER TABLE `posts` ADD FULLTEXT KEY `Title_2` (`Title`,`Content_Summary`,`Content_Full`);
--
-- Indexes for table `status_posts`
--
ALTER TABLE `status_posts`
ADD PRIMARY KEY (`Id`);
--
-- Indexes for table `tags`
--
ALTER TABLE `tags`
ADD PRIMARY KEY (`Id`);
--
-- Indexes for table `tag_posts`
--
ALTER TABLE `tag_posts`
ADD PRIMARY KEY (`Id`,`IdTag`,`IdPost`),
ADD KEY `TagPosts_Posts` (`IdPost`),
ADD KEY `TagPosts_Tags` (`IdTag`);
--
-- Indexes for table `token`
--
ALTER TABLE `token`
ADD PRIMARY KEY (`Id`);
--
-- Indexes for table `typeaccount`
--
ALTER TABLE `typeaccount`
ADD PRIMARY KEY (`Id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `accounts`
--
ALTER TABLE `accounts`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
--
-- AUTO_INCREMENT for table `categories`
--
ALTER TABLE `categories`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
--
-- AUTO_INCREMENT for table `categories_sub`
--
ALTER TABLE `categories_sub`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21;
--
-- AUTO_INCREMENT for table `comments`
--
ALTER TABLE `comments`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT for table `editoraccount`
--
ALTER TABLE `editoraccount`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
--
-- AUTO_INCREMENT for table `feedback`
--
ALTER TABLE `feedback`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
--
-- AUTO_INCREMENT for table `information`
--
ALTER TABLE `information`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;
--
-- AUTO_INCREMENT for table `postdetails`
--
ALTER TABLE `postdetails`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24;
--
-- AUTO_INCREMENT for table `posts`
--
ALTER TABLE `posts`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24;
--
-- AUTO_INCREMENT for table `status_posts`
--
ALTER TABLE `status_posts`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT for table `tags`
--
ALTER TABLE `tags`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24;
--
-- AUTO_INCREMENT for table `tag_posts`
--
ALTER TABLE `tag_posts`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=244;
--
-- AUTO_INCREMENT for table `token`
--
ALTER TABLE `token`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
--
-- AUTO_INCREMENT for table `typeaccount`
--
ALTER TABLE `typeaccount`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `accounts`
--
ALTER TABLE `accounts`
ADD CONSTRAINT `Accounts_TypeAccount` FOREIGN KEY (`TypeAccount`) REFERENCES `typeaccount` (`Id`);
--
-- Constraints for table `comments`
--
ALTER TABLE `comments`
ADD CONSTRAINT `Comment_Accounts` FOREIGN KEY (`IdAccount`) REFERENCES `accounts` (`Id`),
ADD CONSTRAINT `Comment_Posts` FOREIGN KEY (`IdPost`) REFERENCES `posts` (`Id`);
--
-- Constraints for table `editoraccount`
--
ALTER TABLE `editoraccount`
ADD CONSTRAINT `EditorAccount_Accounts` FOREIGN KEY (`IdAccount`) REFERENCES `accounts` (`Id`),
ADD CONSTRAINT `EditorAccount_Categories` FOREIGN KEY (`IdCategories`) REFERENCES `categories` (`Id`);
--
-- Constraints for table `feedback`
--
ALTER TABLE `feedback`
ADD CONSTRAINT `Feedback_EditorAccount` FOREIGN KEY (`IdEditorAccount`) REFERENCES `accounts` (`Id`),
ADD CONSTRAINT `Feedback_Posts` FOREIGN KEY (`IdPost`) REFERENCES `posts` (`Id`);
--
-- Constraints for table `information`
--
ALTER TABLE `information`
ADD CONSTRAINT `Information_Accounts` FOREIGN KEY (`IdAccount`) REFERENCES `accounts` (`Id`);
--
-- Constraints for table `postdetails`
--
ALTER TABLE `postdetails`
ADD CONSTRAINT `PostDetail_Account` FOREIGN KEY (`IdAccount`) REFERENCES `accounts` (`Id`);
--
-- Constraints for table `posts`
--
ALTER TABLE `posts`
ADD CONSTRAINT `Posts_StatusPosts` FOREIGN KEY (`IdStatus`) REFERENCES `status_posts` (`Id`),
ADD CONSTRAINT `Posts_SubCategories` FOREIGN KEY (`IdCategories`) REFERENCES `categories_sub` (`Id`);
--
-- Constraints for table `tag_posts`
--
ALTER TABLE `tag_posts`
ADD CONSTRAINT `TagPosts_Posts` FOREIGN KEY (`IdPost`) REFERENCES `posts` (`Id`),
ADD CONSTRAINT `TagPosts_Tags` FOREIGN KEY (`IdTag`) REFERENCES `tags` (`Id`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;