PHP yakuniy loyiha: izohlar sahifasi

Bu darsda butun bo’lim bo’ylab o’rganilganlarni bitta ishlaydigan loyihada birlashtiramiz: izohlar sahifasi — forma, validatsiya, saqlash va ro’yxat.

Loyiha tuzilishi

include darsidagi tamoyil bo’yicha:

izohlar/
├── public/
│   └── index.php          ← kirish nuqtasi
├── src/
│   ├── izohlar.php        ← ma'lumot bilan ishlash
│   └── validatsiya.php    ← tekshirish
├── qismlar/
│   ├── sarlavha.php
│   └── footer.php
└── malumot/
    └── izohlar.json       ← saqlash joyi

Vazifalar ajratilgan: bir fayl saqlaydi, ikkinchisi tekshiradi, uchinchisi ko’rsatadi.

Validatsiya qatlami

PHP

Funksiya sof: kirish oladi, xatolar massivini qaytaradi, hech narsani o’zgartirmaydi. Shuning uchun uni alohida sinash oson.

Saqlash qatlami

PHP

Uch himoya qatlami: fayl bormi, JSON to’g’rimi, natija massivmi. Tashqi ma’lumotga hech qachon ishonmangxatolar darsidagi qoida.

Faylga yozish:

function izohlarniSaqla(string $fayl, array $izohlar): bool {
    $matn = json_encode(
        $izohlar,
        JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
    );
    return file_put_contents($fayl, $matn, LOCK_EX) !== false;
}

JSON_UNESCAPED_UNICODE — o’zbek harflari o’qiladigan qolsin; LOCK_EX — ikki so’rov bir vaqtda yozib faylni buzmasin.

Ko’rsatish qatlami

PHP

Ikkinchi izohga qarang: hujum urinishi zararsiz matnga aylandi — htmlspecialchars ishladi.

<<<HTML ... HTML; — heredoc yozuvi, ko’p qatorli matn uchun qulay. nl2br qator uzilishlarini <br> ga o’giradi.

To’liq kirish nuqtasi

public/index.php — barcha qatlamlarni birlashtiradi:

<?php
declare(strict_types=1);

require __DIR__ . "/../src/izohlar.php";
require __DIR__ . "/../src/validatsiya.php";

const FAYL = __DIR__ . "/../malumot/izohlar.json";

$xatolar = [];
$eski = ["ism" => "", "email" => "", "matn" => ""];

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $eski = [
        "ism"   => trim($_POST["ism"] ?? ""),
        "email" => trim($_POST["email"] ?? ""),
        "matn"  => trim($_POST["matn"] ?? ""),
    ];

    $xatolar = izohTekshir($eski);

    if (!$xatolar) {
        $izohlar = izohlarniOqi(FAYL);
        $izohlar = izohQosh($izohlar, $eski);
        izohlarniSaqla(FAYL, $izohlar);

        // POST-Redirect-GET
        header("Location: /index.php?holat=ok");
        exit;
    }
}

$izohlar = izohlarniOqi(FAYL);
$sarlavha = "Izohlar";
require __DIR__ . "/../qismlar/sarlavha.php";
?>

<?php if (isset($_GET["holat"])): ?>
  <p class="muvaffaqiyat">Izohingiz qo'shildi. Rahmat!</p>
<?php endif; ?>

<form method="post">
  <label>Ism:
    <input type="text" name="ism"
           value="<?= htmlspecialchars($eski["ism"]) ?>">
  </label>
  <?php if (isset($xatolar["ism"])): ?>
    <span class="xato"><?= $xatolar["ism"] ?></span>
  <?php endif; ?>

  <label>Email:
    <input type="email" name="email"
           value="<?= htmlspecialchars($eski["email"]) ?>">
  </label>
  <?php if (isset($xatolar["email"])): ?>
    <span class="xato"><?= $xatolar["email"] ?></span>
  <?php endif; ?>

  <label>Izoh:
    <textarea name="matn"><?= htmlspecialchars($eski["matn"]) ?></textarea>
  </label>
  <?php if (isset($xatolar["matn"])): ?>
    <span class="xato"><?= $xatolar["matn"] ?></span>
  <?php endif; ?>

  <button type="submit">Yuborish</button>
</form>

<h2><?= count($izohlar) ?> ta izoh</h2>

<?php foreach (array_reverse($izohlar) as $izoh): ?>
  <?= izohChiz($izoh) ?>
<?php endforeach; ?>

<?php require __DIR__ . "/../qismlar/footer.php"; ?>

Butun oqim bir joyda

PHP

Ishonchsiz so’rov rad etildi, to’g’rilari saqlandi — butun zanjir ishladi.

Qanday naqshlar ishlatildi

Naqsh Dars
Qatlamlarga bo’lish, __DIR__ include
$_POST + ?? + trim formalar
filter_var bilan validatsiya formalar
Assotsiativ massivda xatolar assotsiativ massiv
try/catch bilan JSON o’qish xatolar
htmlspecialchars — XSS himoyasi matn funksiyalari
foreach bilan ro’yxat chizish sikllar
Tur belgilangan funksiyalar funksiyalar

Keyingi qadamlar

Loyihani kengaytirish uchun g’oyalar:

  1. Ma’lumotlar bazasi — JSON o’rniga MySQL va PDO;
  2. Sahifalash — izohlar ko’payganda 10 tadan ko’rsatish;
  3. Sessiya — foydalanuvchi ismini eslab qolish;
  4. CSRF token — forma soxta saytdan yuborilmasin;
  5. Moderatsiya — izoh avval tasdiqlansin, keyin chiqsin;
  6. Testlar — validatsiya funksiyasi uchun PHPUnit.

Bo’lim yakuni

Shu bilan PHP Boshlang’ich darajasi tugadi. Siz o’rgandingiz:

  • Asoslar — o’zgaruvchi, tur, operator, shart, sikl, funksiya;
  • Ma’lumot — massiv, assotsiativ massiv, matn va son funksiyalari, sana;
  • Web — forma qabul qilish, validatsiya, include bilan bo’lish;
  • Ishonchlilik — xatolarni ushlash va xavfsizlik qoidalari.

Amaliy mashq

  1. Loyihani o’z papkangizga ko’chirib, php -S localhost:8000 bilan ishga tushiring;
  2. validatsiyaga “izoh 500 belgidan oshmasin” shartini qo’shing;
  3. izohlarni eng yangisi tepada bo’ladigan qilib saralang;
  4. izohlar sonini ko’rsatuvchi sarlavha qo’shing;
  5. bo’sh ro’yxat uchun “Hali izoh yo’q” xabarini chiqaring;
  6. htmlspecialchars ni olib tashlab, <b>test</b> yuboring — farqni ko’ring, keyin qaytaring.

Qisqacha xulosa

  • Kodni qatlamlarga ajrating: validatsiya, saqlash, ko’rsatish.
  • Validatsiya funksiyasi sof bo’lsin — sinash oson bo’ladi.
  • Tashqi ma’lumotni (fayl, JSON, $_POST) har doim tekshirib qabul qiling.
  • Xato bo’lsa foydalanuvchi kiritganini formaga qaytaring.
  • Saqlagandan keyin POST-Redirect-GET bilan yo’naltiring.
  • Chiqarishda htmlspecialchars — majburiy.
  • Yo’llarni __DIR__ bilan yozing, sozlamani public/ dan tashqarida saqlang.

Bu dars foydali bo'ldimi?

marta ko'rildi