This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.This theme is Bloggerized by Lasantha Bandara - Premiumbloggertemplates.com.

Hiển thị các bài đăng có nhãn Ajax. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Ajax. Hiển thị tất cả bài đăng

Thứ Năm, 24 tháng 12, 2015

Ajax 17

Untitled Document

Bài 17: Validate form Modal Bootstrap với jQuery Ajax

 0 
 Google +0 

  0
Đăng bởi: TheHalfHeart - Vào ngày: 08-11-2015 - Chuyên mục: PHP - View: 1061
Download Demo
Theo như bạn nói thì mình sẽ sử dụng jQuery kết hợp với Ajax để xây dựng chức năng Validate form trong Modal Bootstrap. Thực tế thì chức năng này mình có khá nhiều bài hướng dẫn rồi nhưng có lẽ bạn vẫn còn mơ hồ với Ajax nên mình xây dựng một video luôn cho bạn.

1. Tạo form đăng ký thành viên với Modal Bootstrap

Để tiện việc Support thì mình sẽ hướng dẫn cách Validate form đăng ký thành viên có tên là modal.php với nội dung như sau.

Ajax 16

Untitled Document

Bài 16: Kỹ thuật xử lý hàng đợi khi gửi ajax
 0 
 Google +0 

  0
Đăng bởi: TheHalfHeart - Vào ngày: 26-03-2015 - Chuyên mục: PHP - View: 2703
Download Demo
Nếu bạn cần xử lý ajax nhiều lần và thứ tự thực hiện giữa các lần gửi ajax thì bạn sẽ áp dụng kỹ thuật đệ quy ajax, hay còn gọi là thiết lập hàng đợi trong ajax. Đây là một kỹ thuật cũng nâng cao và nó chủ yếu là do kinh nghiệm của mỗi người nên trong bài này mình chỉ chia sẻ kinh nghiệm của mình, nếu có gì sai mong bạn bỏ qua.
Hàng đợi là gi? hàng đợi là một khái niệm mà bạn đã học rồi nên mình không nói nhiều về. Nó có nhiều loại nhưng mình đề cập đến một loại hàng đợi giống như khi bạn xếp hàng thanh toán tiền trong siêu thị vậy, nghĩa là bạn sẽ phải xếp hàng và đi theo thú tự ai đến trước thì được thanh toán trước, khi nào người đó thanh toán xong thì người tiếp theo mới được thanh toán. Và kỹ thuật này áp dụng vào code hoàn toàn được.


1. Tình huống bài toán hàng đợi

Để các bạn dễ hiểu hơn thì mình đưa ra một ví dụ thế này.
Mình sẽ xây dựng một ứng dụng gồm một ô textbox và một button như hình sau:
http://freetuts.net/upload/tut_post/images/2015/03/26/346/vi-du-tien-trinh-ajax.png
Khi người dùng click vào nút Send thì chương trình sẽ tạo ra một bảng gồm 10 phần tử (10 tasks) và trạng thái của các phần tử (Waitting, Sendding, Finished). Lúc này hệ thống bắt đầu xử lý từng task bằng ajax.
vi-du-ajax.png
Nhìn thoáng qua thì nó không ứng dụng gì nhưng nếu bạn biết cách áp dụng vào bài toán của bạn thì nó sẽ có tác dụng ngay. Ví dụ bạn viết chương trình gửi email với số lượng lớn thì bạn sẽ phải gửi từng email, lúc này danh sách hàng đợi sẽ là tổng số email. Email nào chưa gửi thì ở trạng thái Waitting, email nào đang gửi thì ở trạng thái Sendding và email nào gửi rồi thì ở trạng thái Finished.


2. xử lý ajax theo hàng đợi

Trước tiên bạn cần tạo hai file:

  • sleep.php là file nhận request từ ajax
  • index.html là file chính

Cả hai file này cùng nằm trong một thư mục www hoặc htdocs của Webserver ảo nhé các bạn.
File sleep.php:
Vì mình demo không có sử dụng database hay gửi email nên mình sẽ dùng hàm sleep ngủ 2 giây để các bạn thấy trạng thái rõ ràng hơn. Lúc này nội dung của file như sau:


1
2
3

<?php
sleep(2);
?>

File index.html:


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

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
        <style>
            .red{
                color: red;
            }
            .blue{
                color:blue;
            }
            .pink{
                color:pink;
            }
        </style>
        <script language="javascript">
            $(document).ready(function()
            {
                // Code
            });
        </script>
    </head>
    <body>
        <input type="text" id="num-thread" value="10"/>
        <input type="button" id="send-request" value="Send"/>
        <div id="results"></div>
    </body>
</html>

Trong file này bạn cần chú ý các điểm sau:

  • Mình khai báo 3 class CSS để hiển thị màu sắc cho các trạng thái
  • Mình có khai báo một thẻ script dùng để code JS, nên sau này những đoạn code JS sẽ được đặt vào vị trí này
  • Có một thẻ div#results dùng để hiển thị bảng task

Bây giờ chạy file lên bạn sẽ có giao diện gồm một ô input và một button như hình trên. Bây giờ ta bắt đầu code Ajax cho nó nhé.
Mình sẽ tạo hai hàm như sau:

  • Hàm display_html(num) dùng để hiển thị bảng danh sách các task như trên và tham số truyền vào là số lượng task (num)
  • Hàm send_ajax(num, index) dùng để gửi ajax và tham số truyền vào gồm số lượng task (num) và task cần gửi (index)

Hàm display_html().


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

function display_html(num)
{
    var html = '';

    html += '<table border="1" cellpadding="5">';
        html += '<tr>';
            html += '<td>Num</td>';
            html += '<td>Status</td>';
        html += '</tr>';

    for (var i = 0; i < num; i++){
        html += '<tr>';
            html += '<td>'+(i+1)+'</td>';
            html += '<td id="waitting'+i+'" class="pink">Waitting...</td>';
        html += '</tr>';
    }
    html += '</table>'

    $('#results').html(html);
}

Các bạn để ý mình có gán ID cho cột trạng thái với quy luật '<td id="waitting'+i+'" class="pink">Waitting...</td>'. trong đó i là số thứ tự của tas, điều này quan trọng vì hàm send_ajax() sẽ dựa vào id này để bik cần thay đổi trang thái cho task nào.
Hàm send_ajax().


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

