Ngu ngơ học làm web (62) - Ứng dụng “Trắc nghiệm tính cách”

Tiếp theo của: Ngu ngơ học làm web (61) - Bài tập về mảng
------

Phần 62. Ứng dụng “Trắc nghiệm tính cách”

Đây là clip số 32: viết ứng dụng “trắc nghiệm tính cách”


Lưu lại các tập tin dữ liệu để tiện sử dụng,

[questions.txt]

id|question
01|Bạn cảm thấy dễ chịu nhất khi nào?
02|Bạn thường bước đi:
03|Khi nói chuyện với người khác, bạn:
04|Khi nghỉ ngơi, bạn ngồi như thế nào?
05|Khi ngạc nhiên thích thú, bạn phản ứng thế nào?
06|Khi đi dự tiệc, bạn:
07|Bạn đang làm việc và tập trung cao độ thì bị cắt ngang. Bạn sẽ:
08|Bạn thích màu nào nhất trong các màu dưới đây?
09|Khi đi ngủ, lúc sắp ngủ, bạn nằm trong tư thế nào?
10|Bạn thường mơ mình:

[options.txt]

question_id|option_id|option|point
01|a|Vào buổi sáng|2
01|b|Vào buổi chiều và chớm tối|4
01|c|Vào đêm muộn|6
02|a|Khá nhanh với bước chân dài|6
02|b|Khá nhanh với bước chân ngắn|4
02|c|Không nhanh lắm, đầu ngẩng cao, hướng mặt ra cả thế giới|7
02|d|Không nhanh lắm, đầu cúi xuống|2
02|e|Rất chậm|1
03|a|Đứng, khoanh tay|4
03|b|Siết chặt hai bàn tay|2
03|c|Đặt một hoặc cả hai tay lên hông|5
03|d|Chạm hoặc đẩy người đối thoại|7
03|e|Sờ tai, xoa cằm hoặc nghịch tóc|6
04|a|Đầu gối cong, hai chân khép sát vào nhau|4
04|b|Hai chân bắt chéo nhau|6
04|c|Hai chân duỗi thẳng|2
04|d|Khoanh chân|1
05|a|Cười lớn|6
05|b|Cười, nhưng không cười lớn|4
05|c|Cười lặng lẽ|3
05|d|Cười bẽn lẽn, ngượng ngùng|5
06|a|Gây ồn ào khi đến để mọi người chú ý|6
06|b|Đến lặng lẽ, và tìm người bạn quen biết|4
06|c|Bước vào một cách lặng lẽ nhất, cố gắng không bị chú ý|2
07|a|Chào đón "kẻ phá đám"|6
07|b|Cảm thấy thực sự khó chịu|2
07|c|Mơ hồ giữa hai thái cực|4
08|a|Đỏ hoặc cam|6
08|b|Đen|7
08|c|Vàng hoặc xanh nhạt|5
08|d|Xanh lá cây|4
08|e|Xanh đậm hoặc tím|3
08|f|Trắng|2
08|g|Nâu hoặc xám|1
09|a|Nằm ngửa duỗi thẳng|7
09|b|Nằm úp, duỗi thẳng|6
09|c|Nằm nghiêng về một bên, hơi co|4
09|d|Tay gối đầu|2
09|e|Chùm đầu|1
10|a|Rớt|4
10|b|Đánh đấm hoặc vật lộn|2
10|c|Tìm kiếm một vật gì hoặc người nào|3
10|d|Bay hoặc trôi|5
10|e|Ít khi mơ|6
10|f|Giấc mơ của bạn luôn vui vẻ dễ thương|1

[result.txt]

min|max|result
0|20|Mọi người nghĩ bạn là người nhút nhát, hay run sợ, và thiếu quyết đoán, bạn là người luôn cần sự quan tâm, và luôn luôn muốn một ai đó khác đưa ra quyết định cho mình và chẳng bao giờ muốn tham gia bất cứ điều gì với bất cứ ai! Mọi người coi bạn là người hay lo lắng vào những vấn đề không tồn tại. Một số người nghĩ rằng bạn là người nhàm chán nhưng chỉ những người thật sự hiểu bạn mới biết rằng bạn không phải như thế.
21|30|Bạn bè của bạn coi bạn là người chịu khó và kén chọn. Họ coi bạn là người rất thận trọng, vô cùng cẩn thận, chậm và ổn định̀. Sẽ thật sự rất ngạc nhiên nếu bỗng nhiên bạn làm điều gì đó bốc đồng hay hấp tấp . Bạn là người có thể kiểm tra và suy xét tất cả mọi thứ một cách cẩn thận từ mọi góc độ và sau đó quyết định của bạn có thể đi ngược lại nó. Mọi người nghĩ rằng những phản ứng này là do một phần trong tính cách thận trọng của bạn.
31|40|Mọi người cảm thấy bạn nhạy cảm, thận trọng, kỹ lưỡng và thực tế. Họ coi bạn là người thông minh, tài năng và khiêm tốn. Bạn không kết bạn quá nhanh hoặc quá dễ dàng, nhưng bạn cực kỳ trung thành với bạn bè và cũng mong đợi từ bạn của mình một lòng trung thành trở lại. Những người bạn thật sự của bạn luôn biết rằng phải rất khó khăn mới có thể làm bạn mất đi sự tin tưởng ở bạn bè của bạn, nhưng việc đó cũng đồng nghĩa rằng một khi lòng tin tưởng đó đổ vỡ thì cũng khó mà hàn gắn.
41|50|Mọi người thấy bạn tươi mát, sinh động, vui vẻ, thiết thực, và luôn luôn thú vị. Bạn luôn là trung tâm của sự chú ý, nhưng vừa đủ cân bằng chứ không để cho nó vượt qua giới hạn. Mọi người thấy bạn là người tử tế, ân cần, một người hiểu biết và sẽ luôn luôn cổ vũ và giúp đỡ họ.
51|60|Mọi người coi bạn là một người thú vị, hay thay đổi, tánh tình bốc đồng; bạn được sinh ra để là một nhà lãnh đạo. Bạn là người quyết định mọi việc nhanh chóng, mặc dù không phải lúc nào những quyết định đó cũng chính xác. Mọi người coi bạn là một người táo bạo và mạo hiểm, và sẽ cố gắng thử thách bất cứ điều gì đó một lần. Bạn là người biết nắm bắt cơ hội và thích thú những cuộc phiêu lưu. Mọi người thích được ở bên bạn bởi vì những sự hứng thú mà bạn đem đến cho họ.
61|200|Bạn là người mà người khác cảm thấy cần phải đề phòng. Họ thấy bạn là người hão huyền và thích được làm trung tâm của mọi sự chú ý. Cá tính của bạn cũng rất trội và mạnh mẽ. Mọi người có thể khâm phục bạn và mong muốn được như bạn, nhưng họ lại không tin tưởng bạn và luôn ngần ngại, không muốn quá dính líu với bạn.

Qua clip này, để ý cách phân tích ứng dụng sẽ thực hiện, lưu dữ liệu, tổ chức dữ liệu.

Để ý mối liên hệ giữa thuộc tính name, value của một input kiểu radio trong HTML với các trường (field) trong cơ sở dữ liệu. Ví dụ,

<li><label><input type="radio" name="01" value="2"> Vào buổi sáng</label></li>

Ở đoạn mã HTML trên, thuộc tính name chứa id của một câu hỏi, còn value chứa số điểm tương ứng với mỗi câu trả lời của câu hỏi.

Để đọc dữ liệu từ một tập tin, sử dụng hàm file, ví dụ,

            $data = file('questions.txt') or die('Cannot read file');

            echo '<pre>';
            print_r($data);
            echo '</pre>';

