Názory k článku
PHP okénko: Využití unikátních klíčů v databázi
unikatnost
celé vláknojeste elegantnejsi reseni pridavani unikatnich zaznamu mi prijde
INSERT INTO uzivatele VALUES ('', $username);
kdy prvni sloupec - PK ID - ma nastaven auto_increment a tedy bude vzdy osazen unikatni hodnotou, kterou pomoci funkce mysql_insert_id() mohu vyuzit jiz v bezicim skriptu bez zpetneho dotazu na nejnovejsi zaznam (jak jsem to uz kdesi videl :)
Re: unikatnost
celé vláknoProc je posledni kod spatne?
celé vláknoRozhodne by neskodilo alespon oquotovat uzivatelem predane parametry, ze?
Re: Proc je posledni kod spatne?
celé vláknoRe: Proc je posledni kod spatne?
celé vlákno; - magic_quotes_gpc = Off [Performance]
; Input data is no longer escaped with slashes so that it can be sent into
; SQL databases without further manipulation. Instead, you should use the
; function addslashes() on each input element you wish to send to a database.
php.ini-recommended pro PHP 4.3.10
Re: Proc je posledni kod spatne?
celé vláknoChapu, ze je to kvuli prehlednosti a lepsi citelnosti, kdyby se v clanku melo resit vsechno, co by je v produkcnim prostredi potreba, nebude to tak nazorne. Ale taky myslim, ze v clanku je dost mista na to, aby se to tam zminilo.
chybka?
celé vláknojak to? zamykani provadis preci proti zapisu, ne cteni
Re: chybka?
celé vláknoRe: chybka?
celé vláknoignore
celé vláknoRe: ignore
celé vláknoAle postřeh je to dobrý, o IGNORE jsem po pravdě řečeno ani nevěděl.
jaká lama to zase poučuje o php?
celé vláknoNěkdo tu chce poučovat ostatní a přitom se zdá, že nezvládá základní principy.
- magic_quotes_gpc je přece "root of all evil" - skoro jako premature optimization!
- "elegantní řešení" v článku má své "issues"
- MySQL nemá transakce? A takové věci je ještě povoleno říkat databáze? :)
Ostatně si myslím, že pokud u projektu používáte databázi, která nemá podporu transakcí, vnořených dotazů ani cizích klíčů, není nutné se nadále zatěžovat nějakou konzistencí dat. Stejně se to píše v jazyce bez podpory výjimek (už neplatí na 100 %, ale v5 málokdo nasadil) a tak se u složitějších sad dotazů snaha nahradit transakce nějakými sadami if else nemůže setkat s úspěchem.
Proto doporučuji se na nějaké kontroly úspěchu/neúspěchu dotazů vykašlat. Četnost vzniklých chyb bude stejně vysoká (nízká), jako u dalších programátorských chyb v kódu a může se řešit úplně stejně - ruční úpravou nebo ignorováním. Praktický dopad toho, že se jednomu z tisíce uživatelů občas nenačte stránka, anebo se mu zobrazí stránka prázdná, rozsypaná, a bude muset znovunačíst je nulový.
K mezní situaci (zde vytvoření dvou stejných uživatelů současně) za celý život aplikace stejně nikdy nedojde. A pokud ano, jaké budou důsledky? Jeden ze dvou uživatelů se nebude moci přihlásit. Tak si založí nového a test už ho upozorní na duplicitu jména. Bude to někomu vadit? Nemyslím....
Takže k čemu jsme došli? Reakce na chyby dotazů u špatné db je vlastně "premature optimization" a ta je "root of all evil". Nezabýval bych se tím. Pokud si je programátor vědom důsledků a ví že žádné nejsou, nevadí to.
Re: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknozaujimalo by ma ci by si vedel vyprodukovat podobny jednoduchy clanok ktory by pochopil zaciatocnik a nieco priniesol aj starsim programatorom (profik som nepouzil pretoze profik je ten co berie za pracu peniaze ... profici sme vsetci :) )
inak super clanok - dobra praca.
Re: jaká lama to zase poučuje o php?
celé vlákno„Pokud používáme MySQL bez transakcí, například s MyISAM tabulkami, a chceme zaručit jedinečnost uživatelských jmen v tabulce uživatelů, můžeme nad sloupcem uživatelských jmen vytvořit UNIQUE index. Pak můžeme ke vložení uživatele jediný příkaz INSERT, přičemž duplicita uživatelského jména je ošetřena indexem a atomicita operace použitím jediného DML příkazu.“
Obsah článku shrnutý do dvou srozumitelných vět.
Re: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vlákno(tim nerikam, ze mam pana Vranu za lamu ... jen mi takova argumentace prijde usmevna)
Re: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vláknoRe: jaká lama to zase poučuje o php?
celé vlákno"Ruční úprava nebo ignorování" ... hmm, aha. To si budu pamatovat.
Myslím, že to nebylo o tom, zda k té situaci dojde nebo ne, ale o tom, jak se tomu dá předejít. Jasně, že při použití PostgreSQL by se to DĚLALO JINAK.
On ten článek vznikl možná jako reakce na jeden díl mého seriálu na Linuxsoftu, který si Jakub přečetl a nad nímž přemýšlel. Ty připomínky jsou dost konstruktivní, uvědomte si, že na většině webů se zkrátka nějakou dobu ještě s MySQL 4.x (která neumí uložené procedury) budeme setkávat.
zamykani tabulek
celé vláknoStacilo by napsat do novinek u unikatniho zaznamu nastavte unikatni klic. Doufam, ze to nebude pokracovat stylem, co delaji amateri spatne, protoze na to lze napsat hodne clanku.
Mimo jine me stve teorie programovani, vzdy je to jen teorie, ale prakticke problemy to nepriblizuje. Ani jeden ze tri prikladu neni problematicky, fungovali by vsechny.
Re: zamykani tabulek
celé vlákno"zamykani tabulek je blbost, co kdyz se budou registrovat 2 uzivatele?"
Zamykání tabulek funguje tak, že když je tabulka zamknutá a proces udělá "LOCK TABLES", tak čeká na odemknutí procesem, který ji zamkl. Zkuste si o tom nejprve něco nastudovat, než napíšete, že to je blbost.
"opravdu se jedna jen o teoretickou moznost, ktera nenastane a resit to nejakym selectem..."
To, že se někdo pokusí zaregistrovat pod již obsazeným loginem, je poměrně časté a nějak to ošetřit je opravdu nezbytné.
"teorie, ale prakticke problemy to nepriblizuje"
Článek se točí okolo praktického příkladu, na který narazíte skoro v každé webové aplikaci s registrací uživatelů.
"Ani jeden ze tri prikladu neni problematicky, fungovali by vsechny."
První příklad jednoduše JE špatně. U jednoduchých webíků v takto jednoduché situaci je možnost kolize minimální (což je v článku uvedeno), ale ve složitějších případech to riziko je potřeba zohlednit - je nutné jednoduchý příklad chápat obecněji. Druhý příklad má také rizika, možná ještě horší než první - neodemknutí tabulky může znamenat znefunkčnění celé aplikace.
Pokud unikátní klíče pro tento účel používat umíte, mohl jste článek na základě nadpisu (a případně perexu) přeskočit. Nedá se předpokládat, že pro všechny čtenáře Roota bude cokoliv napsaného neznámou oblastí.
Re: zamykani tabulek
celé vlákno> První příklad jednoduše JE špatně. U jednoduchých webíků v takto jednoduché situaci je možnost kolize minimální
I prvni moznost ma problem pouze se behem cca 10-20ms pokusi zaregistrovat dva uzivatele se stejnym, jeste nepouzitym loginem. To je fakt spis v oblasti puste teorie :-)
Ale jinak clanek dobry, alespon byl o necem. To se o vsech clancich rict bohuzel neda.
Re: zamykani tabulek
celé vláknoVždyť jsem psal, že "je nutné jednoduchý příklad chápat obecněji". Co třeba takovýto kód ukládající počet přístupů po vteřinách:
<?php
$cas = date("Y-m-d H:i:s");
if (mysql_result(mysql_query("SELECT COUNT(*) FROM pristupy WHERE cas = '$cas'"), 0)) {
mysql_query("UPDATE pristupy SET pocet = pocet + 1 WHERE cas = '$cas'");
} else {
mysql_query("INSERT INTO pristupy (cas, pocet) VALUES ('$cas', 1)");
}
?>
Pokud je nad sloupcem (cas) unikátní klíč, tak se spousta přístupů neuloží, pokud ne, tak cas bude obsahovat duplicitní hodnoty.
O smysluplnost tohoto příkladu teď nejde - jde o to, že je potřeba o riziku vědět a kód psát podle toho.
Re: zamykani tabulek
celé vláknoPriklad v clanku je proste zavadejici. Ja sice chapu vasi snahu, ale radim vam, pouzivejte jasnejsi priklady. Jinak se ctenari "zaseknou" na takovyhle nesrovnalostech.
Re: zamykani tabulek
celé vláknoRe: zamykani tabulek
celé vláknoRe: zamykani tabulek
celé vláknoUnikatni klic
celé vláknoRe: Unikatni klic
celé vláknoRe: Unikatni klic
celé vláknoA nedela to nahodou databaze automaticky? ;-)
Re: Unikatni klic
celé vláknoRe: Unikatni klic
celé vláknobug report
$var = ' :)
Ehm...
celé vláknoTakže - pokud máte skutečnou databázi s potřebnou výbavou, tak se jakémukoliv zamykání čehokoliv vyhýbejte, pokud to jde. Zamykání záznamů je vyhrazeno pro případná transakční zpracování (běžný dotaz by měl probíhat jako with nolock) sad dat nad více tabulkami, případně pro lokální aplikace s nativním přístupem k danému DB stroji, kde je kontrola skutečného odemčení záznamu. Pokud někdo laboruje se zamykáním na úrovni stránky/sady (pokud to tedy ten DB stroj umožňuje) nebo celé tabulky, musí mít zatraceně dobrý důvod. Webová aplikace bez middleware (typicky většina PHP aplikací, ale platí to třeba i o starých ASP) by takový rozsah neměla vůbec používat a pokud ano, tak zprostředkovaně přes uložené procedury DB stroje (pokud je podporuje). V silně konkurenčním prostředí naděláte hodně škody podobnými nápady.
Na potřebný zásah v uvedeném příkladu Vám skutečně postačí klíč typu UNIQUE, případně CANDIDATE (dle typu DB serveru) nad daným polem a nic více. Odchytit pak případnou chybu při insertu je elementární praxe databázového programování a nic víc nepotřebujete, než tuto chybu zdvořile oznámit uživateli, ať si vymyslí jiné username. Backlink dotazy stojí akorát zbytečnou režii aplikace a DB serveru a de facto oznámí uživateli totéž, ale zatíží databázi jedním (nebo více) zbytečným dotazem.
Přihlašování dotazem na celou tabulku userů je taky pěkný zlozvyk. Buď databázový stroj umožňuje příjem parametrů a pak lze posílat login name jako parametrický dotaz, nebo, pokud DB stroj umožňuje využívat views (pohledy), dotaz poslat na k tomu určený view, který je v cache DB stroje, je naindexován a fyzicky předtříděn dle potřebného pole (v tomto případě username).
Domnívám se, že by jako motiv tohoto článku bylo lepší, kdyby bylo případným začátečníkům vysvětleno, co je to PRIMARY KEY, CLUSTERED INDEX, FOREIGN KEY, UNIQUE KEY a kdy je použít. A pak tabulku, kde jsou porovnány nejběžnější databáze, zda to či ono mají ve výbavě. A až na závěr teprve příklad použití.
I když - kovářova kobyla chodí bosa...když se dívám na některé své aplikace, tam je taky dost prohřešků. Ale alespoň návody pro začínající by jich měly být prosty. :)))
No flame, please...
Re: Ehm...
celé vláknoCo přesně rozumíte tím parametrickým dotazem? (Mám takové tušení, ale v tomto jednoduchém ködu mi asi mi uniká souvislost...)
Re: Ehm...
celé vláknoPokud nemáme v db transakce a v jazyce podporu výjimek, pak se jakákoliv snaha napsat kvalitní aplikaci nemůže setkat s úspěchem.
Re: Ehm...
celé vláknoAj ked je pravda, ze login sa riesi ako prvy z casti webu ( aspon v mojom pripade), ktore vyzaduju databazu, takze to dava zmysel, len to mohlo byt nejako vysvetlene preco autor zacal prave odtial.
Mna napriklad nedavno prekvapili zmeny v komunikacii PHP a MySQL co sa tyka ich novsich verzii. Teda nepatrim k tym co sa vyznaju a k problemu som sa dostal len tak ze som chcel nainstalovat phpBB2 a postNuke na mysql 4.1.8 co skoncilo odpovedou ze moj mysql klient je zastaraly a ze ho mam obnovit. Pravdu som zistil az tu v casti "Installation":
http://www.php.net/manual/en/ref.mysql.php
kde je medzi inym spomenute ze na MySQL verzie 4.1.+ je vhodne pouzit funkcie "mysqli_" ktore sa sice od "mysql_" funkcii z mojho hladiska odlisuju akurat tym pismenkom "i" :) ale moje phpBB to nevyriesi.
Tiez tam spominaju zmeny v PHP 5 comu som tak celkom neporozumel, a to je to, co by ste mohli (ci uz dobrovolne alebo nie :) opisat v nejakom dalsom diely, ze ako su na tom verzie php verzus mysql.
MySQL neumi trensakce? Coze?
celé vláknoJen proto, ze defaultni typ tabulek ho neumi? Kratkozrake.
Re: MySQL neumi trensakce? Coze?
celé vláknoDefaultní tabulek bohužel umí věci, které neumějí ty další. To je hlavní problém MySQL (a důvod, proč ji nepoužívám): Naprostá neortogonalita funkci...
Re: MySQL neumi trensakce? Coze?
celé vláknotakze bych spise v clanku na to upozornil, nez ze bych to prehlizel. Aspon jsem si teda myslel, ze jsem na root.cz a ne na blabolnik.cz :)
Re: MySQL neumi trensakce? Coze?
celé vláknoRe: MySQL neumi trensakce? Coze?
celé vláknoA není v článku uvedeno "MySQL [transakce] však umožňuje pouze za určitých okolností"? Všimněte si prosím hlavně odkazu na relevantní část MySQL dokumentace. Nepřijde mi to jako přehlížení.
pojídači koláčů
celé vláknoTotiž, článek není určen začátečníkům ani rádoby-programátorům. Možná proto přehlíží takové zásadní věci, jako je "slashování" proměnných - autor to nejspíš považuje za samozřejmé a nechce odvádět pozornost od tématu. A tématem je atomicita operací. Povídání o nějaké "registraci uživatelů", to je jen omáčka, aby výklad získal praktičtější ráz.
A hle. Pod článek se vyrojilo spousta reakcí typu "proč takové obstrukce, vždyť ke kolizi dojde maximálně jednou za 10 let", "reload to vyřeší" až po "doporučuji se na to vykašlat". Žasnu. Kde se v člověku, který ještě před pár měsící netušil co zkratka SQL znamená (nebo netuší dodnes), bere odhodlání takové odborně laděné články komentovat? Dnes tady nějaký komentátor sebevědomě doporučuje chyby ignorovat, a jinde ve fóru si vyleje zlost na Microsoftí programátory, protože mu spadly Windows. Nechť je jejich pokrytectví liská.
Jaká radost, když v tom póvlu člověk narazí na konstruktivní názory, který osvětlují problémy se zamykáním tabulek a podobně.
(taktéž reakce "řešení: nepoužívej MySQL" mi přijdou jako známka sníženého IQ)
Re: pojídači koláčů
celé vláknoUrážet umíte nádherně ó pane geniální programátore.
Možná jste i jakýsi slavný hacker, když jste o každém přispěvovateli zjistil tolik informací, klaním se Vám uctivě, množství odhalení v jednom příspěvku je až ohromující.
Děkuji že jste mě upozornil, že tento článek není ani pro začátečníky, ani pro rádoby-programátory, kdybych to vědel předem, ani bych to nečetl, natož plýtval čas diskusí. Běžím si radši vylít zlost do jiného fóru, zase mi spadly Windows!
Už se těším na příval odborně napsaných aplikací s geniální databází MySQL, které budou psané systémem LOCK TABLES příkazy příkazy UNLOCK TABLES, slibuji že se k nim budu třikrát denně modlit.
Také se těším na další pokračování článku s názvem "Jak zajistit konzistenci dat bez transakcí", kde nám autor vysvětlí, že ten jediný správný způsob (r) je takto:
while (!end) // atomicita operace!!
end = true;
error = INSERT INTO table1...
error1 = INSERT INTO table2....
if (error || error1) { // error -> rollback
DELETE FROM table1..
DELETE FROM table2..
end = false; // try again
}
}

