Příkaz INSERT: Jak přidat nový řádek?
Zatímco SELECT data vybíral, INSERT je vytváří. Představte si to jako vyplnění nového listu v našem pořadači a jeho založení do složky.
Základní syntaxe vypadá takto:
INSERT INTO uzivatele (jmeno, email, heslo)
VALUES ('Jan Novák', 'jan@novak.cz', 'tajneheslo123');
Co se v dotazu děje?
INSERT INTO uzivatele: Říkáme, do které tabulky chceme psát.
(jmeno, email, heslo): V závorce definujeme seznam sloupců, které hodláme vyplnit.
VALUES (...): Zde uvádíme konkrétní hodnoty v přesném pořadí, v jakém jsme vypsali sloupce.
Poznámka: Pokud má tabulka sloupec
ID, který je nastaven jakoAUTO_INCREMENT(automatické číslování), v příkazu INSERT ho vůbec neuvádíme. Databáze mu přiřadí další volné číslo sama.
SQL Injection: Když uživatel „přepíše“ váš dotaz
Představte si, že máte v PHP kód, který bere jméno z formuláře a vkládá ho přímo do dotazu:
$sql = "SELECT * FROM uzivatele WHERE jmeno = '$jmeno_z_formulare'";
Pokud útočník do políčka pro jméno napíše: ' OR '1'='1, váš výsledný dotaz bude vypadat takto:
SELECT * FROM uzivatele WHERE jmeno = '' OR '1'='1';
Protože 1=1 je vždy pravda, databáze útočníkovi vypíše úplně všechny uživatele i bez znalosti hesla. Tomuto principu se říká SQL Injection.
Obrana: Připravené dotazy (Prepared Statements)
Moderní a nejbezpečnější cestou, jak komunikovat s databází, je nepředávat data přímo, ale používat tzv. „zástupné symboly“ (otazníky).
Místo toho, abychom hodnoty do dotazu „vlepili“, pošleme databázi nejprve šablonu (dotaz s otazníky) a data jí pošleme až v druhém kroku. Databáze pak s těmito daty zachází pouze jako s textem, nikoliv jako s příkazem, což útok znemožní.
Příklad v PHP (pomocí PDO):
// 1. Připravíme si šablonu s otazníky
$stmt = $pdo->prepare("INSERT INTO uzivatele (jmeno, email) VALUES (?, ?)");
// 2. Data pošleme bezpečně odděleně v poli
$stmt->execute([$jmeno, $email]);
Závěr
Vkládání dat je základem každé interaktivní aplikace – od registrace uživatelů po přidávání příspěvků na zeď. Pamatujte si však zlaté pravidlo: Nikdy nevěřte ničemu, co uživatel napíše do formuláře. Vždy používejte Prepared Statements.
V příští kapitole se podíváme na úpravu již existujících dat pomocí příkazu UPDATE a naučíme se mazat záznamy tak, abychom si omylem nesmazali celou databázi.