Nếu  đọc thành công, hàm file trả về một mảng ($data), mỗi phần tử của mảng chứa một hàng dữ liệu của tập tin.

Dùng hàm array_shift(), để xóa đi phần tử đầu tiên.

Để ý cách tách một chuỗi thành một mảng mới. Ví dụ,

Từ chuỗi:

“01|Bạn cảm thấy dễ chịu nhất khi nào?”

Đưa vào mảng $arrQuestion có dạng:

[01] => Array
        (
            [question] => Bạn cảm thấy dễ chịu nhất khi nào?

        )

Đây là đoạn mã PHP,

            $data = file('questions.txt') or die('Cannot read file');
            // bỏ phần tử đầu tiên của mảng $data
            array_shift($data);
            $arrQuestion = array();
            foreach ($data as $key => $value) {
                        // tách chuôi $value dựa vào kí tự |, đưa vào mảng
                        $tmp_array     = explode('|', $value);
                        $id                   = $tmp_array[0];
                        $question         = $tmp_array[1];
                        $arrQuestion[$id] = array('question' => $question);
            }

Ví dụ khác,

Từ chuỗi:

“01|a|Vào buổi sáng|2
01|b|Vào buổi chiều và chớm tối|4
01|c|Vào đêm muộn|6”

Đưa vào mảng $arrOptions có dạng:

[01] => Array
        (
            [a] => Array
                (
                    [option] => Vào buổi sáng
                    [point] => 2

                )

            [b] => Array
                (
                    [option] => Vào buổi chiều và chớm tối
                    [point] => 4

                )

            [c] => Array
                (
                    [option] => Vào đêm muộn
                    [point] => 6

                )

        )

Đây là đoạn mã,

            $data = file('options.txt') or die('Cannot read file');
            array_shift($data);
            $arrOptions = array();
            foreach ($data as $key => $value) {
                        $tmpArr = explode('|', $value);
                        $questionID     = $tmpArr[0];
                        $optionID                    = $tmpArr[1];
                        $answer                       = $tmpArr[2];
                        $point                          = $tmpArr[3];

                        $arrOptions[$questionID][$optionID]['option'] = $answer;           
                        $arrOptions[$questionID][$optionID]['point'] = $point;     
            }
           
             echo '<pre>';
             print_r($arrOptions);
             echo '</pre>';           

Đây là clip số 33: viết ứng dụng “trắc nghiệm tính cách” (tiếp theo)


Để ý, khi bấm nút submit của Form, toàn bộ dữ liệu của Form sẽ được gửi tới trang result.php, nhờ khai báo trong <form action="result.php" method="POST" name="mainForm"> tại index.php.

Để ý, trong <input type=“radio” name=“” value=“”>, hiểu nôm na, giá trị của thuộc tính name là tên chỉ mục trong biến $_POST, thuộc tính value chứa giá trị của input, và sẽ được gửi về Server tại vị trí $_POST[‘name’] tương ứng. Có thể bấm nút submit, rồi dùng dòng lệnh này để kiểm tra:

<?php
            echo '<pre>';
            print_r($_POST);
            echo '</pre>';
?>

Đây là clip số 34: viết ứng dụng “trắc nghiệm tính cách” (hết)


Lưu lại mã nguồn để tham khảo,

[function_option.php]

<?php
            $data = file('options.txt') or die('Cannot read file');
            array_shift($data);
            $arrOptions = array();
            foreach ($data as $key => $value) {
                        $tmpArr = explode('|', $value);
                        $questionID     = $tmpArr[0];
                        $optionID                    = $tmpArr[1];
                        $answer                                   = $tmpArr[2];
                        $point                          = $tmpArr[3];

                        $arrOptions[$questionID][$optionID]['option'] = $answer;           
                        $arrOptions[$questionID][$optionID]['point'] = $point;     
            }
?>

[function_question.php]

<?php
            $data = file('questions.txt') or die('Cannot read file');
            array_shift($data);
            $arrQuestions = array();
            foreach ($data as $key => $value) {
                        $tmp_array     = explode('|', $value);
                        $id                   = $tmp_array[0];
                        $question         = $tmp_array[1];
                        $arrQuestions[$id] = array('question' => $question);
            }
?>

[result.php]

<!DOCTYPE html>
<html lang="en">
<head>
            <meta charset="UTF-8">
            <title>Trắc nghiệm tính cách</title>
            <link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
<?php
            // Đọc tập tin questions.txt
            $data = file('questions.txt') or die('Cannot read file');

            $point = 0;
            array_shift($data);

            foreach ($data as $key => $value) {
                        $tmpArr = explode('|', $value);
                        $id       = $tmpArr[0];
                        $point = $point + $_POST[$id];
            }
            // Đọc tập tin result.txt
            $data = file('result.txt') or die('Cannot read file');
            array_shift($data);
            foreach ($data as $key => $value) {
                        $tmpArr = explode('|', $value);
                        $min    = $tmpArr[0];
                        $max   = $tmpArr[1];
                        $content           = $tmpArr[2];
                        if($point >= $min && $point <= $max) {
                                    $result = $content;
                                    break;
                        }
            }

            // echo '<pre>';
            // print_r($_POST);
            // echo '</pre>';
?>
            <div class="content">
                        <h1>Kết quả trắc nghiệm tính cách</h1>
                        <p><b>Tổng số điểm của bạn là: </b><?php echo $point;?></p><p style='margin-top: 10px; text-align: justify;'><b>Kết quả trắc nghiệm của bạn: </b><?php echo $result;?></p>
            </div>
           
</body>
</html>

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
            <meta charset="UTF-8">
            <title>Trắc nghiệm tính cách</title>
            <link type="text/css" rel="stylesheet" href="style.css">
</head>

<body>
<?php
            require_once 'function_question.php'; //$arrQuestions
            require_once 'function_option.php'; //$arrOptions

            $newArr = array();
            foreach ($arrQuestions as $key => $value) {
                        $newArr[$key]['question'] = $value['question'];
                        $newArr[$key]['sentences'] = $arrOptions[$key];
            }
?>
            <div class="content">
                        <h1>Trắc nghiệm tính cách</h1>
                        <form action="result.php" method="POST" name="mainForm">
                        <?php
                                    $i = 1;
                                    foreach ($newArr as $key => $value) {
                                                echo '<div class="question">';
                                                echo '<p><span>Câu hỏi '.$i.': </span>'.$value['question'].'</p>';
                                                echo '<ul>';
                                                foreach ($value['sentences'] as $keyC => $valueC) {
                                                            echo '<li><label><input type="radio" name="'.$key.'" value="'.$valueC["point"].'"> '.$valueC["option"].'</label></li>';
                                                }
                                                echo '</ul>';
                                                $i++;
                                                echo '</div>';
                                    }
                        ?>
                        <input type="submit" value="Kiểm tra" name="submit">
                        </form>
                       
            </div>
</body>
</html>

[style.css]

* {
            margin: 0px;
            padding: 0px;
}

.content {
            width: 800px;
            padding: 10px;
            border: 2px solid #ddd;
            height: auto;
            margin: 20px auto;
}

.content h1 {
            color: red;
            text-align: center;
            padding: 10px 0px;
}

.question {
            font-size: 18px;
            line-height: 24px;
}

.question p {
            font-size: 20px;
            line-height: 30px;
}

.question p span {
            font-weight: bold;
}

.question ul li {
            list-style-type: none;
            padding-left: 40px;
}

.content input[type="submit"] {
            margin: 0 auto;
            display: block;
            height: 40px;
            width: 100px;
            border-radius: 5px;
            font-weight: bold;
            font-size: 18px;
}


Đây là clip số 35: ôn tập về mảng


-----------
Cập nhật [9/9/2020]
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web