PHP (40) - PHP a vkládání záznamů do databází
Z databází pochopitelně budeme data jednak vybírat, a jednak je do
ní musíme nějak dostat. Dnes si ukážeme, jak vkládat data do MySQL. A vytvoříme si knihu hostů.
20.8.2004 15:00 |
Petr Zajíc
| Články autora
| přečteno 121562×
Trocha SQL
V MySQL slouží ke vkládání do tabulky příkaz INSERT.
Jeho typická
syntaxe je:
INSERT INTO [název
tabulky] (sloupec, ...) VALUES (hodnota, ...)
To platí v případě, že data do tabulky vkládáme z kódu a přidá to
jeden řádek. Data ovšem můžeme vkládat rovněž z jiné tabulky. Pak je
syntaxe následující:
INSERT INTO [název
tabulky] (sloupec, ...) SELECT ...
a dodejme, že tato syntaxe může vložit obecně nula až mnoho řádků.
Tabulka, do které vkládáme, musí v databázi již existovat. Pokud by
neexistovala, měli bychom ji nejprve vytvořit příkazem CREATE TABLE.
Příkaz INSERT patří mezi tzv. manipulační příkazy jazyka SQL. To
znamená, že po jeho použití se data v databázi mohou změnit. Což se po
SELECT nikdy nestane, SELECT je tedy naproti tomu výběrový příkaz.
Při použití příkazu INSERT si musíme v praxi dát pozor na několik
obecných zásad:
- Vkládaná data by se měla, pokud je to možné, nějak odkontrolovat
ještě předtím, než je pošleme databázi. Například můžeme kontrolovat
jejich velikost a podobně.
- Zejména pro skripty na internetu platí, že by měla existovat
nějaká možnost nechat si zobrazit data předtím, než je vložíme.
Všimněte si, že přesně takhle to funguje například v diskusích k
článkům tady na linuxsoftu.
- Uživatel by měl být nějak informován o tom, že se operace
podařila.
Uvědomte si rovněž, že selhání příkazů měnících data může mít horší
následky než selhání výběrových dotazů. Pokud by například selhal
příkaz ukládající do databáze čas Vašeho příchodu do práce, může to být
daleko horší než selhání dotazu, který zobrazuje Vaše přesčasy.
Poznámka pro workoholiky: Vás se to netýká.
Insert pomocí PHP
Jak jste asi čekali, v PHP se přidávací dotazy rovněž realizují
pomocí funkce mysql_query. V případě manipulačních dotazů vrací funkce
mysql_query TRUE pokud se povedla, v ostatních případech vrací FALSE.
Funkce mysql_query tedy nijak nevrací počet vložených záznamů. Ten
můžeme zjistit pomocí jiné funkce, a sice mysql_affected_rows. Ta
funguje tak, že vrátí počet vložených (změněných, odstraněných) řádků
ovlivněných posledním manipulačním dotazem. Pokud poslední manipulační
dotaz selhal, vrací -1.
Jako příklad si můžeme vytvořit jednoduchou knihu hostů. Bude to
založeno na třech vzájemně provázaných skriptech, přičemž
- jeden skript bude zajišťovat zobrazování záznamů pomocí příkazu
SELECT.
- druhý skript tu bude proto, aby zobrazil formulář pro vložení
záznamu a data nám před vložením zkontroloval.
- třetí skript provede vlastní "databázovou" práci.
Tabulka obsahující zapsané texty bude velmi jednoduchá. Bude
obsahovat jeden sloupec pro zápis vzkazu a druhý sloupec, v němž bude
uložen čas zápisu. Vytvoříme ji následujícím příkazem CREATE TABLE:
CREATE TABLE
`kniha_hostu` (
`cas` INT NOT NULL ,
`vzkaz` VARCHAR( 255 ) NOT NULL);
Sluší se podotknout, že datový typ int budeme používat pro uložení
data záznamu ve formátu unixového časového razítka. To je počet vteřin,
který uplynul od 1.1.1970. Tím pádem se úplně vyhneme použití
databázových datových typů pro uložení datumů a časů.
Skript pro výběr a zobrazení záznamů
To je vlastně skript, který jsme již dříve použili v příkladu o
stránkování. Jedná se pouze o výběr záznamů a jejich zobrazení:
<h1>Naše kniha
hostů</h1>
<p><a href="40_insert.php">Vložit nový záznam do knihy
hostů</a></p>
<?
define ("ROWS", 10);
// zde je include souboru s
konstantami
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
mysql_select_db(SQL_DBNAME);
// stránkování ...
$vysledek=mysql_query("select * from
kniha_hostu order by cas desc");
while ($zaznam=MySQL_Fetch_Array($vysledek))
{
echo "<p>".date("j.n.Y G:i:s", ($zaznam["cas"]))."<BR>\n";
echo $zaznam["vzkaz"]."</p>\n";
}
?>
Ukázat
celý skript
Tady stojí za zmínku pouze to, že náš příkaz SELECT je tak protřelý,
že umí seřadit záznamy podle doby zadání, a to sestupně.
Skript pro zadání a kontrolu dat
To je složitější záležitost a zobrazím Vám pro lepší pochopení celý
skript:
<?
$BudemeZobrazovat=true;
if ($_POST["odeslano"])
{
if (strlen($_POST["vzkaz"])==0 || strlen($_POST["vzkaz"])>255)
{
echo "Vzkaz
by měl mít mezi 1 - 255 znaků";
}
else
{
$BudemeZobrazovat=false;
?>
<h1>Náhled vzkazu před
uložením</h1>
<div style="background :
Silver;">
<?echo nl2br($_POST["vzkaz"])?>
</div>
<form method="post" action="<?echo $_SERVER["PHP_SELF"]?>">
<input type="hidden"
name="vzkaz" value="<?echo $_POST["vzkaz"]?>">
<input type="Submit"
name="zpet" value="<< Zpět">
</form>
<form method="post"
action="40_modify.php">
<input type="hidden"
name="vzkaz" value="<?echo $_POST["vzkaz"]?>">
<input type="Submit"
name="Uložit" value="Uložit >>">
</form>
<?
}
}
if ($BudemeZobrazovat):?>
<h1>Vložení vzkazu</h1>
<form method="post" action="<?echo $_SERVER["PHP_SELF"]?>">
Váš vzkaz:<br><textarea rows="6"
name="vzkaz" cols="40"><?echo $_POST["vzkaz"]?></textarea><br>
<input type="hidden" name="odeslano"
value="true">
<input type="Submit" name="odeslat"
value=">> Náhled">
</form>
<?endif;?>
Celý skript obsahuje tři formuláře. Proč tolik? Spodní formulář je
"klasický" formulář pro zadání vzkazu. Ten je po odeslání zkontrolován
s tím, že pokud je vzkaz příliš krátký nebo příliš dlouhý, je to
vráceno uživateli k opravení.
Druhý formulář se opět odkazuje na stejnou stránku a je tu proto,
aby si uživatel mohl text ke vložení vizuálně odkontrolovat předtím,
než jej odešle. Může si třeba všimnout nějaké pravopisné chyby a
podobně. Protože nic uživateli nebrání zadat mimo jiné i řádkování,
obsahuje skript formátovací příkaz nl2br, který text "rozhodí" do řádků.
A konečně třetí formulář odesílá data skriptu 40_modify.php, jež
provede samotné vložení řádku do databáze.
Skript pro vložení záznamu do
databáze
je relativně jednoduchý:
<?
// zde je include souboru s
konstantami
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
mysql_select_db(SQL_DBNAME);
$vysledek=mysql_query("insert into kniha_hostu
(cas, vzkaz) values (".time().",'".$_POST["vzkaz"]."')");
$path=SubStr($SCRIPT_NAME, 0, StrRPos($SCRIPT_NAME,"/"))."/40_select.php";
Header("Location: http://".$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$path);
?>
Všimněme si dvou věcí: Za prvé toho, že příkaz insert obsahuje
výsledek funkce time. Ta vrátí unixové časové razítko jakožto celé
číslo, což je přesně to, co potřebujeme. Za druhé - ihned po vložení
řádku se přesouváme na jiný skript! To je důležité ze dvou podstatných
důvodů:
- Psychologický důvod - Uživatel by rád viděl, že je záznam
skutečně vložen. V našem případě jej tedy přesměrujeme na stránku,
která mu jeho záznam zobrazí (bude nejspíš první nahoře, protože řadíme
sestupně podle data a času vložení)
- Technický důvod - kdybychom zůstali na stránce pro vložení
záznamu a uživatel by obnovil stránku v prohlížeči, uložil by se záznam
dvakrát. Podobný efekt by mělo procházení historie dokumentů. Takhle se
do historie uloží pouze návštěva stránky s formulářem.
A ještě poznámka: Při korektuře seriálu jsem si všiml, že spousta
uživatelů vkládá do knihy návštěv HTML kód. Soubory byly upraveny tak,
aby se takový kód ignoroval.
Závěr
Celou sadu skriptů si můžete vyzkoušet. Jelikož byl příklad trochu rozsáhlý, je
nejdůležitější pochopit, jak spolu skripty pro výběr,
zadání
a akci
vzájemně souvisejí.
Pozn.: Protože už tak je to relativně
složité, v příkladech jsem se prakticky vůbec nezabýval nějakým
formátováním výstupu. V praxi by se to pochopitelně pro reálný provoz
muselo trochu učesat.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|