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 56938×
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
|
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 ...
|