Jakub Vrána
1001 tipů a triků pro PHP
Computer Press Brno 2012
K1783_dotisk.indd 1
16.3.2012 14:34:47
1001 tipů a triků pro PHP Jakub Vrána Obálka: Martin Sodomka Odpovědný redaktor: Martin Herodek Technický redaktor: Jiří Matoušek Objednávky knih: http://knihy.cpress.cz www.albatrosmedia.cz eshop@albatrosmedia.cz bezplatná linka 800 555 513 ISBN 978-80-251-2940-1 Vydalo nakladatelství Computer Press v Brně roku 2012 ve společnosti Albatros Media a. s. se sídlem Na Pankráci 30, Praha 4. Číslo publikace 16 097. © Albatros Media a. s. Všechna práva vyhrazena. Žádná část této publikace nesmí být kopírována a rozmnožována za účelem rozšiřování v jakékoli formě či jakýmkoli způsobem bez písemného souhlasu vydavatele. Dotisk 1. vydání.
K1783_dotisk.indd 2
16.3.2012 14:35:31
Stručný obsah Úvod Přehledný kód Běhové prostředí Instalace a konfigurace Syntaxe jazyka Jazykové konstrukce Proměnné Pole Objektové programování Návrhové vzory Regulární výrazy Webové aplikace Zpracování formulářů Práce se soubory Databáze Ukládání dat Vícejazyčné aplikace E-maily AJAX Práce s obrázky XML dokumenty Export a import dat Knihovny a frameworky Bezpečnost aplikace Zabezpečení dat Výkonnost Hotové aplikace Vývojové prostředí Vývoj PHP Poslední tip
K1783.indd 3
33 35 47 53 75 89 103 121 131 153 159 167 189 209 227 271 289 303 317 321 325 335 347 355 377 395 417 423 437 443
25.11.2010 9:44:38
K1783.indd 4
25.11.2010 9:44:38
Obsah
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
K1783.indd 5
Úvod
33
Přehledný kód
35
Jak je to s velikostí písmen Jak je to s velikostí písmen u zkratek Jak je to s velikostí písmen v URL Diakritika v identifikátorech Diakritika v komentářích Rozmístění tříd do souborů Pojmenování rozhraní Co to je značka Byte-Order-Mark Čeština nebo angličtina? Jazyk textů a komentářů Pojmenování funkcí Název aplikace v identifikátorech Velikost písmen v SQL dotazech Jak vypadá Spaghetti code Jak na odsazování kódu Znak pro odsazování kódu Odsazování konstrukce switch Odsazování kódu v kombinaci s HTML Zarovnávání operátorů Odřádkování před operátorem Jak na konce řádků Konec řádku na konci souboru Ukončení posledního prvku pole Pořadí parametrů funkcí Pojmenování parametrů funkcí Závorky kolem ternárního operátoru Použít apostrofy nebo uvozovky? Řídicí konstrukce s bloky kódu Volání funkce před její definicí V jakém pořadí definovat metody Funkce vypisující data Postradatelné proměnné a funkce
35 35 35 36 36 36 36 36 36 37 37 37 38 38 38 39 39 39 40 40 41 41 41 41 42 42 42 43 43 44 44 44
25.11.2010 9:44:38
6
Obsah
Běhové prostředí 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
Použití PHP pro webové aplikace Použití PHP z příkazové řádky Syntaktická kontrola skriptu Jiná konfigurace při spuštění z příkazové řádky Spuštění PHP kódu bez vytváření souboru Interaktivní vyhodnocování kódu Vstup a výstup z příkazového řádku Chyba skriptu spuštěného z příkazového řádku Použití chybového výstupu Načtení vstupu z webové služby Zápis na výstup z webové aplikace Načtení konfigurace PHP Detekce běhového prostředí Definice konfiguračního souboru Pravidelné spouštění úloh Pravidelné spouštění úloh z webu Aktuální adresář při spuštění skriptu Co je to PHP-GTK Jak na PHP pro Javu Jak na PHP pro .NET
Instalace a konfigurace 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
K1783.indd 6
Jak zjistit verzi PHP Aktuální verze PHP Nastavení konfigurace PHP Konfigurace pro adresář Centrální konfigurace pro adresář Vynucení konfigurace Použití konstant v konfiguraci PHP Použití jednotek v konfiguraci PHP Pravdivostní hodnoty konfiguračních direktiv Otevírání vzdálených souborů Vkládání vzdálených souborů HTML nebo XHTML? Výběr kódování Nastavení kódování Předefinování řetězcových funkcí
47 47 47 47 47 48 48 48 48 49 49 49 50 50 50 51 51 51 51 52 52
53 53 53 53 53 54 54 54 54 55 55 55 56 56 56 56
25.11.2010 9:44:38
Obsah
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
K1783.indd 7
Jak na hlášení chyb Práce s neinicializovanými proměnnými Proměnná s chybovou hláškou Využití obsluhy chyby pro získání chybové hlášky HTML kód v chybách Chyby v SQL dotazech Instalace PHP na vlastním počítači Instalace PHP na IIS Instalace PHP a aplikací na IIS Jaká je licence PHP Jaká je licence MySQL Nahrávání extenzí Název souboru s extenzí Vývojové a produkční prostředí Odkazy z chybových hlášek Konfigurace aplikace specifická pro server Povolení ladicího režimu Nevhodné povolení ladícího režimu Registrace proměnných zvenku Pořadí proměnných zvenku Automatické ošetřování vstupu od uživatele Vypnutí automatického ošetřování vstupu od uživatele Automatické ošetření načítaných dat Automatické zahájení session Platnost session proměnných Mazání starých session dat Přidání session identifikátoru do URL Odmítnutí session identifikátoru z URL Konstanta se session identifikátorem Vytváření session identifikátoru Oddělovač parametrů URL Nastavení limitů PHP Nastavení omezení paměti Co je to bezpečný režim Omezení adresáře skriptů Umístění dočasných souborů Jak skrýt přítomnost PHP Vložení souboru do všech skriptů
7
57 57 58 58 58 59 59 60 60 60 60 61 61 61 62 62 62 63 63 64 64 64 65 65 65 66 66 66 66 67 67 67 68 68 69 69 69 69
25.11.2010 9:44:38
8
Obsah
106 107 108 109 110 111 112 113 114 115 116 117 118 119
Konfigurace e-mailu Jak nastavit časové pásmo Konfigurace MySQL Co je to MySQLnd Zastaralé direktivy Jaký použít oddělovač adresářů Oddělovač cest Vypsání XML značky Použití konstant pro vlastní konfiguraci Konstanty bez rozlišení velikosti písmen Definice absolutní cesty Definice absolutního URL Kde je uložena cesta k sobě Instalace vlastní aplikace
Syntaxe jazyka 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
K1783.indd 8
Možnosti uzavírání PHP kódu Vynechání koncové značky Konec řádku za koncovou značkou Ukončení příkazu Ignorování zbytku souboru Ukončení příkazu pro ignorování zbytku souboru Druhy komentářů Ukončení jednořádkového komentáře Dokumentační komentáře Značky dokumentačních komentářů Jak na „Nutno dodělat“ Zpracování dokumentačních komentářů Jak na anotace Co je operátor identity Jaký použít operátor nerovnosti Pořadí porovnávání Co je to ternární operátor Zkrácený ternární operátor Jak používat operátor plus Pořadí násobení a dělení Bitový posun Obvyklý bitový posun Bitová negace
70 70 70 70 71 71 71 71 72 72 72 73 73 73
75 75 75 75 75 75 76 76 76 77 77 77 78 78 78 78 79 79 79 79 80 80 80 80
25.11.2010 9:44:38
Obsah
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
Definice konstant Použití konstant Nedefinované konstanty Konstanty obsahující pole Jak uložit návratovou hodnotu funkce Interní funkce s proměnným počtem parametrů Předefinování funkce Definice výjimky Rozšíření výjimky Probublání výjimky Eskalace výjimky Překlad chyb na výjimky Typy výjimek v PHP Zobrazení typu výjimky Obsluha nezachycené výjimky Skrytí chyb Zobrazení všech chyb Úklid po chybě
Jazykové konstrukce 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
K1783.indd 9
Univerzálnost cyklu for Došli jsme na konec cyklu? Počet průchodů cyklem Jak použít operátor čárka Alternativní syntaxe řídících konstrukcí Řetězení podmíněného příkazu Vyvolání chyby v podmíněném příkazu Pořadí bloků podmíněného příkazu Zkrácené vyhodnocování podmínek Jaké zvolit pořadí podmínek Opakované vyhodnocování podmínky Jaké použít logické operátory Priorita logických operátorů Priorita operátoru zřetězení Vyskočení z nadřazeného cyklu Co jsou speciální funkce Používat include nebo require? Kdy používat include_once? Kontrola opakovaného vložení zevnitř knihovny
9
81 81 81 81 82 82 83 83 83 84 84 85 85 85 86 86 87 87
89 89 89 89 90 90 90 90 91 91 92 92 92 92 93 93 93 94 94 94
25.11.2010 9:44:38
10
Obsah
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
Ukončení vkládání souboru Testování úspěšnosti vložení souboru Využití návratové hodnoty vložených souborů Globální proměnné ve vkládaných souborech Ukončení funkce bez návratové hodnoty Inicializace statických proměnných Hromadné přiřazení proměnných Jakou použít koncovku u vkládaných souborů Vkládání souboru z aktuálního adresáře Vložení souboru z adresáře zpracovávaného skriptu Použití jmenného prostoru Co je to aserce Funkce s libovolným počtem parametrů Co je to anonymní funkce Jak používat uzávěry Vytvoření funkce z řetězce Vyhodnocení kódu v řetězci Omezené vyhodnocení kódu v řetězci
Proměnné 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
K1783.indd 10
Rozsah viditelnosti proměnných Přístup ke globálním proměnným z funkce Reference a globální proměnné Proměnné proměnné Proměnné s nepovolenými znaky Proměnné s rozšířenými znaky Je proměnná nastavena? Jsou proměnné nastavené? Zrušení proměnné Přiřazení proměnných hodnotou Přiřazení proměnných referencí Předání parametrů referencí Předání parametrů referencí při volání Přiřazení objektů referencí Volitelný parametr předávaný referencí Jak použít přiřazení jako výraz Zachování typu proměnné Zachování významu proměnné Zjištění typu proměnné
95 95 95 96 96 96 97 97 98 98 98 99 99 100 100 101 101 101
103 103 103 104 104 104 105 105 105 106 106 106 107 107 107 108 108 108 109 109
25.11.2010 9:44:38
Obsah
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
K1783.indd 11
Ověření typu řetězec Nastavení typu proměnné Převod na pravdivostní hodnotu Jaké používá PHP velikosti čísel Jak pracovat s přesnými čísly Bitový posun Zápis hexadecimálních čísel Zápis čísel v osmičkové soustavě Zápis čísel ve vědecké notaci Převod uživatelského vstupu na číslo Kontrola číselného řetězce Používání čísel v kódu Nastavení jazyka Řetězec jako posloupnost bajtů Přístup k jednomu znaku v řetězci Binární bezpečnost řetězcových funkcí Speciální znaky v řetězci Znaková sada a kódování Jak na převod kódování Délka řetězce v kódování UTF-8 Samotné zpětné lomítko v řetězci Jak na víceřádkové řetězce Co je to heredoc Řetězec bez interpretace speciálních znaků Přístup k prvkům pole uvnitř řetězce Přístup ke složitějším strukturám z řetězce Přístup k libovolným strukturám z řetězce Je řetězec neprázdný? Porovnávání řetězců Porovnání řetězců bez rozlišení velikosti písmen Porovnání číselných řetězců Porovnání prvních několika znaků řetězce Končí text tímto řetězcem? Záměna více řetězců najednou Záměna více bajtů najednou Ošetřování parametrů funkcí Ošetření chyby při deserializaci proměnných
11
109 109 110 110 110 110 111 111 111 111 111 112 112 112 113 113 113 113 114 114 114 114 115 115 116 116 116 116 117 117 118 118 118 118 119 119 119
25.11.2010 9:44:38
12
Obsah
Pole 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
Sjednocení polí Spojení polí Přidání prvku na konec pole Přidání prvku na začátek pole Vložení prvků doprostřed pole Jaký je typ klíčů pole Načítání unikátních identifikátorů Procházení polí Procházení pole referencí Získání náhodného prvku pole Jak realizovat víceúrovňová pole Výchozí parametry funkce v poli Třídění polí Stabilita třídění Třídění českých polí Zřetězení prvků pole Obalení prvků pole řetězcem Výchozí hodnota nenastaveného prvku pole Vyhledání hodnoty v poli Získání prvního prvku pole Získání libovolného prvku pole Průchod více poli současně Pole pevně dané velikosti Jak implementovat frontu a zásobník Rychlejší fronta a zásobník Jak detekovat pole
Objektové programování 280 281 282 283 284 285 286 287 288 289
K1783.indd 12
Vytvoření objektu bez parametrů konstruktoru Jak na konstruktor v PHP 4 Jak na konstruktor od PHP 5 Zakázání vytvoření objektu Co je to vícenásobný konstruktor Volání destruktoru při chybě Přístup k objektu vrácenému funkcí Co je to standardní třída Přetypování na objekt Jak se odkázat na aktuální objekt
121 121 121 121 121 122 122 123 123 123 124 124 124 125 125 125 126 126 126 127 127 127 128 128 128 129 129
131 131 131 131 131 132 133 133 133 133 134
25.11.2010 9:44:38
Obsah
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
K1783.indd 13
Zjištění názvu třídy Inicializace vlastností Veřejné vlastnosti Neveřejné vlastnosti v PHP 4 Deklarace více vlastností Jak definovat interní veřejné metody Převod na řetězec Explicitní převod na řetězec Práce s neinicializovanými vlastnostmi Vyvolání chyby při zápisu do neinicializované vlastnosti Vlastnosti pouze pro čtení Jak na serializaci objektů Jak na deserializaci objektů Jak exportovat objekty Jak klonovat objekty Co je mělká kopie objektu Co je hluboká kopie objektu Automatická hluboká kopie objektu Předávání metod k zavolání Předávání statických metod k zavolání Automatické nahrávání tříd Jmenné prostory při automatickém nahrávání tříd Více funkcí pro nahrávání tříd Deserializace objektů bez definovaných tříd Viditelnost protected Viditelnost členů jiných objektů stejné třídy Viditelnost pro přátele Využití abstraktních tříd Určení typu parametru Co je to rozhraní Implementace více rozhraní Změna parametrů zděděných metod Procházení objektů Přístup k indexu objektu Jak zjistit počet prvků objektu Objekt jako pole Jak zavést silnou kontrolu typů Kontrola skalárních typů v parametrech
13
134 134 135 135 135 135 136 136 137 137 137 138 139 139 139 140 140 141 141 141 142 142 142 142 143 143 143 144 145 145 146 146 147 148 148 149 149 149
25.11.2010 9:44:38
14
Obsah
328 329 330
Co je to reflexe Využití reflexe pro testování Objekty jako klíče pole
Návrhové vzory 331 332 333 334 335 336 337 338
Singleton Důkladný Singleton Registry Registry s odloženou inicializací Factory Observer Model-View-Controller Active record
Regulární výrazy 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
K1783.indd 14
Knihovny regulárních výrazů Oddělovač regulárních výrazů Zpětné lomítko v regulárním výrazu Nadbytečná zpětná lomítka Speciální znaky v regulárním výrazu Libovolný počet opakování Konec řetězce v regulárním výrazu Co jsou to třídy znaků Nalezení výčtu znaků v řetězci Kontrola alfanumerických znaků Jak vyhledat všechna písmena Ošetření textu v regulárním výrazu Nalezené číslo řádku Nalezení více regulárních výrazů Neuložení nalezeného výskytu Pojmenování nalezených výskytů Zvýraznění odkazů v textu Zkrácení odkazů v textu Jak zjistit počet provedených záměn Co jsou hladové kvantifikátory Aserce v regulárních výrazech
150 150 150
153 153 153 154 154 155 156 156 157
159 159 159 159 160 160 160 161 161 161 161 162 162 162 162 163 163 163 164 165 165 165
25.11.2010 9:44:38
Obsah
Webové aplikace 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
K1783.indd 15
Struktura adresy URL Předání parametrů v URL Speciální znaky v názvech parametrů Odstranění parametru z URL Sestavení parametrů URL Odkaz na první stránku Odkazy na části stránky Absolutní a relativní odkazy Použití relativních odkazů Jak používat stavové hlavičky Alternativní způsob nastavení stavových hlaviček Okamžik odeslání hlaviček Poslání stavového kódu v případě chyby Způsoby přesměrování Jak adresovat výchozí stránku aplikace Přesměrování na domácí stránku aplikace Jaká je struktura souboru pro roboty Skrytí stránek před vyhledávači Co znamená bezstavovost webových aplikací Uložení informací o uživateli do cookies Nastavení a přečtení cookie Práce s odeslanou cookie Odstranění cookie Použití cookies pro předvyplnění formuláře Nastavení doby platnosti cookies Prodloužení doby platnosti cookie Velikost cookies Cookies pro více adresářů Cookies pro více domén Cookies třetích stran Co jsou session proměnné Nastavení a přečtení session proměnné Trvalé nastavení filtru uživatele Automatické vložení konce stránky Umístění vkládaných souborů do jiného adresáře Umístění vkládaných souborů do podadresáře Jak vytvořit pěknou URL
15
167 167 167 168 168 168 169 169 169 170 170 171 171 171 172 172 172 173 173 173 174 174 174 174 175 175 175 176 176 177 177 177 177 178 178 179 179 179
25.11.2010 9:44:39
16
Obsah
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
Přepis URL Přepis pěkných URL Přesměrování starých URL Automatické vytvoření pěkného URL Pěkná URL s identifikátorem Přepis všech URL Změna systému URL Jak na přesměrování domén Doména s www nebo bez? Pěkná URL pro chudé Pěkná URL přes chybovou stránku Jak nastavit chybovou stránku Velikost písmen v URL Návrat na předchozí stránku Detekce zastaralého odkazu Automatické zastavení skriptu Externí vyhledávání na stránkách Vyhledávání v placených stránkách Jak správně realizovat demoverzi Zjištění aktuální verze
Zpracování formulářů 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
K1783.indd 16
Rozdíl mezi metodami GET a POST Přístup k datům od uživatele Přístup k datům od uživatele z funkcí Přesměrování po odeslání formuláře metodou POST Zobrazení informace o provedené operaci Uložení informace o provedené operaci Předání informace o provedené operaci Kód přesměrování po odeslání formuláře Formát hlavičky Location Hlavička Location se zabezpečenými stránkami Hlavička Location s číslem portu Přesměrování na část dokumentu Typ dat z formuláře Prázdná hodnota z formuláře Odeslání pole Zpracování odeslaného pole Indexace prvků v odeslaném poli
180 180 180 181 182 182 183 183 183 184 184 184 185 185 186 186 186 187 187 188
189 189 189 190 190 191 191 192 192 193 193 193 193 194 194 195 195 195
25.11.2010 9:44:39
Obsah
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
Složitější index v odeslaném poli Odeslání formuláře na sebe sama Metoda GET přepíše parametry v URL Detekce odeslání formuláře Jak nastavit název odesílacího tlačítka Jak realizovat více odesílacích tlačítek Odesílací tlačítko pro každý řádek Jak realizovat košík s produkty Ukládání košíku do session proměnné Ukládání košíku do cookie Ukládání košíku do databáze Přidání položky do košíku JavaScriptem Jak zjistit celkovou cenu košíku Převod košíku do databáze Opakované odeslání formuláře Náhled komentáře Smazání odeslaného komentáře Logování IP adresy Logování identifikátoru prohlížeče Zobrazení IP adresy Jak vytvořit výběrový seznam Jak vytvořit výběrový seznam se skupinami Zpracování formuláře po automatickém odhlášení Jaká je maximální délka řetězců Vypnutí doplňování hodnot
Práce se soubory 459 460 461 462 463 464 465 466 467 468 469 470
K1783.indd 17
Získání celého obsahu souboru Jak určit délku načtených dat Vypsání obsahu souboru Jak detekovat konce řádků Jak zjistit čitelnost souboru Cache informací o souboru Zapsání proměnné do souboru Co je atomicita operací Jak na zamykání souborů Atomická práce se soubory Datum poslední modifikace aktuálního souboru Vytvoření dočasného souboru
17
196 196 196 197 197 198 198 199 199 199 200 200 201 202 202 203 204 205 205 205 206 207 207 208 208
209 209 209 209 209 210 210 210 210 211 211 211 211
25.11.2010 9:44:39
18
Obsah
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
K1783.indd 18
Práce s daty v paměti Procházení adresářů Rekurzivní procházení adresářů Vestavěné rekurzivní procházení adresářů Průchod souborů ve více adresářích Poslání dat metodou POST Získání souboru přes proxy server Přihlašovací údaje ke vzdálenému souboru Získání vrácených hlaviček Stažení souboru extenzí CURL Přenos cookies při stahování souboru Ruční zpracování cookies Stažení souboru na pozadí Ruční získání HTTP odpovědi Ruční stažení souboru Zpracování HTML stránky Zjištění kódování HTML stránky Zjištění jazyka HTML dokumentu Zjištění kódování českého textu Zapsání binárních dat Načtení binárních dat Práce s komprimovanými soubory Nahrávání souborů Práva k nahraným souborům Nahrání více souborů Přesunutí souboru od uživatele Kontrola nahraného souboru Původní název nahraného souboru Načtení souboru od uživatele Vlastník nahraného souboru Výchozí práva vytvářených souborů Velikost nahrávaného souboru Zjištění koncovky souboru Ukládání souborů do databáze Uložení souboru od uživatele do databáze Načítání souborů z databáze Ukládání souborů do PostgreSQL Stažení části souboru
212 212 212 213 213 213 214 214 214 214 215 215 216 216 217 217 218 219 219 220 220 220 221 221 221 222 222 222 222 223 223 223 223 224 224 224 225 225
25.11.2010 9:44:39
Obsah
Databáze 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
K1783.indd 19
Nezávislost na databázovém systému Výběr databázového systému Jednotná práce s různými databázovými systémy Co umožňuje extenze PDO Ošetření chyb v PDO Co umožňuje knihovna Dibi Co umožňuje knihovna NotORM Přenášení nevyužitých dat z databáze Co je to ORM Jak používat operátor OR v MySQL Hledání v seznamu hodnot Zapisování identifikátorů Ošetření identifikátorů Co umožňuje databáze information_schema Vestavěná databáze Vlastní funkce v SQLite Pevná struktura databáze Pojmenování databázových tabulek Využití typu int unsigned Uložení desetinných čísel Využití typu char Maximální délka řetězce Zadání neplatných dat Zobrazení varování Využití typu enum Jaký je typ dat pocházejících z databáze Formát kalendářního data Nastavení časového pásma Přehledný zápis SQL dotazů Názvy sloupců při spojení více tabulek Seznam sloupců v dotazu INSERT Pevný název tabulky Co dělá hvězdička v dotazu SELECT Způsoby spojení tabulek Význam hodnoty NULL K čemu slouží indexy Co jsou unikátní indexy
19
227 227 227 227 228 228 229 229 230 230 231 231 231 232 232 232 233 233 233 233 234 234 234 234 234 235 235 235 236 236 237 237 237 238 238 238 238 239
25.11.2010 9:44:39