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
Funksiya sof: kirish oladi, xatolar massivini qaytaradi, hech narsani o’zgartirmaydi. Shuning uchun uni alohida sinash oson.
Saqlash qatlami
Uch himoya qatlami: fayl bormi, JSON to’g’rimi, natija massivmi. Tashqi ma’lumotga hech qachon ishonmang — xatolar 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
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
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:
- Ma’lumotlar bazasi — JSON o’rniga MySQL va PDO;
- Sahifalash — izohlar ko’payganda 10 tadan ko’rsatish;
- Sessiya — foydalanuvchi ismini eslab qolish;
- CSRF token — forma soxta saytdan yuborilmasin;
- Moderatsiya — izoh avval tasdiqlansin, keyin chiqsin;
- 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,
includebilan bo’lish; - Ishonchlilik — xatolarni ushlash va xavfsizlik qoidalari.
Amaliy mashq
- Loyihani o’z papkangizga ko’chirib,
php -S localhost:8000bilan ishga tushiring; - validatsiyaga “izoh 500 belgidan oshmasin” shartini qo’shing;
- izohlarni eng yangisi tepada bo’ladigan qilib saralang;
- izohlar sonini ko’rsatuvchi sarlavha qo’shing;
- bo’sh ro’yxat uchun “Hali izoh yo’q” xabarini chiqaring;
htmlspecialcharsni 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, sozlamanipublic/dan tashqarida saqlang.