PHP / Маягт баталгаажуулалт

Маягт баталгаажуулалт

Хэрэглэгч маягтад юу ч оруулж болно — хоосон утга, буруу формат, маш урт текст, эсвэл хортой код хүртэл. Тиймээс маягтаас ирсэн өгөгдлийг хэзээ ч итгэлгүйгээр боловсруулж, заавал шалгах хэрэгтэй. Энэ шалгалтыг validation гэж нэрлэдэг. Сайн validation нь хэрэглэгчид ойлгомжтой алдааны мэдэгдэл өгөж, програмыг аюулгүй байлгадаг.

Үндсэн шалгалтууд

Хамгийн түгээмэл шалгалтуудыг харцгаая:

php
<?php
$алдаанууд = [];
$ner = '';
$имэйл = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // Хоосон эсэхийг шалгах
    $ner = trim($_POST['ner'] ?? '');
    if ($ner === '') {
        $алдаанууд[] = "Нэр заавал шаардлагатай.";
    }

    // Урт шалгах
    if (strlen($ner) > 50) {
        $алдаанууд[] = "Нэр 50 тэмдэгтээс ихгүй байна.";
    }

    // И-мэйл формат шалгах
    $имэйл = trim($_POST['имэйл'] ?? '');
    if (!filter_var($имэйл, FILTER_VALIDATE_EMAIL)) {
        $алдаанууд[] = "И-мэйл хаяг буруу байна.";
    }
}
?>

trim() нь мөрийн эхэн, эцэс дэх хоосон зайг арилгадаг — хэрэглэгч санамсаргүйгээр зай оруулсан байж болно. ?? нь утга байхгүй тохиолдолд '' буцаана.

Алдааг хуудсанд харуулах

Validation-н үр дүнг хэрэглэгчид тодорхой харуулах нь маш чухал. Алдааны жагсаалт болон маягтыг нэг хуудсанд нэгтгэж бичнэ:

php
<?php
$алдаанууд = [];
$амжилт = false;
$ner = '';
$нас = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $ner = trim($_POST['ner'] ?? '');
    $нас = trim($_POST['нас'] ?? '');

    if ($ner === '') {
        $алдаанууд[] = "Нэр хоосон байна.";
    }

    if ($нас === '' || !is_numeric($нас)) {
        $алдаанууд[] = "Нас буруу байна.";
    } elseif ((int)$нас < 1 || (int)$нас > 120) {
        $алдаанууд[] = "Нас 1–120 хооронд байх ёстой.";
    }

    if (empty($алдаанууд)) {
        $амжилт = true;
    }
}
?>

<!DOCTYPE html>
<html>
<body>

<?php if ($амжилт): ?>
    <p>Амжилттай бүртгэгдлээ! Сайн уу, <?php echo htmlspecialchars($ner); ?>!</p>
<?php endif; ?>

<?php if (!empty($алдаанууд)): ?>
    <ul>
        <?php foreach ($алдаанууд as $алдаа): ?>
            <li><?php echo $алдаа; ?></li>
        <?php endforeach; ?>
    </ul>
<?php endif; ?>

<form action="" method="post">
    <input type="text" name="ner" value="<?php echo htmlspecialchars($ner); ?>" placeholder="Нэр">
    <input type="number" name="нас" value="<?php echo htmlspecialchars($нас); ?>" placeholder="Нас">
    <button type="submit">Бүртгүүлэх</button>
</form>

</body>
</html>

value="<?php echo htmlspecialchars($ner); ?>" — алдаатай үед хэрэглэгчийн оруулсан утгыг хадгалж харуулдаг тул дахин бүгдийг бичихгүй.

filter_var — PHP-н суурилагдсан шалгагч

PHP-д filter_var() функц нь олон төрлийн шалгалт хийдэг:

php
<?php
$имэйл = "test@example.com";
$url   = "https://example.com";
$тоо   = "42";

// И-мэйл шалгах
if (filter_var($имэйл, FILTER_VALIDATE_EMAIL)) {
    echo "И-мэйл зөв байна.";
}

// URL шалгах
if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo "URL зөв байна.";
}

// Тоо шалгах (бүхэл тоо)
if (filter_var($тоо, FILTER_VALIDATE_INT)) {
    echo "Бүхэл тоо байна.";
}

// Тоо шалгах (мужтай)
$сонголт = filter_var($тоо, FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 1, 'max_range' => 100]
]);
if ($сонголт !== false) {
    echo "1-ээс 100 хооронд байна.";
}
?>

filter_var() нь false буцаавал шалгалт тэнцсэнгүй гэсэн үг.

Өгөгдлийг цэвэрлэх (sanitization)

Validation нь өгөгдөл зөв эсэхийг шалгадаг бол sanitization нь өгөгдлөөс хортой хэсгийг арилгадаг. Хоёулаа зэрэг хэрэглэх нь шилдэг дадал:

php
<?php
$утга = "<script>alert('xss')</script> Болд";

// HTML тэгийг арилгана
$цэвэр = strip_tags($утга);
echo $цэвэр; // Болд

// Тусгай тэмдэгтүүдийг HTML entity болгоно
$аюулгүй = htmlspecialchars($утга);
echo $аюулгүй; // &lt;script&gt;alert('xss')&lt;/script&gt; Болд

// Filter ашиглан цэвэрлэх
$имэйл = filter_var("  test@EXAMPLE.com  ", FILTER_SANITIZE_EMAIL);
echo $имэйл; // test@EXAMPLE.com
?>

Гаралтыг хэвлэхдээ htmlspecialchars() — оруултыг хадгалахдаа strip_tags() — гэж ойлговол хялбар.

Дараагийн хичээлд:

Файл унших, бичих үйлдлүүдийг судална. fopen(), fread(), fwrite(), file_get_contents() функцуудаар текст файлтай хэрхэн ажиллахыг жишээгээр үзнэ.s