Hlavní navigace

PHP okénko: Využití unikátních klíčů v databázi

Začíná PHP okénko, které vám bude přinášet drobné postřehy z programování v PHP, vždy pokud možno s uvedením konkrétních ukázek kódu. První okénko ukazuje, jak lze s využitím unikátních indexů elegantně a korektně ukládat do databáze uživatelská jména.

Tweetni to Odměnte autora  Jak to funguje?

Pokud má webová aplikace možnost registrace uživatelů, obvykle jim dovoluje zvolit uživatelské jméno, pod kterým se k aplikaci budou přihlašovat. Obvykle také chceme, aby toto uživatelské jméno bylo jednoznačné (obzvláště pokud jim na jeho základě vytvoříme e-mailovou adresu nebo URL). Dá se to jako obvykle řešit několika způsoby.

<?php
// špatný kód
if (mysql_result(mysql_query("SELECT COUNT(*) FROM uzivatele WHERE login = '$_GET[login]'"), 0)) {
    echo "Uživatel již existuje.\n";
} else {
    mysql_query("INSERT INTO uzivatele (login) VALUES ('$_GET[login]')");
}

// opravený kód
mysql_query("LOCK TABLES uzivatele WRITE");
if (mysql_result(mysql_query("SELECT COUNT(*) FROM uzivatele WHERE login = '$_GET[login]'"), 0)) {
    echo "Uživatel již existuje.\n";
} else {
    mysql_query("INSERT INTO uzivatele (login) VALUES ('$_GET[login]')");
}
mysql_query("UNLOCK TABLES");

// elegantní kód, předpokládá existenci unikátního klíče nad sloupcem login
mysql_query("INSERT INTO uzivatele (login) VALUES ('$_GET[login]')");
if (mysql_errno() == 1062) {
    echo "Uživatel již existuje.\n";
}
?> 

Proč je první kód špatně? Důvod je ten, že k webové aplikaci může přistupovat více uživatelů zároveň, tím pádem mezi provedením SELECT a INSERT může tyto dvě operace provést někdo jiný, a uživatel se tak vloží dvakrát. Je to sice spíše teoretická možnost, ale je lepší si ušetřit bezesné noci hledáním takovýchto problémů. Ve většině databází se tento problém řeší transakcemi, MySQL je však umožňuje pouze za určitých okolností a jako náhradu nabízí zamykání tabulek.

To používá druhý příklad, který je už po formální stránce správně, je ale poněkud krkolomný a skrývá riziko neodemčení tabulky (pokud by uživatel přerušil provádění skriptu před odemčením tabulky a pokud se používá persistentní připojení k databázi, tak už si z tabulky uzivatele nikdo nic nepřečte). Toto riziko se dá řešit doplněním kódu register_shutdown_function(create_function('', 'mysql_query("UNLOCK TABLES");')); před zamknutím tabulky, to se už ale krkolomnost dostává na kritickou hranici.

Třetí způsob je naproti tomu elegantní. Předpokládá pouze existenci unikátního indexu nad sloupcem login, ten by ale měl existovat tak jako tak, protože výrazně urychluje dotazy do tabulky omezené tímto sloupcem. MySQL chyba č. 1062 nastane v případě duplicity unikátního klíče.


Podobně laděné texty můžete najít i na autorově weblogu PHP triky.

Jakub Vrána

Jakub Vrána

Autor se živí programováním v PHP, podílí se na jeho oficiální dokumentaci, vyučuje ho na MFF UK a vede odborná školení. Poznámky si zapisuje na weblog PHP triky.

Ohodnoťte jako ve škole:
Průměrná známka 3,08
Tweetni to Odměnte autora  Jak to funguje?

Školení: Obsahová strategie a content marketing

DW - Školeny webcopywritingu
  • Proč je obsahový marketing výrazným trendem
  • Jak navrhnout užitečnou obsahovou strategii
  • Jaký obsah využít a které nástroje vám pomohou
  • Jak zlepšit workflow a výsledky copywritingu

Detailní informace o školení content strategy »

       

Přehled názorů

unikatnost
navi 25. 3. 2005 01:02
Nový
└ 
Re: unikatnost
bacil 25. 3. 2005 06:19
Nový
Proc je posledni kod spatne?
Wejn 25. 3. 2005 01:16
Nový
├ 
Re: Proc je posledni kod spatne?
Jakub Vrána 25. 3. 2005 07:02
Nový
│
└ 
Re: Proc je posledni kod spatne?
Vermin 25. 3. 2005 09:34
Nový
└ 
Re: Proc je posledni kod spatne?
Martin Kavalec 25. 3. 2005 09:42
Nový
chybka?
rejpal 25. 3. 2005 02:20
Nový
└ 
Re: chybka?
Milos Prchlik 25. 3. 2005 03:35
Nový
 
└ 
Re: chybka?
Jindrich Makovicka 25. 3. 2005 19:21
Nový
ignore
Dave G. 25. 3. 2005 02:43
Nový
└ 
Re: ignore
Jakub Vrána 25. 3. 2005 07:12
Nový
jaká lama to zase poučuje o php?
martin 25. 3. 2005 07:44
Nový
├ 
Re: jaká lama to zase poučuje o php?
tomulli 25. 3. 2005 08:15
Nový
│
├ 
Re: jaká lama to zase poučuje o php?
anonymní uživatel 25. 3. 2005 09:11
Nový
│
└ 
Re: jaká lama to zase poučuje o php?
anonymní uživatel 25. 3. 2005 20:43
Nový
├ 
Re: jaká lama to zase poučuje o php?
karci 25. 3. 2005 09:35
Nový
│
└ 
Re: jaká lama to zase poučuje o php?
Jakub Hegenbart 26. 3. 2005 22:25
Nový
│
 
├ 
Re: jaká lama to zase poučuje o php?
Jakub Hegenbart 26. 3. 2005 22:25
Nový
│
 
└ 
Re: jaká lama to zase poučuje o php?
Jakub Vrána 27. 3. 2005 09:54
Nový
│
 
 
├ 
Re: jaká lama to zase poučuje o php?
Jakub Hegenbart 27. 3. 2005 15:35
Nový
│
 
 
└ 
Re: jaká lama to zase poučuje o php?
Jakub Hegenbart 27. 3. 2005 15:38
Nový
│
 
 
 
└ 
Re: jaká lama to zase poučuje o php?
Jakub Hegenbart 27. 3. 2005 15:38
Nový
├ 
Re: jaká lama to zase poučuje o php?
Tomáš Krause 25. 3. 2005 16:10
Nový
│
└ 
Re: jaká lama to zase poučuje o php?
Wejn 26. 3. 2005 12:41
Nový
│
 
├ 
Re: jaká lama to zase poučuje o php?
anonymní uživatel 27. 3. 2005 04:14
Nový
│
 
└ 
Re: jaká lama to zase poučuje o php?
Jakub Vrána 27. 3. 2005 09:52
Nový
└ 
Re: jaká lama to zase poučuje o php?
anonymní uživatel 24. 4. 2005 00:34
Nový
zamykani tabulek
markon 25. 3. 2005 12:39
Nový
├ 
Re: zamykani tabulek
Jakub Vrána 25. 3. 2005 13:37
Nový
│
└ 
Re: zamykani tabulek
Michal Kára 25. 3. 2005 15:53
Nový
│
 
└ 
Re: zamykani tabulek
Jakub Vrána 26. 3. 2005 08:10
Nový
│
 
 
├ 
Re: zamykani tabulek
Michal Kára 26. 3. 2005 10:09
Nový
│
 
 
└ 
Re: zamykani tabulek
PD. 27. 3. 2005 08:40
Nový
├ 
Re: zamykani tabulek
Jan Korbel 25. 3. 2005 13:41
Nový
└ 
Re: zamykani tabulek
Michal Kubeček 25. 3. 2005 16:57
Nový
Unikatni klic
dave 25. 3. 2005 14:54
Nový
├ 
Re: Unikatni klic
rane 25. 3. 2005 15:12
Nový
└ 
Re: Unikatni klic
Michal Kára 25. 3. 2005 15:47
Nový
 
└ 
Re: Unikatni klic
dave 25. 3. 2005 16:37
Nový
 
 
└ 
Re: Unikatni klic
Michal Kára 26. 3. 2005 10:01
Nový
bug report
STiCK 25. 3. 2005 15:37
Nový
Ehm...
geneticy 27. 3. 2005 22:06
Nový
├ 
Re: Ehm...
Jakub Hegenbart 27. 3. 2005 22:47
Nový
├ 
Re: Ehm...
martin 28. 3. 2005 13:50
Nový
└ 
Re: Ehm...
gemda 29. 3. 2005 20:18
Nový
MySQL neumi trensakce? Coze?
anonymní uživatel 28. 3. 2005 14:09
Nový
└ 
Re: MySQL neumi trensakce? Coze?
Jakub Hegenbart 28. 3. 2005 16:25
Nový
 
└ 
Re: MySQL neumi trensakce? Coze?
anonymní uživatel 29. 3. 2005 18:22
Nový
 
 
├ 
Re: MySQL neumi trensakce? Coze?
Jakub Hegenbart 29. 3. 2005 20:14
Nový
 
 
└ 
Re: MySQL neumi trensakce? Coze?
Jakub Vrána 30. 3. 2005 09:27
Nový
pojídači koláčů
dgx 28. 3. 2005 20:23
Nový
└ 
Re: pojídači koláčů
martin 29. 3. 2005 08:48
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem