LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> 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 108887×

Komerční sdělení: Pořádáme Kurzy PHP

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

pridej.cz

 

DISKUZE

Header - location 21.8.2004 11:25 Petr Zajíc
L Re: Header - location 3.10.2008 23:22 Petr Stodůlka
xhtml a php 22.8.2004 03:32 Pavel Bařina
|- Re: xhtml a php 22.8.2004 09:28 Pavel Kácha
L Re: xhtml a php 22.8.2004 12:48 Jan Houštěk
  |- Re: xhtml a php 22.8.2004 13:44 Pavel Bařina
  |- Re: xhtml a php 22.8.2004 22:43 Petr Zajíc
  L Re: xhtml a php 26.8.2004 22:50 Michal Kubeček
    L Re: xhtml a php 4.10.2008 08:12 Jakub 'NOclipus' Lédl
Há?ky a ?árky v MySQL 23.10.2005 16:50 Jan Šmucr
tabulka v databázi 28.7.2006 22:22 spageta
|- Re: tabulka v databázi 28.7.2006 23:09 Ondřej Čečák
L Re: tabulka v databázi 29.7.2006 20:56 Petr Zajíc
Polozka \\ 12.3.2007 21:17 Michal Bůžek
L Re: Polozka \\\\ 12.3.2007 21:50 Michal Bůžek
duplicitní vložení 5.1.2008 15:08 slune
Smajlíci 27.2.2008 21:04 hynek jj
Kniha hostů a uvozovky. 6.1.2009 18:10 Pavel Zvěřina
L Re: Kniha hostů a uvozovky. 30.1.2009 21:42 Petr Stodůlka
  L Re: Kniha hostů a uvozovky. 1.2.2009 22:31 Pavel Zvěřina
    L Re: Kniha hostů a uvozovky. 27.2.2010 14:56 Jan Quagmire
Není tam bezpečnostní díra? 30.4.2011 15:08 Patrick "Kusoš" Kusebauch




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

12.8.2016 11:51 / Josef Zapletal
Jak udělat HTML/Javascript swiping gallery do mobilu?

8.8.2016 14:58 / Adams
fairies for hire

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze