1 00:00:00,000 --> 00:00:02,405 >> [Musik spiller] 2 00:00:02,405 --> 00:00:10,439 3 00:00:10,439 --> 00:00:11,980 DAVID MALAN: Okay, det er CS50. 4 00:00:11,980 --> 00:00:13,740 Dette er slutningen af ​​ugen otte. 5 00:00:13,740 --> 00:00:15,887 Og i dag, starter vi at udfylde nogle stykker 6 00:00:15,887 --> 00:00:17,720 når det kommer til bygning ting på nettet. 7 00:00:17,720 --> 00:00:20,020 Så minde om, at på mandag vi bruger en masse mere tid 8 00:00:20,020 --> 00:00:22,530 på PHP, som er denne dynamik programmeringssprog, 9 00:00:22,530 --> 00:00:26,872 lader os udgang, blandt andet ting, HTML og andre sådant indhold 10 00:00:26,872 --> 00:00:27,830 at vi vil få lyst til at se. 11 00:00:27,830 --> 00:00:30,871 Men vi har ikke rigtig set på, hvordan vi kommer til at gemme alle oplysninger. 12 00:00:30,871 --> 00:00:34,477 Faktisk næsten enhver af at super interessante websteder, du besøger i dag 13 00:00:34,477 --> 00:00:36,560 har en form for database på bagsiden ende, ikke? 14 00:00:36,560 --> 00:00:39,540 Facebook sikkert gemmer masser af data om os alle og Gmail gemmer alle 15 00:00:39,540 --> 00:00:40,210 af dine e-mails. 16 00:00:40,210 --> 00:00:44,150 >> Og så, mange andre steder er ikke bare statisk indhold, der er oplysende. 17 00:00:44,150 --> 00:00:45,640 Det er faktisk dynamisk på en eller anden måde. 18 00:00:45,640 --> 00:00:48,480 Du giver input, opdaterer det siderne for andre mennesker. 19 00:00:48,480 --> 00:00:50,620 Du får beskeder, du sender beskeder, og så videre. 20 00:00:50,620 --> 00:00:54,250 Så i dag, ser vi nærmere på fundamentet for et projekt 21 00:00:54,250 --> 00:00:57,330 at du vil dykke ned i næste uge, CS50 Finance, som 22 00:00:57,330 --> 00:01:00,509 er faktisk vil have dig med at opbygge noget ikke i C, men i PHP. 23 00:01:00,509 --> 00:01:02,550 En hjemmeside, der ser en lidt noget som dette 24 00:01:02,550 --> 00:01:05,810 der gør det muligt at købe og sælge bestande, der faktisk 25 00:01:05,810 --> 00:01:09,044 kommer til at trække på realtid lager data fra Yahoo Finance. 26 00:01:09,044 --> 00:01:11,960 Og så i sidste ende, vil du have den illusion for dig selv og for brugere 27 00:01:11,960 --> 00:01:14,550 at du rent faktisk køber og sælger lagre og få næsten realtid 28 00:01:14,550 --> 00:01:16,800 opdateringer, styre en portefølje, som alle 29 00:01:16,800 --> 00:01:20,310 vil kræve at have, sidste ende, en database over brugere. 30 00:01:20,310 --> 00:01:23,330 >> Så med dine egne ord, især hvis du ikke er 31 00:01:23,330 --> 00:01:25,670 Super fortrolig med computeren videnskab eller databaser, hvad 32 00:01:25,670 --> 00:01:30,790 kender du en database til at være lige nu, i ikke-tekniske termer? 33 00:01:30,790 --> 00:01:32,300 Hvad er det? 34 00:01:32,300 --> 00:01:36,882 Hvordan vil du beskrive det til en roommate eller en ven? 35 00:01:36,882 --> 00:01:40,100 >> PUBLIKUM: [uhørligt] oplysninger [uhørligt] 36 00:01:40,100 --> 00:01:44,430 >> DAVID MALAN: Så en liste over oplysninger, eller en store-- en liste over oplysninger 37 00:01:44,430 --> 00:01:47,160 at du måske ønsker at gemme om noget, som en bruger. 38 00:01:47,160 --> 00:01:50,190 Og hvad gør brugere forbundet med dem? 39 00:01:50,190 --> 00:01:53,160 Hvis du er en bruger på Facebook eller Gmail, hvad er de egenskaber 40 00:01:53,160 --> 00:01:54,940 at vi alle brugere have? 41 00:01:54,940 --> 00:01:58,530 Ligesom, hvad der kunne være nogle af de kolonner i regnearket, som vi 42 00:01:58,530 --> 00:01:59,390 hentydede sidste gang? 43 00:01:59,390 --> 00:02:01,140 Fordi igen, kan du tænke på en database 44 00:02:01,140 --> 00:02:05,810 virkelig som en fancy Excel-fil eller Google Regneark eller Apple Numbers fil. 45 00:02:05,810 --> 00:02:08,280 >> Så, hvad synes du om når du tænker på en bruger? 46 00:02:08,280 --> 00:02:11,290 Hvad har de? 47 00:02:11,290 --> 00:02:11,790 Hvad er det? 48 00:02:11,790 --> 00:02:12,470 >> PUBLIKUM: Et navn. 49 00:02:12,470 --> 00:02:13,303 >> DAVID MALAN: Et navn. 50 00:02:13,303 --> 00:02:16,840 Så hvis navn, ligesom David Malan ville være navnet på nogle bruger. 51 00:02:16,840 --> 00:02:17,980 Hvad andre gør en bruger have? 52 00:02:17,980 --> 00:02:18,770 >> PUBLIKUM: En id. 53 00:02:18,770 --> 00:02:19,561 >> DAVID MALAN: En id. 54 00:02:19,561 --> 00:02:23,320 Så ligesom et ID-nummer, som din Harvard Id eller din Yale Net-ID eller lignende. 55 00:02:23,320 --> 00:02:24,923 Hvad andet kan en bruger have? 56 00:02:24,923 --> 00:02:25,890 >> PUBLIKUM: Kodeord. 57 00:02:25,890 --> 00:02:29,240 >> DAVID MALAN: Et kodeord, måske en adresse, måske et telefonnummer, måske 58 00:02:29,240 --> 00:02:30,050 en e-mailadresse. 59 00:02:30,050 --> 00:02:32,640 Så der er bundter af marker og dette kunne slags spiral ud af kontrol 60 00:02:32,640 --> 00:02:34,760 hurtigt, så snart du begynder indse, åh, lad os gemme denne 61 00:02:34,760 --> 00:02:36,190 og lad os gemme dette og hint. 62 00:02:36,190 --> 00:02:37,657 >> Men hvordan gør vi rent faktisk gør det? 63 00:02:37,657 --> 00:02:39,740 Så igen, den mentale model at have for dag som vi 64 00:02:39,740 --> 00:02:42,320 dykke ned i selve SQL, Structured Query Language, 65 00:02:42,320 --> 00:02:44,186 er en database, der ligner dette. 66 00:02:44,186 --> 00:02:45,310 Det er bare rækker og kolonner. 67 00:02:45,310 --> 00:02:48,309 Og du kan forestille Google Regneark eller en række andre programmer. 68 00:02:48,309 --> 00:02:52,130 Men hvad er nøglen om MySQL, som er den databasesoftware vi kommer til at bruge, 69 00:02:52,130 --> 00:02:54,920 det frit åbent available-- Facebook anvendelser 70 00:02:54,920 --> 00:02:59,200 det og en række andre websites-- database gemmer tingene relationelt. 71 00:02:59,200 --> 00:03:01,770 Og en relationsdatabase betyder bare en, der bogstavelig talt 72 00:03:01,770 --> 00:03:03,672 gemmer sine data i rækker og kolonner. 73 00:03:03,672 --> 00:03:04,630 Det er så simpelt er det. 74 00:03:04,630 --> 00:03:07,230 >> Så selv noget lignende Oracle, som du måske har generelt hørt om 75 00:03:07,230 --> 00:03:08,271 er en relationsdatabase. 76 00:03:08,271 --> 00:03:10,929 Og under kølerhjelmen, det gemmer data i rækker og kolonner. 77 00:03:10,929 --> 00:03:12,970 Og Oracle afgifter du en masse penge til at gøre det, 78 00:03:12,970 --> 00:03:15,550 mens MySQL afgifter dig noget for det samme. 79 00:03:15,550 --> 00:03:18,790 Så er SQL vil give os mindst fire operationer. 80 00:03:18,790 --> 00:03:23,190 Evnen til at vælge data, som læste data, indsætte, slette og opdatere data. 81 00:03:23,190 --> 00:03:25,525 Med andre ord dem, er virkelig de fire centrale operationer 82 00:03:25,525 --> 00:03:28,950 der kommer til at give os mulighed for at ændre ting i disse rækker og kolonner. 83 00:03:28,950 --> 00:03:33,250 >> Værktøjet, som vi vil bruge i dag, især at lære SQL og at lege med det 84 00:03:33,250 --> 00:03:34,627 igen kaldes PHP MyAdmin. 85 00:03:34,627 --> 00:03:35,460 Det er web-baseret værktøj. 86 00:03:35,460 --> 00:03:38,200 Total tilfældighed, at det er skrevet i PHP. 87 00:03:38,200 --> 00:03:42,400 Men det kommer til at give os en grafisk brugergrænseflade, så vi rent faktisk kan 88 00:03:42,400 --> 00:03:46,054 oprette disse rækker og kolonner og derefter tale med dem via kode. 89 00:03:46,054 --> 00:03:47,970 Så lad os nu begynde at hvad jeg synes er helt ærligt 90 00:03:47,970 --> 00:03:51,000 slags sjove processen med bygge bagenden af ​​hjemmesider, 91 00:03:51,000 --> 00:03:54,580 de dele, at brugerne ikke se, men sikkert gør sig om, 92 00:03:54,580 --> 00:03:56,170 fordi det er snarere Datas gang. 93 00:03:56,170 --> 00:03:59,570 Så ligner C og en lidt mindre som PHP, 94 00:03:59,570 --> 00:04:04,954 SQL eller en database, der understøtter SQL, har mindst disse datatyper 95 00:04:04,954 --> 00:04:05,870 og klaser af andre. 96 00:04:05,870 --> 00:04:08,107 CHAR, VARCHAR, INT, BIGINT, DECIMAL, og DATETIME. 97 00:04:08,107 --> 00:04:09,940 Og der er en hel bundt af andre funktioner, 98 00:04:09,940 --> 00:04:11,940 men lad os gøre dette ved måde faktiske eksempel. 99 00:04:11,940 --> 00:04:16,450 >> Jeg har tænkt mig at gå ind i CS50 IDE hvor der i forvejen, har jeg logget ind 100 00:04:16,450 --> 00:04:19,372 og jeg har også besøgt en URL til dette værktøj kaldet PHP MyAdmin. 101 00:04:19,372 --> 00:04:22,580 Og i problemer sæt syv, vil vi fortælle dig nøjagtigt, hvordan man kommer til denne grænseflade 102 00:04:22,580 --> 00:04:23,200 samt. 103 00:04:23,200 --> 00:04:25,640 På øverste venstre hjørne, mærke til det siger foredrag. 104 00:04:25,640 --> 00:04:27,610 Og det betyder bare, at i forvejen, skabte jeg 105 00:04:27,610 --> 00:04:31,360 en tom database kaldet forelæsning der har ingen regneark i det endnu. 106 00:04:31,360 --> 00:04:32,600 Der er ingen rækker og kolonner. 107 00:04:32,600 --> 00:04:34,308 Fordi den første ting, vi vil gøre 108 00:04:34,308 --> 00:04:37,100 er begynde at oprette en tabel der kommer til at gemme vores brugere. 109 00:04:37,100 --> 00:04:39,100 >> Så bogstaveligt talt over her til højre, jeg er 110 00:04:39,100 --> 00:04:42,070 vil fortælle databasen Jeg vil have en tabel kaldet Brugere. 111 00:04:42,070 --> 00:04:44,845 Så det er ligesom den fil, jeg ønsker at gemme alle mine data. 112 00:04:44,845 --> 00:04:45,720 Og hvor mange kolonner? 113 00:04:45,720 --> 00:04:47,740 Nå, lad os holde det simpelt for nu. 114 00:04:47,740 --> 00:04:51,855 Jeg ønsker blot at gemme som en brugernavn og et navn for en bruger. 115 00:04:51,855 --> 00:04:53,020 Vi vil starte små. 116 00:04:53,020 --> 00:04:55,370 Så jeg vil have to kolonner alt. 117 00:04:55,370 --> 00:04:57,360 Og jeg har tænkt mig at gå videre og klik på Gå. 118 00:04:57,360 --> 00:04:59,210 Og så, for disse kolonner, hvad jeg vil 119 00:04:59,210 --> 00:05:04,576 at do-- hvis denne internet cooperates-- okay, 120 00:05:04,576 --> 00:05:05,950 så vi kommer til at prøve det igen. 121 00:05:05,950 --> 00:05:09,180 Jeg har tænkt mig at oprette en tabel kaldet Brugere med to kolonner, skal du klikke på OK, OK. 122 00:05:09,180 --> 00:05:10,520 Nu har vi fået det rigtig hurtigt. 123 00:05:10,520 --> 00:05:12,065 Tak, meget godt klaret. 124 00:05:12,065 --> 00:05:14,440 Okay, så hvad ønsker vi disse kolonner skal hedde? 125 00:05:14,440 --> 00:05:16,080 >> Så er man kommer til at hedde Brugernavn. 126 00:05:16,080 --> 00:05:19,480 Så alt jeg ser her-- og grænsefladen ærligt talt bliver lidt grimt til sidst, 127 00:05:19,480 --> 00:05:21,270 når du begynder at skrive i alle disse data. 128 00:05:21,270 --> 00:05:27,450 Men hvad er rart er, at slags paradoksalt nok, jeg skaber kolonner, 129 00:05:27,450 --> 00:05:29,977 men værktøjet har tåbeligt lagde dem ud i rækker 130 00:05:29,977 --> 00:05:31,560 så jeg kan konfigurere disse kolonner. 131 00:05:31,560 --> 00:05:33,550 Så der er to emner der under Navn. 132 00:05:33,550 --> 00:05:36,180 Og en af ​​disse felter jeg vil kaldes brugernavn, 133 00:05:36,180 --> 00:05:38,000 og det andet område, jeg vil ringe til Navn. 134 00:05:38,000 --> 00:05:40,340 >> Og nu jeg nødt til at vælge datatyper for disse ting. 135 00:05:40,340 --> 00:05:42,330 Så mens der i Excel og Google Regneark, 136 00:05:42,330 --> 00:05:45,531 hvis du ønsker en kolonne, du bogstaveligt talt bare skrive navn eller brugernavn, tryk Enter. 137 00:05:45,531 --> 00:05:48,030 Måske du gør det fed ansigt bare for klarhed, men det er det. 138 00:05:48,030 --> 00:05:50,140 Du behøver ikke angive typer af søjlerne. 139 00:05:50,140 --> 00:05:53,790 Nu i Google Regneark eller Excel, du kunne angive, hvordan data bliver gjort. 140 00:05:53,790 --> 00:05:58,120 Du kan gå til menuen Formater og du kan angive vis denne lignende dollartegn, 141 00:05:58,120 --> 00:05:59,900 vis denne som en floating point-værdi. 142 00:05:59,900 --> 00:06:01,990 >> Så det er ens i ånd til at det, vi er ved at gøre, 143 00:06:01,990 --> 00:06:04,740 men det er faktisk kommer til at tvinge at dataene er en bestemt type. 144 00:06:04,740 --> 00:06:07,750 Nu, selvom et øjeblik siden jeg sagde, at der er kun et par datatyper, 145 00:06:07,750 --> 00:06:11,120 der er faktisk en hel masse, og de er 146 00:06:11,120 --> 00:06:12,910 i varierende grader af specificitet. 147 00:06:12,910 --> 00:06:14,970 Og som en sidebemærkning, du kan endda gøre smarte ting 148 00:06:14,970 --> 00:06:17,520 ligesom opbevaring geometrier inde i en database. 149 00:06:17,520 --> 00:06:19,250 Du kan gemme ting ligesom GPS-koordinater 150 00:06:19,250 --> 00:06:22,420 og faktisk finde, matematisk, punkter, som er tæt på andre. 151 00:06:22,420 --> 00:06:24,128 Men vi kommer til at holde dette super enkel 152 00:06:24,128 --> 00:06:26,800 og gå op til her, alle de såkaldte string typer. 153 00:06:26,800 --> 00:06:29,240 >> Så her er en liste over en hel masse muligheder. 154 00:06:29,240 --> 00:06:32,740 CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. 155 00:06:32,740 --> 00:06:34,110 Og det er lidt overvældende. 156 00:06:34,110 --> 00:06:37,610 Og desværre, noget paradoksalt nok til C, 157 00:06:37,610 --> 00:06:40,120 en CHAR er egentlig ikke en CHAR. 158 00:06:40,120 --> 00:06:44,170 Hvis du angiver i en database at dine data type er CHAR, 159 00:06:44,170 --> 00:06:47,390 det betyder, at ja, det er en CHAR, men det er en eller flere tegn. 160 00:06:47,390 --> 00:06:49,630 Og du er nødt til at specificere hvor mange tegn, du ønsker. 161 00:06:49,630 --> 00:06:51,636 Så, hvad er en typisk længde for et brugernavn? 162 00:06:51,636 --> 00:06:52,760 Er der en grænse typisk? 163 00:06:52,760 --> 00:06:53,920 >> PUBLIKUM: [uhørligt] 164 00:06:53,920 --> 00:06:55,050 >> DAVID MALAN: 16 måske? 165 00:06:55,050 --> 00:06:55,990 Noget i den stil. 166 00:06:55,990 --> 00:06:57,948 Du ved, tilbage i dag, det plejede at være otte. 167 00:06:57,948 --> 00:07:00,289 Nogle gange er det 16, nogle gange Det er endnu mere end det. 168 00:07:00,289 --> 00:07:02,080 Og så, det ikke er tilfældet betyder give mig en CHAR. 169 00:07:02,080 --> 00:07:04,730 Det betyder, at jeg er nødt til at specificere længden af ​​feltet, 170 00:07:04,730 --> 00:07:07,402 og nu kan jeg sige noget lignende 16. 171 00:07:07,402 --> 00:07:08,610 Og der er en afvejning her. 172 00:07:08,610 --> 00:07:11,360 Så vil vi se på et øjeblik at dette betyder en, 173 00:07:11,360 --> 00:07:14,620 hver brugernavn skal være 16 tegn. 174 00:07:14,620 --> 00:07:18,720 Men vent et øjeblik, M-A-L-A-N. Hvis det er mit brugernavn og jeg bruger kun fem, 175 00:07:18,720 --> 00:07:23,070 hvad ville du foreslå, at databasen at gøre for de andre 11 tegn, 176 00:07:23,070 --> 00:07:24,471 Jeg har reserveret plads til? 177 00:07:24,471 --> 00:07:25,220 Hvad ville du gøre? 178 00:07:25,220 --> 00:07:26,480 >> PUBLIKUM: [uhørligt] 179 00:07:26,480 --> 00:07:27,160 >> DAVID MALAN: Ja, bare gøre dem alle null. 180 00:07:27,160 --> 00:07:28,290 Gør dem rum. 181 00:07:28,290 --> 00:07:30,816 Men sandsynligvis null, så en masse backslash nuller. 182 00:07:30,816 --> 00:07:33,190 Så på den ene side, vi har nu sørget for, at mit brugernavn 183 00:07:33,190 --> 00:07:34,780 kan ikke være mere end 16 tegn. 184 00:07:34,780 --> 00:07:37,590 Og bagsiden af ​​det er at hvis jeg havde en rigtig langt navn 185 00:07:37,590 --> 00:07:39,940 eller ønskede en virkelig lang brugernavn ligesom nogle af jer 186 00:07:39,940 --> 00:07:44,840 fyre kan have i at kollegiet eller på Yale.edu, kan du ikke har en. 187 00:07:44,840 --> 00:07:47,177 Og så i virkeligheden, hvis du har nogensinde registreret for en hjemmeside 188 00:07:47,177 --> 00:07:49,385 og du får råbte på at sige dit kodeord er for lang 189 00:07:49,385 --> 00:07:52,710 eller dit brugernavn er for lang, er det simpelthen fordi en programmør, når 190 00:07:52,710 --> 00:07:55,500 konfigurere sin database, besluttede, at dette område vil 191 00:07:55,500 --> 00:07:57,150 være længere end denne længde. 192 00:07:57,150 --> 00:08:00,580 >> Okay, så hvad hvis vi går videre til at navngive? 193 00:08:00,580 --> 00:08:05,240 Hvor længe skal en typiske menneske navn være? 194 00:08:05,240 --> 00:08:07,492 Hvor mange tegn, 16? 195 00:08:07,492 --> 00:08:09,450 Jeg kan gætte vi kunne finde nogen i dette rum 196 00:08:09,450 --> 00:08:13,210 hvor ved hans eller hendes første plus sidste navn er længere end 16 tegn. 197 00:08:13,210 --> 00:08:14,850 Så hvad er bedre end det, 17? 198 00:08:14,850 --> 00:08:17,040 18? 199 00:08:17,040 --> 00:08:18,830 25? 200 00:08:18,830 --> 00:08:20,350 Større? 201 00:08:20,350 --> 00:08:20,980 30? 202 00:08:20,980 --> 00:08:21,855 >> PUBLIKUM: [uhørligt] 203 00:08:21,855 --> 00:08:23,700 DAVID MALAN: 5.000, åh min Gud. 204 00:08:23,700 --> 00:08:26,309 Så det er sandsynligvis en anstændig øvre grænse, skal vi sige. 205 00:08:26,309 --> 00:08:28,350 Og her vi slags har at foretage en dom opkald. 206 00:08:28,350 --> 00:08:30,400 Ligesom, der er ingen rigtige svar her. 207 00:08:30,400 --> 00:08:32,740 Infinite er ikke helt muligt, fordi vi er i sidste ende 208 00:08:32,740 --> 00:08:34,781 kommer til at have-- vi er kommer til at løbe tør for hukommelse. 209 00:08:34,781 --> 00:08:36,909 Så vi er nødt til at gøre en dom opkald på et tidspunkt. 210 00:08:36,909 --> 00:08:41,010 >> Meget almindelig ville være, for eksempel, at use-- og lad mig præcisere CHAR her 211 00:08:41,010 --> 00:08:46,050 som before-- 255 var bogstaveligt øvre grænse for denne database-software 212 00:08:46,050 --> 00:08:46,700 år siden. 213 00:08:46,700 --> 00:08:48,575 Og så, en masse mennesker ville bare sige, fint. 214 00:08:48,575 --> 00:08:49,420 255 er den grænse. 215 00:08:49,420 --> 00:08:50,620 Lad os bare bruge det maksimale. 216 00:08:50,620 --> 00:08:51,870 Og det er temmelig latterligt. 217 00:08:51,870 --> 00:08:55,060 Ligesom, hvis du skriver en person er navn til 200 plus tegn, 218 00:08:55,060 --> 00:08:56,140 at en smule latterligt. 219 00:08:56,140 --> 00:08:59,624 >> Men husk, at ASCII ikke det eneste system for tegn. 220 00:08:59,624 --> 00:09:01,540 Og så, især i en masse asiatiske sprog 221 00:09:01,540 --> 00:09:04,248 hvor der er tegn kan vi ikke udtrykke på tastaturer som min amerikanske 222 00:09:04,248 --> 00:09:08,209 tastatur, nogle tegn faktisk tage 16 bit i stedet for otte bits. 223 00:09:08,209 --> 00:09:10,250 Og så, det faktisk er ikke alt, urimelig 224 00:09:10,250 --> 00:09:12,250 at vi har brug for mere plads, hvis vi ønsker at passe 225 00:09:12,250 --> 00:09:16,252 større tegn end selve USA centric dem vi har tendens til at diskutere. 226 00:09:16,252 --> 00:09:17,460 Så vi har brug for nogle øvre grænse. 227 00:09:17,460 --> 00:09:21,470 Jeg ved ikke, hvad det bedste er, men 255 er generelt et almindeligt. 228 00:09:21,470 --> 00:09:22,700 25 føler lav. 229 00:09:22,700 --> 00:09:23,857 16, 32 føler lav. 230 00:09:23,857 --> 00:09:25,690 Jeg vil fejle på siden af noget højere. 231 00:09:25,690 --> 00:09:27,330 Men der er en afvejning, som altid. 232 00:09:27,330 --> 00:09:31,902 Hvad er det måske indlysende afvejning for at reservere 255 tegn 233 00:09:31,902 --> 00:09:33,360 for alles navn i min database? 234 00:09:33,360 --> 00:09:34,230 >> PUBLIKUM: [uhørligt] 235 00:09:34,230 --> 00:09:34,510 >> DAVID MALAN: Hvad er det? 236 00:09:34,510 --> 00:09:35,430 >> PUBLIKUM: [uhørligt] 237 00:09:35,430 --> 00:09:37,138 >> DAVID MALAN: Det er en masse hukommelse, right? 238 00:09:37,138 --> 00:09:42,280 M-A-L-A-N. Jeg har netop spildt 250 tegn bare at gemme mit navn 239 00:09:42,280 --> 00:09:46,000 defensivt, bare i tilfælde nogen i klassen har en virkelig langt navn. 240 00:09:46,000 --> 00:09:47,940 Det virker som en urimelig afvejning. 241 00:09:47,940 --> 00:09:52,040 >> Så det viser sig, at SQL, denne database sprog, 242 00:09:52,040 --> 00:09:55,480 faktisk understøtter noget kaldet VARCHAR eller variabel CHAR. 243 00:09:55,480 --> 00:09:59,390 Og det er slags rart i, at dette giver dig mulighed for at angive ikke en fast 244 00:09:59,390 --> 00:10:01,900 bredde, men snarere en variabel bredde. 245 00:10:01,900 --> 00:10:05,060 Og mere specifikt en maksimale bredde af feltet. 246 00:10:05,060 --> 00:10:08,901 Så betyder det, at et navn kan ikke være mere end 250 tegn, 247 00:10:08,901 --> 00:10:10,150 men det kan helt sikkert være færre. 248 00:10:10,150 --> 00:10:11,733 Og databasen vil være smart. 249 00:10:11,733 --> 00:10:14,860 Hvis du sætter i M-A-L-A-N, det er kun kommer til at bruge fem, 250 00:10:14,860 --> 00:10:18,120 måske seks bytes for ligesom en bageste null-tegn, 251 00:10:18,120 --> 00:10:23,330 og ikke bruge en ekstra 249 eller 250 byte unødigt. 252 00:10:23,330 --> 00:10:27,380 >> Så det ser ud som jeg burde har startet med denne historie. 253 00:10:27,380 --> 00:10:29,140 Men der er altid en afvejning. 254 00:10:29,140 --> 00:10:33,024 Så på den ene side et brugernavn jeg har specificeret til at blive hårdt kodet ved 16, 255 00:10:33,024 --> 00:10:34,940 og måske det var ikke den rigtige opkald, måske det 256 00:10:34,940 --> 00:10:40,040 er, men hvorfor ikke bruge VARCHARs for alt? 257 00:10:40,040 --> 00:10:42,020 >> Den eksisterer for en grund. 258 00:10:42,020 --> 00:10:46,200 Hvorfor ikke bruge VARCHARs for hvert felt hvis længde, du ikke kender i forvejen 259 00:10:46,200 --> 00:10:48,180 hvis det synes at være en stor ting, right? 260 00:10:48,180 --> 00:10:50,482 Brug kun så meget plads som du har brug for op til denne grænse? 261 00:10:50,482 --> 00:10:51,271 >> PUBLIKUM: Langsommere. 262 00:10:51,271 --> 00:10:52,146 DAVID MALAN: Speller? 263 00:10:52,146 --> 00:10:53,120 PUBLIKUM: Gør det langsommere? 264 00:10:53,120 --> 00:10:53,970 DAVID MALAN: Åh, det er langsommere. 265 00:10:53,970 --> 00:10:55,720 Godt, det er næsten altid svaret, helt ærligt. 266 00:10:55,720 --> 00:10:56,520 Ligesom, hvad er tradeoff? 267 00:10:56,520 --> 00:10:58,570 Det enten koster mere plads eller det koster mere tid. 268 00:10:58,570 --> 00:11:00,111 Så i dette tilfælde, kan det være langsommere. 269 00:11:00,111 --> 00:11:00,920 Hvorfor? 270 00:11:00,920 --> 00:11:05,830 >> PUBLIKUM: [uhørligt] bestemme [uhørligt]. 271 00:11:05,830 --> 00:11:06,640 >> DAVID MALAN: God. 272 00:11:06,640 --> 00:11:09,670 Så kan du husker fra selv PSED5, leger med din tilgang 273 00:11:09,670 --> 00:11:12,750 til ordbogen, hvis du skal allokere hukommelse dynamisk eller beholde 274 00:11:12,750 --> 00:11:14,630 dyrkning af en buffer, der kan faktisk være langsom. 275 00:11:14,630 --> 00:11:16,963 Hvis du nødt til at kalde malloc under kølerhjelmen og måske 276 00:11:16,963 --> 00:11:19,610 det er, hvad MySQL gør, så sikkert, der kunne være tilfældet. 277 00:11:19,610 --> 00:11:22,430 Og hvis du tror måde tilbage til PSet-- eller endda 278 00:11:22,430 --> 00:11:26,340 uger to, da vi gjorde ting som binær søgning eller endda lineær søgning, 279 00:11:26,340 --> 00:11:30,690 en af ​​de gode ting ved hvert ord i en database eller hvert ord i en kolonne 280 00:11:30,690 --> 00:11:33,690 være nøjagtig den samme længde, selv hvis en hel masse af disse tegn 281 00:11:33,690 --> 00:11:37,390 er tomme, er, at du kan bruge random access på dine data, ikke? 282 00:11:37,390 --> 00:11:40,310 >> Hvis du ved, at hver ord er 16 tegn væk, 283 00:11:40,310 --> 00:11:46,460 du kan bruge pointer aritmetik, så at tale, og gå til os 16, 32, 48, 64, 284 00:11:46,460 --> 00:11:49,589 og du kan bare hoppe øjeblikkeligt ved hjælp af aritmetiske 285 00:11:49,589 --> 00:11:51,130 ethvert af ordene i databasen. 286 00:11:51,130 --> 00:11:54,280 Hvorimod hvis det er en VARCHAR, hvad har du i stedet nødt til at gøre? 287 00:11:54,280 --> 00:11:55,960 >> [Telefonen ringer] 288 00:11:55,960 --> 00:11:58,680 >> Hvis det er en VARCHAR, du kan ikke bruge random access. 289 00:11:58,680 --> 00:12:01,341 Hvad du nødt til at kigge efter eller gøre? 290 00:12:01,341 --> 00:12:01,840 Ja? 291 00:12:01,840 --> 00:12:03,240 >> PUBLIKUM: [uhørligt] 292 00:12:03,240 --> 00:12:04,310 >> DAVID MALAN: Look gennem whole-- spor 293 00:12:04,310 --> 00:12:06,518 gennem hele listen udkig efter, hvad, sandsynligvis? 294 00:12:06,518 --> 00:12:08,356 Hvilken slags særlig værdi? 295 00:12:08,356 --> 00:12:09,230 PUBLIKUM: [uhørligt] 296 00:12:09,230 --> 00:12:11,105 DAVID MALAN: Leder for null terminatorer 297 00:12:11,105 --> 00:12:13,637 at afgrænse adskillelsen af ​​ord. 298 00:12:13,637 --> 00:12:15,720 Så igen, en afvejning, og der er ingen rigtige svar. 299 00:12:15,720 --> 00:12:18,380 Men det er her, især når dine brugere kommer til at være mange 300 00:12:18,380 --> 00:12:21,700 og din belastning på dine servere, den Antallet af mennesker, der bruger det får højt, 301 00:12:21,700 --> 00:12:23,650 disse faktisk er nontrivial beslutninger. 302 00:12:23,650 --> 00:12:26,640 Så kan vi lade disse som dette, men Lad os rulle ned over til højre 303 00:12:26,640 --> 00:12:27,332 her. 304 00:12:27,332 --> 00:12:30,290 Nu er der et par kolonner hvor vi er nødt til at foretage en dom opkald. 305 00:12:30,290 --> 00:12:35,170 Giver det mening at tillade en brugers navn, en brugers brugernavn eller en brugers 306 00:12:35,170 --> 00:12:36,370 navn, for at være nul? 307 00:12:36,370 --> 00:12:37,610 Det vil sige, lige tomt. 308 00:12:37,610 --> 00:12:40,360 Føles lidt meningsløse, så jeg er ikke kommer til at kontrollere disse bokse. 309 00:12:40,360 --> 00:12:42,670 Men det viser sig i en database, kan man sige, 310 00:12:42,670 --> 00:12:44,620 nogen kan eventuelt have denne værdi. 311 00:12:44,620 --> 00:12:47,180 Denne kolonne har ikke faktisk være der. 312 00:12:47,180 --> 00:12:48,570 >> Nu er der denne rullemenuen. 313 00:12:48,570 --> 00:12:50,810 Og læg mærke til jeg er stadig i første række er, 314 00:12:50,810 --> 00:12:52,520 så jeg taler om brugernavn nu. 315 00:12:52,520 --> 00:12:56,290 Og det viser sig, at en database, I modsætning til en simpel simpel regneark, 316 00:12:56,290 --> 00:12:58,520 har kraftfulde funktioner kaldes indekser. 317 00:12:58,520 --> 00:13:02,600 Og et indeks er en måde at fortælle database på forhånd, at jeg mennesket 318 00:13:02,600 --> 00:13:03,900 am klogere end dig. 319 00:13:03,900 --> 00:13:10,430 >> Jeg ved, hvad slags forespørgsler, skal du vælge eller indsætte eller slette eller opdatering, 320 00:13:10,430 --> 00:13:13,182 at min kode kommer til at ende med at gøre på denne database. 321 00:13:13,182 --> 00:13:14,390 Jeg ønsker at læse en masse data. 322 00:13:14,390 --> 00:13:15,681 Jeg ønsker at indsætte en masse data. 323 00:13:15,681 --> 00:13:17,530 Jeg ønsker at konstant slette en masse data. 324 00:13:17,530 --> 00:13:21,520 Hvis jeg ved, at jeg har tænkt mig at være adgang et felt som brugernavn en masse, 325 00:13:21,520 --> 00:13:24,770 Jeg kan preemptively fortælle database, jeg ved mere end dig, 326 00:13:24,770 --> 00:13:29,220 og jeg ønsker at dekret, der du bør indeksere dette felt. 327 00:13:29,220 --> 00:13:33,200 Hvor indeksere et felt eller en søjle betyder, at på forhånd, 328 00:13:33,200 --> 00:13:37,040 bør låne nogle ideer fra, ligesom, uge fire og fem og seks fra CS50 329 00:13:37,040 --> 00:13:39,240 og faktisk opbygge noget som en binær søgning 330 00:13:39,240 --> 00:13:41,560 træ eller noget generelt kaldes en B-træ 331 00:13:41,560 --> 00:13:43,410 at du ville lære i en klasse som CS124 332 00:13:43,410 --> 00:13:46,710 på Harvard, en algoritmer klasse, eller en række andre steder. 333 00:13:46,710 --> 00:13:49,570 >> Databasen og smart mennesker, der gennemførte det 334 00:13:49,570 --> 00:13:53,880 vil finde ud af at gemme at skema med oplysninger 335 00:13:53,880 --> 00:13:57,061 i hukommelsen, så søgninger og andre operationer er super hurtig. 336 00:13:57,061 --> 00:13:58,060 Du behøver ikke at gøre det. 337 00:13:58,060 --> 00:14:00,640 Du behøver ikke at gennemføre lineær søgning eller binær søgning 338 00:14:00,640 --> 00:14:03,300 eller mergesort eller udvælgelse Sorter, noget af det. 339 00:14:03,300 --> 00:14:06,590 Databasen gør det for dig, hvis du fortæller det forebyggende at indeksere dette felt. 340 00:14:06,590 --> 00:14:09,100 >> Og du kan se alt, der er nogle andre karakteristika 341 00:14:09,100 --> 00:14:11,010 Vi kan fortælle databasen til at håndhæve. 342 00:14:11,010 --> 00:14:16,431 Hvad kan det betyde, hvis jeg vælger Unique fra denne menu, bare intuitivt? 343 00:14:16,431 --> 00:14:16,930 Ja? 344 00:14:16,930 --> 00:14:17,889 >> PUBLIKUM: [uhørligt] 345 00:14:17,889 --> 00:14:19,930 DAVID MALAN: Yeah, det brugernavn skal være unikt. 346 00:14:19,930 --> 00:14:23,330 Er dette en god ting eller en dårlig ting for en database, for et websted med brugerne? 347 00:14:23,330 --> 00:14:24,965 Bør brugernavne være unik? 348 00:14:24,965 --> 00:14:25,880 Ja, sandsynligvis. 349 00:14:25,880 --> 00:14:27,800 Hvis det er, hvad det felt vi bruger til at logge på, 350 00:14:27,800 --> 00:14:31,867 du ikke virkelig ønsker at mennesker, der har den samme fornemmelse eller det samme brugernavn. 351 00:14:31,867 --> 00:14:33,700 Så kan vi have den database håndhæve, at så 352 00:14:33,700 --> 00:14:37,880 at nu i min PHP kode eller ethvert sprog, Jeg behøver ikke at, for eksempel, tjek 353 00:14:37,880 --> 00:14:41,490 nødvendigvis gør dette brugernavn eksisterer før jeg lade nogen registrere? 354 00:14:41,490 --> 00:14:46,690 Databasen vil ikke lade to personer navngivne David eller Malans registrere i dette tilfælde. 355 00:14:46,690 --> 00:14:50,030 >> Og som en side, selvom det Menuen kun lader dig vælge en, 356 00:14:50,030 --> 00:14:54,550 et entydigt indeks er en, der er indekseret til superhurtig ydelse, 357 00:14:54,550 --> 00:14:56,100 men det er også gennemtvinger entydighed. 358 00:14:56,100 --> 00:14:58,850 Og vi vil komme tilbage til, hvad det to andre betyder på bare et øjeblik. 359 00:14:58,850 --> 00:15:00,930 I mellemtiden, hvis jeg går til min anden række, som 360 00:15:00,930 --> 00:15:06,230 er brugerens navn, skal jeg angive at navnet skal være unikt? 361 00:15:06,230 --> 00:15:09,550 Nej, fordi du kunne sikkert have-- der er ingen to David 362 00:15:09,550 --> 00:15:11,050 Malans i dette rum, mest sandsynligt. 363 00:15:11,050 --> 00:15:14,290 Men hvis vi vælger et andet navn, vi måske helt sikkert have kollisioner. 364 00:15:14,290 --> 00:15:16,130 >> Tænk tilbage på hash tabeller og lignende. 365 00:15:16,130 --> 00:15:18,604 Så vi bestemt ikke ønsker at gøre navnefeltet unikt. 366 00:15:18,604 --> 00:15:21,270 Så vi bare kommer til at forlade at som bindestreg, bindestreg, bindestreg, ingenting. 367 00:15:21,270 --> 00:15:22,660 Og jeg har tænkt mig at forlade alt andet alene. 368 00:15:22,660 --> 00:15:25,035 De fleste af disse områder vi vil ikke have at bekymre sig om. 369 00:15:25,035 --> 00:15:27,830 Og når jeg er klar til at gemme det, hvis internettet samarbejder, 370 00:15:27,830 --> 00:15:35,032 Jeg klikker på Gem, og meget, meget, meget langsomt gør databasen bliver gemt. 371 00:15:35,032 --> 00:15:37,240 Og nu er jeg tilbage til denne interface, som ganske vist 372 00:15:37,240 --> 00:15:38,680 er overvældende ved første øjekast. 373 00:15:38,680 --> 00:15:42,450 Men alt hvad jeg har tænkt mig at gøre, er at klikke på ordet Brugere på øverst til venstre. 374 00:15:42,450 --> 00:15:47,630 Jeg har tænkt mig at gå op her, skal du klikke Brugere, og som standard, det 375 00:15:47,630 --> 00:15:50,180 har udført nogle SQL, men mere om det i et øjeblik. 376 00:15:50,180 --> 00:15:52,654 Her er bare en oversigt over, hvad jeg gjorde. 377 00:15:52,654 --> 00:15:55,320 Og ikke at bekymre dig, at du ser Omtale af latin og svensk her. 378 00:15:55,320 --> 00:16:00,490 Det er bare standard indstillinger, fordi MySQL oprindeligt, 379 00:16:00,490 --> 00:16:04,000 eller PHP MyAdmin, en af ​​de to sket at være skrevet af nogle svenske folk. 380 00:16:04,000 --> 00:16:06,100 Men det er irrelevant i vores tilfælde her. 381 00:16:06,100 --> 00:16:08,280 >> Okay, så hvorfor er alt dette interessant? 382 00:16:08,280 --> 00:16:13,050 Det viser sig, kan jeg indsætte data i en database ved at skrive kode. 383 00:16:13,050 --> 00:16:15,940 Og jeg gå videre og i min fil her, er jeg 384 00:16:15,940 --> 00:16:19,000 kommer til at gå videre og lade som om dette er tilsluttet til denne database, som 385 00:16:19,000 --> 00:16:23,040 er det ikke i øjeblikket, men det vil være, når vi kommer til problemet sæt syv. 386 00:16:23,040 --> 00:16:25,640 Og jeg har tænkt mig at gå videre og udføre en funktion kaldet forespørgsel, 387 00:16:25,640 --> 00:16:28,730 som vi vil give dig i problemer sæt syv distribution kode, der 388 00:16:28,730 --> 00:16:31,490 tager mindst ét ​​argument, som er blot en streng. 389 00:16:31,490 --> 00:16:33,460 En streng af SQL-kode. 390 00:16:33,460 --> 00:16:36,700 Så du er ved at lære at skrive Structured Query Language. 391 00:16:36,700 --> 00:16:41,270 >> Hvis jeg ønsker at indsætte en ny række i min database, fordi nogen har indsendt 392 00:16:41,270 --> 00:16:47,600 en formular til min kode, ville jeg bogstaveligt talt skrive INSERT INTO brugere følgende 393 00:16:47,600 --> 00:16:52,800 felter: Brugernavn, komma, navn, værdierne, 394 00:16:52,800 --> 00:16:57,480 og nu har jeg brug for at indsætte noget som Malan, og tilbud, 395 00:16:57,480 --> 00:17:01,490 citat slut 'David Malan. « Og nu selv for dem bekendt med SQL, 396 00:17:01,490 --> 00:17:07,830 hvorfor bruger jeg enkelte anførselstegn Indersiden af ​​grønne streng? 397 00:17:07,830 --> 00:17:10,790 398 00:17:10,790 --> 00:17:13,040 Hvad kan være årsagen her? 399 00:17:13,040 --> 00:17:14,609 >> Bemærk jeg er sammenblanding to sprog. 400 00:17:14,609 --> 00:17:18,099 Query er en PHP funktion, men det tager et argument. 401 00:17:18,099 --> 00:17:21,740 Og dette argument har til sig selv være skrevet på et andet sprog kaldet 402 00:17:21,740 --> 00:17:23,500 SQL, Structured Query Language. 403 00:17:23,500 --> 00:17:27,940 Så alt, hvad jeg har netop fremhævet her 404 00:17:27,940 --> 00:17:30,380 er dette sprog kaldes SQL. 405 00:17:30,380 --> 00:17:36,290 Så, hvad er der med de enkelte anførselstegn, lige som en hurtig tilregnelighed check? 406 00:17:36,290 --> 00:17:37,324 Fortsæt. 407 00:17:37,324 --> 00:17:37,990 De er strenge. 408 00:17:37,990 --> 00:17:41,590 Så tilbud, citat slut Malan og tilbud, citat slut David Malan er strenge. 409 00:17:41,590 --> 00:17:45,210 Og lige tænker intuitivt nu, at vide, hvad du ved om C og PHP, 410 00:17:45,210 --> 00:17:50,220 hvorfor gjorde jeg ikke gøre det, som jeg normalt brugte dobbelte anførselstegn for strygere? 411 00:17:50,220 --> 00:17:52,310 Hvorfor har jeg ikke lyst til at gøre det? 412 00:17:52,310 --> 00:17:52,810 Ja? 413 00:17:52,810 --> 00:17:53,685 >> PUBLIKUM: [uhørligt] 414 00:17:53,685 --> 00:17:56,695 415 00:17:56,695 --> 00:17:57,570 DAVID MALAN: Præcis. 416 00:17:57,570 --> 00:17:59,653 Fordi jeg allerede bruger dobbelte anførselstegn på vej 417 00:17:59,653 --> 00:18:01,929 uden for argumentet til PHP-funktionen, 418 00:18:01,929 --> 00:18:03,470 Jeg vil bare forvirre tolk. 419 00:18:03,470 --> 00:18:04,860 Det vil ikke vide, behøver disse går sammen? 420 00:18:04,860 --> 00:18:05,735 Må disse går sammen? 421 00:18:05,735 --> 00:18:06,810 Må disse går sammen? 422 00:18:06,810 --> 00:18:08,070 Så jeg skifte i stedet. 423 00:18:08,070 --> 00:18:11,784 >> Eller jeg kunne gøre noget som dette, backslash tilbud eller backslash citat. 424 00:18:11,784 --> 00:18:14,200 Helt ærligt, der bare begynder at få meget ulæselig og grimme. 425 00:18:14,200 --> 00:18:16,790 Men det ville opnå samme resultat som godt. 426 00:18:16,790 --> 00:18:19,760 >> Så hvis jeg skulle udføre denne forespørgsel nu, lad os se hvad der sker. 427 00:18:19,760 --> 00:18:22,740 Jeg har tænkt mig at gå videre nu, og i stedet end udføre PHP-kode, som 428 00:18:22,740 --> 00:18:24,610 er hvor du vil spille i problemer sæt syv, 429 00:18:24,610 --> 00:18:27,200 Jeg har tænkt mig at i stedet gå til PHP MyAdmin. 430 00:18:27,200 --> 00:18:29,770 Og jeg manuelt gå at gå til fanen SQL, 431 00:18:29,770 --> 00:18:31,580 og lad mig zoome ind på grænsefladen. 432 00:18:31,580 --> 00:18:34,007 Og jeg har tænkt mig at indsætte de ting, jeg lige har skrevet. 433 00:18:34,007 --> 00:18:36,090 Og farvekodning har ændret en lille smule nu, 434 00:18:36,090 --> 00:18:38,750 bare fordi de programformater tingene lidt anderledes. 435 00:18:38,750 --> 00:18:41,960 Men se, at alt jeg har gjort er jeg har sagt, indsætte i Brugere. 436 00:18:41,960 --> 00:18:45,790 Jeg har angivet, så i et komma adskilt parentes liste de to 437 00:18:45,790 --> 00:18:48,850 felter som jeg ønsker at indsætte, og så har jeg bogstaveligt talt sagt værdier 438 00:18:48,850 --> 00:18:51,510 efterfulgt af en anden paren, og derefter de to værdier 439 00:18:51,510 --> 00:18:53,520 Jeg ønsker at plug-in, og nu for god foranstaltning, 440 00:18:53,520 --> 00:18:55,010 Jeg vil sætte et semikolon i slutningen. 441 00:18:55,010 --> 00:18:56,570 Så er det ikke C. Dette er ikke PHP. 442 00:18:56,570 --> 00:18:59,970 Dette er nu SQL, og jeg indsætte det ind i denne web-baseret interface, der er 443 00:18:59,970 --> 00:19:02,710 bare at lade mig, så snart jeg klikker OK, 444 00:19:02,710 --> 00:19:08,060 udføre denne forespørgsel på databasen kører inde i CS50 IDE. 445 00:19:08,060 --> 00:19:09,470 >> Så dette er godt. 446 00:19:09,470 --> 00:19:12,520 Bemærk, at den ene række indsat, gik super hurtig, 447 00:19:12,520 --> 00:19:15,190 0,0054 sekunder for at indsætte disse data. 448 00:19:15,190 --> 00:19:16,610 Så det lyder temmelig sundt. 449 00:19:16,610 --> 00:19:19,350 Det omformateret min forespørgsel for mig her blot for at se det 450 00:19:19,350 --> 00:19:21,730 i form af farvekodede version. 451 00:19:21,730 --> 00:19:24,540 Men nu, hvis jeg klikker Gennemse, bemærke, at selv 452 00:19:24,540 --> 00:19:29,070 selvom der er en masse rod på skærmen, min tabel har nu to rækker. 453 00:19:29,070 --> 00:19:30,700 >> Så lad mig gå videre og gøre en anden. 454 00:19:30,700 --> 00:19:33,760 I stedet for dette, så lad mig gå til fanen SQL igen. 455 00:19:33,760 --> 00:19:40,723 Og denne gang vil jeg indsætte noget lignende Rob og hans navn vil være røve Bowden. 456 00:19:40,723 --> 00:19:42,330 Bowden. 457 00:19:42,330 --> 00:19:44,040 Lad os klikke på Gem. 458 00:19:44,040 --> 00:19:46,140 Ups, snarere Go. 459 00:19:46,140 --> 00:19:48,890 >> Klik på Gennemse igen, og nu mærke til jeg har to rækker. 460 00:19:48,890 --> 00:19:52,390 Så dette er blot en måde mere kompleks måde at åbne Google Regneark 461 00:19:52,390 --> 00:19:54,010 og bare skrive en række i en kolonne. 462 00:19:54,010 --> 00:19:57,070 Men hvad er centrale er, at vi nu har syntaksen 463 00:19:57,070 --> 00:20:00,220 med til at skrive kode, så i sidste ende, kunne vi faktisk 464 00:20:00,220 --> 00:20:01,790 gøre nogle og dette. 465 00:20:01,790 --> 00:20:05,380 Husk på, at PHP understøtter Super globale variabler. 466 00:20:05,380 --> 00:20:08,415 >> Hvad er inde i dollar logge understregning GET i PHP? 467 00:20:08,415 --> 00:20:10,290 Vi tog et kig på en eller to enkle eksempler. 468 00:20:10,290 --> 00:20:15,640 Og i PSet6, husker du har hej dot PHP som bruger denne variabel. 469 00:20:15,640 --> 00:20:17,870 Hvad sker der? 470 00:20:17,870 --> 00:20:21,015 Eller hvad er det? 471 00:20:21,015 --> 00:20:22,522 Lidt højere. 472 00:20:22,522 --> 00:20:23,790 >> PUBLIKUM: [uhørligt] 473 00:20:23,790 --> 00:20:25,030 >> DAVID MALAN: Det er en sne frø af array, som 474 00:20:25,030 --> 00:20:27,714 er bare en fancy måde at sige en array, der har vigtige værdipar. 475 00:20:27,714 --> 00:20:28,880 Og tasterne er ikke numerisk. 476 00:20:28,880 --> 00:20:30,420 De er ord eller strenge. 477 00:20:30,420 --> 00:20:32,750 Og konkret, hvilke er de centrale værdipar? 478 00:20:32,750 --> 00:20:35,110 Hvor kommer de fra? 479 00:20:35,110 --> 00:20:35,620 Undskyld? 480 00:20:35,620 --> 00:20:36,994 >> PUBLIKUM: [uhørligt] 481 00:20:36,994 --> 00:20:37,660 DAVID MALAN: Nej? 482 00:20:37,660 --> 00:20:40,700 Hvor gør dem nøglen værdi par fra? 483 00:20:40,700 --> 00:20:42,490 Sig igen? 484 00:20:42,490 --> 00:20:44,610 Igen? 485 00:20:44,610 --> 00:20:46,472 Er jeg den eneste, hørelse noget? 486 00:20:46,472 --> 00:20:47,810 >> [Latter] 487 00:20:47,810 --> 00:20:49,042 >> Det er rigtigt, ja? 488 00:20:49,042 --> 00:20:50,435 >> PUBLIKUM: [uhørligt] 489 00:20:50,435 --> 00:20:52,560 DAVID MALAN: Ja, de kommer fra forespørgselsstrengen. 490 00:20:52,560 --> 00:20:55,380 Så hvis du spole tilbage i tide til at når vi har spillet med Google 491 00:20:55,380 --> 00:20:59,600 og vi har gået til Google.com skråstreg søgning spørgsmålstegn q lig katte, 492 00:20:59,600 --> 00:21:03,550 hvis jeg skulle trykke Enter, og hvis Google blev gennemført i PHP, 493 00:21:03,550 --> 00:21:07,017 PHP-kode, som Google skrev ville have adgang til dollartegn 494 00:21:07,017 --> 00:21:11,600 understrege GET inde hvoraf er en vigtig kaldes Q og en værdi 495 00:21:11,600 --> 00:21:17,680 kaldet katte, at det derefter kan bruge bruges til at gøre et virkeligt søgning med. 496 00:21:17,680 --> 00:21:20,860 >> Så i virkeligheden, hvad jeg har tænkt mig at gøre nu, er at gå tilbage til min PHP kode 497 00:21:20,860 --> 00:21:23,140 at du igen vil se mere af i PSet7. 498 00:21:23,140 --> 00:21:25,440 Og i stedet for at tilslutte i hårde kodede værdier, som 499 00:21:25,440 --> 00:21:27,630 synes ikke som en meget dynamisk hjemmeside, 500 00:21:27,630 --> 00:21:30,680 Jeg har tænkt mig at give dig en teaser af hvad din faktiske kode ville gøre. 501 00:21:30,680 --> 00:21:32,854 Du ville sætte i to spørgsmål markerer som denne. 502 00:21:32,854 --> 00:21:34,270 Jeg ved ikke, hvad brugernavnet er. 503 00:21:34,270 --> 00:21:37,390 Jeg ved ikke, hvad det navn vil være, 504 00:21:37,390 --> 00:21:39,470 men jeg ved, jeg kan få dem dynamisk. 505 00:21:39,470 --> 00:21:43,420 >> Så hvis koden vi skriver nu, er koden kører på Googles servere, 506 00:21:43,420 --> 00:21:46,940 eller hvis dette er hej dot PHP, som kommer med PSet6, 507 00:21:46,940 --> 00:21:48,650 Jeg har tænkt mig at passere ind forespørgslen funktion 508 00:21:48,650 --> 00:21:51,450 ligesom printf, to andre argumenter. 509 00:21:51,450 --> 00:21:57,120 GET, tilbud, citat slut brugernavn, og GET, tilbud, citat slut navn. 510 00:21:57,120 --> 00:22:00,720 Og nu, mærke til, hvad det generelle struktur er her. 511 00:22:00,720 --> 00:22:03,320 Jeg har fået til venstre side af opkaldet, 512 00:22:03,320 --> 00:22:05,480 denne funktion kaldes forespørgsel i PHP. 513 00:22:05,480 --> 00:22:08,160 Jeg har stadig som et første argument, bare en tekststreng. 514 00:22:08,160 --> 00:22:11,000 >> Men at tekststreng er skrevet i et sprog, der kaldes SQL. 515 00:22:11,000 --> 00:22:12,616 Og helt ærligt, det er ikke et stort sprog. 516 00:22:12,616 --> 00:22:14,990 Vi kun vil tale om det formelt i dag, virkelig. 517 00:22:14,990 --> 00:22:17,031 Og derefter i problemer sæt syv, der er relativt 518 00:22:17,031 --> 00:22:18,800 par funktioner, som vi er kommer til at udnytte. 519 00:22:18,800 --> 00:22:22,530 Spørgsmålstegnene, dog mener tilslutte en værdi her og stik i en anden værdi 520 00:22:22,530 --> 00:22:23,130 her. 521 00:22:23,130 --> 00:22:26,010 Og varsel, jeg har udeladt, hvad fra hele quote-- pokkers 522 00:22:26,010 --> 00:22:30,470 det-- omkring citatet markerer denne gang. 523 00:22:30,470 --> 00:22:34,930 Jeg har udeladt citatet mærker omkring spørgsmålstegnet, 524 00:22:34,930 --> 00:22:36,410 Beklager, denne gang omkring. 525 00:22:36,410 --> 00:22:38,870 >> Så, hvad er nice om dette spørgsmålstegn funktion, som 526 00:22:38,870 --> 00:22:42,830 PHP har en tendens til at støtte, Ruby og Python og andre sprog, 527 00:22:42,830 --> 00:22:45,730 dette betyder bare plug i nogle værdi her og ved du hvad? 528 00:22:45,730 --> 00:22:48,300 Du regne ud, om at bruge enkelte anførselstegn eller dobbelte anførselstegn. 529 00:22:48,300 --> 00:22:50,966 Må ikke genere mig med dem, intellektuelt uinteressant detaljer. 530 00:22:50,966 --> 00:22:53,780 Men, sørg for at det er korrekt så min kode er i sidste instans 531 00:22:53,780 --> 00:22:57,010 operationel og sikker, som vil have en betydning inden længe. 532 00:22:57,010 --> 00:23:00,460 >> Nu, hvordan mange argumenter i alt, bare for at være klar, er forespørgslen funktionen tage? 533 00:23:00,460 --> 00:23:05,240 534 00:23:05,240 --> 00:23:07,581 Nogen ønsker at stemme for mere end to? 535 00:23:07,581 --> 00:23:08,080 Tre? 536 00:23:08,080 --> 00:23:10,001 Sure, hvorfor? 537 00:23:10,001 --> 00:23:10,920 Hvorfor tre? 538 00:23:10,920 --> 00:23:12,305 >> PUBLIKUM: [uhørligt] 539 00:23:12,305 --> 00:23:13,180 DAVID MALAN: Præcis. 540 00:23:13,180 --> 00:23:14,610 Den første del er den streng. 541 00:23:14,610 --> 00:23:18,640 Det andet argument er dollartegn understrege GET beslag brugernavn. 542 00:23:18,640 --> 00:23:21,950 Og det tredje argument er den samme ting, men bare navnet. 543 00:23:21,950 --> 00:23:24,590 Så med andre ord, nu hvis jeg havde en webformular 544 00:23:24,590 --> 00:23:27,149 der skulle tekstfelter, en for brugerens brugernavn, 545 00:23:27,149 --> 00:23:29,690 en for hans eller hendes navn, bare ligesom du ville se i en hjemmeside 546 00:23:29,690 --> 00:23:32,120 når du tilmelder dig nogle hjemmeside, denne magt 547 00:23:32,120 --> 00:23:35,450 være koden på bagenden, der faktisk gør indsættelsen nu 548 00:23:35,450 --> 00:23:37,220 i databasen. 549 00:23:37,220 --> 00:23:40,870 >> Nu derimod lad os hurtigt frem. 550 00:23:40,870 --> 00:23:43,840 Antag at en bruger er nu logge ind og du vil 551 00:23:43,840 --> 00:23:48,860 at skrive PHP kode, der kontrollerer, om den person, der er bare logget ind 552 00:23:48,860 --> 00:23:52,250 er faktisk en bruger, kan du bruge temmelig simpel syntaks. 553 00:23:52,250 --> 00:23:55,832 Du kan sige SELECT, lad os sige stjerne, hvor stjerne betyder alt. 554 00:23:55,832 --> 00:23:57,540 Jeg ved ikke, hvad jeg ønsker, så bare giv mig 555 00:23:57,540 --> 00:24:01,585 alle kolonner fra tabellen kaldet brugerne, hvor, og det er rart. 556 00:24:01,585 --> 00:24:03,710 Vælg understøtter, hvad der er kaldes et prædikat, som er 557 00:24:03,710 --> 00:24:06,630 som en måde at kvalificere, hvad du ønsker. 558 00:24:06,630 --> 00:24:10,590 Hvor brugernavn er lig tilbud, citat slut Malan. 559 00:24:10,590 --> 00:24:13,680 Så også her jeg har indlejret inde argumentet 560 00:24:13,680 --> 00:24:16,110 til en PHP-funktion, en linje af SQL-kode. 561 00:24:16,110 --> 00:24:18,680 Og at SQL-kode dette tid bogstaveligt talt går 562 00:24:18,680 --> 00:24:21,790 at søge efter tilbud, citat slut Malan. 563 00:24:21,790 --> 00:24:24,420 >> Nu det er ikke alt, nyttige, så jeg har tænkt mig at springe, at 564 00:24:24,420 --> 00:24:28,650 og jeg har tænkt mig at lægge væk dette tip fra Brady, og gå 565 00:24:28,650 --> 00:24:30,990 og plug-in i stedet et spørgsmålstegn her. 566 00:24:30,990 --> 00:24:33,290 Så bare for at være klar, hvad skal min andet argument 567 00:24:33,290 --> 00:24:37,480 være, hvis nogen har netop logget ind, og jeg vil kontrollere, om han eller hun er faktisk 568 00:24:37,480 --> 00:24:39,265 en bruger? 569 00:24:39,265 --> 00:24:40,140 PUBLIKUM: [uhørligt] 570 00:24:40,140 --> 00:24:40,890 DAVID MALAN: Ja. 571 00:24:40,890 --> 00:24:44,120 Jeg hører dollartegn understregning GET tilbud, citat slut brugernavn. 572 00:24:44,120 --> 00:24:50,040 Og det bør vende tilbage til mig nogen af ​​rækkerne i min database 573 00:24:50,040 --> 00:24:51,986 der har et brugernavn på Malan. 574 00:24:51,986 --> 00:24:54,860 Nu forhåbentlig vil jeg komme tilbage nul, hvis Malan har aldrig været her, 575 00:24:54,860 --> 00:24:56,290 eller en, hvis han har. 576 00:24:56,290 --> 00:24:59,026 Jeg burde ikke komme tilbage to eller tre eller fire. 577 00:24:59,026 --> 00:24:59,526 Hvorfor? 578 00:24:59,526 --> 00:25:00,220 >> PUBLIKUM: [uhørligt] 579 00:25:00,220 --> 00:25:01,120 >> DAVID MALAN: Jeg sagde unik, ikke? 580 00:25:01,120 --> 00:25:01,750 Simpel grund. 581 00:25:01,750 --> 00:25:04,030 Fordi jeg sagde, at det er nødt til at være unikke, lige logisk, 582 00:25:04,030 --> 00:25:07,940 du kan kun have nul eller én Malans i dette særlige database tabel. 583 00:25:07,940 --> 00:25:10,965 Nu som en sidebemærkning, bare så du har set det, selvom jeg fortsætte med at bruge GET 584 00:25:10,965 --> 00:25:14,350 og selvom PSet6 kun anvendes GET, kan du helt sikkert have POST. 585 00:25:14,350 --> 00:25:17,212 Og huske, at Post er en anden teknik til at indsende oplysninger 586 00:25:17,212 --> 00:25:19,170 fra en formular, men det ikke vises i webadressen. 587 00:25:19,170 --> 00:25:22,690 Det er lidt mere sikker i hvert fald for ting som brugernavne og passwords, 588 00:25:22,690 --> 00:25:25,210 som PSet7 vil faktisk medføre. 589 00:25:25,210 --> 00:25:28,130 >> Så lad os gøre det i PHP MyAdmin og se hvad der sker. 590 00:25:28,130 --> 00:25:30,020 Jeg har tænkt mig at gå til fanen MySQL. 591 00:25:30,020 --> 00:25:34,450 Og bemærk, at standardværdien for PHP MyAdmin, bare for at forsøge at være hjælpsom, 592 00:25:34,450 --> 00:25:37,050 er at vælge stjerne fra brugerne hvor én. 593 00:25:37,050 --> 00:25:39,430 Tja, den ene er altid sandt, så dette har den tåbelige effektive 594 00:25:39,430 --> 00:25:40,400 af bare vælge alt. 595 00:25:40,400 --> 00:25:42,691 Men jeg har tænkt mig at være lidt mere pedantisk og manuelt 596 00:25:42,691 --> 00:25:45,920 skrive ud SELECT stjerne fra brugerne. 597 00:25:45,920 --> 00:25:48,294 >> Nu teknisk, kan du citere navnet på bordene. 598 00:25:48,294 --> 00:25:50,460 Det er sjældent, at du er nødt til, men bemærke disse er ikke 599 00:25:50,460 --> 00:25:52,240 din normale citater på amerikansk tastatur. 600 00:25:52,240 --> 00:25:54,760 Dette er den såkaldte backtick, som er generelt i øverste venstre 601 00:25:54,760 --> 00:25:56,000 hjørne af tastaturet. 602 00:25:56,000 --> 00:25:58,500 Men det er sjældent, at du vil faktisk nødt til at gider med det, 603 00:25:58,500 --> 00:25:59,950 så jeg vil bare udelade dem alligevel. 604 00:25:59,950 --> 00:26:02,280 Så nu, lad mig gå videre og ramte gå. 605 00:26:02,280 --> 00:26:06,616 Og hvor mange rækker skal jeg få tilbage, når jeg vælger stjerne fra brugere? 606 00:26:06,616 --> 00:26:08,407 >> PUBLIKUM: [uhørligt] 607 00:26:08,407 --> 00:26:09,990 DAVID MALAN: Antallet af rækker, sikker. 608 00:26:09,990 --> 00:26:12,390 Men hvor mange i denne beton historie lige nu? 609 00:26:12,390 --> 00:26:14,640 To, fordi der var mig og der var Rob. 610 00:26:14,640 --> 00:26:19,370 Så hvis jeg klikker Go, ser jeg visuelt at Jeg har fået tilbage, ja, to rækker. 611 00:26:19,370 --> 00:26:22,060 Der er en masse rod på skærmen, men jeg ser kun to rækker. 612 00:26:22,060 --> 00:26:28,580 Derimod hvis jeg gør det igen og gøre SELECT stjerne fra brugere, hvor brugernavn 613 00:26:28,580 --> 00:26:31,840 lig tilbud, citat slut Malan, nu, hvis jeg klikker OK, 614 00:26:31,840 --> 00:26:33,970 Jeg vil kun komme tilbage en række. 615 00:26:33,970 --> 00:26:36,499 Og endelig, hvis jeg gør noget som dette, formoder 616 00:26:36,499 --> 00:26:38,290 at jeg er ligeglad få alt, 617 00:26:38,290 --> 00:26:41,020 som er form for meningsløs nu, fordi der er kun to kolonner. 618 00:26:41,020 --> 00:26:43,103 Det er ikke ligesom jeg vælge en enorm mængde data. 619 00:26:43,103 --> 00:26:46,720 Antag jeg gå videre og vælger navn fra 620 00:26:46,720 --> 00:26:51,990 brugere, hvor brugernavn lig Malan, hvad der er rart om SQL ærligt, 621 00:26:51,990 --> 00:26:54,290 er, at det virkelig bare gør hvad du fortæller det at gøre. 622 00:26:54,290 --> 00:26:57,550 Det er temmelig kortfattet, men du bogstaveligt talt bare fortælle det, hvad du vil gøre. 623 00:26:57,550 --> 00:27:01,130 Vælg navn fra brugerne, hvor brugernavnet lig Malan. 624 00:27:01,130 --> 00:27:03,440 Og det er virkelig, at eksplicit. 625 00:27:03,440 --> 00:27:08,410 Så nu, hvis jeg ramte Go, hvor mange rækker er jeg kommer til at få tilbage? 626 00:27:08,410 --> 00:27:10,770 En, fordi det er bare Malan, forhåbentlig. 627 00:27:10,770 --> 00:27:13,100 Eller nul, hvis han ikke er der, men en maksimalt. 628 00:27:13,100 --> 00:27:17,610 >> Og hvor mange kolonner får jeg tilbage? 629 00:27:17,610 --> 00:27:18,450 Hvor mange kolonner? 630 00:27:18,450 --> 00:27:20,658 Denne gang, jeg bare at få en, fordi jeg ikke 631 00:27:20,658 --> 00:27:22,380 Vælg stjerne, hvilket er alt. 632 00:27:22,380 --> 00:27:27,900 Nu er jeg vælge bare navn, så jeg bare komme tilbage en kolonne og en række. 633 00:27:27,900 --> 00:27:31,730 Og det ser slags passende latterligt, bare at kigge super 634 00:27:31,730 --> 00:27:33,060 lille som denne. 635 00:27:33,060 --> 00:27:34,290 Så, hvad der virkelig sker? 636 00:27:34,290 --> 00:27:36,890 Når du udfører en SQL forespørgsel ved hjælp vælge, 637 00:27:36,890 --> 00:27:38,700 hvad du får tilbage fra databasen 638 00:27:38,700 --> 00:27:42,970 er som en midlertidig tabel med rækker og kolonner, måske, 639 00:27:42,970 --> 00:27:46,260 men at udelade noget, var faktisk ikke valgt af dig. 640 00:27:46,260 --> 00:27:49,010 Så det er ligesom, hvis nogen havde en stor regneark med alle de studerende 641 00:27:49,010 --> 00:27:51,610 registreret for nogle studerende gruppe, og du siger, 642 00:27:51,610 --> 00:27:55,097 give mig alle de freshman, der har registreret for vores studerende gruppe, hvad 643 00:27:55,097 --> 00:27:56,930 din kollega i studerende gruppe kan gøre 644 00:27:56,930 --> 00:27:58,430 er de kunne bare hånd dig hele regnearket. 645 00:27:58,430 --> 00:27:59,742 Det er ligesom at sige vælge stjerne. 646 00:27:59,742 --> 00:28:02,200 Og det er lidt irriterende, hvis du kun ønskede freshman. 647 00:28:02,200 --> 00:28:05,640 Og så, hvis du i stedet sagde, Vælg stjerne fra database tabel 648 00:28:05,640 --> 00:28:08,470 hvor året er lig med tilbud, citat slut freshman, 649 00:28:08,470 --> 00:28:10,810 det er som om din ven i elevgruppen 650 00:28:10,810 --> 00:28:13,770 bogstaveligt fremhævet og kopieres kun de freshman rækker, 651 00:28:13,770 --> 00:28:16,780 indsat dem i en ny Google Regneark eller en Excel-fil, 652 00:28:16,780 --> 00:28:18,860 og rakte dig tilbage kun resulterende fil. 653 00:28:18,860 --> 00:28:21,710 Det er alt, der foregår på begrebsmæssigt her. 654 00:28:21,710 --> 00:28:23,920 >> Så i sidste ende, kan vi gøre nogle ret fancy ting 655 00:28:23,920 --> 00:28:26,560 ved at lagre ting som brugernavne og passwords og lignende. 656 00:28:26,560 --> 00:28:30,310 Men, det viser sig, skal vi gøre lidt anderledes end dette. 657 00:28:30,310 --> 00:28:34,750 Det er ikke så smart at kun gemme et brugernavn og en adgangskode. 658 00:28:34,750 --> 00:28:37,790 Nogen tidligere, tror jeg hernede, foreslog et ID. 659 00:28:37,790 --> 00:28:40,787 Nu et ID kunne være som en Harvard-id eller Yales Net-ID, 660 00:28:40,787 --> 00:28:42,870 men det kunne være endnu enklere i vores database sagen. 661 00:28:42,870 --> 00:28:45,120 Og ja, den fælles sag er at have en anden kolonne. 662 00:28:45,120 --> 00:28:46,953 Og jeg har tænkt mig at gå videre og redigere mit bord. 663 00:28:46,953 --> 00:28:49,521 Og hvis du spiller rundt med dette interface til PSet7, 664 00:28:49,521 --> 00:28:51,770 vil du se, at du kan kontrollere denne knap her og tilføje 665 00:28:51,770 --> 00:28:53,750 et felt i begyndelsen af ​​tabellen. 666 00:28:53,750 --> 00:28:56,720 Og nu, hvis jeg klikker OK, går det at give mig en af ​​disse former 667 00:28:56,720 --> 00:28:57,600 fra tidligere. 668 00:28:57,600 --> 00:29:00,170 Jeg har tænkt mig at tilføje et felt kaldet id. 669 00:29:00,170 --> 00:29:03,070 Og jeg har tænkt mig at gøre det til en numerisk type. 670 00:29:03,070 --> 00:29:05,362 >> Jeg har en hel masse af værdier for talværdier. 671 00:29:05,362 --> 00:29:08,677 Jeg bare at vælge en INT og ikke bekymre dig om de forskellige størrelser. 672 00:29:08,677 --> 00:29:10,510 Jeg behøver ikke at angive en længde eller en værdi, 673 00:29:10,510 --> 00:29:13,710 fordi det vil være 32 bit, uanset hvad. 674 00:29:13,710 --> 00:29:16,070 Attributter, ser vi ikke før. 675 00:29:16,070 --> 00:29:18,410 Nogen interesse i nogen af ​​disse menuindstillinger denne gang? 676 00:29:18,410 --> 00:29:21,890 677 00:29:21,890 --> 00:29:23,745 For en INT? 678 00:29:23,745 --> 00:29:24,620 Hvad har du foreslå? 679 00:29:24,620 --> 00:29:27,350 680 00:29:27,350 --> 00:29:28,445 Nej? 681 00:29:28,445 --> 00:29:29,570 Gør nogen af ​​disse giver mening? 682 00:29:29,570 --> 00:29:30,536 Ja. 683 00:29:30,536 --> 00:29:31,900 Ja, usigneret, ikke? 684 00:29:31,900 --> 00:29:35,930 >> Generelt, hvis vi kommer til at give alle et unikt nummer, som 685 00:29:35,930 --> 00:29:38,200 er, hvor denne historie er gå, jeg virkelig kun ønsker 686 00:29:38,200 --> 00:29:41,919 en person at have nummeret som nul og en og to og tre og fire. 687 00:29:41,919 --> 00:29:43,710 Jeg behøver ikke at beskæftige sig med negative tal. 688 00:29:43,710 --> 00:29:45,210 Det bare ser ud som unødig kompleksitet. 689 00:29:45,210 --> 00:29:48,470 Jeg vil have fire milliarder mulige værdier, ikke fire milliarder mulige værdier, 690 00:29:48,470 --> 00:29:50,699 så jeg bare fordoblet kapacitet min INT. 691 00:29:50,699 --> 00:29:53,490 Som en sidebemærkning, hvis du ønsker at forholde dette til noget som Facebook, 692 00:29:53,490 --> 00:29:56,190 igen slags min dag, når Facebook først kom ud, 693 00:29:56,190 --> 00:29:59,510 Jeg tror, ​​hvad de var ved hjælp af i deres MySQL-database 694 00:29:59,510 --> 00:30:02,856 at opbevare en brugers identifikator, var bare en INT. 695 00:30:02,856 --> 00:30:05,230 Men selvfølgelig, der er en masse af virkelige mennesker i verden. 696 00:30:05,230 --> 00:30:07,438 Der er en masse falske Facebook konti i verden. 697 00:30:07,438 --> 00:30:11,701 Og så til sidst, overløb Facebook størrelsen af ​​en INT, en fire mia 698 00:30:11,701 --> 00:30:12,200 værdi. 699 00:30:12,200 --> 00:30:15,032 Hvilket er grunden til, hvis man ser rundt og der er hjemmesider 700 00:30:15,032 --> 00:30:16,740 der kan fortælle dig, hvad dit unikke id er. 701 00:30:16,740 --> 00:30:19,781 Og hvis du aldrig har valgt et brugernavn i Facebook, vil du se dit unikke id. 702 00:30:19,781 --> 00:30:23,080 Jeg synes det er profil dot PHP spørgsmålstegn id lig noget. 703 00:30:23,080 --> 00:30:27,210 Det er nu noget ligesom en stor INT, eller en lang længe, ​​hvis du vil, 704 00:30:27,210 --> 00:30:29,700 som er en 64-bit værdi eller noget tilsvarende. 705 00:30:29,700 --> 00:30:33,620 >> Så selv i den virkelige verden at gøre disse spørgsmål i sidste ende nogle gange noget. 706 00:30:33,620 --> 00:30:37,600 Og det viser sig her, hvis jeg give alle mine brugere et unikt id, 707 00:30:37,600 --> 00:30:41,750 Jeg ønsker at være super eksplicitte og minimalt gør dette område unikt. 708 00:30:41,750 --> 00:30:44,750 Men det viser sig der er en stykke nomenklatur i dag også 709 00:30:44,750 --> 00:30:46,470 det er en primær nøgle. 710 00:30:46,470 --> 00:30:49,800 Hvis du designer en database tabel, og du på forhånd 711 00:30:49,800 --> 00:30:55,580 at en af ​​kolonnerne i tabellen bør og vil entydigt at identificere rækker 712 00:30:55,580 --> 00:30:58,500 i tabellen, du ønsker at specificere det og fortælle databasen, 713 00:30:58,500 --> 00:31:00,250 dette er min primære nøgle. 714 00:31:00,250 --> 00:31:02,110 Der kan være dubletter på andre områder, 715 00:31:02,110 --> 00:31:06,330 men jeg fortæller den database, dette er min primære, min mest vigtige område, 716 00:31:06,330 --> 00:31:08,420 der er garanteret til at være unik. 717 00:31:08,420 --> 00:31:09,660 >> Nu, dette synes overflødig. 718 00:31:09,660 --> 00:31:13,830 Jeg foreslår nu, at vi tilføje, ved at klikke på Gem her, 719 00:31:13,830 --> 00:31:17,210 et felt called-- og jeg har tænkt mig at gå videre og klik på AI, 720 00:31:17,210 --> 00:31:19,720 vi vil vende tilbage til at der i et øjeblik, Gem. 721 00:31:19,720 --> 00:31:22,540 Jeg foreslår nu, at mit bord se sådan ud. 722 00:31:22,540 --> 00:31:26,305 Jeg har en INT felt kaldet id, en CHAR felt kaldet Brugernavn, 723 00:31:26,305 --> 00:31:31,100 en VARCHAR felt kaldet Navn, men id, hvis det er primær og derfor unik, 724 00:31:31,100 --> 00:31:33,760 hvorfor jeg bare spilder tid at indføre, hvad 725 00:31:33,760 --> 00:31:39,140 effektivt er et andet unikt felt, der kaldes id, der er en INT? 726 00:31:39,140 --> 00:31:41,980 >> Brugernavn, tilbagekaldelse, var allerede enestående, sagde vi. 727 00:31:41,980 --> 00:31:45,350 Så bare logisk, behøver du ikke enhver database erfaring til grund 728 00:31:45,350 --> 00:31:47,570 gennem denne, hvorfor kunne jeg har indført 729 00:31:47,570 --> 00:31:50,065 en INT som min entydig identifikator så godt? 730 00:31:50,065 --> 00:31:52,740 731 00:31:52,740 --> 00:31:53,930 Hvad denne-- siger igen? 732 00:31:53,930 --> 00:31:55,580 >> PUBLIKUM: [uhørligt] 733 00:31:55,580 --> 00:31:59,534 >> DAVID MALAN: Tilfældig adgang er nemmere, hvorfor? 734 00:31:59,534 --> 00:32:00,410 >> PUBLIKUM: [uhørligt] 735 00:32:00,410 --> 00:32:02,367 DAVID MALAN: Ja, det er lige adgang numre. 736 00:32:02,367 --> 00:32:04,750 Så hvis du tænker på denne virkelig er en tabel, som et array, 737 00:32:04,750 --> 00:32:07,690 nu har jeg entydige identifikatorer at jeg kan hoppe rundt. 738 00:32:07,690 --> 00:32:11,520 Og bedre end der stadig er, at hvor stor er en INT kommer til at være igen? 739 00:32:11,520 --> 00:32:14,450 740 00:32:14,450 --> 00:32:15,800 32 bit eller fire bytes. 741 00:32:15,800 --> 00:32:17,750 >> Hvor stor er mit brugernavn kommer til at være? 742 00:32:17,750 --> 00:32:20,310 743 00:32:20,310 --> 00:32:21,990 Maksimalt? 744 00:32:21,990 --> 00:32:22,880 16 bytes. 745 00:32:22,880 --> 00:32:26,080 >> Så hvis du virkelig pleje om udførelsen af ​​din kode, 746 00:32:26,080 --> 00:32:31,390 tænker tilbage på PSet5, ville du foretrække at søge efter en fire byte værdi eller en 16 747 00:32:31,390 --> 00:32:32,240 byte værdi, right? 748 00:32:32,240 --> 00:32:33,810 Det er virkelig så simpelt er det. 749 00:32:33,810 --> 00:32:38,060 Du er nødt til at gøre fire gange så meget arbejde at søge efter brugernavne, fordi disse 750 00:32:38,060 --> 00:32:38,830 er 16 bytes. 751 00:32:38,830 --> 00:32:41,320 Så er du nødt til bogstaveligt talt sammenligne alle 16 bytes at være 752 00:32:41,320 --> 00:32:43,140 sikker ja, det er brugernavn, jeg ønsker. 753 00:32:43,140 --> 00:32:46,610 Mens det for en INT, kan du gøre det med blot fire bytes. 754 00:32:46,610 --> 00:32:49,212 >> Og som en sidebemærkning for dem interesseret i computer hardware, 755 00:32:49,212 --> 00:32:52,420 det viser sig, du kan passe noget lignende en INT eller en 32-bit værdi i noget 756 00:32:52,420 --> 00:32:55,330 kaldes et register i en computer CPU, hvilket betyder, at det er super, 757 00:32:55,330 --> 00:32:58,400 super hurtig, selv ved den laveste niveau af computerens hardware. 758 00:32:58,400 --> 00:33:00,530 Så der er bare fordele hele vejen rundt. 759 00:33:00,530 --> 00:33:01,530 Så hvad betyder det? 760 00:33:01,530 --> 00:33:04,850 I virkeligheden, når du designer en database tabel, næsten hele tiden 761 00:33:04,850 --> 00:33:07,170 er du nødt til ikke kun de data, du holder af, 762 00:33:07,170 --> 00:33:09,280 men også noget en entydig identifikator 763 00:33:09,280 --> 00:33:11,280 fordi dette vil Lad os gøre andre ting. 764 00:33:11,280 --> 00:33:13,160 Og lad os falde over et problem her. 765 00:33:13,160 --> 00:33:15,990 >> Antag, at brugerne ikke har bare brugernavne og navne, 766 00:33:15,990 --> 00:33:19,540 men de har også ting som byer og stater og postnumre, i det mindste 767 00:33:19,540 --> 00:33:20,432 her i USA. 768 00:33:20,432 --> 00:33:22,390 Så jeg har tænkt mig at gå videre og lige hurtigt sige, 769 00:33:22,390 --> 00:33:26,180 give mig flere tre kolonner ved slutningen af ​​tabellen. 770 00:33:26,180 --> 00:33:28,900 Og det bliver City, dette vil være staten, 771 00:33:28,900 --> 00:33:30,400 og dette vil være Zip. 772 00:33:30,400 --> 00:33:32,710 >> Nu City, hvad datatyper bør dette være, måske? 773 00:33:32,710 --> 00:33:35,460 774 00:33:35,460 --> 00:33:35,989 VARCHAR? 775 00:33:35,989 --> 00:33:37,780 Jeg ved ikke, hvad det længste bynavnet er. 776 00:33:37,780 --> 00:33:40,571 Et eller andet sted i Amerika, er der sandsynligvis nogle latterligt langt ord, 777 00:33:40,571 --> 00:33:43,605 så lad os bare gå med 255, noget historisk eller vilkårligt. 778 00:33:43,605 --> 00:33:44,730 Stat, hvad du vil gøre? 779 00:33:44,730 --> 00:33:48,380 780 00:33:48,380 --> 00:33:50,367 Dom opkald, ikke? 781 00:33:50,367 --> 00:33:51,700 Hvad er måske den mest effektive? 782 00:33:51,700 --> 00:33:53,500 Hvor mange tegn? 783 00:33:53,500 --> 00:33:55,950 Måske bare to, hvis vi kan slippe af sted med at gøre netop, 784 00:33:55,950 --> 00:33:58,250 lignende, MA for Massachusetts og så videre. 785 00:33:58,250 --> 00:34:00,520 Så jeg har tænkt mig at gå en CHAR værdi på to. 786 00:34:00,520 --> 00:34:03,080 >> Postnummer er interessant. 787 00:34:03,080 --> 00:34:06,679 Vi er her i 02138, så foreslår vi skal bruge hvad? 788 00:34:06,679 --> 00:34:07,470 Det er en INT, ikke? 789 00:34:07,470 --> 00:34:10,030 790 00:34:10,030 --> 00:34:12,800 INT, INT, kort? 791 00:34:12,800 --> 00:34:14,521 Korte ville arbejde. 792 00:34:14,521 --> 00:34:15,020 Nej? 793 00:34:15,020 --> 00:34:18,920 794 00:34:18,920 --> 00:34:20,870 CHAR eller fem, men jeg vil have en INT. 795 00:34:20,870 --> 00:34:23,710 Hvorfor skubbe tilbage på en INT? 796 00:34:23,710 --> 00:34:26,820 Overtale mig fra dette. 797 00:34:26,820 --> 00:34:29,210 Hvad er dumt om en INT, min idé? 798 00:34:29,210 --> 00:34:29,871 Ja. 799 00:34:29,871 --> 00:34:31,199 >> PUBLIKUM: Tag op mere hukommelse. 800 00:34:31,199 --> 00:34:32,909 >> DAVID MALAN: Tag op mere hukommelse. 801 00:34:32,909 --> 00:34:35,310 Fire bytes, men du er foreslå et postnummer 802 00:34:35,310 --> 00:34:39,000 som fem bytes eller nogen var som en CHAR, der føles som eh, det er ikke rigtig 803 00:34:39,000 --> 00:34:39,620 sagen. 804 00:34:39,620 --> 00:34:40,489 >> Nå, sjov historie. 805 00:34:40,489 --> 00:34:43,179 År siden, da jeg plejede at bruge Microsoft Outlook til min e-mail, 806 00:34:43,179 --> 00:34:45,150 Jeg til sidst ønskede at skifte til Gmail. 807 00:34:45,150 --> 00:34:48,949 Og så, jeg eksporterede alle mine kontaktpersoner fra Outlook som en CSV-fil. 808 00:34:48,949 --> 00:34:50,699 Komma adskilte værdier, som netop betød, at jeg 809 00:34:50,699 --> 00:34:54,060 havde alle mine venner navne og sidste navne og telefonnumre og postnumre 810 00:34:54,060 --> 00:34:54,747 og alt dette. 811 00:34:54,747 --> 00:34:56,580 Og så gjorde jeg det fejltagelse at åbne det op 812 00:34:56,580 --> 00:34:58,640 i Excel, hvilket er en regnearksprogram, 813 00:34:58,640 --> 00:35:00,289 forstår CSV-filer, som vi har set. 814 00:35:00,289 --> 00:35:03,080 Men så må jeg have ramt, ligesom, Kommando eller Kontrol S på et tidspunkt. 815 00:35:03,080 --> 00:35:06,250 Og Excel tilsyneladende på tidspunktet havde en funktion, hvor som helst det 816 00:35:06,250 --> 00:35:08,100 så et nummer, er det forsøgt at være nyttigt. 817 00:35:08,100 --> 00:35:11,610 Og hvis dette antal i gang med nuller, ville det bare slippe af med dem. 818 00:35:11,610 --> 00:35:13,420 Hvorfor har du brug for førende nuller på heltal? 819 00:35:13,420 --> 00:35:15,140 De er meningsløse, matematisk. 820 00:35:15,140 --> 00:35:17,530 De er ikke meningsløs i US Postal-systemet. 821 00:35:17,530 --> 00:35:19,954 Så jeg har haft i år, til denne dag, jeg stadig 822 00:35:19,954 --> 00:35:22,370 har venner, at når sjældne tilfælde, at jeg har brug for nogen er 823 00:35:22,370 --> 00:35:24,078 imødegå disse dage, Jeg vil stadig se, at jeg 824 00:35:24,078 --> 00:35:26,767 har en ven i Cambridge, Massachusetts, 2138. 825 00:35:26,767 --> 00:35:29,350 Og det er irriterende, hvis du er forsøger at sortere på programmatisk 826 00:35:29,350 --> 00:35:30,975 generere kuverter eller bare notere det ned. 827 00:35:30,975 --> 00:35:33,599 Og det er på grund af denne grund, Jeg valgte den forkerte datatype. 828 00:35:33,599 --> 00:35:34,490 Så jeg elsker din idé. 829 00:35:34,490 --> 00:35:35,650 Lad os bruge en CHAR felt. 830 00:35:35,650 --> 00:35:38,340 Fem tegn, undtagen Der er et hjørne tilfældet. 831 00:35:38,340 --> 00:35:42,220 Hvis du stadig sende mail, sommetider postnumre i disse dage, 832 00:35:42,220 --> 00:35:45,360 de er, ligesom, plus fire. 833 00:35:45,360 --> 00:35:48,200 Så vi har brug for en bindestreg og derefter vi har brug for fire flere numre. 834 00:35:48,200 --> 00:35:50,330 Så for at være ærlig, det kunne gå mange forskellige måder. 835 00:35:50,330 --> 00:35:52,371 >> For nu, vil jeg holde det enkelt og jeg er bare 836 00:35:52,371 --> 00:35:54,780 kommer til at sige, at det er en fem CHAR værdi, og vi er 837 00:35:54,780 --> 00:35:56,739 kommer til at springe hele Dash plus fire. 838 00:35:56,739 --> 00:35:58,280 Men disse er den slags kompromiser. 839 00:35:58,280 --> 00:36:00,196 Og du kan tænke på det samme problemer 840 00:36:00,196 --> 00:36:01,860 med telefonnumre eller andre områder. 841 00:36:01,860 --> 00:36:04,350 >> Og nu, det er faktisk en tåbelig vej til at gå ned. 842 00:36:04,350 --> 00:36:08,000 Antag både Rob og jeg og Hannah og Maria og [? Davon?] Og Andy 843 00:36:08,000 --> 00:36:12,820 og andre på personalet alle lever i Cambridge, Massachusetts, 02138. 844 00:36:12,820 --> 00:36:17,970 Dette faktisk føler dum, at jeg er tilføje til mine brugere bord, by, stat, 845 00:36:17,970 --> 00:36:18,630 og lynlås. 846 00:36:18,630 --> 00:36:20,980 Hvorfor? 847 00:36:20,980 --> 00:36:21,960 >> PUBLIKUM: [uhørligt] 848 00:36:21,960 --> 00:36:22,918 >> DAVID MALAN: Sig igen? 849 00:36:22,918 --> 00:36:24,310 PUBLIKUM: [uhørligt] 850 00:36:24,310 --> 00:36:25,850 >> DAVID MALAN: De er altid kommer til at gå sammen, ikke? 851 00:36:25,850 --> 00:36:28,660 Når det viser sig, vi plejede at tænke dette var tilfældet, indtil vi udtømmende 852 00:36:28,660 --> 00:36:30,570 søgte hele USA, og viser sig, at der 853 00:36:30,570 --> 00:36:32,653 er nogle uoverensstemmelser hvor flere byer har 854 00:36:32,653 --> 00:36:35,060 den samme lynlås, hvilket er underligt. 855 00:36:35,060 --> 00:36:40,580 Men, hvis vi fastsætter for nu at 02138 er altid Cambridge, Massachusetts, 856 00:36:40,580 --> 00:36:44,910 hvorfor i verden ville du gemmer i din database Cambridge og MA og 02138 857 00:36:44,910 --> 00:36:49,357 for mig og for Hannah og til Rob og for [? Davon?], Og for andre, der bor 858 00:36:49,357 --> 00:36:51,190 her i Cambridge, er det perfekt overflødig. 859 00:36:51,190 --> 00:36:54,480 >> Vi bør komme væk med blot at lagre hvad? 860 00:36:54,480 --> 00:36:55,610 Bare det postnummer. 861 00:36:55,610 --> 00:36:58,660 Men så, hvis vi gemmer bare postnummer, jeg ønsker, sandsynligvis, 862 00:36:58,660 --> 00:37:02,160 til min hjemmeside for at vide, hvor 02138 er. 863 00:37:02,160 --> 00:37:03,910 Så jeg har brug for en anden tabel. 864 00:37:03,910 --> 00:37:04,697 Og det er OK. 865 00:37:04,697 --> 00:37:07,530 Og i virkeligheden, det er en af ​​de designprocesser designe tabeller 866 00:37:07,530 --> 00:37:11,472 at du vil gøre i PSet7 såvel hvorved du ønsker at faktor ud fælles data. 867 00:37:11,472 --> 00:37:14,430 Ligesom vi har været factoring ud fælles kode og factoring ud fælles 868 00:37:14,430 --> 00:37:17,380 stilarter fra CSS, her også i databasen, 869 00:37:17,380 --> 00:37:21,180 hvis jeg kun har brug for 02138 til entydigt identificere en persons hjemby, 870 00:37:21,180 --> 00:37:25,020 må ikke opbevares Cambridge, Mass for hver darn bruger på dit bord. 871 00:37:25,020 --> 00:37:29,770 >> I stedet har en separat tabel kaldet Lynlåse, der bør have, hvad kolonner? 872 00:37:29,770 --> 00:37:33,490 Sandsynligvis et ID felt, bare fordi, for de principper, vi taler om nu. 873 00:37:33,490 --> 00:37:35,720 Sandsynligvis en zip felt til 02138. 874 00:37:35,720 --> 00:37:38,400 Og så sandsynligvis, hvad andre kolonner? 875 00:37:38,400 --> 00:37:42,950 By og stat, men kun har én række for 02138, en række for 02139, 876 00:37:42,950 --> 00:37:44,772 én række til 90.210. 877 00:37:44,772 --> 00:37:46,730 Og det er bogstaveligt talt alle postnumre jeg kender. 878 00:37:46,730 --> 00:37:49,012 >> Så nu, hvad kan du gøre? 879 00:37:49,012 --> 00:37:51,220 Dette er problematisk, fordi nu har jeg fået to tabeller. 880 00:37:51,220 --> 00:37:54,660 Så mine brugere er for det meste herovre, men deres bystat oplysninger er 881 00:37:54,660 --> 00:37:55,390 her ovre. 882 00:37:55,390 --> 00:37:58,635 Så viser det sig med SQL, der faktisk en måde at slutte oplysninger, 883 00:37:58,635 --> 00:38:00,470 og du vil se dette i pset. 884 00:38:00,470 --> 00:38:03,000 >> Men det viser sig, du kan gøre noget som dette. 885 00:38:03,000 --> 00:38:10,501 SELECT stjerne fra brugere, JOIN lynlåse ON brugere dot lynlås lig lynlåse dot lynlås. 886 00:38:10,501 --> 00:38:13,360 Hvilket er lidt ordrige, ganske vist, men dette blot 887 00:38:13,360 --> 00:38:17,590 betyder at vælge alt fra processen med at tage mine brugere bord 888 00:38:17,590 --> 00:38:19,580 og min lynlåse tabel. 889 00:38:19,580 --> 00:38:22,120 Deltag dem på den ene felt har de i kolonne. 890 00:38:22,120 --> 00:38:24,780 Så bogstaveligt gøre noget som dette, og give mig tilbage 891 00:38:24,780 --> 00:38:27,360 en ny midlertidig tabel der er bredere, der er større, 892 00:38:27,360 --> 00:38:29,450 der har alle de kolonner fra dem begge. 893 00:38:29,450 --> 00:38:33,510 Og det ganske enkelt ville være det syntaks for at gøre noget som dette. 894 00:38:33,510 --> 00:38:35,540 >> Så der er det forude, men der kommer 895 00:38:35,540 --> 00:38:38,950 at være andre designbeslutninger, du vil nødt til at gøre, ikke kun med indekser 896 00:38:38,950 --> 00:38:40,550 men også at løbe ind i udfordringer. 897 00:38:40,550 --> 00:38:43,360 Faktisk er der en udfordring i enhver database design 898 00:38:43,360 --> 00:38:47,930 hvorved nogle gange to mennesker måske ønsker adgang til samme rækker af databasen 899 00:38:47,930 --> 00:38:48,530 tabel. 900 00:38:48,530 --> 00:38:51,450 Så det er noget, som vi vil støde på i PSet7 samt. 901 00:38:51,450 --> 00:38:54,686 >> Men jeg tænkte jeg ville se på en angreb, der er muligt i SQL. 902 00:38:54,686 --> 00:38:56,560 Hvad er nogle af de problemer, der kan opstå? 903 00:38:56,560 --> 00:38:58,170 Så vil du støde på dette i PSet7. 904 00:38:58,170 --> 00:39:01,874 Og vi fortæller dig direkte, hvad det kodende løsning på dette problem er. 905 00:39:01,874 --> 00:39:04,790 Men hvis du tager et højere niveau klasse, især i operativsystemer, 906 00:39:04,790 --> 00:39:06,950 du kommer til at støde et spørgsmål om Atomicity, 907 00:39:06,950 --> 00:39:10,080 problemet med at forsøge at gøre flere ting på én gang 908 00:39:10,080 --> 00:39:11,000 uden afbrydelse. 909 00:39:11,000 --> 00:39:14,560 >> Og jeg tænkte jeg ville indføre denne idé til PSet7 med en metafor 910 00:39:14,560 --> 00:39:18,160 at jeg lærte mig selv i Margo Seltzer s CS164 operativsystemer 911 00:39:18,160 --> 00:39:18,990 klasse ĺr siden. 912 00:39:18,990 --> 00:39:22,230 Antag, at du har en af ​​disse kollegieværelse køleskabe i dit kollegieværelse eller hus, 913 00:39:22,230 --> 00:39:24,474 og du har en reel forkærlighed for mælk. 914 00:39:24,474 --> 00:39:27,140 Og så, du kommer hjem fra klasser en dag, du åbner køleskabet. 915 00:39:27,140 --> 00:39:27,620 Åh, for fanden. 916 00:39:27,620 --> 00:39:28,870 Der er ingen mælk i køleskabet. 917 00:39:28,870 --> 00:39:32,470 Så du lukker køleskabet, låse døren, låse dit kollegieværelse, 918 00:39:32,470 --> 00:39:34,770 gå rundt om hjørnet til CVS, komme i linje, 919 00:39:34,770 --> 00:39:36,312 og begynde at tjekke ud for nogle mælk. 920 00:39:36,312 --> 00:39:38,978 Og det kommer til at tage et stykke tid, fordi dem sgu selv kassen 921 00:39:38,978 --> 00:39:40,570 tællere tage for evigt at bruge alligevel. 922 00:39:40,570 --> 00:39:41,950 Så i mellemtiden, din værelseskammerat kommer hjem. 923 00:39:41,950 --> 00:39:43,470 Han eller hun virkelig kan lide mælk så godt. 924 00:39:43,470 --> 00:39:45,520 De kommer ind i kollegieværelse, åbne køleskabet, åh, darn det. 925 00:39:45,520 --> 00:39:46,490 Der er ikke mere mælk. 926 00:39:46,490 --> 00:39:49,040 >> Så han eller hun også går rundt om hjørnet. 927 00:39:49,040 --> 00:39:51,670 Men nu, da der er ligesom to eller tre eller fire CVSes nærheden, 928 00:39:51,670 --> 00:39:53,800 de tilfældigvis til at gå til en af ​​de forskellige dem på pladsen. 929 00:39:53,800 --> 00:39:55,830 Og så nu, et par minutter senere, begge af jer 930 00:39:55,830 --> 00:39:58,060 komme hjem og UH, værste problem nogensinde. 931 00:39:58,060 --> 00:40:00,967 Nu har du for meget mælk fordi det kommer til at gå sur. 932 00:40:00,967 --> 00:40:03,050 Og du kan lide mælk, men du kan ikke rigtig lide mælk. 933 00:40:03,050 --> 00:40:06,730 >> Så nu, dette var en dyr fejltagelse, fordi begge du 934 00:40:06,730 --> 00:40:09,870 taget en beslutning på grundlag af tilstand nogle variabel, 935 00:40:09,870 --> 00:40:12,660 var i færd med at ændres af dig, 936 00:40:12,660 --> 00:40:14,560 initiativtager kommer til at få mælk. 937 00:40:14,560 --> 00:40:17,785 Så hvad er måske et menneske løsning på dette problem? 938 00:40:17,785 --> 00:40:18,660 PUBLIKUM: [uhørligt] 939 00:40:18,660 --> 00:40:19,430 DAVID MALAN: Skriv en note, ikke? 940 00:40:19,430 --> 00:40:21,850 Sørg altid for en note, hvis du er bekendt med det show. 941 00:40:21,850 --> 00:40:23,100 Ja, der er to af os. 942 00:40:23,100 --> 00:40:25,940 Så altid forlade en note, eller bogstaveligt låse køleskabet 943 00:40:25,940 --> 00:40:28,602 med en vis form for hængelås eller noget over toppen sådan. 944 00:40:28,602 --> 00:40:31,310 Men det er faktisk kommer til at være centralt problem med database design, 945 00:40:31,310 --> 00:40:34,710 især når du har måske flere browsere, flere bærbare computere, 946 00:40:34,710 --> 00:40:37,450 flere brugere forsøger alle at opdatere oplysninger på en gang. 947 00:40:37,450 --> 00:40:40,590 Særligt følsomme oplysninger Ligesom finansielle oplysninger, 948 00:40:40,590 --> 00:40:43,350 hvorved med en bestand handel hjemmeside som du skal bygge, 949 00:40:43,350 --> 00:40:47,270 hvad nu hvis du ønsker at kontrollere, hvor mange penge du har, og derefter, hvis du har nok, 950 00:40:47,270 --> 00:40:48,490 købe nogle lager? 951 00:40:48,490 --> 00:40:50,899 >> Men hvad nu hvis en anden, der har en fælles konto med dig 952 00:40:50,899 --> 00:40:52,690 er samtidig forsøger at købe nogle lager? 953 00:40:52,690 --> 00:40:55,190 Så han eller hun er at kontrollere saldo, begge af jer 954 00:40:55,190 --> 00:40:57,540 komme tilbage til samme svar, er der ingen mælk. 955 00:40:57,540 --> 00:41:00,580 Eller begge af du får tilbage svaret, du har $ 100 i kontoen. 956 00:41:00,580 --> 00:41:04,680 Begge du prøver at gøre beslutningen at købe en andel af nogle selskab lager. 957 00:41:04,680 --> 00:41:06,130 >> Og nu, hvad sker der? 958 00:41:06,130 --> 00:41:07,140 Du har to aktier? 959 00:41:07,140 --> 00:41:08,420 Du har ingen aktier? 960 00:41:08,420 --> 00:41:10,320 Problemer som der kan opstå. 961 00:41:10,320 --> 00:41:11,755 Så vil vi støde på det. 962 00:41:11,755 --> 00:41:14,630 SQL-injektion angreb, heldigvis, er noget, vi vil hjælpe dig med, 963 00:41:14,630 --> 00:41:17,430 men disse er atrociously fælles disse dage stadig. 964 00:41:17,430 --> 00:41:18,680 Så dette er blot et eksempel. 965 00:41:18,680 --> 00:41:21,290 Jeg gør ingen påstande, Harvard PIN system er 966 00:41:21,290 --> 00:41:23,130 sårbare over for denne særlige angreb. 967 00:41:23,130 --> 00:41:24,160 Vi har prøvet. 968 00:41:24,160 --> 00:41:26,120 Men, du ved, at vi have et felt som dette. 969 00:41:26,120 --> 00:41:29,620 Og Yales Net-ID har en lignende ser skærmen i disse dage. 970 00:41:29,620 --> 00:41:33,190 Og det viser sig, at måske PIN-systemet er implementeret i PHP. 971 00:41:33,190 --> 00:41:37,050 >> Og hvis det were-- det er not-- de kunne have kode, der ser sådan ud. 972 00:41:37,050 --> 00:41:38,210 De har to variabler. 973 00:41:38,210 --> 00:41:42,495 Giv mig brugernavn og adgangskode fra posten Super global variabel 974 00:41:42,495 --> 00:41:43,970 at vi talte om tidligere. 975 00:41:43,970 --> 00:41:47,310 Måske Harvard har en forespørgsel Ligesom SELECT stjerne fra brugere 976 00:41:47,310 --> 00:41:50,005 hvor brugernavn lig og kodeord lig. 977 00:41:50,005 --> 00:41:51,880 Og bemærk, at jeg bare sætte det i at bruge 978 00:41:51,880 --> 00:41:55,050 den krøllede bandage notation fra den anden dag, hvilket betyder blot tilslutte en værdi 979 00:41:55,050 --> 00:41:55,550 her. 980 00:41:55,550 --> 00:41:57,449 Jeg bruger ikke den spørgsmålstegn teknik. 981 00:41:57,449 --> 00:41:59,240 Jeg har ikke nogen anden eller tredjemand argumenter. 982 00:41:59,240 --> 00:42:02,350 Jeg er bare bogstaveligt konstruere strengen selv. 983 00:42:02,350 --> 00:42:04,930 >> Problemet er dog, at hvis nogen kan lide en scroob, 984 00:42:04,930 --> 00:42:09,020 som er en henvisning til en film, logger ind med noget som dette, 985 00:42:09,020 --> 00:42:11,250 og jeg har fjernet prikkerne der normalt dække op 986 00:42:11,250 --> 00:42:14,370 adgangskoder, hvad nu hvis han er særligt ondsindet 987 00:42:14,370 --> 00:42:18,860 og hans password måske er 12345, pr filmen kaldet "Spaceballs," 988 00:42:18,860 --> 00:42:21,970 men han kritisk typer en ét tilbud efter fem, 989 00:42:21,970 --> 00:42:24,790 derefter bogstaveligt ordet eller i rummet, og derefter tilbud, 990 00:42:24,790 --> 00:42:29,160 citat slut en er lig citerer én, men varsel han udeladt hvad? 991 00:42:29,160 --> 00:42:32,700 Han har udeladt citatet til højre og han udeladt citatet til venstre. 992 00:42:32,700 --> 00:42:35,170 >> For hvis denne angriber scroob formodning 993 00:42:35,170 --> 00:42:38,160 er, at de mennesker, der skrev dette PHP kode ikke var så lyse, 994 00:42:38,160 --> 00:42:42,990 måske de bare har nogle enkelt citerer omkring interpolation 995 00:42:42,990 --> 00:42:45,210 af en variabel i krøllede parenteser? 996 00:42:45,210 --> 00:42:48,620 Og så måske, han kunne slags af fuldføre deres tanker 997 00:42:48,620 --> 00:42:53,290 for dem, men på en måde, der foregår at lade ham hacket ind i PIN-systemet. 998 00:42:53,290 --> 00:42:55,310 Med andre ord, formoder at dette er den kode 999 00:42:55,310 --> 00:42:57,140 og vi nu tilslutte hvad scroob indtastet. 1000 00:42:57,140 --> 00:42:58,770 Og det er rødt, fordi det er dårligt. 1001 00:42:58,770 --> 00:43:01,310 >> Og den underliggende tekst er, hvad han har skrevet i, 1002 00:43:01,310 --> 00:43:05,510 scroob kunne narre Harvards server til konstruktion af en SQL-forespørgsel 1003 00:43:05,510 --> 00:43:07,440 streng, der ser sådan ud. 1004 00:43:07,440 --> 00:43:11,760 Kodeord lig 12345 eller en er lig én. 1005 00:43:11,760 --> 00:43:14,820 Resultatet heraf, logisk, er, at dette vil logge scroob 1006 00:43:14,820 --> 00:43:18,360 i hvis hans password er 12345 eller hvis en ligemænd 1007 00:43:18,360 --> 00:43:22,660 én, som naturligvis er altid sandt, hvilket betyder scroob altid får i. 1008 00:43:22,660 --> 00:43:26,060 >> Og så, til den måde løse dette, som i mange tilfælde, 1009 00:43:26,060 --> 00:43:28,140 ville være at skrive mere defensivt. 1010 00:43:28,140 --> 00:43:30,390 At bruge noget som vores faktiske forespørgslen funktion, som 1011 00:43:30,390 --> 00:43:33,980 vil du se i PSet7, hvor vi tilslutter noget som spørgsmålstegn her. 1012 00:43:33,980 --> 00:43:35,980 Og skønheden i forespørgsel funktionen vi 1013 00:43:35,980 --> 00:43:40,010 give dig er det beskytter mod disse såkaldte SQL injektion angreb, hvor 1014 00:43:40,010 --> 00:43:44,260 nogen er tricking din kode ind injicere sin egen SQL-kode. 1015 00:43:44,260 --> 00:43:47,380 For hvad forespørgslen funktionen vi giver du rent faktisk vil gøre, 1016 00:43:47,380 --> 00:43:51,270 hvis du bruger spørgsmålstegnet syntaks og en anden og en tredje argument her, 1017 00:43:51,270 --> 00:43:54,590 er, hvad der gjorde det føje til input, som brugeren forudsat? 1018 00:43:54,590 --> 00:43:56,060 De, backslash citater. 1019 00:43:56,060 --> 00:43:58,590 >> Så det undslipper enhver potentielt farlige tegn. 1020 00:43:58,590 --> 00:44:01,000 Det ser mærkeligt nu, men det er ikke sårbare 1021 00:44:01,000 --> 00:44:03,260 fordi den ikke ændre logikken længere 1022 00:44:03,260 --> 00:44:06,470 fordi det hele password er nu et enkelt citat, der ikke er, 1023 00:44:06,470 --> 00:44:07,596 Faktisk scroob adgangskode. 1024 00:44:07,596 --> 00:44:09,845 Så har der været nogle vittigheder om dette i årenes løb. 1025 00:44:09,845 --> 00:44:12,570 Så det var et foto taget nogle nørd på en parkeringsplads 1026 00:44:12,570 --> 00:44:16,620 hvorved du måske vide, at nogle byer og stater forsøger at scanne din licens 1027 00:44:16,620 --> 00:44:19,460 plade til at fakturere dig eller billet, du hvis du går igennem uden, ligesom, 1028 00:44:19,460 --> 00:44:20,660 E-Z Pass ting. 1029 00:44:20,660 --> 00:44:24,490 Så denne person formodes at måske folk skriver E-Z Pass systemet 1030 00:44:24,490 --> 00:44:28,240 var ikke så lyse, og måske de bare sammenkædet sammen en snor, 1031 00:44:28,240 --> 00:44:32,190 så han eller hun ikke kunne skadeligt ikke bare færdiggøre deres tanker, 1032 00:44:32,190 --> 00:44:35,150 men faktisk udføre en dårlig kommando, som vi ikke har nævnt endnu, 1033 00:44:35,150 --> 00:44:36,380 men du kan sikkert gætte. 1034 00:44:36,380 --> 00:44:39,820 At udover at slette og indsætte og opdatere og vælg, 1035 00:44:39,820 --> 00:44:43,370 der er også et nøgleord kaldet slip, som bogstaveligt sletter alt 1036 00:44:43,370 --> 00:44:45,300 i databasen, som er særligt slemt. 1037 00:44:45,300 --> 00:44:48,760 >> Vi kan zoome ind på dette, hvis det er lidt svært at se. 1038 00:44:48,760 --> 00:44:52,300 Dette, nu er en berømt tegneserie det er vidunderligt klog nu 1039 00:44:52,300 --> 00:44:53,145 og forståeligt. 1040 00:44:53,145 --> 00:45:00,880 1041 00:45:00,880 --> 00:45:04,750 >> [Latter] 1042 00:45:04,750 --> 00:45:05,910 >> Ja, cool. 1043 00:45:05,910 --> 00:45:06,800 Slags geeking ud. 1044 00:45:06,800 --> 00:45:08,800 Så disse, så er SQL-injektion angreb. 1045 00:45:08,800 --> 00:45:13,050 Og de er så nemme at undgå ved at bruge den rigtige kode eller de rigtige biblioteker. 1046 00:45:13,050 --> 00:45:15,947 Og du vil se i PSet7, det er Derfor giver vi dig forespørgslen funktionen. 1047 00:45:15,947 --> 00:45:17,780 Så et par teasere at vi troede, vi havde 1048 00:45:17,780 --> 00:45:19,930 giver dig her i vores resterende minutter sammen. 1049 00:45:19,930 --> 00:45:24,030 Så, som du husker fra uge nul, vi introducerede disse to pærer, som 1050 00:45:24,030 --> 00:45:26,610 er rart, ikke kun på grund de er smuk og er farverige, 1051 00:45:26,610 --> 00:45:29,450 men fordi de støtter noget kaldet et API, et program 1052 00:45:29,450 --> 00:45:31,980 Programming Interface og i CS50 hidtil, vi har 1053 00:45:31,980 --> 00:45:34,440 meste fokuseret på GET og POST, men det viser sig 1054 00:45:34,440 --> 00:45:37,390 der er andre HTTP verber som PUT. 1055 00:45:37,390 --> 00:45:39,430 >> Og i virkeligheden, var dette et dias fra uge nul 1056 00:45:39,430 --> 00:45:44,930 hvorved hvis du skriver kode, der sender a la PSet6 en HTTP-anmodning, der 1057 00:45:44,930 --> 00:45:49,647 ser sådan ud med denne luns af tekst nederst, som kaldes JSON, 1058 00:45:49,647 --> 00:45:52,230 eller JavaScript Object Notation at vi vil tale om i næste uge, 1059 00:45:52,230 --> 00:45:57,030 du kan tænde eller slukke eller ændre farven af ​​lys som dem. 1060 00:45:57,030 --> 00:46:00,480 Så hvis CS50 har også foruden nogle af disse pærer her i New Haven 1061 00:46:00,480 --> 00:46:02,480 Hvis du gerne vil låne dem for de endelige projekter, 1062 00:46:02,480 --> 00:46:04,370 også nogle Microsoft Bands, som er ligesom 1063 00:46:04,370 --> 00:46:07,619 ure, at du bærer rundt håndleddet der på samme måde har en API, så du 1064 00:46:07,619 --> 00:46:10,040 kan skrive din egen software til dem. 1065 00:46:10,040 --> 00:46:12,490 >> Vi har en konto med Apples iOS kode, så 1066 00:46:12,490 --> 00:46:15,510 at hvis du har en Apple Watch eller en iPhone eller en iPad eller en iPod, 1067 00:46:15,510 --> 00:46:17,707 du kan skrive kode, faktisk kører på dem. 1068 00:46:17,707 --> 00:46:19,540 Vi har en hel masse af Arduinos, som er 1069 00:46:19,540 --> 00:46:22,010 bittesmå computere uden sager i det væsentlige, 1070 00:46:22,010 --> 00:46:25,240 at du kan oprette forbindelse via USB, typisk til din egen Mac eller PC, 1071 00:46:25,240 --> 00:46:28,810 skrive kode, der kører på disse fysiske enheder, der ofte har sensorer på dem 1072 00:46:28,810 --> 00:46:30,790 så du kan interagere med den virkelige verden. 1073 00:46:30,790 --> 00:46:32,860 Vi har en hel masse af Leap Motion enheder, 1074 00:46:32,860 --> 00:46:36,500 der er USB-enheder til Mac-computere og Pc'er, her og igen, i New Haven. 1075 00:46:36,500 --> 00:46:40,080 Og hvis du slutter den til din Mac, du rent faktisk kan styre din computer 1076 00:46:40,080 --> 00:46:42,550 ved at skrive software at via infrarøde stråler, 1077 00:46:42,550 --> 00:46:46,360 tal ud af, hvor din menneskelige hænder er, selv uden at røre tastaturet. 1078 00:46:46,360 --> 00:46:49,135 Vi troede, vi ville dele en hurtig glimt på dette, for eksempel. 1079 00:46:49,135 --> 00:46:51,428 >> [Musik spiller] 1080 00:46:51,428 --> 00:47:55,840 1081 00:47:55,840 --> 00:47:57,590 Så har vi en hel flok af disse ting, 1082 00:47:57,590 --> 00:48:01,040 Også kaldet Myo arm bands som du sætter over din underarm 1083 00:48:01,040 --> 00:48:04,595 og så kan du styre den virkelige verden eller den virtuelle verden som denne. 1084 00:48:04,595 --> 00:48:06,471 >> [Musik spiller] 1085 00:48:06,471 --> 00:49:17,580 1086 00:49:17,580 --> 00:49:20,920 Eller har vi også nogle Google Pap, som er bogstaveligt talt, ligesom, 1087 00:49:20,920 --> 00:49:24,841 en papkasse du kan sætte på din ansigt, men dias i din telefon til det 1088 00:49:24,841 --> 00:49:27,590 så du sætter glas din telefon virkelig tæt på dine øjne. 1089 00:49:27,590 --> 00:49:30,190 Og Google Pap er temmelig billige på $ 10 eller $ 20. 1090 00:49:30,190 --> 00:49:32,230 Og det har små linser at lidt off skift 1091 00:49:32,230 --> 00:49:35,900 billedet på skærmen i din menneskelige øjne til at give dig en fornemmelse af dybde 1092 00:49:35,900 --> 00:49:39,550 så du rent faktisk har en 3D- miljø foran dig. 1093 00:49:39,550 --> 00:49:42,927 Vi har også nogle Samsung Gear, som er dyrere version af denne, 1094 00:49:42,927 --> 00:49:46,010 men der kan på lignende måde glide i en Android-telefon og give dig en illusion 1095 00:49:46,010 --> 00:49:48,309 of-- eller give oplevelsen af virtual reality. 1096 00:49:48,309 --> 00:49:50,850 Og i vore sidste to minutter, Vi troede, vi ville forsøge at gøre dette. 1097 00:49:50,850 --> 00:49:55,250 Hvis jeg kan projicere hvad Colton har her blot for at skærpe din appetit, 1098 00:49:55,250 --> 00:49:58,442 lad mig gå videre og smide op på den store skærm her. 1099 00:49:58,442 --> 00:49:59,400 Lad mig dræbe lys. 1100 00:49:59,400 --> 00:50:02,290 Colton, vil du gå videre og sætte på din celle et øjeblik 1101 00:50:02,290 --> 00:50:05,171 og komme på over til midt på scenen? 1102 00:50:05,171 --> 00:50:07,420 Og vil du project-- dette er hvad Colton ser. 1103 00:50:07,420 --> 00:50:10,560 >> Nu Wi-Fi i her er ikke så stærk for denne enhed 1104 00:50:10,560 --> 00:50:13,870 at dette er super overbevisende, men Colton er bogstaveligt talt 1105 00:50:13,870 --> 00:50:15,710 i denne magiske futuristiske sted. 1106 00:50:15,710 --> 00:50:16,796 Han ser kun et billede. 1107 00:50:16,796 --> 00:50:19,920 Du ser hans venstre og højre øje at hans hjerne er syning sammen 1108 00:50:19,920 --> 00:50:22,260 i et tredimensionelt miljø på hans ansigt. 1109 00:50:22,260 --> 00:50:24,319 Han har netop valgt et menupunkt her. 1110 00:50:24,319 --> 00:50:27,360 Og så igen, han iført dette headset med en Samsung telefon på det, der er 1111 00:50:27,360 --> 00:50:29,080 trådløst rager til vores overhead. 1112 00:50:29,080 --> 00:50:30,349 Nu er du på Mars, jeg tror? 1113 00:50:30,349 --> 00:50:31,140 COLTON: Jeg tror det. 1114 00:50:31,140 --> 00:50:32,181 Jeg er ikke sikker [uhørligt]. 1115 00:50:32,181 --> 00:50:34,250 [Latter] 1116 00:50:34,250 --> 00:50:36,374 >> DAVID MALAN: Slår ud Mars har disse menuer. 1117 00:50:36,374 --> 00:50:41,590 >> COLTON: [uhørligt] nogle cool steder, hvis vi ønsker at gå at-- 1118 00:50:41,590 --> 00:50:43,330 >> DAVID MALAN: Hvor vil vi hen? 1119 00:50:43,330 --> 00:50:45,837 >> COLTON: [uhørligt] 1120 00:50:45,837 --> 00:50:48,170 DAVID MALAN: Og lad os se hvor Colton s tager os nu. 1121 00:50:48,170 --> 00:50:48,961 COLTON: [uhørligt] 1122 00:50:48,961 --> 00:50:52,830 1123 00:50:52,830 --> 00:50:56,380 >> DAVID MALAN: Så der er så mange forskellige steder, du kan tage dig selv. 1124 00:50:56,380 --> 00:51:00,590 Der er FAPIs via hvilken du kan skrive spil eller interaktioner, 1125 00:51:00,590 --> 00:51:01,950 køre i sidste ende på telefonen. 1126 00:51:01,950 --> 00:51:03,908 Så du virkelig bare skriver en mobiltelefon app. 1127 00:51:03,908 --> 00:51:06,380 Men takket være softwaren og grafikfunktioner, 1128 00:51:06,380 --> 00:51:08,765 nu Colton er i denne lille lille hytte. 1129 00:51:08,765 --> 00:51:10,515 Og risiko for overvældende os selv, 1130 00:51:10,515 --> 00:51:13,330 Colton og jeg vil holde sig til mens i slutningen af ​​klassen her i dag 1131 00:51:13,330 --> 00:51:14,300 Hvis du gerne vil komme op og spille. 1132 00:51:14,300 --> 00:51:16,350 Og vi vil bringe dem tilbage næste uge også. 1133 00:51:16,350 --> 00:51:18,420 Uden yderligere Ado det er det for i dag. 1134 00:51:18,420 --> 00:51:21,990 Vi vil se dig i næste uge. 1135 00:51:21,990 --> 00:51:24,140 >> [MUSIC - Ragga TWINS, "ond mand"] 1136 00:51:24,140 --> 00:55:23,146