<?php
// Připojení k databázi a definice vlastních funkcí.
require('common.php');
// Tisk HTML hlavičky.
hlavicka('Vložení osoby');
// try-catch blok pro zachycení chyb v SQL dotazech
try {
/* Jestli byl odeslaný formulář zjistíme podle toho, jestli je v POST datech prvek tlačítka */
if (isset($_POST['insert'])) {
// Byl odeslaný formulář, zkontrolujeme zadání
if (empty($_POST['jmeno']) ||
empty($_POST['prijmeni']) ||
empty($_POST['prezdivka'])) {
/* Není zadáno jmeno, prijmeni nebo prezdivka, což jsou povinná pole (to je dané v databázi)
kdybychom chtěli větší uživatelskou přívětivost, bylo byt nutné testovat každou proměnou
ve vlastní podmínce a zobrazit přesné chybové hlášení (co konkrétně bylo špatně vyplněno)
*/
echo "Špatně vyplněno";
} else {
/* Formulář je přibližně správně vyplněn (ještě bychom měli zkontrolovat jestli je výška a
datum ve správném formátu). Výšku převedeme pomocí funkce intval() při vkládání (což
není příliš správné, ale je to účinné. Datum je složitější a bude ošetřeno v nějaké
další verzi - chyba zadání se projeví prostě tím, že se osobu nepodaří vložit. */
/* Sestavíme SQL dotaz s parametry.
*/
$stmt = $db->prepare("INSERT INTO osoby
(prezdivka,jmeno, prijmeni,vyska,datum_narozeni,id_adresy) VALUES
(:prezdivka, :jmeno, :prijmeni, :vyska, :datum_narozeni, :id_adresy)");
$stmt->bindValue(':datum_narozeni', $_POST['datum_narozeni'], PDO::PARAM_STR);
$stmt->bindValue(':prezdivka', $_POST['prezdivka'], PDO::PARAM_STR);
$stmt->bindValue(':jmeno', $_POST['jmeno'], PDO::PARAM_STR);
$stmt->bindValue(':prijmeni', $_POST['prijmeni'], PDO::PARAM_STR);
// Výška nemusí být zadaná
if (empty($_POST['vyska'])) {
/* Nastavíme hodnotu na null - tak zajistíme, že i v SQL dotazu bude vložena
hodnota NULL (bez hodnoty), pokud bychom to neudělali, tak by se do dotazu
vložil prázdný řetězec, který nelze v databázi uložit do sloupce typu integer
*/
$_POST['vyska'] = null;
} else {
/* Převedeme výšku na celé číslo (tento převod je velmi agresivní, takže například
z '42 banánů' udělá hodnotu 42) */
$_POST['vyska'] = intval($_POST['vyska']);
}
// výška a id adresy jsou v DB uložené jako číslo, proto vynutíme datový typ INT
$stmt->bindValue(':vyska', $_POST['vyska'], PDO::PARAM_INT);
$stmt->bindValue(':id_adresy', null, PDO::PARAM_INT);
// Pro kontrolu vypíšeme dotaz na obrazovku
$stmt->debugDumpParams();
// Spustíme SQL dotaz
$stmt->execute();
/* Pokud adresa není úspěšně vložena, bude vytvořena výjimka a následující řádek
se neprovede.
*/
echo "<p>Osoba byla vložena.</p>";
}
}
} catch (PDOException $e) { // došlo k chybě při zpracovávání SQL dotazů
/* Tato situace může nastat pokud se pokusíme vložit již existující záznam, nebo pokud
nejsou vstupní parametry dobře ošetřeny. */
echo "<p>Došlo k chybě: ".$e->getMessage()."</p>\n";
}
/* Výpis formuláře - vzhledem k tomu, že budeme formulář později upravovat, tak je výhodné
rovnou ho generovat dynamicky jako text vypsaný pomocí příkazu echo
*/
echo "
<form method='post'>
<table>
<tr>
<td>Jméno:</td>
<td><input type='text' name='jmeno' /></td>
</tr><tr>
<td>Příjmení:</td>
<td><input type='text' name='prijmeni' /></td>
</tr><tr>
<td>Přezdívka:</td>
<td><input type='text' name='prezdivka' /></td>
</tr><tr>
<td>Datum narození:</td>
<td><input type='text' name='datum_narozeni' /></td>
</tr><tr>
<td>Výška:</td>
<td><input type='text' name='vyska' /></td>
</tr><tr>
<td colspan='2'><input type='submit'
name='insert' value='Vložit osobu' /></td>
</tr>
</table>
</form>
</body>
</html>";