function send_ajax(num, index)
{
    // Kiểm tra xem task đã hết chưa, nếu hết thì dừng
    if (index > (num - 1)){
        return false;
    }

    // Chuyển trang thái từ waitting san sendding
    $('#waitting'+index).removeClass('pink').addClass('red').html('Sending...');

    // Gửi ajax
    $.ajax({
        url : 'sleep.php',
        type : 'post',
        dataType : 'text',
        success : function()
        {
            // Sau khi thành công thì chuyển trạng thái sang finished
            $('#waitting'+index).removeClass('red').addClass('blue');
            $('#waitting'+index).html('Finished');
        }
    })
    .always(function(){
        // Xử lý task tiếp theo
        send_ajax(num, ++index);
    });
}

Ok vậy là ta đã có hai hàm, bây giờ ta sẽ viết javascript xử lý sự kiện click vào button như sau:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

$('#send-request').click(function()
{  
    // Lấy số lượng task từ user nhập vào
    var num = parseInt($('#num-thread').val());

    // Ẩn textbox và button
    $(this).remove();
    $('#num-thread').remove();

    // Hiển thị table danh sách task
    display_html(num);

    // gửi ajax cho lần đầu tiên (task = 1)
    send_ajax(num, 0);
});

Ok và đây là toàn bộ file index.html.


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

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
        <style>
            .red{
                color: red;
            }
            .blue{
                color:blue;
            }
            .pink{
                color:pink;
            }
        </style>
        <script language="javascript">
            $(document).ready(function()
            {
                // Hàm hiển thị danh sách hàng task
                function display_html(num)
                {
                    var html = '';

                    html += '<table border="1" cellpadding="5">';
                        html += '<tr>';
                            html += '<td>Num</td>';
                            html += '<td>Status</td>';
                        html += '</tr>';

                    for (var i = 0; i < num; i++){
                        html += '<tr>';
                            html += '<td>'+(i+1)+'</td>';
                            html += '<td id="waitting'+i+'" class="pink">Waitting...</td>';
                        html += '</tr>';
                    }
                    html += '</table>'

                    $('#results').html(html);
                }
                 
                // Hàm gửi ajax
                function send_ajax(num, index)
                {
                    // Kiểm tra xem task đã hết chưa, nếu hết thì dừng
                    if (index > (num - 1)){
                        return false;
                    }

                    // Chuyển trang thái từ waitting san sendding
                    $('#waitting'+index).removeClass('pink').addClass('red').html('Sending...');

                    // Gửi ajax
                    $.ajax({
                        url : 'sleep.php',
                        type : 'post',
                        dataType : 'text',
                        success : function()
                        {
                            // Sau khi thành công thì chuyển trạng thái sang finished
                            $('#waitting'+index).removeClass('red').addClass('blue');
                            $('#waitting'+index).html('Finished');
                        }
                    })
                    .always(function(){
                        // Xử lý task tiếp theo
                        send_ajax(num, ++index);
                    });
                }
                  
                // Khi click gửi request
                $('#send-request').click(function()
                {  
                    // Lấy số lượng task từ user nhập vào
                    var num = parseInt($('#num-thread').val());

                    // Ẩn textbox và button
                    $(this).remove();
                    $('#num-thread').remove();

                    // Hiển thị table danh sách task
                    display_html(num);

                    // gửi ajax cho lần đầu tiên (task = 1)
                    send_ajax(num, 0);
                });
            });
        </script>
    </head>
    <body>
        <input type="text" id="num-thread" value="10"/>
        <input type="button" id="send-request" value="Send"/>
        <div id="results"></div>
    </body>
</html>

3. Lời kết

Bạn hoàn toàn có thể cải tiến chương trình này bằng cách viết chương trình gửi email hàng loạt, trong đó:

  • số lượng task ở ô input bạn sẽ cho người dùng nhập danh sách email và cách nhau bởi dấu phẩy
  • file sleep.php có nhiệm vụ nhận email và gửi
  • đoạn javascript có nhiệm vụ chuyển danh sách email và đưa vào hàng đợi, sau đó gửi từng email.

Vì mình cũng hơi bận nên chỉ đưa ra ý tưởng vậy thôi, chúc các bạn thành công!

Ajax 15

Untitled Document

Bài 15: jQuery Ajax pagination load more với PHP và MYSQL
 0 
 Google +0 

  0
Đăng bởi: TheHalfHeart - Vào ngày: 10-12-2014 - Chuyên mục: PHP - View: 5009
Download Demo
Một số website có chức năng là khi chúng ta kéo xuống dưới sẽ tự động hiển thị thêm tin, cái này ta gọi là ajax scrolling pagination. Còn trường hợp ở cuối danh sách có một button load more thì đấy ta gọi là Ajax pagination load more. Trong bài này chúng ta sẽ tìm hiểu thủ thuật load more này nhé, còn thủ thuật kia đã có bài trình bày rồi.


1. Ý tưởng kỹ thuật jQuery ajax pagination load more

Các bạn thấy khi chúng ta load lần đầu thì sẽ lấy trang thứ nhất, khi click load more thì sẽ load trang tiếp theo và thêm vào phần dưới cùng của danh sách, như vậy chúng ta sẽ dùng hàm append trong jQuery và kết hợp PHP để trả về danh sách tin tương ứng từng trang. Tuy nhiên có một câu hỏi đặt ra là ở Server có cần tính tổng số trang để tìm limit và start hay không? Câu trả lời là không cần nhé, chúng ta sẽ dùng một mẹo nhỏ là sẽ select dư 1 record (nghĩa là limit = limit + 1), sau đó đếm tổng số record trả về nếu:

  • Nếu tổng số record bằng limit + 1 thì nghĩa là còn tin cho trang kế, lúc này ta không cần ẩn button load more, khi lặp sẽkhông lặp record cuối cùng vì đây là record d dùng để check dữ liệu còn hay không
  • Nếu bé hơn limit +1 thì nghĩa là trang kế ko còn tin nào, lúc này ta ẩn button load more

Như vậy là chúng ta không cần phải sử dụng thuật toán phân trang để xử lý.


2. Các bước thực hiện ajax pagination load more với jquery và PHP

Chúng ta sẽ làm một ví dụ đó là tạo một trang hiển thị danh sách khách hàng.


Tạo database để phân trang khi click vào load more

Tạo database:


CREATE TABLE IF NOT EXISTS `tb_customer` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`website` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=INNODB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;

Thêm một vài record:


INSERT INTO `tb_customer` (`id`, `name`, `website`) VALUES
(1, 'Nguyễn Văn Cường', 'freetuts.net'),
(2, 'Trương Phúc Hoài Minh', 'freetuts.net'),
(3, 'Đặng Văn Chương', 'freetuts.net'),
(4, 'Trương Tấn Thành', 'freetuts.net'),
(5, 'Lâm văn Lang', 'demo.com'),
(6, 'Nguyễn Văn Kiệt', 'ajax.com'),
(7, 'Nguyễn Thị Nở', 'thimau.com'),
(8, 'Đặng Thị Thoa', 'scrolling.com'),
(9, 'Trương Văn Kiệt', 'ajaxscrolling.com'),
(10, 'Đặng Thị Tâm', 'nono.com');

Tạo trang hiển thị danh sách khách hàng list.php

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>
<script language="javascript" src="ajax.js" ></script>
<style type="text/css">
.button{
display: inline-block;
background: blue;
padding: 5px 10px;
color:#FFF;
margin: 20px;
}
</style>
</head>
<body>
<div id="content">
<?php require('data.php'); ?>
</div>
<a href="#" class="button" id="load_more">LOAD MORE</a>
</body>
</html>

Trong file này mình có thêm thư viện jquery, một file ajax.js, một button load more và cuối cùng là có require file data.php(file này sẽ tạo ở phần dưới)


File data.php kết nối xử lý database phân trang load more

File này có nội dung như sau:


<?php

// Thiết lập kết quả trả về là html và charset là utf8 để khỏi lỗi font
header('Content-Type: text/html; charset=utf-8');

// Kết nối database
$conn = mysqli_connect('localhost', 'root', 'vertrigo', 'demo') or die ('Không thể kết nối đến CSDL');
mysqli_set_charset($conn, 'utf8');

// Lấy trang hiện tại
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;

// Kiểm tra trang hiện tại có bé hơn 1 hay không
if ($page < 1) {
$page = 1;
}

// Số record trên một trang
$limit = 3;

// Tìm start
$start = ($limit * $page) - $limit;

// Câu truy vấn
// Trong câu truy vấn này chúng ta sẽ lấy limit tăng lên 1
// Lý do là vì ta không có viết code đếm record nên dựa vào tổng số kết quả trả về để:
// - Nếu kết quả trả về bằng $limit + 1 thì còn phân trang
// - Nếu kết quả trả về bé hơn $limit + 1 thì nghĩa là hết dữ liệu nên ngưng phân trang
$sql = "select * from tb_customer limit $start,".($limit + 1);

// Thực hiện câu truy vấn
$query = mysqli_query($conn, $sql) or die ('Lỗi câu truy vấn');

// Duyệt kết quả rồi đưa vào mảng result
$result = array();
while ($row = mysqli_fetch_array($query))
{
// Thêm vào result
array_push($result, $row);
}

// Nếu là request ajax thì trả kết quả JSON
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){
// Mình sleep 1 giây để các bạn check nhé, khi sử dụng thì bỏ đoạn sleep này đi
sleep(1);

// Trả kết quả về cho ajax
die (json_encode($result));
}
else // Ngược lại thì hiển thị bình thường. Trường hợp này dùng load trong file list.php
{
$total = count($result);
// Bỏ đi kết quả cuối cùng vì kết quả này dùng để check phân trang thôi
for ($i = 0; $i < $total - 1; $i++)
{
echo '<div class="item">';
echo $result[$i]['id'].' - '.$result[$i]['name'].' - '.$result[$i]['website'];
echo '</div>';
}
}

?>

Trong phần comment mình đã giải thích khá kỹ rồi, riêng có một lưu ý với bạn là đoạn xuất danh sách ra màn hình có 2 trường hợp:

  • Nếu request là ajax thì sẽ trả về danh sách dạng JSON để javascript xử lý dữ liệu và hiển thị ra
  • Nếu request không phải ajax thì dùng code PHP show danh sách khách hàng ra luôn, trường hợp này dùng cho lần load đầu tiên ở file list.php

File ajax pagination load more ajax.js

Nội dung file này như sau:


// Biến dùng kiểm tra nếu đang gửi ajax thì ko thực hiện gửi thêm
var is_busy = false;

// Biến lưu trữ trang hiện tại
var page = 1;

// Số record trên mỗi trang
var record_per_page = 3;

// Biến lưu trữ rạng thái phân trang
var stopped = false;

$(document).ready(function()
{
// Khi kéo scroll thì xử lý
$('#load_more').click(function()
{
// Element append nội dung
$element = $('#content');

        // ELement hiển thị chữ loadding
$button = $(this);

// Nếu đang gửi ajax thì ngưng
if (is_busy == true) {
return false;
}

// Tăng số trang lên 1
page++;

        // Hiển thị loadding ...
$button.html('LOADDING ...');

        // Gửi Ajax
$.ajax(
{
type: 'get',
dataType: 'json',
url: 'data.php',
data: {page: page},
success: function(result)
{
var html = '';

                // Trường hợp hết dữ liệu cho trang kết tiếp
if (result.length <= record_per_page)
{
// Lặp dữ liêụ
$.each(result, function (key, obj){
html += '<div>'+obj.id+' - '+obj.name+'-'+obj.website+'</div>';
});

                    // Thêm dữ liệu vào danh sách
$element.append(html);

                    // Xóa button
$button.remove();
}
else{ // Trường hợp còn dữ liệu cho trang kế tiếp
// Lặp dữ liêụ, trường hợp này ta lặp bỏ đi phần record cuối cùng vì ta selec với limit + 1
$.each(result, function (key, obj){
if (key < result.length - 1){
html += '<div>'+obj.id+' - '+obj.name+'-'+obj.website+'</div>';
}
});

                    // Thêm dữ liệu vào danh sách
$element.append(html);
}

            }
})
.always(function()
{
// Sau khi thực hiện xong thì đổi giá trị cho button
$button.html('LOAD MORE');
is_busy = false;
});

    });
});

Không giống như ví dụ trong bài srolling pagination là kết quả trả về HTML nên chỉ cần show ra, bài này kết quả ajax trả về JSON nên ta sẽ phải dùng vòng lặp each để xuất dữ liệu ra màn hình. Vẫn có 2 trường hợp là:

  • Nếu kết quả trả về dư 1 record thì tức là còn dữ liệu cho trang tiếp, lúc này ta ko ẩn button và khi lặp phải bỏ phần tử cuối cùng
  • Nếu kết quả trả về bé hơn hoặc bằng limit thì nghĩa là hết data, lúc này ta phải ẩn button load more.

Và đây là thành quả của chúng ta:
load-more-pagination-ajax.png


3. Lời kết

Lúc đầu mình không tính viết bài này vì nó cũng rất giống với bài Ajax Scrolling Pagination , chỉ khác là một bên có button load more và một bên không phải button. Tuy nhiên trong bài này mình sử dụng JSON để trả về khi gọi ajax nên sẽ hay hơn bài trước.

Ajax 14

Untitled Document

Bài 14: jQuery Ajax scrolling pagination với PHP và MYSQL
 0 
 Google +0 

  0
Đăng bởi: TheHalfHeart - Vào ngày: 07-12-2014 - Chuyên mục: PHP - View: 3313
Download Demo
Hiện nay có một số website khi các bạn kéo xuống phía dưới cùng thì nó tự động load thêm dữ liệu, facebook là một ví dụ nhưng nó khác ở chỗ là nó thực hiện hai thao tác, thứ nhất là kéo xuống sẽ load thêm, thứ hai là nó thiết lập sau một thời gian sẽ load thêm. Chức năng này người ta gọi là Ajax Scrolling Pagination với PHP và MYSQL. Trong bài này chúng ta sẽ áp dụng phương pháp này để xây dựng một chức năng demo cho các bạn xem nhé.


1. Xây dựng chức năng Ajax Scrolling Pagination với PHP và MYSQL

Chúng ta sẽ đi từng phần một để các bạn dễ hiểu bài hơn, quy trình như sau:

  • Tạo CSDL và thêm một số record để test
  • Tạo file hiển thị danh sách 
  • Dùng jQuery xử lý sự kiện Scrolling và gọi ajax

Mỗi bước chúng ta sẽ có những đoạn code liên kết với nhau nên các bạn đọc kỹ bài viết nhé.


Tạo database để phân trang khi scrolling

Tạo database:


1
2
3
4
5
6

CREATE TABLE IF NOT EXISTS `tb_customer` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `website` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=INNODB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;

Thêm một vài record:


1
2
3
4
5
6
7
8
9
10
11

INSERT INTO `tb_customer` (`id`, `name`, `website`) VALUES
(1, 'Nguyễn Văn Cường', 'freetuts.net'),
(2, 'Trương Phúc Hoài Minh', 'freetuts.net'),
(3, 'Đặng Văn Chương', 'freetuts.net'),
(4, 'Trương Tấn Thành', 'freetuts.net'),
(5, 'Lâm văn Lang', 'demo.com'),
(6, 'Nguyễn Văn Kiệt', 'ajax.com'),
(7, 'Nguyễn Thị Nở', 'thimau.com'),
(8, 'Đặng Thị Thoa', 'scrolling.com'),
(9, 'Trương Văn Kiệt', 'ajaxscrolling.com'),
(10, 'Đặng Thị Tâm', 'nono.com');

Tạo file hiển thị kết quả phân trang khi scrolling

Bạn tạo file list.php với nội dung như sau:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>
        <script language="javascript" src="ajax.js" ></script>
        <style type="text/css">
            #loadding {color:red; font-size: 20px; font-weight: bold; text-align: center}
            .item {height: 500px; border: solid 2px blue; background: #CCCCCC;
                  line-height: 500px; color: blue; text-align: center; font-weight: bold; margin: 20px 0px;}
            .hidden {display: none}
        </style>
    </head>
    <body>
        <div id="content">
            <?php require('data.php'); ?>
        </div>
        <div id="loadding" class="hidden">
            LOADDING ...
        </div>
    </body>
</html>

Trong file này tôi có thêm thư viện jQuery, file ajax.js  và tạo hai thẻ div như sau:

  • <div id="content"> dùng để hiển thị danh sách, trong này tôi có require  file data.php mà chúng ta sẽ tạo ở bước tiếp theo
  • <div id="loadding" class="hidden"> dùng để hiển thị chữ loadding khi gửi ajax

Viết jQuery Ajax Scrolling Pagination

Bạn tạo file ajax.js với nội dung như sau, lưu ý là file này mình đã import vào file list.php ở bước trên.


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

// Biến dùng kiểm tra nếu đang gửi ajax thì ko thực hiện gửi thêm
var is_busy = false;
     
// Biến lưu trữ trang hiện tại
var page = 1;

// Biến lưu trữ rạng thái phân trang
var stopped = false;

$(document).ready(function()
{   
    // Khi kéo scroll thì xử lý
    $(window).scroll(function()
    {
        // Element append nội dung
        $element = $('#content');
         
        // ELement hiển thị chữ loadding
        $loadding = $('#loadding');
         
        // Nếu màn hình đang ở dưới cuối thẻ thì thực hiện ajax
        if($(window).scrollTop() + $(window).height() >= $element.height())
        {
            // Nếu đang gửi ajax thì ngưng
            if (is_busy == true){
                return false;
            }
             
            // Nếu hết dữ liệu thì ngưng
            if (stopped == true){
                return false;
            }
             
            // Thiết lập đang gửi ajax
            is_busy = true;
             
            // Tăng số trang lên 1
            page++;
             
            // Hiển thị loadding
            $loadding.removeClass('hidden');
             
            // Gửi Ajax
            $.ajax(
            {
                type        : 'get',
                dataType    : 'text',
                url         : 'data.php',
                data        : {page : page},
                success     : function (result)
                {
                    $element.append(result);
                }
            })
            .always(function()
            {
                // Sau khi thực hiện xong ajax thì ẩn hidden và cho trạng thái gửi ajax = false
                $loadding.addClass('hidden');
                is_busy = false;
            });
            return false;
        }
    });
});

File này tôi đã comment rất kỹ rồi, chung quy lại ý tưởng như sau:

  • Tạo các biến is_busy, page, stoppedđể lưu các thông số check khi phân trang
  • Thực hiện phân trang khi màn hình kéo xuống dưới cùng 
  • Trước khi gửi phải kiểm tra các giá trị các biến toàn cục để quyết định gửi ajax hay không, đồng thời hiển thị chữ loadding nếu cho phép gửi ajax
  • Sau khi gửi ajax thì ẩn nút loadding
  • Sử dụng sử dụng phương thức GET trong jquery ajax để gửi.

Tạo file data.php để thực hiện truy vấn dữ liệu

File này khá là quan trọng đấy, nó có hai nhiệm vụ là :

  • Import vào file list.php trong div có id  = content.
  • Ajax sẽ gọi đến file này

Nội dung như sau:


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

<?php

// Bước này dùng để kiểm tra thôi chứ ko có tác dụng gì
// Mục đích là ngưng xử lý 3 giây để mình xem dòng chữ loadding
// Sau khi test xong bạn xóa đi nhé
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){
    sleep(1);
}

// Thiết lập kết quả trả về là html và charset là utf8 để khỏi lỗi font
header('Content-Type: text/html; charset=utf-8');

// Kết nối database
$conn = mysqli_connect('localhost', 'root', 'vertrigo', 'demo') or die ('Không thể kết nối đến CSDL');
mysqli_set_charset($conn, 'utf8');

// Lấy trang hiện tại
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;

// Kiểm tra trang hiện tại có bé hơn 1 hay không
if ($page < 1) {
    $page = 1;
}

// Số record trên một trang
$limit = 3;

// Tìm start
$start = ($limit * $page) - $limit;

// Câu truy vấn
// Trong câu truy vấn này chúng ta sẽ lấy limit tăng lên 1
// Lý do là vì ta không có viết code đếm record nên dựa vào tổng số kết quả trả về để:
// - Nếu kết quả trả về bằng $limit + 1 thì còn phân trang
// - Nếu kết quả trả về bé hơn $limit + 1 thì nghĩa là hết dữ liệu nên ngưng phân trang
$sql = "select * from tb_customer limit $start,".($limit + 1);

// Thực hiện câu truy vấn
$query = mysqli_query($conn, $sql) or die ('Lỗi câu truy vấn');

// Duyệt kết quả rồi đưa vào mảng result
$result = array();
while ($row = mysqli_fetch_array($query))
{
    // Thêm vào result
    array_push($result, $row);
}

// Hiển thị dữ liệu
$total = count($result);
// Bỏ đi kết quả cuối cùng vì kết quả này dùng để check phân trang thôi
// Tuy nhiên chỉ bỏ ở trường hợp ($total > $limit) nếu không ở trang cuối cùng sẽ mất một row
if ($total > $limit){
    for ($i = 0; $i < $total - 1; $i++)
    {
        echo '<div class="item">';
            echo $result[$i]['id'].' - '.$result[$i]['name'].' - '.$result[$i]['website'];
        echo '</div>';
    }
}
else{
    for ($i = 0; $i < $total; $i++)
    {
        echo '<div class="item">';
            echo $result[$i]['id'].' - '.$result[$i]['name'].' - '.$result[$i]['website'];
        echo '</div>';
    }
}

// Nếu hết dữ liệu thì stop không phan trang nữa
// Ta chỉ cần kiểm tra xem tổng số record có nhiều hơn limit hay không
// vì trong câu truy vấn mình select với limit = limit + 1
if ($total <= $limit){
    echo '<script language="javascript">stopped = true; </script>';
}
?>

Trong file này các bạn cần lưu ý các vấn đề như sau:

  • Ở trên cùng mình có sử dụng hàm sleep để ngưng xủ lý 1 giây mục đích là cho dòng chữ loadding được hiển thị ra để test, nếu không nó xử lý nhanh quá chúng ta không thấy.
  • Ở đây ta không cần đếm tổng số record mà sử dụng một mẹo đơn giản đó là lấy dư thêm 1 record, nếu kết quả trả về có số record dư 1 thì nghĩa là còn data, ngược lại hết data.
  • Ở đoạn code dưới cùng mình có check nếu hết data thì xuất một đoạn mã javascript gán biến stopped = true, biến này chính là biên mà ta khai báo toàn cục ở file ajax.js

Như vậy là hết rồi, bạn chạy lên và xem thành quả của mình nhé.


2. Lời kết

Bài này cũng hơi ngắn và mình viết ở dạng jquery thuần chứ không đưa nó vào jquery plugin, nếu bạn rành jquery thì có thể đưa nó vào mọt plugin để sử dụng cho tiện. Hy vọng qua bài jQuery Ajax Scrolliing Pagination sẽ giúp các bạn thực hiện được một thao tác phân trang ajax scrolling rất hay này.

Ajax 13

Untitled Document

Bài 13: Delay the keyup event for jquery ajax
 0 
 Google +0 

  0
Đăng bởi: TheHalfHeart - Vào ngày: 17-09-2014 - Chuyên mục: PHP - View: 2348
Download Demo
Có thể nói ajax là một kỹ thuật được ứng dụng rất rộng rãi trong các ứng dụng web vì sự mượt mà của nó, nhất là kết hợp với các hiệu ứng jquery. Nhưng để xử lý tiến trình ajax thật sự rất mơ hồ với những bạn mới làm quen với ajax. Một ví dụ điển hình là xây dựng chức năng search cho sự kiện keyup event, nếu ta nhập dữ liệu liên tục thì nó sẽ gửi request liên tục lên server, điều này  không hay lắm, thay vào đó ta sẽ gửi một request cuối cùng (ký tự cuối cùng nhập vào sẽ gửi ajax). Vậy trong bài này ta sẽ tìm hiểu một kỹ thuật gọi là Delay the keyup event for jquery ajax
Trước khi vào vấn đề chính ta sẽ tạo một số file trong quá trình xử lý đã nhé.
Tạo file result.php: File này có nhiệm vụ là nhận nội dung cần tìm và trả về kết quả, nhưng để đơn giản không có sử dụng database thì tôi sẽ trả về kết quả của chuỗi nhận vào, nội dung như sau:


1
2
3

<?php
echo isset($_GET['title']) ? $_GET['title'] : '';
?>

Tạo file index.php: File này hiển thị input#title nhập dữ liệu tìm kiếm, một thẻ div#result dùng để hiển thị kết quả trả về, một đoạn mã script trong đó có sự kiện keyup. Và đương nhiên là không thể thiếu đoạn code import file jquery vào.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<!DOCTYPE html>
<html>
    <head>
        <title>Delay the keyup event for jquery ajax</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="robots" content="noindex,nofollow"/>
        <script language="javascript" src="http://code.jquery.com/jquery-2.0.0.min.js"></script>
        <script language="javascript">
         
        $('#title').keyup(function()
        {
            // Nội dung search
        });
         
        </script>
    </head>
    <body>
        <a href="http://freetuts.net" title="Học lập trình online">Về trang chủ</a> <br/> <hr/>
        <input type="text" id="title" value=""/>
        <hr/>
        <div id="result"></div>
    </body>
</html>

Note: Nội dung trong bài có sử dụng ajax, nếu bạn chưa biết thì xem bài tìm hiểu ajax là gì.


1. Không sử dụng delay keyup event để gửi ajax

Cách này thì rất thông thường, ta chỉ cần bắt sự kiện keyup và lấy nội dung, sau đó gửi ajax.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

$('#title').keyup(function()
{
    var data = {
        title : $('#title').val()
    };
    $.ajax({
        type : 'get',
        dataType : 'text',
        data : data,
        url : 'result.php',
        success : function (result){
            $('#result').html(result);
        }
    });
});

Nhược điểm của cách này là ajax sẽ gửi liên tục, mỗi khi nhập một ký tự vào nó sẽ gửi ajax nên sẽ tốn tài nguyên hệ thống và đôi khi hiển thị kết quả trả về lệch nhau do request trước trả kết quả về sau.  Với cách này tôi có viết một bài tương tự đó là bàiSearch Ajax Autocomplete.


2. Kỹ thuật Delay the keyup event for jquery ajax

Trước tiên bạn phải biết qua hàm setTimeout trong javascript dùng để thiết lập thời gian chạy một action nào đó và hàm clearTimeout dùng để bỏ đi sự kiện mà ta đã xử lý ở hàm setTimeout.
Ví dụ:


1
2
3
4
5
6
7
8
9
10

// Thiết lập trong thời gian 5 giây tới sẽ chạy đoạn code
// alert lên chuỗi 123
var timeout = setTimeout(function(){
    alert('123');
}, 5000);

 

// Clear đi đói tượng timeout, lúc này đoạn code
// alert sẽ không thực hiện được
clearTimeout(timeout);

Bây giờ ta sẽ ứng dụng 2 hàm này để thiết lập delay keyup event ajax:
Ý tưởng như sau, ở mỗi sự kienj keyup ta sẽ không gửi ajax liền mà ta sẽ dùng hàm setTimeout để thiết lập 1 giây sau mới gửi ajax tiếp, đồng thời trước khi thực hiện setTimeout thì ta sẽ dùng hàm clearTimeout để xóa đi những gì mà ta thiết lập trước đó. Như vậy khi ta gõ những ký tự gần nhau trong khoảng thời gian dưới 1 giây thì nó sẽ không gửi đi, chi khi nào ta dừng ko gõ thì 1 giây sau ajax sẽ được thực hiện. Đoạn code như sau:


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

// Delay the keyup event for jquery ajax
$(document).ready(function()
{
    // Khai báo đối tượng timeout để dùng cho hàm
    // clearTimeout
    var timeout = null;

    // Sự kiện keyup
    $('#title').keyup(function()
    {
        // Xóa đi những gì ta đã thiết lập ở sự kiện
        // keyup của ký tự trước (nếu có)
        clearTimeout(timeout);

        // Sau khi xóa thì thiết lập lại timeout
        timeout = setTimeout(function ()
        {
            // Lấy nội dung search
            var data = {
                title : $('#title').val()
            };

            // Gửi ajax search
            $.ajax({
                type : 'get',
                dataType : 'text',
                data : data,
                url : 'result.php',
                success : function (result){
                    $('#result').html(result);
                }
            });
        }, 1000);
    });
});

Qua phần comment tôi đã giải thích rõ rồi tôi không giải thích gì thêm, chú ý đoạn code jquery ajax rất quan trọng. Các bạn chỉ cần đọc code, xem demo và download về coi sẽ hiểu ra được vấn đề rất dễ dàng.
Và đây là hình hiển thị thành quả của chúng ta.
http://freetuts.net/upload/tut_post/images/2014/09/17/166/delay-the-keyup-event-for-jquery-ajax.png


3. Lời kết

Khi làm việc với ajax ta sử dụng những mẹo rất nhỏ để áp dụng vào thì tiến trình xử lý sẽ rất là mượt và đáp ứng được yêu cầu của hệ thống. Như ví dụ trên không phải là một thứ gì to tác mà chỉ là một kỹ thuật nho nhỏ với tên gọi Delay the keyup event for jquery ajax rất đơn giản mà hiệu quả.
Cũng còn có nhiều cách giải quyết vấn đề này nên nếu bạn có cách nào hay thì hãy chia sẻ cho mọi người nhé.

Ajax 11

Untitled Document

Bài 11: Viết thư viện captcha với php và kiểm tra mã captcha bằng ajax

  1  


 
Google +0  

   0
Đăng bởi: TheHalfHeart - Vào ngày: 21-08-2014 - Chuyên mục: PHP - View: 3895
Download Demo
Nếu như bạn hay lướt web thì bạn sẽ thấy có những website khi bạn đăng ký thành viên hoặc là gửi thông tin liên hệ thì họ sẽ có những mã code cho bạn nhập vào, những đoạn mã này có mục đích là chống spam vì nó được sinh ra ngẫu nhiên. Những đoạn mã như vậy người ta gọi là mã captcha, hay còn gọi là mã chống spam.
Vậy, trong bài này tôi sẽ hướng dẫn các bạn tạo một thư viện captcha bằng php  cho riêng mình, đồng thời học cách sử dụng thư viện captcha, cách hiển thị captcha ra form và sử dụng ajax để validate captcha. Ta bắt đầu nhé.

1. Tạo thư viện captcha bằng php

Công việc đầu tiên là bạn phải tạo một thư viện captcha, đây là thư viện mà tôi viết sẵn nên các bạn xem trực tiếp trên nó nhé, tôi chỉ hướng dẫn cách sư dụng.
Bạn tạo file captcha.php với nội dung sau:


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

class Captcha
{
    var $img_width      =   120;
    var $img_height     =   30;
         
    var $font_path      =   './fonts'; // đường dẫn đên thư mục file text
    var $fonts          =   array();
    var $font_size      =   15;
     
    var $char_set       =   "ABCDEFGHJKLMNPQRSTUVWXYZ2345689";
    var $char_length    =   5;
     
    var $char_color     =   "#880000,#008800,#000088,#888800,#880088,#008888,#000000";
    var $char_colors    =   array();
     
    var $line_count     =   10;
    var $line_color     =   "#DD6666,#66DD66,#6666DD,#DDDD66,#DD66DD,#66DDDD,#666666";
    var $line_colors    =   array();
         
    var $bg_color       =   '#FFFFFF';
     
    // Khởi tạo cấu hình, hàm này sẽ trả về mã code và hiển thị hình
    function get_and_show_image( $override = array() )
        {
                // Override lại thong số config
        if( is_array( $override) )
        {
            foreach ( $override as  $key => $value) {
                                if( isset( $this->$key ))
                                        $this->$key = $value;
            }          
        }
                 
                // Tạo danh sách colors thành một mảng
        $this->line_colors = preg_split("/,\s*?/", $this->line_color );
        $this->char_colors = preg_split("/,\s*?/", $this->char_color );
         
                // Lấy danh sách fonts trong folder được định nghĩa trong biến font_path
        $this->fonts = $this->collect_files( $this->font_path, "ttf");
                 
                // Khởi tạo hình ảnh
        $img = imagecreatetruecolor( $this->img_width, $this->img_height);
        imagefilledrectangle($img, 0, 0, $this->img_width - 1, $this->img_height - 1, $this->gd_color( $this->bg_color ));
         
                 
        // Vẽ hình lung tung cho đời nó tươi mát
        for ($i = 0; $i < $this->line_count; $i++){
            imageline($img,
                rand(0, $this->img_width  - 1),
                rand(0, $this->img_height - 1),
                rand(0, $this->img_width  - 1),
                rand(0, $this->img_height - 1),
                $this->gd_color($this->line_colors[rand(0, count($this->line_colors) - 1)])
            );
                }
             
        // Vẽ code lên hình
        $code = "";
        $y = ($this->img_height / 2) + ( $this->font_size / 2);
         
        for ($i = 0; $i < $this->char_length ; $i++)
                {
            $color = $this->gd_color( $this->char_colors[rand(0, count($this->char_colors) - 1)] );
            $angle = rand(-30, 30);
            $char = substr( $this->char_set, rand(0, strlen($this->char_set) - 1), 1);
             
            $sel_font = $this->fonts[rand(0, count($this->fonts) - 1)];  
                         
            $font = $this->font_path . "/" . $sel_font;
             
            $x = (intval(( $this->img_width / $this->char_length) * $i) + ( $this->font_size / 2));
            $code .= $char;
             
            imagettftext($img, $this->font_size, $angle, $x, $y, $color, $font, $char);
        }
         
                // Hiển thị ảnh
                header('content-type: image/jpg');
                  
        ImageJPeg( $img);
                 
        return $code;
    }  
         
        // Chuyển color
    function gd_color($html_color) {
        return preg_match('/^#?([\dA-F]{6})$/i', $html_color, $rgb)
          ? hexdec($rgb[1]) : false;
    }

        // Lấy danh sách file theo phần mở rộng (ext)
    function collect_files($dir, $ext)
        {
        if (false !== ($dir = opendir($dir)))
                {
            $files = array();

            while (false !== ($file = readdir($dir)))
                if (preg_match("/\\.$ext\$/i", $file))
                    $files[] = $file;

            return $files;

        }
                return false;
    }
}

Trong thư viện captcha này bạn cần cấu hình những thông số như sau:

  • Thuộc tính $font_path là nơi chứa những file font chữ của captcha
  • Thuộc tính $img_width là chiều dài của hình ảnh trả về
  • Thuộc tính $img_height là chiều cao của hình ảnh trả về 
  • Thuộc tính $char_length là chiều dài của mã code captcha
  • Thuộc tính $bg_color là mã màu của background, mặc định là màu trắng (FFFFFF),
  • Thuộc tính $font_size là kích thước của chữ in trên hình captcha

Cấu trúc folder sẽ có dạng như sau:
http://freetuts.net/upload/tut_post/images/2014/08/21/137/cau-truc-folder-captcha.png
Ở đây bạn chỉ cần chú ý đến folder fonts, đây là folder chứa những file font chữ của captcha,

2. Tạo file hiển thị hình ảnh captcha bằng php

Trong bước này ta sẽ hiển thị hình ảnh captcha thông qua một file PHP, ở file này sẽ import file captcha.php, khởi tạo đối tượng captcha và lưu vào SESSION nhằm mục đích dùng để validate khi người dùng submit form.
Bạn tạo file image.php với nội dung như sau:


1
2
3
4
5
6
7
8
9
10

<?php session_start();

require("captcha.php");
$captcha = new Captcha();
$code = $captcha->get_and_show_image();

// Lưu code session
$_SESSION['captcha_code'] = $code;

?>

Bước này rất đơn giản, quan trọng nhất là ở đoạn code lưu SESSION, nếu ta không lưu thì ta sẽ không biết được mã code hiện tại là bao nhiêu để validate.

 

3. Tạo form liên hệ hiển thị captcha

Bây giờ tôi sẽ tạo form liên hệ, và để đơn giản tôi chỉ hiển thị một form đơn giản với một nội dung duy nhất đó là content. Bạn tạo file index.php với nội dung như sau:


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

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script language="javascript" src="http://code.jquery.com/jquery-2.0.0.min.js"></script>
    </head>
    <body style="width: 500px; margin: 0px auto;">
        <form id="mainform" method="post" action="">
            <table border="1" cellspacing="0" cellpadding="5">
                <tr>
                    <td>Nội dung</td>
                    <td><textarea id="content" cols="40" rows="5"></textarea></td>
                </tr>
                <tr>
                    <td>Captcha</td>
                    <td>
                        <img src="image.php" id="img-captcha"/>
                        <input type="button" value="Reload" onclick="$('#img-captcha').attr('src', 'image.php?rand=' + Math.random())" /> <br/>
                        <input type="text" id="captcha" value="" />
                    </td>
                </tr>
                <tr>
                    <td>Captcha</td>
                    <td>
                        <input id="submit" type="submit" value="Lưu" />
                    </td>
                </tr>
            </table>
        </form>
        <script language="javascript">
            $(document).ready(function(){
                $('#submit').click(function()
                {
                    // Lấy dự liệu
                    var data = {
                        content : $('#content').val(),
                        captcha : $('#captcha').val()
                    };
                     
                    // Validate
                    if ($.trim(data.content) == ''){
                        alert('Bạn chưa nhập nội dung');
                    }
                    else if ($.trim(data.captcha) == ''){
                        alert('Bạn chưa nhập captcha');
                    }
                    else{
                         
                        $.ajax({
                            type : 'POST',
                            dataType : 'json',
                            url : 'ajax_validate.php',
                            data : data,
                            success : function (result){
                                if (!result.hasOwnProperty('error')){
                                    alert('Kết quả trả về không phù hợp');
                                }
                                else if (result['error'] == 'success'){
                                    $('#mainform').submit();
                                    alert('Kiểm tra thành công');
                                }
                                else{
                                    if (result['content'] != ''){
                                        alert(result['content']);
                                    }
                                     
                                    if (result['captcha'] != ''){
                                        alert(result['captcha']);
                                    }
                                }
                            },
                            error : function (){
                                alert('Có lỗi xảy ra trong quá trình xử lý');
                            }
                        });
                    }
                    return false;
                });
            });
        </script>
    </body>
</html>

Trong đó đoạn code dưới đây dùng để hiển thị captcha nên trong src của thẻ image tôi có trỏ đên file captcha.php. Và mỗi lần click vào button reload  tôi sẽ thay thông số random trên SRC của thẻ captcha với mục đích load lại hình ảnh, vì nếu không làm vậy thì bộ nhớ của trình duyệt sẽ ko gọi đến server để đổi code.


1
2
3
4
5
6
7
8

<tr>
    <td>Captcha</td>
    <td>
        <img src="image.php" id="img-captcha"/>
        <input type="button" value="Reload" onclick="$('#img-captcha').attr('src', 'image.php?rand=' + Math.random())" /> <br/>
        <input type="text" id="captcha" value="" />
    </td>
</tr>


Đoạn code dưới đây dùng để gửi ajax kiểm tra thông tin người dùng nhập vào:


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

$(document).ready(function(){
    $('#submit').click(function()
    {
        // Lấy dự liệu
        var data = {
            content : $('#content').val(),
            captcha : $('#captcha').val()
        };

        // Validate
        if ($.trim(data.content) == ''){
            alert('Bạn chưa nhập nội dung');
        }
        else if ($.trim(data.captcha) == ''){
            alert('Bạn chưa nhập captcha');
        }
        else{

            $.ajax({
                type : 'POST',
                dataType : 'json',
                url : 'ajax_validate.php',
                data : data,
                success : function (result){
                    if (!result.hasOwnProperty('error')){
                        alert('Kết quả trả về không phù hợp');
                    }
                    else if (result['error'] == 'success'){
                        $('#mainform').submit();
                        alert('Kiểm tra thành công');
                    }
                    else{
                        if (result['content'] != ''){
                            alert(result['content']);
                        }

                        if (result['captcha'] != ''){
                            alert(result['captcha']);
                        }
                    }
                },
                error : function (){
                    alert('Có lỗi xảy ra trong quá trình xử lý');
                }
            });
        }
        return false;
    });
});

4. Tạo trang nhận request ajax kiểm tra mã captcha bằng php

Bước này ta sẽ tạo một file ajax_validate.php, nội dung của file này sẽ lấy dữ liệu từ đoạn code gửi ajax bên file index.php


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

session_start();

// Lấy thông tin
$content = isset($_POST['content']) ? $_POST['content'] : false;
$captcha = isset($_POST['captcha']) ? $_POST['captcha'] : false;

// Biến lưu kết quả trả về
$error = array(
    'error'     => 'success',
    'content'   => '',
    'captcha'   => ''
);

// Kiểm tra content
if (!$content){
    $error['content'] = 'Bạn chưa nhập nội dung';
    $error['error'] = 'error';
}

// Kiểm tra captcha
if (!$captcha){
    $error['captcha'] = 'Bạn chưa nhập captcha';
    $error['error'] = 'error';
}
else if (!isset($_SESSION['captcha_code']) || $_SESSION['captcha_code'] != trim($captcha)) {
    $error['captcha'] = 'Captcha bạn nhập không đúng';
    $error['error'] = 'error';
}

// Trả kết quả cho client
die (json_encode($error));

Trong file này bạn chỉ cần chú ý đến những đoạn code comment mà tôi dùng để kiểm tra mã captcha. Vì ở file image.php tôi lưu code vào SESSION nên ở đây tôi sẽ kiểm tra và gọi session để so sánh thông số rồi trả về kết quả
Chạy lên ta ta sẽ có như hình ảnh dưới đây:
http://freetuts.net/upload/tut_post/images/2014/08/21/137/captcha-voi-php.png

5. Lời kết

Bài này mình chỉ muốn giới thiệu thư viện captcha và cách sử dụng nó như hiển thị captcha, reload capcha,... đồng thời hướng dẫn các bạn cách sử dụng Ajax để validate form. Vì bài khá đơn giản nên mình không sử dụng database để lưu trữ.