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

> PHP (41) - Měníme data v databázích

Změna je život! Platí to i pro data v databázích a my se dnes naučíme jak je měnit.

23.8.2004 15:00 | Petr Zajíc | Články autora | přečteno 51126×

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

Z databáze již umíme záznamy vybírat a umíme je do ní vkládat. Další úkon, který nás čeká je umět data upravit neboli aktualizovat.

Zase trocha SQL

V SQL se k aktualizaci řádku nebo řádků v databázi používá příkaz UPDATE. UPDATE narozdíl od INSERT nevkládá do databáze žádné řádky, ale upravuje existující data. To znamená, že provedete-li na tabulkce příkaz UPDATE, počet řádků v této tabulce se nezmění, ale mohou se změnit údaje v jednotlivých řádcích. V MySQL je pochopitelně i k příkazu UPDATE rozsáhlá dokumentace. Jeho nejprimitivnější forma pak je:

UPDATE tabulka SET sloupec=hodnota [,jiný sloupec=hodnota...]

Pokud použijete příkaz tak, jak je uveden výše, bude zaktualizována celá tabulka, to znamená každý její řádek. Nic vám samozřejmě nebrání použít klauzuli WHERE a vybrat jen některé řádky, které se budou aktualizovat. MySQL umí dokonce použít rozšíření LIMIT pro stanovení maximálního počtu řádků, které se mají měnit.

Aby to nebyla jen suchá teorie předpokládejme na chvíli, že jste se práve prolomili do databáze obsahující podklady pro výpočet mezd ve Vaší firmě. Můžete si s ní dělat co chcete, třeba změnit políčko PLAT (to je představa...). Nejprve si tedy ukažme plošný přístup:

UPDATE PLATY SET PLAT = 20000

Nebo se můžeme rozhodnout zvýšit všem plat o 20% (z čehož je vidět, že nové hodnoty v tabulce mohou záviset na hodnotách stejných sloupců před jejich aktualizací):

UPDATE PLATY SET PLAT = PLAT*1.2

Nebo se můžeme rozhodnout podle hesla "každý dobrý skutek musí být po zásluze potrestán" a snížit platy jen těm, kdo je mají vysoké:

UPDATE PLATY SET PLAT = PLAT*0.8 WHERE PLAT > 20000

a konečně se můžeme zcela nekolegiálně obohatit sami příkazem ve smyslu:

UPDATE PLATY SET PLAT = PLAT*2 WHERE PRACOVNIK = 'Petr Zajíc'

Použití WHERE je na příkladech dobře vidět - zatímco první dva manipulují všemi záznamy v databázi, třetí manipuluje jen omezenou skupinou šťastlivců a poslední dokonce pouze jedním záznamem.

Kromě příkazu UPDATE, který je v SQL standardně, má MySQL ještě příkaz REPLACE. Nemám ho moc rád, ale funguje následovně: REPLACE se chová jako INSERT s tím, že pokud je zároveň

  • v tabulce, do níž se vkládá definován primární nebo jedinečný klíč a
  • v datech, která se vkládají jeden nebo více záznamů v nichž se shoduje hodnota sloupce s primárním nebo jedinečným klíčem s hodnotou v tabulce, do níž se vkládá

nejsou data vložena jako nový řádek, ale existující data jsou přepsána. Tento příkaz vám může ušetřit nějaký čas. (Přesně řečeno místo INSERT a UPDATE použijete REPLACE). Rád ho nemám proto, že není standardizován.

Aktualizujeme pomocí PHP

Tady je situace veselá, protože platí většina toho, co pro INSERT. Takže se můžete podívat do minulého dílu, a já krátce zopakuji:

  • rovněž na poslání příkazu UPDATE do MySQL pomocí PHP se používá funkce mysql_query.
  • mysql_affected_rows vrací počet aktualizovaných záznamů nebo -1, pokud dotaz selhal. Hodnotu lze testovat a tak zjistit, zda se aktualizace povedla.
  • mysql_query vrací TRUE pokud se příkaz povedl, FALSE pokud selhal.
  • Pokud aktualizace nějakým způsobem závisí na hodnotách zadaných uživatelem, měly by se tyto hodnoty pečlivě zkontrolovat ještě předtím, než je dotaz proveden.

Některé věci, které jsme uvedli v souvislosti s příkazem INSERT pro UPDATE naopak neplatí, nebo neplatí tak striktně. Například bude možná obtížné nebo dokonce nemožné nějak předem odkontrolovat, jaký dopad bude mít na databázi provedení příkazu UPDATE. Řeší se to tak, že se stav tabulky zobrazí po provedení příkazu (třeba chcete-li změnit při nakupování přes elektronický obchod množství zboží v košíku, většinou je to provedeno a potom je Vám obsah košíku zobrazen). Rovněž někdy nebývá tak důležité zamezit opakované aktualizaci řádku způsobené pohybem v historii dokumentů nebo refreshováním stránky.

Příklad

My jsme si ve třicátém dílu našeho seriálu vytvořili počitadlo, které ukládalo údaje o počtu návštěv na stránce do textového souboru. Zkusme si nyní tento triviální příklad přepsat tak, aby používal jako úložiště databázi! Definice tabulky bude opravdu primitivní:

create table pocitadlo (pocet int);
insert into pocitadlo (pocet) values(0);

A celý skript bude vypadat následovně:

<?
  
// zde je include souboru s konstantami
  
mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
  
mysql_select_db(SQL_DBNAME);
  
mysql_query("update pocitadlo set pocet = pocet+1");
  
$vysledek=mysql_query("select pocet from pocitadlo");
  
$zaznam=mysql_fetch_array($vysledek);
  
$celkem=$zaznam["pocet"];
  echo
"Již máme zaznamenáno $celkem přístupů!!!";
?>

Spustit skript

Skript není kromě použití příkazu update opravdu ničím zajímavý. Všimněte si, že jsem hned při definici tabulky nastavil výchozí hodnotu počitadla na nulu, takže jsem se tím pak již nemusel zabývat v kódu PHP.

Snad by se dala rozebrat jedna věc - z příkladu je vidět, že na uložení opravdu jednoduchých informací většinou nejsou databáze potřeba. Tento skript zcela určitě poběží déle než skript z třicátého dílu, kde jsme ukládali stav počitadla do souboru, protože režie spojená s připojením k databázi je téměř určitě větší než režie spojená s otevřením souboru. Takže jsme použili přístup "s dělem na komára". Ale čistě pro ukázku fungování příkazu UPDATE to postačilo.

Pozn.: Tento skript však sám o sobě řeší problém se souběžností. Jestliže by se totiž pokusilo více uživatelů najednou přistupovat ke stránkám, na nichž počitadlo běží, databáze by si s tím dokázala poradit. Logika zabraňující zničení dat v případě vícenásobných přístupů je totiž v každé databázi již obsažena.

Pozn.: V praxi to bývá tak, že když už se výsledky počítání ukládají do databáze, používá se pro každý přístup samostatný řádek. Neeviduje se jen počet přístupů, ale i další věci, jako například IP adresa z níž byl přístup proveden, použitý prohlížeč a tak dále. Je jasné, že pak by se použil INSERT, ne UPDATE.

Použití UPDATE není ve skriptech tak časté jako SELECT nebo INSERT. Kontrolujte data a dávejte si pozor, zda aktualizujete právě ty řádky, které chcete skutečně měnit. A ještě jedna přátelská rada na závěr: Jestliže ladíte kód hojně využívající UPDATE, ušetří Vám spoustu času, když budete mít k dispozici zálohu databáze ;-)

Verze pro tisk

pridej.cz

 

DISKUZE

Hmm... 23.8.2004 18:02 CIJOML
L Re: Hmm... 23.8.2004 18:42 Petr Zajíc
Prohlížeč 1.4.2008 18:58 Dan Pelíšek
proměná v SQL? 1.4.2008 20:36 Dan Pelíšek
  L Re: proměná v SQL? 1.4.2008 23:19 Aleš Hakl
    L Re: proměná v SQL? 2.4.2008 21:01 Dan Pelíšek
      L Re: proměná v SQL? 2.4.2008 21:28 Aleš Hakl




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

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

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

> Poslední diskuze

15.6.2017 9:34 / Ondřej Havlas
php,

10.6.2017 10:39 / Temple
sell home for cash

11.5.2017 23:32 / lelo
Re: Problém se správcem balíčků

11.5.2017 5:45 / davd mašek
Re: Problém se správcem balíčků

10.5.2017 22:54 / lelo
Re: Problém se správcem balíčků

Více ...

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