0%

📝 Formas un POST/GET

HTML formas ļauj lietotājiem ievadīt datus, kurus PHP var uzņemt un apstrādāt. Šī ir fundamentāla web programmēšanas prasme.

php

GET vs POST

ĪpašībaGETPOST
Datu atrašanās vietaURL (?atslēga=vērtība)Pieprasījuma ķermenis (neredzams URL)
RedzamībaRedzams URLNav redzams
Bukleta iespēja✅ Var saglabāt kā grāmatzīmi❌ Nevar
Datu apjoms~2000 rakstzīmesNeierobežots (praktiski)
DrošībaMazāk droša (sensitīviem datiem)Drošāka (paroles, personas dati)
Kešošana✅ Tiek kešots❌ Netiek kešots
IzmantošanaMeklēšana, filtrēšana, navigācijaFormas, pieteikšanās, datu augšupielāde
Teksts
<?php
// GET datu uztvēršana (no URL: ?vārds=Anna&vecums=25)
$vārds = $_GET["vārds"] ?? "Anonīms";
$vecums = (int) ($_GET["vecums"] ?? 0);

echo "Vārds: $vārds, Vecums: $vecums<br>";

// POST datu uztvēršana (no formas)
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $vārds = trim($_POST["vārds"] ?? "");
    $parole = $_POST["parole"] ?? "";
    
    echo "Saņemts vārds: " . htmlspecialchars($vārds);
}

// $_REQUEST - apvieno GET, POST un COOKIE
$meklēšana = $_REQUEST["q"] ?? "";
?>

HTML forma + PHP apstrāde

Teksts
<?php
// Pilns piemērs: forma un apstrāde vienā failā
// Saglabā kā: kontaktforma.php

$kļūdas = [];
$veiksmīgi = false;
$vārds = $epasts = $ziņa = "";

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // Uztvērt un "iztīrīt" datus
    $vārds  = trim($_POST["vārds"] ?? "");
    $epasts = trim($_POST["epasts"] ?? "");
    $ziņa   = trim($_POST["ziņa"] ?? "");

    // Validācija
    if (empty($vārds)) {
        $kļūdas[] = "Vārds ir obligāts lauks.";
    } elseif (strlen($vārds) < 2) {
        $kļūdas[] = "Vārds ir pārāk īss.";
    }

    if (empty($epasts)) {
        $kļūdas[] = "E-pasts ir obligāts lauks.";
    } elseif (!filter_var($epasts, FILTER_VALIDATE_EMAIL)) {
        $kļūdas[] = "Nepareizs e-pasta formāts.";
    }

    if (strlen($ziņa) < 10) {
        $kļūdas[] = "Ziņa jābūt vismaz 10 rakstzīmes gara.";
    }

    if (empty($kļūdas)) {
        // Viss kārtībā - apstrādā (saglabā DB, sūti epast utt.)
        $veiksmīgi = true;
        // Notīrīt pēc veiksmīgas apstrādes
        $vārds = $epasts = $ziņa = "";
    }
}
?>

<!DOCTYPE html>
<html lang="lv">
<body>

<?php if ($veiksmīgi): ?>
    <div style="color:green; padding:10px; background:#e8f5e9; border-radius:5px;">
        ✅ Paldies! Ziņa veiksmīgi nosūtīta.
    </div>
<?php endif; ?>

<?php if (!empty($kļūdas)): ?>
    <div style="color:red; padding:10px; background:#ffebee; border-radius:5px;">
        <strong>Kļūdas:</strong>
        <ul>
            <?php foreach ($kļūdas as $kļūda): ?>
                <li><?= htmlspecialchars($kļūda) ?></li>
            <?php endforeach; ?>
        </ul>
    </div>
<?php endif; ?>

<form method="POST" action="">
    <label>Vārds:
        <input type="text" name="vārds" value="<?= htmlspecialchars($vārds) ?>" required>
    </label><br>

    <label>E-pasts:
        <input type="email" name="epasts" value="<?= htmlspecialchars($epasts) ?>">
    </label><br>

    <label>Ziņa:
        <textarea name="ziņa"><?= htmlspecialchars($ziņa) ?></textarea>
    </label><br>

    <button type="submit">Nosūtīt</button>
</form>

</body>
</html>

Dzīva forma demonstrācija

Aizpildiet formu zemāk, lai redzētu PHP formu apstrādi darbībā:

Vārds * E-pasts * Ziņa * Nosūtīt ziņu

Drošība – XSS un SQL Injection novēršana

❌ 3 galvenās drošības kļūdas
  1. XSS: Vienmēr izmantojiet htmlspecialchars() pirms datu izvadīšanas HTML
  2. SQL Injection: Vienmēr izmantojiet PDO sagatavotus paziņojumus
  3. CSRF: Pievienojiet CSRF token visām formām, kas maina datus

🎓 Ko mācīties tālāk?

Nākamajā sadaļā iepazīstieties ar objektorientētu programmēšanu (OOP) PHP – klases, objekti, mantošana.

Teksts
<?php
// ========================================
// XSS (Cross-Site Scripting) novēršana
// ========================================

// BĪSTAMI - tieši izvadīt lietotāja ievadi:
// echo $_POST["vards"]; // NEKAD tā nedarīt!

// DROŠI - htmlspecialchars() pārvērš HTML speciālās rakstzīmes
$ievade = $_POST["vards"] ?? "";
echo htmlspecialchars($ievade, ENT_QUOTES, "UTF-8");

// DROŠI - filter_input() ar sanitization
$vārds = filter_input(INPUT_POST, "vards", FILTER_SANITIZE_SPECIAL_CHARS);
$vecums = filter_input(INPUT_POST, "vecums", FILTER_VALIDATE_INT);
$epasts = filter_input(INPUT_POST, "epasts", FILTER_VALIDATE_EMAIL);

// ========================================
// SQL Injection novēršana (Prepared Statements)
// ========================================

// BĪSTAMI:
// $id = $_GET["id"];
// $sql = "SELECT * FROM users WHERE id = $id";
// (lietotājs var ievadīt: 1 OR 1=1 un dabūt visus ierakstus!)

// DROŠI - izmantot PDO un sagatavotus paziņojumus:
// $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
// $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
// $stmt->execute(["id" => $id]);
// $lietotājs = $stmt->fetch();

// ========================================
// CSRF (Cross-Site Request Forgery) aizsardzība
// ========================================

// Ģenerēt tokenu sesijā
session_start();
if (empty($_SESSION["csrf_token"])) {
    $_SESSION["csrf_token"] = bin2hex(random_bytes(32));
}
$csrf = $_SESSION["csrf_token"];

// Forma: <input type="hidden" name="csrf" value="<?= $csrf ?>">

// Validācija:
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    if (!hash_equals($_SESSION["csrf_token"], $_POST["csrf"] ?? "")) {
        die("CSRF validācija neizdevās!");
    }
    // Turpina apstrādi...
}
?>