1 00:00:00,000 --> 00:00:02,405 >> [MUSIC SPILLE] 2 00:00:02,405 --> 00:00:10,439 3 00:00:10,439 --> 00:00:11,980 DAVID MALAN: Greit, dette er CS50. 4 00:00:11,980 --> 00:00:13,740 Dette er slutten av uken åtte. 5 00:00:13,740 --> 00:00:15,887 Og i dag, starter vi å fylle ut noen brikker 6 00:00:15,887 --> 00:00:17,720 når det gjelder å bygge ting på nettet. 7 00:00:17,720 --> 00:00:20,020 Så husker at på mandag Vi bruker mye mer tid 8 00:00:20,020 --> 00:00:22,530 på PHP, som er denne dynamiske programmeringsspråk som 9 00:00:22,530 --> 00:00:26,872 lar oss utgang, blant annet ting, HTML og andre slike innhold 10 00:00:26,872 --> 00:00:27,830 at vi ønsker å se. 11 00:00:27,830 --> 00:00:30,871 Men vi har egentlig ikke sett på hvordan vi kommer til å lagre informasjon. 12 00:00:30,871 --> 00:00:34,477 Faktisk, kan nesten alle av at det super interessante nettsteder du besøker i dag 13 00:00:34,477 --> 00:00:36,560 har en slags database på baksiden slutten, ikke sant? 14 00:00:36,560 --> 00:00:39,540 Facebook lagrer sikkert massevis av data om oss alle, og Gmail lagrer alle 15 00:00:39,540 --> 00:00:40,210 av e-postene. 16 00:00:40,210 --> 00:00:44,150 >> Og så, mange andre steder er ikke bare statisk innhold som er informative. 17 00:00:44,150 --> 00:00:45,640 Det er faktisk dynamisk på noen måte. 18 00:00:45,640 --> 00:00:48,480 Du gi innspill, oppdaterer den sidene for andre mennesker. 19 00:00:48,480 --> 00:00:50,620 Du får meldinger du sender meldinger, og så videre. 20 00:00:50,620 --> 00:00:54,250 Så i dag, ser vi nærmere på de fundamentet for et prosjekt 21 00:00:54,250 --> 00:00:57,330 at du vil dykke inn i neste uke, CS50 Finance, som 22 00:00:57,330 --> 00:01:00,509 faktisk kommer til å ha deg å bygge noe ikke i C, men i PHP. 23 00:01:00,509 --> 00:01:02,550 En nettside som ser litt noe sånt som dette 24 00:01:02,550 --> 00:01:05,810 som gjør det mulig å kjøpe og selge aksjer som er faktisk 25 00:01:05,810 --> 00:01:09,044 kommer til å trekke på sanntid børsdata fra Yahoo Finance. 26 00:01:09,044 --> 00:01:11,960 Og så til slutt, vil du ha illusjon for deg selv og for brukere 27 00:01:11,960 --> 00:01:14,550 at du faktisk kjøper og selger aksjer og får nesten sanntid 28 00:01:14,550 --> 00:01:16,800 oppdateringer, administrere en portefølje, som alle 29 00:01:16,800 --> 00:01:20,310 kommer til å kreve å ha, til slutt, en database av brukerne. 30 00:01:20,310 --> 00:01:23,330 >> Så, i dine egne ord, spesielt hvis du ikke er 31 00:01:23,330 --> 00:01:25,670 super kjent med datamaskinen vitenskap eller databaser, hva 32 00:01:25,670 --> 00:01:30,790 vet du en database for å være akkurat nå, i ikke-tekniske termer? 33 00:01:30,790 --> 00:01:32,300 Hva er dette? 34 00:01:32,300 --> 00:01:36,882 Hvordan vil du beskrive det til et kollektiv eller en venn? 35 00:01:36,882 --> 00:01:40,100 >> PUBLIKUM: [uhørbart] informasjon [uhørbart] 36 00:01:40,100 --> 00:01:44,430 >> DAVID MALAN: Så, en liste med informasjon, eller en store-- en liste med informasjon 37 00:01:44,430 --> 00:01:47,160 som du kanskje ønsker å lagre om noe, som en bruker. 38 00:01:47,160 --> 00:01:50,190 Og hva gjør brukerne har assosiert med dem? 39 00:01:50,190 --> 00:01:53,160 Hvis du er en bruker på Facebook eller Gmail, hva kjennetegner 40 00:01:53,160 --> 00:01:54,940 at vi alle brukere ha? 41 00:01:54,940 --> 00:01:58,530 Liker, hva som kan være noe av det kolonner i regnearket som vi 42 00:01:58,530 --> 00:01:59,390 hentydet siste gang? 43 00:01:59,390 --> 00:02:01,140 Fordi igjen, kan du tenke 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å, hva synes du om når du tenker på en bruker? 46 00:02:08,280 --> 00:02:11,290 Hva har de? 47 00:02:11,290 --> 00:02:11,790 Hva 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, som, David Malan ville være navnet på en bruker. 51 00:02:16,840 --> 00:02:17,980 Hva andre gjør en bruker ha? 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å, som et ID-nummer, som din Harvard ID eller Yale Net ID eller lignende. 55 00:02:23,320 --> 00:02:24,923 Hva annet kan en bruker ha? 56 00:02:24,923 --> 00:02:25,890 >> PUBLIKUM: Passord. 57 00:02:25,890 --> 00:02:29,240 >> DAVID MALAN: Et passord, kanskje en adresse, kanskje et telefonnummer, kanskje 58 00:02:29,240 --> 00:02:30,050 en e-postadresse. 59 00:02:30,050 --> 00:02:32,640 Så, det er bunter av felt og dette kan liksom komme ut av kontroll 60 00:02:32,640 --> 00:02:34,760 raskt så snart du begynner realisere, oh, la oss lagre dette 61 00:02:34,760 --> 00:02:36,190 og la oss lagre og datt. 62 00:02:36,190 --> 00:02:37,657 >> Men hvordan gjør vi faktisk gjøre det? 63 00:02:37,657 --> 00:02:39,740 Så igjen, den mentale modellen å ha for i dag som vi 64 00:02:39,740 --> 00:02:42,320 dykke inn i selve SQL, Structured Query Language, 65 00:02:42,320 --> 00:02:44,186 er en database som ser ut som dette. 66 00:02:44,186 --> 00:02:45,310 Det er bare rader og kolonner. 67 00:02:45,310 --> 00:02:48,309 Og du kan forestille Google Spreadsheets eller hvilket som helst antall andre programmer. 68 00:02:48,309 --> 00:02:52,130 Men hva er nøkkelen om MySQL, som er den databaseprogramvare vi kommer til å bruke, 69 00:02:52,130 --> 00:02:54,920 det fritt åpent available-- Facebook bruksområder 70 00:02:54,920 --> 00:02:59,200 det og en rekke andre websites-- databasen lagrer ting relasjonelt. 71 00:02:59,200 --> 00:03:01,770 Og en relasjonsdatabase betyr bare en som bokstavelig 72 00:03:01,770 --> 00:03:03,672 lagrer dataene i rader og kolonner. 73 00:03:03,672 --> 00:03:04,630 Det er så enkelt som det. 74 00:03:04,630 --> 00:03:07,230 >> Så selv noe sånt som Oracle som du kanskje har generelt hørt om 75 00:03:07,230 --> 00:03:08,271 er en relasjonsdatabase. 76 00:03:08,271 --> 00:03:10,929 Og under panseret, det lagrer data i rader og kolonner. 77 00:03:10,929 --> 00:03:12,970 Og Oracle belaster deg en mye penger for å gjøre det, 78 00:03:12,970 --> 00:03:15,550 mens MySQL avgifter du ingenting for det samme. 79 00:03:15,550 --> 00:03:18,790 Så, er SQL kommer til å gi oss minst fire operasjoner. 80 00:03:18,790 --> 00:03:23,190 Muligheten til å velge data, slik som lese data, sette inn, slette og oppdatere data. 81 00:03:23,190 --> 00:03:25,525 Med andre ord, de er egentlig de fire nøkkeloperasjoner 82 00:03:25,525 --> 00:03:28,950 som kommer til å tillate oss å endre ting i disse rader og kolonner. 83 00:03:28,950 --> 00:03:33,250 >> Verktøyet som vi bruker i dag spesielt å lære SQL og å leke med den 84 00:03:33,250 --> 00:03:34,627 er igjen kalt PHP MyAdmin. 85 00:03:34,627 --> 00:03:35,460 Det er web-basert verktøy. 86 00:03:35,460 --> 00:03:38,200 Total tilfeldighet at det er skrevet i PHP. 87 00:03:38,200 --> 00:03:42,400 Men det kommer til å gi oss en grafisk brukergrensesnitt, slik at vi faktisk kan 88 00:03:42,400 --> 00:03:46,054 lage disse rader og kolonner og deretter snakke med dem via kode. 89 00:03:46,054 --> 00:03:47,970 Så, la oss nå begynne å hva jeg tror er ærlig 90 00:03:47,970 --> 00:03:51,000 form av moroa prosessen med bygge bakenden av nettsteder, 91 00:03:51,000 --> 00:03:54,580 de delene som brukerne ikke se, men sikkert bryr seg om, 92 00:03:54,580 --> 00:03:56,170 fordi det er heller data er i gang. 93 00:03:56,170 --> 00:03:59,570 Så, i likhet med C og en litt mindre som PHP, 94 00:03:59,570 --> 00:04:04,954 SQL, eller en database som støtter SQL, har minst disse datatypene 95 00:04:04,954 --> 00:04:05,870 og bunter av andre. 96 00:04:05,870 --> 00:04:08,107 Røye, VARCHAR, INT, BIGINT, Desimaltall, og DATETIME. 97 00:04:08,107 --> 00:04:09,940 Og det er en hel haug med andre funksjoner, 98 00:04:09,940 --> 00:04:11,940 men la oss gjøre dette ved å måte å faktisk eksempel. 99 00:04:11,940 --> 00:04:16,450 >> Jeg kommer til å gå inn i CS50 IDE der, på forhånd, jeg har logget inn 100 00:04:16,450 --> 00:04:19,372 og jeg har også besøkt en URL for dette verktøyet kalles PHP MyAdmin. 101 00:04:19,372 --> 00:04:22,580 Og i oppgavesettet syv, vil vi fortelle deg nøyaktig hvordan du får til dette grensesnittet 102 00:04:22,580 --> 00:04:23,200 også. 103 00:04:23,200 --> 00:04:25,640 I øverste venstre hjørne, merke det står forelese. 104 00:04:25,640 --> 00:04:27,610 Og det betyr bare at på forhånd, jeg opprettet 105 00:04:27,610 --> 00:04:31,360 en tom database kalt foredraget som ikke har noen regneark i det ennå. 106 00:04:31,360 --> 00:04:32,600 Det er ingen rader og kolonner. 107 00:04:32,600 --> 00:04:34,308 Fordi den første ting vi kommer til å gjøre 108 00:04:34,308 --> 00:04:37,100 er begynne å lage en tabell som kommer til å lagre våre brukere. 109 00:04:37,100 --> 00:04:39,100 >> Så, bokstavelig talt over her til høyre, er jeg 110 00:04:39,100 --> 00:04:42,070 kommer til å fortelle databasen Jeg vil ha en tabell kalt Brukere. 111 00:04:42,070 --> 00:04:44,845 Så, dette er som den filen som jeg ønsker å lagre alle mine data i. 112 00:04:44,845 --> 00:04:45,720 Og hvor mange kolonner? 113 00:04:45,720 --> 00:04:47,740 Vel, la oss holde det enkelt for nå. 114 00:04:47,740 --> 00:04:51,855 Jeg vil bare lagre som en brukernavn og et navn på en bruker. 115 00:04:51,855 --> 00:04:53,020 Vi vil begynne i det små. 116 00:04:53,020 --> 00:04:55,370 Så, jeg vil ha to kolonner totalt. 117 00:04:55,370 --> 00:04:57,360 Og jeg kommer til å gå videre og klikk OK. 118 00:04:57,360 --> 00:04:59,210 Og så, for disse kolonner, hva jeg skal 119 00:04:59,210 --> 00:05:04,576 å do-- hvis denne internett cooperates-- all right, 120 00:05:04,576 --> 00:05:05,950 så vi kommer til å prøve det igjen. 121 00:05:05,950 --> 00:05:09,180 Jeg kommer til å lage en tabell kalt Brukere med to kolonner, klikk på Go, OK. 122 00:05:09,180 --> 00:05:10,520 Nå har vi det veldig fort. 123 00:05:10,520 --> 00:05:12,065 Takk, veldig godt gjort. 124 00:05:12,065 --> 00:05:14,440 Greit, så hva gjør vi ønsker disse kolonnene å bli kalt? 125 00:05:14,440 --> 00:05:16,080 >> Så, man kommer til å bli kalt Brukernavn. 126 00:05:16,080 --> 00:05:19,480 Så alt jeg ser her-- og grensesnittet ærlig blir litt stygg slutt, 127 00:05:19,480 --> 00:05:21,270 når du begynner å skrive i alle disse dataene. 128 00:05:21,270 --> 00:05:27,450 Men hva er hyggelig er at slags paradoksalt nok, jeg skaper kolonner, 129 00:05:27,450 --> 00:05:29,977 men verktøyet har tåpelig lagt dem ut i rader 130 00:05:29,977 --> 00:05:31,560 slik at jeg kan konfigurere disse kolonnene. 131 00:05:31,560 --> 00:05:33,550 Så, det er to blanks der under Navn. 132 00:05:33,550 --> 00:05:36,180 Og en av disse feltene jeg ønsker å kalles brukernavn, 133 00:05:36,180 --> 00:05:38,000 og det andre feltet jeg vil kalle navn. 134 00:05:38,000 --> 00:05:40,340 >> Og nå må jeg velge datatyper for disse tingene. 135 00:05:40,340 --> 00:05:42,330 Så, mens i Excel og Google Spreadsheets, 136 00:05:42,330 --> 00:05:45,531 Hvis du ønsker en kolonne, du bokstavelig talt bare skriver navn eller brukernavn, trykk Enter. 137 00:05:45,531 --> 00:05:48,030 Kanskje du gjør det med fet skrift bare for klarhet, men det er det. 138 00:05:48,030 --> 00:05:50,140 Du trenger ikke oppgi typer av kolonner. 139 00:05:50,140 --> 00:05:53,790 Nå i Google Spreadsheets eller Excel, du kan angi hvordan dataene er gjengitt. 140 00:05:53,790 --> 00:05:58,120 Du kan gå til Format-menyen, og du kan spesifisere vise dette som dollartegn, 141 00:05:58,120 --> 00:05:59,900 viser dette som et flyttall. 142 00:05:59,900 --> 00:06:01,990 >> Så det ligner i ånden til at det vi er i ferd med å gjøre, 143 00:06:01,990 --> 00:06:04,740 men dette er faktisk kommer til å tvinge dataene til å være en bestemt type. 144 00:06:04,740 --> 00:06:07,750 Nå, selv om et øyeblikk siden jeg sa det er bare noen få datatyper, 145 00:06:07,750 --> 00:06:11,120 det er faktisk en hel masse, og de er 146 00:06:11,120 --> 00:06:12,910 i varierende grad av spesifisitet. 147 00:06:12,910 --> 00:06:14,970 Og som en digresjon, du kan selv gjøre fancy ting 148 00:06:14,970 --> 00:06:17,520 som lagrings geometrier innsiden av en database. 149 00:06:17,520 --> 00:06:19,250 Du kan lagre ting som GPS-koordinater 150 00:06:19,250 --> 00:06:22,420 og faktisk finne, matematisk, punkter som er nær andre. 151 00:06:22,420 --> 00:06:24,128 Men vi kommer til å holde dette super enkelt 152 00:06:24,128 --> 00:06:26,800 og gå opp til her, alle de såkalte strengtypene. 153 00:06:26,800 --> 00:06:29,240 >> Så, her er en liste over en hel haug av alternativer. 154 00:06:29,240 --> 00:06:32,740 Røye, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. 155 00:06:32,740 --> 00:06:34,110 Og det er litt overveldende. 156 00:06:34,110 --> 00:06:37,610 Og dessverre, noe paradoksalt nok til C, 157 00:06:37,610 --> 00:06:40,120 en CHAR er virkelig ikke en CHAR. 158 00:06:40,120 --> 00:06:44,170 Hvis du angir i en database at datatype er CHAR, 159 00:06:44,170 --> 00:06:47,390 det betyr at ja, det er en CHAR, men det er ett eller flere tegn. 160 00:06:47,390 --> 00:06:49,630 Og du må spesifisere hvor mange tegn du vil. 161 00:06:49,630 --> 00:06:51,636 Så, hva er en typisk lengde for et brukernavn? 162 00:06:51,636 --> 00:06:52,760 Er det en grense typisk? 163 00:06:52,760 --> 00:06:53,920 >> PUBLIKUM: [uhørbart] 164 00:06:53,920 --> 00:06:55,050 >> DAVID MALAN: 16 kanskje? 165 00:06:55,050 --> 00:06:55,990 Noe sånt. 166 00:06:55,990 --> 00:06:57,948 Du vet, tilbake i dag, det pleide å være åtte. 167 00:06:57,948 --> 00:07:00,289 Noen ganger er det 16, noen ganger det er enda mer enn det. 168 00:07:00,289 --> 00:07:02,080 Og så gjør ikke dette bety gi meg en CHAR. 169 00:07:02,080 --> 00:07:04,730 Dette betyr at jeg må spesifisere lengden av feltet, 170 00:07:04,730 --> 00:07:07,402 og nå kan jeg si noe sånt som 16. 171 00:07:07,402 --> 00:07:08,610 Og det er en trade off her. 172 00:07:08,610 --> 00:07:11,360 Så får vi se på et øyeblikk at dette betyr en, 173 00:07:11,360 --> 00:07:14,620 hver brukernavn må være 16 tegn. 174 00:07:14,620 --> 00:07:18,720 Men vent litt, M-A-L-A-N. Hvis det er brukernavnet mitt og jeg bare bruker fem, 175 00:07:18,720 --> 00:07:23,070 hva ville du foreslå at databasen å gjøre for de andre 11 tegn på at 176 00:07:23,070 --> 00:07:24,471 Jeg har reservert plass til? 177 00:07:24,471 --> 00:07:25,220 Hva vil du gjøre? 178 00:07:25,220 --> 00:07:26,480 >> PUBLIKUM: [uhørbart] 179 00:07:26,480 --> 00:07:27,160 >> DAVID MALAN: Ja, bare gjøre dem alle null. 180 00:07:27,160 --> 00:07:28,290 Gjør dem mellomrom. 181 00:07:28,290 --> 00:07:30,816 Men sannsynligvis null, slik at en Mange backslash nuller. 182 00:07:30,816 --> 00:07:33,190 Så, på den ene siden, har vi nå sørget for at brukernavnet mitt 183 00:07:33,190 --> 00:07:34,780 kan være mer enn 16 tegn. 184 00:07:34,780 --> 00:07:37,590 Og baksiden av det er at hvis jeg hadde en veldig langt navn 185 00:07:37,590 --> 00:07:39,940 eller ville ha en veldig lang brukernavn som noen av dere 186 00:07:39,940 --> 00:07:44,840 Gutta kan ha i at høyskole eller på Yale.edu, kan du ikke har en. 187 00:07:44,840 --> 00:07:47,177 Og så faktisk, hvis du har noen gang er registrert for et nettsted 188 00:07:47,177 --> 00:07:49,385 og du får skrek til å si passordet ditt er for lang 189 00:07:49,385 --> 00:07:52,710 eller brukernavnet ditt er for lenge, det er rett og slett fordi en programmerer, når 190 00:07:52,710 --> 00:07:55,500 konfigurering av sin database, besluttet at dette feltet vil 191 00:07:55,500 --> 00:07:57,150 være lenger enn denne lengden. 192 00:07:57,150 --> 00:08:00,580 >> Greit, så hva om vi fortsette å nevne? 193 00:08:00,580 --> 00:08:05,240 Hvor lenge bør en typisk menneskelig 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 gjetter vi kunne finne noen i dette rommet 196 00:08:09,450 --> 00:08:13,210 der ved hans eller hennes første pluss siste Navnet er lengre enn 16 tegn. 197 00:08:13,210 --> 00:08:14,850 Så, hva er bedre enn 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ørbart] 203 00:08:21,855 --> 00:08:23,700 DAVID MALAN: 5000, oh my God. 204 00:08:23,700 --> 00:08:26,309 Så, det er sannsynligvis en anstendig øvre grense, skal vi si. 205 00:08:26,309 --> 00:08:28,350 Og her vi slags har å foreta en vurderingssak. 206 00:08:28,350 --> 00:08:30,400 Liker, det er ingen riktig svar her. 207 00:08:30,400 --> 00:08:32,740 Infinite er ikke helt mulig, fordi vi er slutt 208 00:08:32,740 --> 00:08:34,781 kommer til å have-- vi er kommer til å gå tom for minne. 209 00:08:34,781 --> 00:08:36,909 Så har vi å gjøre en vurderingssak på enkelte punkt. 210 00:08:36,909 --> 00:08:41,010 >> Meget vanlig vil være, for eksempel, til use-- og la meg spesifisere CHAR her 211 00:08:41,010 --> 00:08:46,050 som before-- 255 var bokstavelig øvre grense på denne databasen programvare 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 si, fine. 214 00:08:48,575 --> 00:08:49,420 255 er grensen. 215 00:08:49,420 --> 00:08:50,620 La oss bare bruke det maksimale. 216 00:08:50,620 --> 00:08:51,870 Og dette er ganske latterlig. 217 00:08:51,870 --> 00:08:55,060 Som, hvis du skriver noens nevne for 200 pluss tegn, 218 00:08:55,060 --> 00:08:56,140 som en litt latterlig. 219 00:08:56,140 --> 00:08:59,624 >> Men, husk at ASCII er ikke det eneste systemet for tegn. 220 00:08:59,624 --> 00:09:01,540 Og så, spesielt i en Mange asiatiske språk 221 00:09:01,540 --> 00:09:04,248 hvor det er tegn vi kan ikke uttrykke på keyboard som min amerikanske 222 00:09:04,248 --> 00:09:08,209 tastatur, noen tegn faktisk ta opp 16 bits i stedet for åtte bits. 223 00:09:08,209 --> 00:09:10,250 Og så, dette faktisk er ikke alle som urimelig 224 00:09:10,250 --> 00:09:12,250 at vi trenger mer plass hvis vi ønsker å passe 225 00:09:12,250 --> 00:09:16,252 større tegn enn de aller USA sentriske de vi har en tendens til å diskutere. 226 00:09:16,252 --> 00:09:17,460 Så, trenger vi noen øvre grense. 227 00:09:17,460 --> 00:09:21,470 Jeg vet ikke hva det beste er, men 255 er generelt en vanlig en. 228 00:09:21,470 --> 00:09:22,700 25 føles 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 feile på siden av noe høyere. 231 00:09:25,690 --> 00:09:27,330 Men det er en trade off, som alltid. 232 00:09:27,330 --> 00:09:31,902 Hva er det kanskje innlysende trade off for å reservere 255 tegn 233 00:09:31,902 --> 00:09:33,360 for alle navn i databasen min? 234 00:09:33,360 --> 00:09:34,230 >> PUBLIKUM: [uhørbart] 235 00:09:34,230 --> 00:09:34,510 >> DAVID MALAN: Hva er det? 236 00:09:34,510 --> 00:09:35,430 >> PUBLIKUM: [uhørbart] 237 00:09:35,430 --> 00:09:37,138 >> DAVID MALAN: Det er en mye minne, ikke sant? 238 00:09:37,138 --> 00:09:42,280 M-A-L-A-N. Jeg har bare kastet bort 250 tegn bare for å lagre navnet mitt 239 00:09:42,280 --> 00:09:46,000 defensivt, bare i tilfelle noen i klassen har et virkelig langt navn. 240 00:09:46,000 --> 00:09:47,940 Det virker som en utilbørlig kompromisset. 241 00:09:47,940 --> 00:09:52,040 >> Så viser det seg at SQL, denne databasen språk, 242 00:09:52,040 --> 00:09:55,480 faktisk støtter noe kalt VARCHAR, eller variabel CHAR. 243 00:09:55,480 --> 00:09:59,390 Og dette er slags fint i at dette lar deg spesifisere 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 mer spesifikt, en maksimal bredde av feltet. 246 00:10:05,060 --> 00:10:08,901 Så betyr dette at et navn kan ikke være mer enn 250 tegn, 247 00:10:08,901 --> 00:10:10,150 men det kan sikkert være færre. 248 00:10:10,150 --> 00:10:11,733 Og databasen skal være smart. 249 00:10:11,733 --> 00:10:14,860 Hvis du putter i M-A-L-A-N, det er bare kommer til å bruke fem, 250 00:10:14,860 --> 00:10:18,120 kanskje seks byte for like en etterfølgende null karakter, 251 00:10:18,120 --> 00:10:23,330 og ikke bruke en ekstra 249 eller 250 bytes unødvendig. 252 00:10:23,330 --> 00:10:27,380 >> Så, dette virker som jeg burde har begynt med denne historien. 253 00:10:27,380 --> 00:10:29,140 Men det er alltid en avveining. 254 00:10:29,140 --> 00:10:33,024 Så, på den ene siden et brukernavn jeg har angitt å være hardkodet på 16, 255 00:10:33,024 --> 00:10:34,940 og kanskje det var ikke høyre samtalen, kanskje det 256 00:10:34,940 --> 00:10:40,040 er, men hvorfor ikke bruke VARCHARs for alt? 257 00:10:40,040 --> 00:10:42,020 >> Det finnes for en grunn. 258 00:10:42,020 --> 00:10:46,200 Hvorfor ikke bruke VARCHARs for hvert felt hvis lengde du ikke kjenner på forhånd 259 00:10:46,200 --> 00:10:48,180 hvis det ser ut til å være en god ting, ikke sant? 260 00:10:48,180 --> 00:10:50,482 Bruk bare så mye plass som du må opp til denne grensen? 261 00:10:50,482 --> 00:10:51,271 >> PUBLIKUM: Tregere. 262 00:10:51,271 --> 00:10:52,146 DAVID MALAN: Speller? 263 00:10:52,146 --> 00:10:53,120 PUBLIKUM: Gjør det saktere? 264 00:10:53,120 --> 00:10:53,970 DAVID MALAN: Å, det er tregere. 265 00:10:53,970 --> 00:10:55,720 Bra, det er nesten alltid svaret, ærlig. 266 00:10:55,720 --> 00:10:56,520 Liker, hva er kompromisset? 267 00:10:56,520 --> 00:10:58,570 Det enten koster mer plass eller det koster mer tid. 268 00:10:58,570 --> 00:11:00,111 Så, i dette tilfellet, kan det være tregere. 269 00:11:00,111 --> 00:11:00,920 Hvorfor? 270 00:11:00,920 --> 00:11:05,830 >> PUBLIKUM: [uhørbart] bestemme [uhørbart]. 271 00:11:05,830 --> 00:11:06,640 >> DAVID MALAN: Good. 272 00:11:06,640 --> 00:11:09,670 Så, kanskje du husker fra selv PSED5, leker med din tilnærming 273 00:11:09,670 --> 00:11:12,750 i ordlisten, hvis du må allokere minne dynamisk eller holde 274 00:11:12,750 --> 00:11:14,630 vokser en buffer, som faktisk kan være treg. 275 00:11:14,630 --> 00:11:16,963 Hvis du må ringe malloc under panseret og kanskje 276 00:11:16,963 --> 00:11:19,610 det er hva MySQL gjør, så sikkert som kunne være tilfelle. 277 00:11:19,610 --> 00:11:22,430 Og hvis du tror måte tilbake til PSet-- eller 278 00:11:22,430 --> 00:11:26,340 uker to, når vi gjorde ting som binære søk eller lineær søk, 279 00:11:26,340 --> 00:11:30,690 en av de fine tingene om hvert ord i en database eller i hvert ord i en kolonne 280 00:11:30,690 --> 00:11:33,690 å være nøyaktig den samme lengde, selv hvis en hel haug av disse tegnene 281 00:11:33,690 --> 00:11:37,390 er tomme, er at du kan bruke tilfeldig tilgang på dataene dine, ikke sant? 282 00:11:37,390 --> 00:11:40,310 >> Hvis du vet at hver Ordet er 16 tegn unna, 283 00:11:40,310 --> 00:11:46,460 du kan bruke pekeren aritmetikk, så å snakke, og gå til oss 16, 32, 48, 64, 284 00:11:46,460 --> 00:11:49,589 og du kan bare hoppe øyeblikkelig hjelp aritmetikk 285 00:11:49,589 --> 00:11:51,130 til noen av ordene i databasen. 286 00:11:51,130 --> 00:11:54,280 Mens hvis det er en VARCHAR, hva gjør du i stedet har å gjø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 bruke random access. 289 00:11:58,680 --> 00:12:01,341 Det du må se etter eller gjøre? 290 00:12:01,341 --> 00:12:01,840 Yeah? 291 00:12:01,840 --> 00:12:03,240 >> PUBLIKUM: [uhørbart] 292 00:12:03,240 --> 00:12:04,310 >> DAVID MALAN: Look gjennom whole-- spor 293 00:12:04,310 --> 00:12:06,518 gjennom hele listen på jakt etter det, mest sannsynlig? 294 00:12:06,518 --> 00:12:08,356 Hva slags spesiell verdi? 295 00:12:08,356 --> 00:12:09,230 PUBLIKUM: [uhørbart] 296 00:12:09,230 --> 00:12:11,105 DAVID MALAN: Looking for null terminatorer 297 00:12:11,105 --> 00:12:13,637 at avgrense separasjon av ord. 298 00:12:13,637 --> 00:12:15,720 Så igjen, en hestekreftene, og det er ingen riktig svar. 299 00:12:15,720 --> 00:12:18,380 Men det er her, særlig når brukerne kommer til å være mange 300 00:12:18,380 --> 00:12:21,700 og belastningen på serverne, de antall personer som bruker det blir høy, 301 00:12:21,700 --> 00:12:23,650 disse er faktisk nontrivial beslutninger. 302 00:12:23,650 --> 00:12:26,640 Så kan vi la disse som dette, men La oss bla ned over til høyre 303 00:12:26,640 --> 00:12:27,332 her. 304 00:12:27,332 --> 00:12:30,290 Nå er det et par kolonner der vi må gjøre en vurderingssak. 305 00:12:30,290 --> 00:12:35,170 Er det fornuftig å la en brukers navn, en brukers brukernavn eller en brukers 306 00:12:35,170 --> 00:12:36,370 navn, for å være null? 307 00:12:36,370 --> 00:12:37,610 Det vil si, bare blank. 308 00:12:37,610 --> 00:12:40,360 Føles litt meningsløse, så jeg er ikke kommer til å sjekke disse boksene. 309 00:12:40,360 --> 00:12:42,670 Men det viser seg i en databasen, kan du si, 310 00:12:42,670 --> 00:12:44,620 noen kan eventuelt ha denne verdien. 311 00:12:44,620 --> 00:12:47,180 Denne kolonnen har ingen å faktisk være der. 312 00:12:47,180 --> 00:12:48,570 >> Nå er det denne rullegardinmenyen. 313 00:12:48,570 --> 00:12:50,810 Og legg merke til jeg er fortsatt i den første raden der, 314 00:12:50,810 --> 00:12:52,520 så jeg snakker om brukernavn nå. 315 00:12:52,520 --> 00:12:56,290 Og det viser seg at en database, i motsetning til en enkel bare regneark, 316 00:12:56,290 --> 00:12:58,520 har kraftige funksjoner kalt indekser. 317 00:12:58,520 --> 00:13:02,600 Og en indeks er en måte å fortelle database på forhånd at jeg den menneskelige 318 00:13:02,600 --> 00:13:03,900 er smartere enn deg. 319 00:13:03,900 --> 00:13:10,430 >> Jeg vet hva slags spørsmål, velg eller sette inn eller slette eller oppdatere, 320 00:13:10,430 --> 00:13:13,182 at koden min kommer til å ende opp med å gjøre på denne databasen. 321 00:13:13,182 --> 00:13:14,390 Jeg ønsker å lese en masse data. 322 00:13:14,390 --> 00:13:15,681 Jeg ønsker å sette inn en masse data. 323 00:13:15,681 --> 00:13:17,530 Jeg ønsker å stadig slette en masse data. 324 00:13:17,530 --> 00:13:21,520 Hvis jeg vet at jeg kommer til å være tilgang til et felt som brukernavn mye, 325 00:13:21,520 --> 00:13:24,770 Jeg kan preemptively fortelle database, jeg vet mer enn deg, 326 00:13:24,770 --> 00:13:29,220 og jeg ønsker å resolusjon som du bør indeksen dette feltet. 327 00:13:29,220 --> 00:13:33,200 Hvor indeksering et felt eller en søyle betyr at databasen på forhånd 328 00:13:33,200 --> 00:13:37,040 bør låne noen ideer fra, som, uke fire og fem og seks fra CS50 329 00:13:37,040 --> 00:13:39,240 og faktisk bygge opp noe som en binær søk 330 00:13:39,240 --> 00:13:41,560 tre eller noe vanligvis kalles en B tre 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 ved Harvard, en algoritmer klasse, eller hvilket som helst antall av andre steder. 333 00:13:46,710 --> 00:13:49,570 >> Databasen og smart folk som gjennomførte det 334 00:13:49,570 --> 00:13:53,880 vil finne ut hvordan du lagrer det bordet av informasjon 335 00:13:53,880 --> 00:13:57,061 i minnet slik at søk og andre operasjoner er super rask. 336 00:13:57,061 --> 00:13:58,060 Du trenger ikke å gjøre det. 337 00:13:58,060 --> 00:14:00,640 Du trenger ikke å implementere lineær søk eller binære søk 338 00:14:00,640 --> 00:14:03,300 eller fusjonere sort eller utvalg sort, noe av det. 339 00:14:03,300 --> 00:14:06,590 Databasen gjør det for deg hvis du forteller det preemptively å indeksere dette feltet. 340 00:14:06,590 --> 00:14:09,100 >> Og du kan se også, det er noen andre egenskaper 341 00:14:09,100 --> 00:14:11,010 vi kan fortelle databasen for å håndheve. 342 00:14:11,010 --> 00:14:16,431 Hva kan det bety hvis jeg velger Unique fra denne menyen, bare intuitivt? 343 00:14:16,431 --> 00:14:16,930 Yeah? 344 00:14:16,930 --> 00:14:17,889 >> PUBLIKUM: [uhørbart] 345 00:14:17,889 --> 00:14:19,930 DAVID MALAN: Ja, brukernavn må være unike. 346 00:14:19,930 --> 00:14:23,330 Er dette en god ting eller en dårlig ting for en database, for et nettsted med brukere? 347 00:14:23,330 --> 00:14:24,965 Bør brukernavn være unik? 348 00:14:24,965 --> 00:14:25,880 Ja, sannsynligvis. 349 00:14:25,880 --> 00:14:27,800 Hvis det er det den feltet vi bruke til å logge inn, 350 00:14:27,800 --> 00:14:31,867 du egentlig ikke ønsker å folk ha den samme følelsen eller samme brukernavn. 351 00:14:31,867 --> 00:14:33,700 Så kan vi ha database håndheve at så 352 00:14:33,700 --> 00:14:37,880 som nå i min PHP kode eller hvilket som helst språk, Jeg trenger ikke å, for eksempel, sjekk 353 00:14:37,880 --> 00:14:41,490 nødvendigvis gjør dette brukernavnet eksisterte før jeg la noen registrere? 354 00:14:41,490 --> 00:14:46,690 Databasen vil ikke la to personer som heter David eller Malans registrere i dette tilfellet. 355 00:14:46,690 --> 00:14:50,030 >> Og som en digresjon, selv om dette menyen bare lar deg velge en, 356 00:14:50,030 --> 00:14:54,550 en unik indeks er en som er indeksert for super rask ytelse, 357 00:14:54,550 --> 00:14:56,100 men det også håndhever unikhet. 358 00:14:56,100 --> 00:14:58,850 Og vi vil komme tilbake til hva to andre mener om en liten stund. 359 00:14:58,850 --> 00:15:00,930 I mellomtiden, hvis jeg går til min andre rad, noe som 360 00:15:00,930 --> 00:15:06,230 er brukerens navn, skal jeg spesifisere at navnet skal være unike? 361 00:15:06,230 --> 00:15:09,550 Nei, fordi du kunne sikkert have-- det er ikke to David 362 00:15:09,550 --> 00:15:11,050 Malans i dette rommet, mest sannsynlig. 363 00:15:11,050 --> 00:15:14,290 Men hvis vi velger et annet navn, vi kan sikkert ha kollisjoner. 364 00:15:14,290 --> 00:15:16,130 >> Tenk tilbake til hasj tabeller og lignende. 365 00:15:16,130 --> 00:15:18,604 Så, vi absolutt ikke ønsker for å gjøre navnefeltet unikt. 366 00:15:18,604 --> 00:15:21,270 Så, vi bare kommer til å forlate at så dash, dash, dash, ingenting. 367 00:15:21,270 --> 00:15:22,660 Og jeg kommer til å forlate alt annet alene. 368 00:15:22,660 --> 00:15:25,035 Faktisk har de fleste av disse feltene Vi trenger ikke å bry seg om. 369 00:15:25,035 --> 00:15:27,830 Og når jeg er klar til å lagre dette, hvis internett samarbeider, 370 00:15:27,830 --> 00:15:35,032 Jeg klikker på Lagre, og veldig, veldig, veldig sakte gjør databasen bli frelst. 371 00:15:35,032 --> 00:15:37,240 Og nå er jeg tilbake til dette grensesnitt, som riktignok 372 00:15:37,240 --> 00:15:38,680 er overveldende ved første øyekast. 373 00:15:38,680 --> 00:15:42,450 Men alt jeg kommer til å gjøre er å klikke på ordet Brukere på venstre. 374 00:15:42,450 --> 00:15:47,630 Jeg kommer til å gå opp her, og klikk Brukerne, og som standard, det 375 00:15:47,630 --> 00:15:50,180 har henrettet noen SQL, men mer om det i et øyeblikk. 376 00:15:50,180 --> 00:15:52,654 Her er bare en oppsummering av hva jeg gjorde. 377 00:15:52,654 --> 00:15:55,320 Og ikke å bekymre deg for at du ser omtale av latin og svenske her. 378 00:15:55,320 --> 00:16:00,490 De er bare standard innstillinger, fordi MySQL opprinnelig, 379 00:16:00,490 --> 00:16:04,000 eller PHP MyAdmin, en av de to som skjedde å være skrevet av noen svenske folk. 380 00:16:04,000 --> 00:16:06,100 Men det er irrelevant i vårt tilfelle her. 381 00:16:06,100 --> 00:16:08,280 >> Greit, så hvorfor er alt dette interessant? 382 00:16:08,280 --> 00:16:13,050 Det viser seg, kan jeg sette inn data inn i en database ved å 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 å gå videre og late som dette er kablet til at databasen, som 385 00:16:19,000 --> 00:16:23,040 det er ikke i øyeblikket, men det vil være når vi kommer til oppgavesettet sju. 386 00:16:23,040 --> 00:16:25,640 Og jeg kommer til å gå videre og utføre en funksjon kalt spørring, 387 00:16:25,640 --> 00:16:28,730 som vi vil gi deg i oppgave satt sju distribusjons kode, som 388 00:16:28,730 --> 00:16:31,490 tar minst ett argument, som er bare en streng. 389 00:16:31,490 --> 00:16:33,460 En streng med SQL-kode. 390 00:16:33,460 --> 00:16:36,700 I så fall er du i ferd med å lære å skrive Structured Query Language. 391 00:16:36,700 --> 00:16:41,270 >> Hvis jeg ønsker å sette inn en ny rad i min database fordi noen har sendt inn 392 00:16:41,270 --> 00:16:47,600 et skjema for å koden min, ville jeg bokstavelig talt skrive INSERT INTO brukere følgende 393 00:16:47,600 --> 00:16:52,800 felt: brukernavn, komma, navn, verdiene, 394 00:16:52,800 --> 00:16:57,480 og nå trenger jeg for å sette inn noe som Malan, og sitat, 395 00:16:57,480 --> 00:17:01,490 unquote 'David Malan. Og nå selv for de som ikke kjenner SQL, 396 00:17:01,490 --> 00:17:07,830 hvorfor jeg bruker apostrof innsiden av denne grønne string? 397 00:17:07,830 --> 00:17:10,790 398 00:17:10,790 --> 00:17:13,040 Hva kan være årsaken her? 399 00:17:13,040 --> 00:17:14,609 >> Legg merke til jeg er co-mingling to språk. 400 00:17:14,609 --> 00:17:18,099 Søket er et PHP-funksjonen, men det tar et argument. 401 00:17:18,099 --> 00:17:21,740 Og det argumentet må selv være skrevet på et annet språk kalt 402 00:17:21,740 --> 00:17:23,500 SQL, Structured Query Language. 403 00:17:23,500 --> 00:17:27,940 Så, alt som jeg har nettopp fremhevet her 404 00:17:27,940 --> 00:17:30,380 er dette språket kalles SQL. 405 00:17:30,380 --> 00:17:36,290 Så, hva skjer med de enkle anførselstegn, akkurat som en rask tilregnelighet sjekk? 406 00:17:36,290 --> 00:17:37,324 Gå videre. 407 00:17:37,324 --> 00:17:37,990 De er strenger. 408 00:17:37,990 --> 00:17:41,590 Så, sitat, unquote Malan og sitat, unquote David Malan er strenger. 409 00:17:41,590 --> 00:17:45,210 Og bare tenker intuitivt nå, vite hva du vet om C og PHP, 410 00:17:45,210 --> 00:17:50,220 hvorfor gjorde jeg ikke dette, som jeg vanligvis brukte doble anførselstegn for strenger? 411 00:17:50,220 --> 00:17:52,310 Hvorfor gjorde jeg ikke ønsker å gjøre det? 412 00:17:52,310 --> 00:17:52,810 Yeah? 413 00:17:52,810 --> 00:17:53,685 >> PUBLIKUM: [uhørbart] 414 00:17:53,685 --> 00:17:56,695 415 00:17:56,695 --> 00:17:57,570 DAVID MALAN: Nettopp. 416 00:17:57,570 --> 00:17:59,653 Fordi jeg allerede bruker anførselstegn på vei 417 00:17:59,653 --> 00:18:01,929 utsiden av argumentet til PHP-funksjonen, 418 00:18:01,929 --> 00:18:03,470 Jeg ville bare forvirre tolk. 419 00:18:03,470 --> 00:18:04,860 Det vil ikke vet, disse gå sammen? 420 00:18:04,860 --> 00:18:05,735 Har disse gå sammen? 421 00:18:05,735 --> 00:18:06,810 Har disse gå sammen? 422 00:18:06,810 --> 00:18:08,070 Så, jeg veksler i stedet. 423 00:18:08,070 --> 00:18:11,784 >> Eller jeg kunne gjøre noe som dette, backslash sitat eller backslash sitat. 424 00:18:11,784 --> 00:18:14,200 Oppriktig, som bare begynner å får veldig uleselig og stygg. 425 00:18:14,200 --> 00:18:16,790 Men det ville oppnå det samme resultat også. 426 00:18:16,790 --> 00:18:19,760 >> Så, hvis jeg skulle utføre dette spørring nå, la oss se hva som skjer. 427 00:18:19,760 --> 00:18:22,740 Jeg kommer til å gå videre nå og heller enn kjøre PHP-koden, som 428 00:18:22,740 --> 00:18:24,610 er hvor du vil spille i oppgavesettet syv, 429 00:18:24,610 --> 00:18:27,200 Jeg kommer til å gå i stedet for å PHP MyAdmin. 430 00:18:27,200 --> 00:18:29,770 Og jeg manuelt gå å gå til kategorien SQL, 431 00:18:29,770 --> 00:18:31,580 og la meg zoome inn på grensesnittet. 432 00:18:31,580 --> 00:18:34,007 Og jeg kommer til å lime inn i det jeg nettopp skrev. 433 00:18:34,007 --> 00:18:36,090 Og fargekoding har endret litt nå, 434 00:18:36,090 --> 00:18:38,750 bare fordi programformater ting litt annerledes. 435 00:18:38,750 --> 00:18:41,960 Men legg merke til at alt jeg har gjort er jeg har sagt, setter inn brukere. 436 00:18:41,960 --> 00:18:45,790 Jeg har spesifisert, da, i et komma separert parentes liste de to 437 00:18:45,790 --> 00:18:48,850 felt som jeg ønsker å sette inn, og da har jeg bokstavelig talt sa verdier 438 00:18:48,850 --> 00:18:51,510 etterfulgt av en annen paren, og deretter de to verdiene 439 00:18:51,510 --> 00:18:53,520 Jeg ønsker å plug-in, og nå for godt mål, 440 00:18:53,520 --> 00:18:55,010 Jeg skal sette et semikolon på slutten. 441 00:18:55,010 --> 00:18:56,570 Så dette er ikke C. Dette er ikke PHP. 442 00:18:56,570 --> 00:18:59,970 Dette er nå SQL, og jeg lime den inn i denne web-basert grensesnitt som er 443 00:18:59,970 --> 00:19:02,710 bare tenkt å la meg, så snart jeg klikker Go, 444 00:19:02,710 --> 00:19:08,060 utføre dette søket på databasen kjører innsiden av CS50 IDE. 445 00:19:08,060 --> 00:19:09,470 >> Så dette er bra. 446 00:19:09,470 --> 00:19:12,520 Legg merke til at sa en rad satt inn, gikk super fort, 447 00:19:12,520 --> 00:19:15,190 0,0054 sekunder for å sette inn disse dataene. 448 00:19:15,190 --> 00:19:16,610 Så, det høres ganske sunt. 449 00:19:16,610 --> 00:19:19,350 Det formatert min spørring for meg her bare for å se det 450 00:19:19,350 --> 00:19:21,730 i form av fargekodede versjon. 451 00:19:21,730 --> 00:19:24,540 Men nå hvis jeg klikker Bla, legge merke til at selv 452 00:19:24,540 --> 00:19:29,070 selv om det er mye rot på skjermen, har mitt bord nå to rader. 453 00:19:29,070 --> 00:19:30,700 >> Så, la meg gå videre og gjøre en annen. 454 00:19:30,700 --> 00:19:33,760 I stedet for dette, la meg gå til fanen SQL igjen. 455 00:19:33,760 --> 00:19:40,723 Og denne gangen skal jeg sette inn noe sånt Rob og hans navn skal være Rob Bowden. 456 00:19:40,723 --> 00:19:42,330 Bowden. 457 00:19:42,330 --> 00:19:44,040 La oss klikker du Lagre. 458 00:19:44,040 --> 00:19:46,140 Oops, heller gå. 459 00:19:46,140 --> 00:19:48,890 >> Klikk Bla gjennom igjen, og Nå merker jeg har to rader. 460 00:19:48,890 --> 00:19:52,390 Så dette er bare en måte mer komplisert måte å åpne opp Google Spreadsheets 461 00:19:52,390 --> 00:19:54,010 og bare å skrive en rad i en kolonne. 462 00:19:54,010 --> 00:19:57,070 Men hva er nøkkelen er at vi nå har syntaksen 463 00:19:57,070 --> 00:20:00,220 som å skrive koden slik at til slutt, kunne vi faktisk 464 00:20:00,220 --> 00:20:01,790 gjøre noe og dette. 465 00:20:01,790 --> 00:20:05,380 Husker at PHP støtter super globale variabler. 466 00:20:05,380 --> 00:20:08,415 >> Hva er innsiden av dollar logg strek GET i PHP? 467 00:20:08,415 --> 00:20:10,290 Vi tok en titt på en eller to enkle eksempler. 468 00:20:10,290 --> 00:20:15,640 Og i PSet6, husker du har hallo dot PHP som bruker denne variabelen. 469 00:20:15,640 --> 00:20:17,870 Hva går inn der? 470 00:20:17,870 --> 00:20:21,015 Eller hva er det? 471 00:20:21,015 --> 00:20:22,522 En litt høyere. 472 00:20:22,522 --> 00:20:23,790 >> PUBLIKUM: [uhørbart] 473 00:20:23,790 --> 00:20:25,030 >> DAVID MALAN: Det er en snø frø av array, som 474 00:20:25,030 --> 00:20:27,714 er bare en fancy måte å si en array som har sentrale verdiparene. 475 00:20:27,714 --> 00:20:28,880 Og tastene er ikke numerisk. 476 00:20:28,880 --> 00:20:30,420 De er ord eller strenger. 477 00:20:30,420 --> 00:20:32,750 Og spesielt hva er de sentrale verdiparene? 478 00:20:32,750 --> 00:20:35,110 Hvor kommer de fra? 479 00:20:35,110 --> 00:20:35,620 Sorry? 480 00:20:35,620 --> 00:20:36,994 >> PUBLIKUM: [uhørbart] 481 00:20:36,994 --> 00:20:37,660 DAVID MALAN: Nei? 482 00:20:37,660 --> 00:20:40,700 Hvor de nøkkelen verdi-par kommer fra? 483 00:20:40,700 --> 00:20:42,490 Si igjen? 484 00:20:42,490 --> 00:20:44,610 Igjen? 485 00:20:44,610 --> 00:20:46,472 Er jeg den eneste som hører noe? 486 00:20:46,472 --> 00:20:47,810 >> [LAUGHTER] 487 00:20:47,810 --> 00:20:49,042 >> Det er riktig, ja? 488 00:20:49,042 --> 00:20:50,435 >> PUBLIKUM: [uhørbart] 489 00:20:50,435 --> 00:20:52,560 DAVID MALAN: Ja, de kommer fra søkestrengen. 490 00:20:52,560 --> 00:20:55,380 Så, hvis du spole tilbake i tid for å når vi har spilt med Google 491 00:20:55,380 --> 00:20:59,600 og vi har gått til Google.com slash søk spørsmålstegn q lik katter, 492 00:20:59,600 --> 00:21:03,550 hvis jeg skulle treffe på Enter, og hvis Google ble implementert i PHP, 493 00:21:03,550 --> 00:21:07,017 PHP-kode som Google skrev ville ha tilgang til dollartegn 494 00:21:07,017 --> 00:21:11,600 underst GET innsiden av som er en nøkkel kalt Q og en verdi 495 00:21:11,600 --> 00:21:17,680 kalt katter som det da kan bruke pleide å gjøre en faktisk søk ​​med. 496 00:21:17,680 --> 00:21:20,860 >> Så, faktisk, hva jeg kommer til å gjøre nå er å gå tilbake til min PHP-kode 497 00:21:20,860 --> 00:21:23,140 at du vil igjen se mer av i PSet7. 498 00:21:23,140 --> 00:21:25,440 Og i stedet for å koble i hardt kodede verdier som 499 00:21:25,440 --> 00:21:27,630 ser ikke ut som en veldig dynamisk nettside, 500 00:21:27,630 --> 00:21:30,680 Jeg kommer til å gi deg en teaser av hva din faktiske koden ville gjøre. 501 00:21:30,680 --> 00:21:32,854 Du ville sette seg i to spørsmålstegn som dette. 502 00:21:32,854 --> 00:21:34,270 Jeg vet ikke hva brukernavnet er. 503 00:21:34,270 --> 00:21:37,390 Jeg vet ikke hva Navnet kommer til å være, 504 00:21:37,390 --> 00:21:39,470 men jeg vet jeg kan få dem dynamisk. 505 00:21:39,470 --> 00:21:43,420 >> Så, hvis koden vi skriver nå er koden kjører på Googles servere, 506 00:21:43,420 --> 00:21:46,940 eller om dette er hei dot PHP, som kommer med PSet6, 507 00:21:46,940 --> 00:21:48,650 Jeg kommer til å passere inn spørringen funksjon 508 00:21:48,650 --> 00:21:51,450 akkurat som printf, to andre argumenter. 509 00:21:51,450 --> 00:21:57,120 GET, sitat, unquote brukernavn, og GET, sitat, unquote navn. 510 00:21:57,120 --> 00:22:00,720 Og nå, legge merke til hva generell struktur er her. 511 00:22:00,720 --> 00:22:03,320 Jeg har fått til venstre side av samtalen, 512 00:22:03,320 --> 00:22:05,480 Denne funksjonen kalles spørring i PHP. 513 00:22:05,480 --> 00:22:08,160 Jeg har fortsatt som en først argument, bare en tekststreng. 514 00:22:08,160 --> 00:22:11,000 >> Men at tekststreng er skrevet på et språk som kalles SQL. 515 00:22:11,000 --> 00:22:12,616 Og ærlig talt, det er ikke et stort språk. 516 00:22:12,616 --> 00:22:14,990 Vi kommer bare til å snakke om det formelt i dag, egentlig. 517 00:22:14,990 --> 00:22:17,031 Og deretter i oppgavesettet syv, det er relativt 518 00:22:17,031 --> 00:22:18,800 noen funksjoner som vi er kommer til å utnytte. 519 00:22:18,800 --> 00:22:22,530 Spørsmålstegnene, men mener plugge inn en verdi her, og plugg i en annen valuta 520 00:22:22,530 --> 00:22:23,130 her. 521 00:22:23,130 --> 00:22:26,010 Og legg merke til, jeg har utelatt hva fra hele quote-- jævla 522 00:22:26,010 --> 00:22:30,470 it rundt sitatet markerer denne gangen. 523 00:22:30,470 --> 00:22:34,930 Jeg har utelatt sitatet tegn rundt spørsmålstegn, 524 00:22:34,930 --> 00:22:36,410 beklager, denne gangen rundt. 525 00:22:36,410 --> 00:22:38,870 >> Så, hva er fint om dette spørsmålstegn funksjon som 526 00:22:38,870 --> 00:22:42,830 PHP har en tendens til å støtte, Ruby og Python og andre språk, 527 00:22:42,830 --> 00:22:45,730 Dette betyr bare plugg i noen verds her og vet du hva? 528 00:22:45,730 --> 00:22:48,300 Du regne ut om du vil bruke apostrof eller doble anførselstegn. 529 00:22:48,300 --> 00:22:50,966 Ikke bry meg med dem intellektuelt uinteressante detaljer. 530 00:22:50,966 --> 00:22:53,780 Men, pass på at det er riktig slik at koden min er slutt 531 00:22:53,780 --> 00:22:57,010 operasjonell og trygg, som vil ha en mening før lenge. 532 00:22:57,010 --> 00:23:00,460 >> Nå, hvor mange argumenter totalt, bare for å være klar, er spørsmålet funksjonen tar? 533 00:23:00,460 --> 00:23:05,240 534 00:23:05,240 --> 00:23:07,581 Alle som ønsker å stemme for mer enn to? 535 00:23:07,581 --> 00:23:08,080 Tre? 536 00:23:08,080 --> 00:23:10,001 Jada, hvorfor? 537 00:23:10,001 --> 00:23:10,920 Hvorfor tre? 538 00:23:10,920 --> 00:23:12,305 >> PUBLIKUM: [uhørbart] 539 00:23:12,305 --> 00:23:13,180 DAVID MALAN: Nettopp. 540 00:23:13,180 --> 00:23:14,610 Den første delen er strengen. 541 00:23:14,610 --> 00:23:18,640 Det andre argumentet er dollartegn underst GET brakett brukernavn. 542 00:23:18,640 --> 00:23:21,950 Og den tredje argumentet er samme, men bare navnet. 543 00:23:21,950 --> 00:23:24,590 Så med andre ord, nå hvis jeg hadde et webskjema 544 00:23:24,590 --> 00:23:27,149 som måtte tekstfelt, en for brukerens brukernavn, 545 00:23:27,149 --> 00:23:29,690 en for hans eller hennes navn, bare som du ville se på en nettside 546 00:23:29,690 --> 00:23:32,120 når du registrerer deg for noen nettside, kan dette 547 00:23:32,120 --> 00:23:35,450 være koden på baksiden slutten som faktisk gjør innsetting nå 548 00:23:35,450 --> 00:23:37,220 inn i databasen. 549 00:23:37,220 --> 00:23:40,870 >> Nå derimot, la oss spole frem. 550 00:23:40,870 --> 00:23:43,840 Anta at en bruker er nå logge inn og du vil 551 00:23:43,840 --> 00:23:48,860 å skrive PHP-kode som sjekker om den personen som nettopp logget inn 552 00:23:48,860 --> 00:23:52,250 er faktisk en bruker, kan du bruker ganske enkel syntaks. 553 00:23:52,250 --> 00:23:55,832 Du kan si SELECT, la oss si Star, hvor stjerne betyr alt. 554 00:23:55,832 --> 00:23:57,540 Jeg vet ikke hva jeg vil, så bare gi meg 555 00:23:57,540 --> 00:24:01,585 alle kolonnene fra tabellen kalt brukere der, og dette er hyggelig. 556 00:24:01,585 --> 00:24:03,710 Velg støtter hva som er kalt et predikat, som er 557 00:24:03,710 --> 00:24:06,630 som en måte å kvalifisere hva du vil. 558 00:24:06,630 --> 00:24:10,590 Der brukernavn er lik sitat, unquote Malan. 559 00:24:10,590 --> 00:24:13,680 Så også her, jeg har innebygd inne argumentet 560 00:24:13,680 --> 00:24:16,110 til en PHP-funksjon, en linje av SQL-kode. 561 00:24:16,110 --> 00:24:18,680 Og at SQL-kode dette tid er bokstavelig talt går 562 00:24:18,680 --> 00:24:21,790 for å søke etter sitat, unquote Malan. 563 00:24:21,790 --> 00:24:24,420 >> Nå det er ikke alle som nyttig, så jeg kommer til å hoppe over det 564 00:24:24,420 --> 00:24:28,650 og jeg kommer til å sette bort dette tipset fra Brady, og gå 565 00:24:28,650 --> 00:24:30,990 og plug-in i stedet et spørsmålstegn her. 566 00:24:30,990 --> 00:24:33,290 Så, bare for å være klar, hva bør mitt andre argument 567 00:24:33,290 --> 00:24:37,480 bli hvis noen har bare logget inn og jeg lurt å sjekke om han eller hun er faktisk 568 00:24:37,480 --> 00:24:39,265 en bruker? 569 00:24:39,265 --> 00:24:40,140 PUBLIKUM: [uhørbart] 570 00:24:40,140 --> 00:24:40,890 DAVID MALAN: Yeah. 571 00:24:40,890 --> 00:24:44,120 Jeg hører dollartegn strek GET sitat, unquote brukernavn. 572 00:24:44,120 --> 00:24:50,040 Og som bør komme tilbake til meg noen av radene i min database 573 00:24:50,040 --> 00:24:51,986 som har et brukernavn av Malan. 574 00:24:51,986 --> 00:24:54,860 Nå forhåpentligvis, jeg kommer til å komme tilbake null hvis Malan har aldri vært 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 skal ikke komme tilbake 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ørbart] 579 00:25:00,220 --> 00:25:01,120 >> DAVID MALAN: Jeg sa unik, ikke sant? 580 00:25:01,120 --> 00:25:01,750 Enkel grunn. 581 00:25:01,750 --> 00:25:04,030 Fordi jeg sa at det er nødt til å være unik, bare logisk, 582 00:25:04,030 --> 00:25:07,940 du kan bare ha null eller ett Malans i denne spesielle databasetabell. 583 00:25:07,940 --> 00:25:10,965 Nå som en side, bare så du har sett det, selv om jeg fortsetter å bruke GET 584 00:25:10,965 --> 00:25:14,350 og selv om PSet6 bare brukt Get, kan du sikkert ha POST. 585 00:25:14,350 --> 00:25:17,212 Og minner om at Post er en annen teknikk for å sende inn informasjon 586 00:25:17,212 --> 00:25:19,170 fra et skjema, men det vises ikke i nettadressen. 587 00:25:19,170 --> 00:25:22,690 Det er litt mer sikker sikkert for ting som brukernavn og passord, 588 00:25:22,690 --> 00:25:25,210 som PSet7 vil i virkeligheten innebære. 589 00:25:25,210 --> 00:25:28,130 >> Så, la oss gjøre dette i PHP MyAdmin og se hva som skjer. 590 00:25:28,130 --> 00:25:30,020 Jeg kommer til å gå til fanen MySQL. 591 00:25:30,020 --> 00:25:34,450 Og legg merke til at standardverdien for PHP MyAdmin, bare for å prøve å være nyttig, 592 00:25:34,450 --> 00:25:37,050 er å velge stjernen fra brukerne hvor man. 593 00:25:37,050 --> 00:25:39,430 Vel, er man alltid sant, så dette har dum effektiv 594 00:25:39,430 --> 00:25:40,400 for bare å velge alt. 595 00:25:40,400 --> 00:25:42,691 Men jeg kommer til å være litt mer pedantisk og manuelt 596 00:25:42,691 --> 00:25:45,920 skriv ut SELECT stjerne fra brukere. 597 00:25:45,920 --> 00:25:48,294 >> Nå teknisk, kan du oppgi navnet på bordene. 598 00:25:48,294 --> 00:25:50,460 Det er sjelden at du må, men legg merke til disse er ikke 599 00:25:50,460 --> 00:25:52,240 normale sitater på amerikansk tastatur. 600 00:25:52,240 --> 00:25:54,760 Dette er den såkalte accent grave, hvilken er vanligvis på venstre hånd 601 00:25:54,760 --> 00:25:56,000 hjørne av tastaturet. 602 00:25:56,000 --> 00:25:58,500 Men det er sjelden at du vil faktisk trenger å bry deg med det, 603 00:25:58,500 --> 00:25:59,950 så jeg skal bare hoppe over dem uansett. 604 00:25:59,950 --> 00:26:02,280 Så nå, la meg gå videre og treffe gå. 605 00:26:02,280 --> 00:26:06,616 Og hvor mange rader bør jeg få tilbake når jeg velger stjerne fra brukerne? 606 00:26:06,616 --> 00:26:08,407 >> PUBLIKUM: [uhørbart] 607 00:26:08,407 --> 00:26:09,990 DAVID MALAN: Antall rader, sikker. 608 00:26:09,990 --> 00:26:12,390 Men hvor mange i denne betong story akkurat nå? 609 00:26:12,390 --> 00:26:14,640 To, fordi det var meg og det var Rob. 610 00:26:14,640 --> 00:26:19,370 Så, hvis jeg klikker OK, jeg ser visuelt at Jeg har fått tilbake, ja, to rader. 611 00:26:19,370 --> 00:26:22,060 Det er mye rot på skjermen, men jeg ser bare to rader. 612 00:26:22,060 --> 00:26:28,580 Derimot, hvis jeg gjør dette igjen og gjøre SELECT stjerne fra brukere, der brukernavn 613 00:26:28,580 --> 00:26:31,840 lik sitat, unquote Malan, nå hvis jeg klikker Go, 614 00:26:31,840 --> 00:26:33,970 Jeg bare kommer til å få tilbake en rad. 615 00:26:33,970 --> 00:26:36,499 Og til slutt, hvis jeg gjør noe som dette, antar 616 00:26:36,499 --> 00:26:38,290 at jeg ikke bryr seg om få alt, 617 00:26:38,290 --> 00:26:41,020 som er slags meningsløst nå, fordi det er bare to kolonner. 618 00:26:41,020 --> 00:26:43,103 Det er ikke som jeg har valgt en enorm mengde data. 619 00:26:43,103 --> 00:26:46,720 Anta at jeg gå videre og trenger SELECT navn FROM 620 00:26:46,720 --> 00:26:51,990 brukere, der brukernavn tilsvarer Malan, hva er fint om SQL ærlig, 621 00:26:51,990 --> 00:26:54,290 er at det egentlig bare gjør det du ber den om. 622 00:26:54,290 --> 00:26:57,550 Det er ganske kortfattet, men du bokstavelig talt bare fortelle det hva du vil gjøre. 623 00:26:57,550 --> 00:27:01,130 Velg navn fra brukere der brukernavn lik Malan. 624 00:27:01,130 --> 00:27:03,440 Og det virkelig er så eksplisitt. 625 00:27:03,440 --> 00:27:08,410 Så nå hvis jeg treffer Go, hvor mange rekker jeg kommer til å komme tilbake? 626 00:27:08,410 --> 00:27:10,770 En, fordi det er bare Malan, forhåpentligvis. 627 00:27:10,770 --> 00:27:13,100 Eller null hvis han ikke er der, men en maksimalt. 628 00:27:13,100 --> 00:27:17,610 >> Og hvor mange kolonner vil jeg komme tilbake? 629 00:27:17,610 --> 00:27:18,450 Hvor mange kolonner? 630 00:27:18,450 --> 00:27:20,658 Denne gangen, jeg bare går å få en fordi jeg ikke 631 00:27:20,658 --> 00:27:22,380 Velg stjernen, som er alt. 632 00:27:22,380 --> 00:27:27,900 Nå er jeg velge bare navn, så jeg bare få tilbake en kolonne og en rad. 633 00:27:27,900 --> 00:27:31,730 Og det ser liksom hensiktsmessig latterlig, bare ser super 634 00:27:31,730 --> 00:27:33,060 liten som dette. 635 00:27:33,060 --> 00:27:34,290 Så, hva er det egentlig som skjer? 636 00:27:34,290 --> 00:27:36,890 Når du utfører et SQL spørring ved hjelp velger, 637 00:27:36,890 --> 00:27:38,700 hva du får tilbake fra databasen 638 00:27:38,700 --> 00:27:42,970 er som en midlertidig tabell med rader og kolonner, kanskje, 639 00:27:42,970 --> 00:27:46,260 men det utelater noe som ble faktisk ikke valgt av deg. 640 00:27:46,260 --> 00:27:49,010 Så, er det som om noen hadde en stor regneark med alle elevene 641 00:27:49,010 --> 00:27:51,610 registrert for noen studentgruppe, og du sier, 642 00:27:51,610 --> 00:27:55,097 gi meg alt av freshman som har registrert for vår studentgruppe, hva 643 00:27:55,097 --> 00:27:56,930 din kollega i studentgruppe kan gjøre 644 00:27:56,930 --> 00:27:58,430 er de bare kunne levere du hele regnearket. 645 00:27:58,430 --> 00:27:59,742 Det er som å si velger stjerne. 646 00:27:59,742 --> 00:28:02,200 Og det er litt irriterende hvis du bare ønsket freshman. 647 00:28:02,200 --> 00:28:05,640 Og så, hvis du i stedet sa, Velg stjerne fra database tabell 648 00:28:05,640 --> 00:28:08,470 hvor året er lik sitat, unquote freshman, 649 00:28:08,470 --> 00:28:10,810 det er som om din venn i studentgruppen 650 00:28:10,810 --> 00:28:13,770 bokstavelig markert og kopierte bare freshman rader, 651 00:28:13,770 --> 00:28:16,780 limt dem inn i en ny Google Regneark eller en Excel-fil, 652 00:28:16,780 --> 00:28:18,860 og ga deg tilbake resulterer bare fil. 653 00:28:18,860 --> 00:28:21,710 Det er alt som kommer på konseptuelt her. 654 00:28:21,710 --> 00:28:23,920 >> Så til slutt, kan vi gjøre noen ganske fancy ting 655 00:28:23,920 --> 00:28:26,560 ved å lagre ting som brukernavn og passord og lignende. 656 00:28:26,560 --> 00:28:30,310 Men, det viser seg, skal vi gjøre en litt annen måte enn dette. 657 00:28:30,310 --> 00:28:34,750 Det er ikke så smart å bare lagre et brukernavn og et passord. 658 00:28:34,750 --> 00:28:37,790 Noen tidligere, tror jeg her nede, foreslo en ID. 659 00:28:37,790 --> 00:28:40,787 Nå en ID kan være som en Harvard-ID eller Yale netto ID, 660 00:28:40,787 --> 00:28:42,870 men det kan være enda enklere i vår database tilfelle. 661 00:28:42,870 --> 00:28:45,120 Og ja, den felles saken er å ha en annen kolonne. 662 00:28:45,120 --> 00:28:46,953 Og jeg kommer til å gå videre og redigere mitt bord. 663 00:28:46,953 --> 00:28:49,521 Og hvis du leke deg med dette grensesnittet for PSet7, 664 00:28:49,521 --> 00:28:51,770 vil du se at du kan sjekke denne knappen her og legge 665 00:28:51,770 --> 00:28:53,750 et felt ved begynnelsen av tabellen. 666 00:28:53,750 --> 00:28:56,720 Og nå hvis jeg klikker Go, kommer det til å gi meg en av disse formene 667 00:28:56,720 --> 00:28:57,600 fra tidligere. 668 00:28:57,600 --> 00:29:00,170 Jeg kommer til å legge til et felt som heter ID. 669 00:29:00,170 --> 00:29:03,070 Og jeg kommer til å gjøre det til en numerisk type. 670 00:29:03,070 --> 00:29:05,362 >> Jeg har en hel haug av verdier for tallverdier. 671 00:29:05,362 --> 00:29:08,677 Jeg skal bare velge en INT og Ikke bekymre deg om de ulike størrelsene. 672 00:29:08,677 --> 00:29:10,510 Jeg trenger ikke å oppgi en lengde eller en verdi, 673 00:29:10,510 --> 00:29:13,710 fordi det kommer til å være 32 biter uansett. 674 00:29:13,710 --> 00:29:16,070 Attributter, fikk vi ikke se før. 675 00:29:16,070 --> 00:29:18,410 Noen interesse i en hvilken som helst av disse menyalternativer denne gangen? 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 Hva gjorde du foreslår? 679 00:29:24,620 --> 00:29:27,350 680 00:29:27,350 --> 00:29:28,445 Nei? 681 00:29:28,445 --> 00:29:29,570 Har noen av disse fornuftig? 682 00:29:29,570 --> 00:29:30,536 Yeah. 683 00:29:30,536 --> 00:29:31,900 Ja, usignert, ikke sant? 684 00:29:31,900 --> 00:29:35,930 >> Vanligvis til hvis vi skal gi alle et unikt nummer, som 685 00:29:35,930 --> 00:29:38,200 er der denne historien er går jeg egentlig bare vil ha 686 00:29:38,200 --> 00:29:41,919 en person å ha nummer lik null og en og to og tre og fire. 687 00:29:41,919 --> 00:29:43,710 Jeg trenger ikke å forholde seg til med negative tall. 688 00:29:43,710 --> 00:29:45,210 Det virker bare som utilbørlig kompleksitet. 689 00:29:45,210 --> 00:29:48,470 Jeg ønsker fire milliarder mulige verdier, ikke fire milliarder mulige verdier, 690 00:29:48,470 --> 00:29:50,699 så jeg bare doblet kapasitet på min INT. 691 00:29:50,699 --> 00:29:53,490 Som en side, hvis du ønsker å forholde seg dette til noe sånt som Facebook, 692 00:29:53,490 --> 00:29:56,190 tilbake i form av dagen min da Facebook først kom ut, 693 00:29:56,190 --> 00:29:59,510 Jeg tror hva de var bruker i sin MySQL database 694 00:29:59,510 --> 00:30:02,856 å lagre en brukers identifikator, var bare en INT. 695 00:30:02,856 --> 00:30:05,230 Men selvfølgelig, det er mye av virkelige mennesker i verden. 696 00:30:05,230 --> 00:30:07,438 Det er mye av falske Facebook kontoer i verden. 697 00:30:07,438 --> 00:30:11,701 Og så til slutt, Facebook flyt på størrelse med et INT, en fire milliarder 698 00:30:11,701 --> 00:30:12,200 verdi. 699 00:30:12,200 --> 00:30:15,032 Som er grunnen, hvis du ser rundt, og det finnes nettsteder 700 00:30:15,032 --> 00:30:16,740 som kan fortelle deg hva din unike ID er. 701 00:30:16,740 --> 00:30:19,781 Og hvis du velger aldri et brukernavn i Facebook, vil du se din unike ID. 702 00:30:19,781 --> 00:30:23,080 Jeg tror det er profilen dot PHP spørsmålstegn ID lik noe. 703 00:30:23,080 --> 00:30:27,210 Det er nå noe som en stor INT, eller en lang lang om du vil, 704 00:30:27,210 --> 00:30:29,700 som er en 64-bits verdi eller noe tilsvarende. 705 00:30:29,700 --> 00:30:33,620 >> Så, selv i den virkelige verden gjør disse problemstillinger slutt noen ganger rolle. 706 00:30:33,620 --> 00:30:37,600 Og det viser seg her, hvis jeg er å gi alle mine brukere en unik ID, 707 00:30:37,600 --> 00:30:41,750 Jeg ønsker å være super eksplisitt og minimal gjøre dette feltet unikt. 708 00:30:41,750 --> 00:30:44,750 Men det viser seg at det er en stykke nomenklatur i dag også 709 00:30:44,750 --> 00:30:46,470 det er en primærnøkkel. 710 00:30:46,470 --> 00:30:49,800 Hvis du utformer en database bord og du vet på forhånd 711 00:30:49,800 --> 00:30:55,580 at en av kolonnene i tabellen bør og vil entydig identifisere rader 712 00:30:55,580 --> 00:30:58,500 i tabellen, vil du spesifisere det og fortelle databasen, 713 00:30:58,500 --> 00:31:00,250 dette er min primærnøkkel. 714 00:31:00,250 --> 00:31:02,110 Det kan være duplikater i andre felt, 715 00:31:02,110 --> 00:31:06,330 men jeg fortelle databasen som dette er mitt primære, min viktigste feltet, 716 00:31:06,330 --> 00:31:08,420 som er garantert å være unik. 717 00:31:08,420 --> 00:31:09,660 >> Nå, dette synes overflødig. 718 00:31:09,660 --> 00:31:13,830 Jeg er nå foreslår at vi legge til, ved å klikke Lagre her, 719 00:31:13,830 --> 00:31:17,210 et felt called-- og jeg kommer å gå videre og klikk AI, 720 00:31:17,210 --> 00:31:19,720 vi vil komme tilbake til det i et øyeblikk, Spar. 721 00:31:19,720 --> 00:31:22,540 Jeg foreslår nå at mitt bord se slik ut. 722 00:31:22,540 --> 00:31:26,305 Jeg har en INT felt kalt ID, en CHAR felt som heter brukernavn, 723 00:31:26,305 --> 00:31:31,100 en VARCHAR felt kalt navn, men ID, hvis det er primær og derfor unikt, 724 00:31:31,100 --> 00:31:33,760 hvorfor gjorde jeg bare kaste bort tid å introdusere det 725 00:31:33,760 --> 00:31:39,140 er effektivt en andre unik felt som heter ID som er en INT? 726 00:31:39,140 --> 00:31:41,980 >> Brukernavn, husker, var allerede unik, sa vi. 727 00:31:41,980 --> 00:31:45,350 Så bare logisk, trenger du ikke noen database erfaring til grunn 728 00:31:45,350 --> 00:31:47,570 gjennom dette, hvorfor kanskje jeg har introdusert 729 00:31:47,570 --> 00:31:50,065 en INT som min unik identifikator også? 730 00:31:50,065 --> 00:31:52,740 731 00:31:52,740 --> 00:31:53,930 Hva er det som sier dette-- igjen? 732 00:31:53,930 --> 00:31:55,580 >> PUBLIKUM: [uhørbart] 733 00:31:55,580 --> 00:31:59,534 >> DAVID MALAN: Random tilgang er enklere, hvorfor? 734 00:31:59,534 --> 00:32:00,410 >> PUBLIKUM: [uhørbart] 735 00:32:00,410 --> 00:32:02,367 DAVID MALAN: Ja, det er bare tilgang til tallene. 736 00:32:02,367 --> 00:32:04,750 Så, hvis du tenker på dette virkelig er en tabell, slik som en matrise, 737 00:32:04,750 --> 00:32:07,690 nå har jeg unike identifikatorer at jeg kan hoppe rundt. 738 00:32:07,690 --> 00:32:11,520 Og bedre enn det som fremdeles er at hvor stor er en INT kommer til å bli igjen? 739 00:32:11,520 --> 00:32:14,450 740 00:32:14,450 --> 00:32:15,800 32 bits eller fire byte. 741 00:32:15,800 --> 00:32:17,750 >> Hvor stor er brukernavnet mitt kommer til å 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 omsorg om ytelsen til koden, 746 00:32:26,080 --> 00:32:31,390 tenker tilbake til PSet5, ville du foretrekke for å søke etter en fire byte verdi eller en 16 747 00:32:31,390 --> 00:32:32,240 byte verdi, ikke sant? 748 00:32:32,240 --> 00:32:33,810 Det er virkelig så enkelt som det. 749 00:32:33,810 --> 00:32:38,060 Du må gjøre fire ganger så mye arbeid å søke etter brukernavn fordi disse 750 00:32:38,060 --> 00:32:38,830 er 16 bytes. 751 00:32:38,830 --> 00:32:41,320 Så må du bokstavelig talt sammenligne alle 16 bytes å være 752 00:32:41,320 --> 00:32:43,140 at ja, dette brukernavnet jeg vil. 753 00:32:43,140 --> 00:32:46,610 Mens det for en INT, kan du gjøre det med bare fire bytes. 754 00:32:46,610 --> 00:32:49,212 >> Og som en side for de interessert i maskinvare, 755 00:32:49,212 --> 00:32:52,420 det viser seg at du får plass til noe sånt en INT eller en 32-bits verdi i noe 756 00:32:52,420 --> 00:32:55,330 kalles et register i en datamaskin CPU, noe som betyr at det er super, 757 00:32:55,330 --> 00:32:58,400 super rask, selv på laveste nivå av datamaskinens maskinvare. 758 00:32:58,400 --> 00:33:00,530 Så, det er bare fordeler rundt. 759 00:33:00,530 --> 00:33:01,530 Så, hva betyr dette? 760 00:33:01,530 --> 00:33:04,850 Faktisk, når du designer en databasetabell, nesten hele tiden 761 00:33:04,850 --> 00:33:07,170 skal du ha ikke bare de dataene du bryr deg om, 762 00:33:07,170 --> 00:33:09,280 men også noe sånt en unik identifikator 763 00:33:09,280 --> 00:33:11,280 fordi dette skal la oss gjøre andre ting. 764 00:33:11,280 --> 00:33:13,160 Og la oss reise over ett problem her. 765 00:33:13,160 --> 00:33:15,990 >> Anta at brukerne har ikke bare brukernavn og navn, 766 00:33:15,990 --> 00:33:19,540 men de har også ting som byer og stater og postnummer, minst 767 00:33:19,540 --> 00:33:20,432 her i USA. 768 00:33:20,432 --> 00:33:22,390 Så, jeg kommer til å gå videre og bare raskt si, 769 00:33:22,390 --> 00:33:26,180 gi meg tre kolonner ved enden av bordet. 770 00:33:26,180 --> 00:33:28,900 Og dette kommer til å være by, dette kommer til å være stat, 771 00:33:28,900 --> 00:33:30,400 og dette kommer til å være Zip. 772 00:33:30,400 --> 00:33:32,710 >> Nå by, hva datatyper bør dette være, kanskje? 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 vet ikke hva lengste navn byen er. 776 00:33:37,780 --> 00:33:40,571 Et eller annet sted i Amerika, det er sannsynligvis noen latterlig langt ord, 777 00:33:40,571 --> 00:33:43,605 så la oss bare gå med 255, noe historisk eller vilkårlig. 778 00:33:43,605 --> 00:33:44,730 Staten, hva du ønsker å gjøre? 779 00:33:44,730 --> 00:33:48,380 780 00:33:48,380 --> 00:33:50,367 Vurderingssak, ikke sant? 781 00:33:50,367 --> 00:33:51,700 Hva er kanskje den mest effektive? 782 00:33:51,700 --> 00:33:53,500 Hvor mange tegn? 783 00:33:53,500 --> 00:33:55,950 Kanskje bare to, hvis vi kan komme unna med å gjøre nettopp, 784 00:33:55,950 --> 00:33:58,250 som, MA for Massachusetts, og så videre. 785 00:33:58,250 --> 00:34:00,520 Så, jeg kommer til å gå en CHAR verdi av to. 786 00:34:00,520 --> 00:34:03,080 >> Postnummer er en interessant ett. 787 00:34:03,080 --> 00:34:06,679 Vi er her i 02 138, slik at foreslår vi bør bruke det? 788 00:34:06,679 --> 00:34:07,470 Det er en INT, ikke sant? 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 Kort sagt vil fungere. 792 00:34:14,521 --> 00:34:15,020 Nei? 793 00:34:15,020 --> 00:34:18,920 794 00:34:18,920 --> 00:34:20,870 CHAR eller fem, men jeg vil ha en INT. 795 00:34:20,870 --> 00:34:23,710 Hvorfor presse tilbake på en INT? 796 00:34:23,710 --> 00:34:26,820 Tale meg fra dette. 797 00:34:26,820 --> 00:34:29,210 Hva er dumt om en INT, min idé? 798 00:34:29,210 --> 00:34:29,871 Yeah. 799 00:34:29,871 --> 00:34:31,199 >> PUBLIKUM: Ta opp mer minne. 800 00:34:31,199 --> 00:34:32,909 >> DAVID MALAN: Ta opp mer minne. 801 00:34:32,909 --> 00:34:35,310 Fire bytes, men du er foreslår et postnummer 802 00:34:35,310 --> 00:34:39,000 som fem bytes eller noen var som en røye, som føles som eh, det er egentlig ikke 803 00:34:39,000 --> 00:34:39,620 tilfelle. 804 00:34:39,620 --> 00:34:40,489 >> Vel, morsom historie. 805 00:34:40,489 --> 00:34:43,179 År siden, da jeg pleide å bruke Microsoft Outlook for e-posten min, 806 00:34:43,179 --> 00:34:45,150 Jeg fikk til slutt ønsket å bytte til Gmail. 807 00:34:45,150 --> 00:34:48,949 Og så, jeg eksportert alle mine kontakter fra Outlook som en CSV-fil. 808 00:34:48,949 --> 00:34:50,699 Kommaseparert verdier, som nettopp mente jeg 809 00:34:50,699 --> 00:34:54,060 hadde alle mine venners navn og sist navn 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å jeg gjorde feil for å åpne den opp 812 00:34:56,580 --> 00:34:58,640 i Excel, som er en regnearkprogram som 813 00:34:58,640 --> 00:35:00,289 forstår CSV-filer som vi har sett. 814 00:35:00,289 --> 00:35:03,080 Men så, jeg må ha truffet, som, Kommando eller kontroll S på ett punkt. 815 00:35:03,080 --> 00:35:06,250 Og Excel tilsynelatende på den tiden hadde en funksjon der enhver tid det 816 00:35:06,250 --> 00:35:08,100 så et tall, den prøvde å være nyttig. 817 00:35:08,100 --> 00:35:11,610 Og hvis det tallet startet med nuller, det ville bare bli kvitt dem. 818 00:35:11,610 --> 00:35:13,420 Hvorfor trenger du fører nuller på heltall? 819 00:35:13,420 --> 00:35:15,140 De er meningsløst, matematisk. 820 00:35:15,140 --> 00:35:17,530 De er ikke meningsløst i US Postal-systemet. 821 00:35:17,530 --> 00:35:19,954 Så, jeg har hatt i årevis, til denne dagen, jeg fortsatt 822 00:35:19,954 --> 00:35:22,370 har venner som når sjeldne tilfelle at jeg trenger noen er 823 00:35:22,370 --> 00:35:24,078 løse disse dager, Jeg vil fortsatt se at jeg 824 00:35:24,078 --> 00:35:26,767 har en venn i Cambridge, Massachusetts, 2 138. 825 00:35:26,767 --> 00:35:29,350 Og det er irriterende hvis du er prøver å sortere av programma 826 00:35:29,350 --> 00:35:30,975 generere konvolutter eller bare notere det ned. 827 00:35:30,975 --> 00:35:33,599 Og det er på grunn av denne grunn, Jeg valgte feil datatype. 828 00:35:33,599 --> 00:35:34,490 Så, jeg elsker ideen din. 829 00:35:34,490 --> 00:35:35,650 La oss bruke et CHAR-feltet. 830 00:35:35,650 --> 00:35:38,340 Fem tegn, unntatt Det er et hjørne tilfelle. 831 00:35:38,340 --> 00:35:42,220 Hvis du fortsatt sende mail, noen ganger zip koder i disse dager, 832 00:35:42,220 --> 00:35:45,360 de er, liker, pluss fire. 833 00:35:45,360 --> 00:35:48,200 Så trenger vi en bindestrek og deretter vi trenger fire tall. 834 00:35:48,200 --> 00:35:50,330 Så for å være ærlig, det kunne gå mange forskjellige måter. 835 00:35:50,330 --> 00:35:52,371 >> For nå kommer jeg til å holde det enkelt og jeg er bare 836 00:35:52,371 --> 00:35:54,780 kommer til å si at det er en five CHAR verdi, og vi er 837 00:35:54,780 --> 00:35:56,739 kommer til å hoppe over hele dashbordet pluss fire. 838 00:35:56,739 --> 00:35:58,280 Men disse er de typer avveininger. 839 00:35:58,280 --> 00:36:00,196 Og du kan tenke på samme problemene som oppstår 840 00:36:00,196 --> 00:36:01,860 med telefonnumre eller andre felt. 841 00:36:01,860 --> 00:36:04,350 >> Og nå, dette er faktisk en tåpelig veien å gå ned. 842 00:36:04,350 --> 00:36:08,000 Anta både Rob og jeg og Hannah og Maria og [? Davon?] Og Andy 843 00:36:08,000 --> 00:36:12,820 og andre i staben alle lever i Cambridge, Massachusetts, 02138. 844 00:36:12,820 --> 00:36:17,970 Dette faktisk føler meg dum som jeg er legge til min brukere bord, by, stat, 845 00:36:17,970 --> 00:36:18,630 og glidelås. 846 00:36:18,630 --> 00:36:20,980 Hvorfor? 847 00:36:20,980 --> 00:36:21,960 >> PUBLIKUM: [uhørbart] 848 00:36:21,960 --> 00:36:22,918 >> DAVID MALAN: Si igjen? 849 00:36:22,918 --> 00:36:24,310 PUBLIKUM: [uhørbart] 850 00:36:24,310 --> 00:36:25,850 >> DAVID MALAN: De er alltid kommer til å gå sammen, ikke sant? 851 00:36:25,850 --> 00:36:28,660 Når det viser seg, vi pleide å tenke dette var tilfellet før vi uttømmende 852 00:36:28,660 --> 00:36:30,570 søkte hele USA, og viser seg at det 853 00:36:30,570 --> 00:36:32,653 er noen uoverensstemmelser der flere byer har 854 00:36:32,653 --> 00:36:35,060 samme zip, som er merkelig. 855 00:36:35,060 --> 00:36:40,580 Men, hvis vi stiller for nå at 02138 er alltid Cambridge, Massachusetts, 856 00:36:40,580 --> 00:36:44,910 hvorfor i all verden ville du lagrer i databasen Cambridge og MA og 02138 857 00:36:44,910 --> 00:36:49,357 for meg og for Hannah og for Rob og for [? Davon?] Og for andre som bor 858 00:36:49,357 --> 00:36:51,190 her i Cambridge, er det helt overflødig. 859 00:36:51,190 --> 00:36:54,480 >> Vi bør komme unna med bare lagring av hva? 860 00:36:54,480 --> 00:36:55,610 Bare postnummer. 861 00:36:55,610 --> 00:36:58,660 Men så, hvis vi lagrer bare postnummer, jeg vil, sannsynligvis, 862 00:36:58,660 --> 00:37:02,160 for mitt nettsted for å vite hvor 02138 er. 863 00:37:02,160 --> 00:37:03,910 Så, jeg trenger en annen tabell. 864 00:37:03,910 --> 00:37:04,697 Og det er OK. 865 00:37:04,697 --> 00:37:07,530 Og faktisk, er dette en av de designprosesser med å utforme tabeller 866 00:37:07,530 --> 00:37:11,472 at du vil gjøre i PSet7 samt hvor du ønsker å faktor ut felles data. 867 00:37:11,472 --> 00:37:14,430 Akkurat som vi har vært facto ut felles kode og factoring ut felles 868 00:37:14,430 --> 00:37:17,380 stiler fra CSS, her også i databasen, 869 00:37:17,380 --> 00:37:21,180 hvis jeg trenger bare 02 138 til entydig identifisere noen hjemby, 870 00:37:21,180 --> 00:37:25,020 lagrer ikke Cambridge, Mass for hver darn bruker i tabellen. 871 00:37:25,020 --> 00:37:29,770 >> I stedet har en egen tabell som heter Glidelåser som skal ha hva kolonner? 872 00:37:29,770 --> 00:37:33,490 Sannsynligvis en ID-feltet, bare fordi, for prinsippene vi snakker om nå. 873 00:37:33,490 --> 00:37:35,720 Sannsynligvis en zip-feltet for 02138. 874 00:37:35,720 --> 00:37:38,400 Og da trolig hva andre kolonner? 875 00:37:38,400 --> 00:37:42,950 By og stat, men bare har én rad for 02138, én rad for 02 139, 876 00:37:42,950 --> 00:37:44,772 én rad for 90210. 877 00:37:44,772 --> 00:37:46,730 Og det er bokstavelig talt alle postnumre jeg vet. 878 00:37:46,730 --> 00:37:49,012 >> Så nå, hva kan du gjøre? 879 00:37:49,012 --> 00:37:51,220 Dette er problematisk, fordi nå har jeg fått to tabeller. 880 00:37:51,220 --> 00:37:54,660 Så, brukerne mine er for det meste over her, men deres bystaten informasjon finnes 881 00:37:54,660 --> 00:37:55,390 her. 882 00:37:55,390 --> 00:37:58,635 Så viser det seg med SQL, det er faktisk en måte å bli med informasjon, 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 seg at du kan gjøre noe som dette. 885 00:38:03,000 --> 00:38:10,501 SELECT stjerne fra brukere, BLI glidelåser ON Brukerne dot zip tilsvarer glidelåser dot zip. 886 00:38:10,501 --> 00:38:13,360 Som er litt ordrike, riktignok, men dette er bare 887 00:38:13,360 --> 00:38:17,590 betyr å velge alt fra prosessen med å ta mitt brukere bord 888 00:38:17,590 --> 00:38:19,580 og min glidelåser bord. 889 00:38:19,580 --> 00:38:22,120 Bli med dem på den ene felt har de i kolonnen. 890 00:38:22,120 --> 00:38:24,780 Så, bokstavelig talt gjøre noe som dette, og gi meg tilbake 891 00:38:24,780 --> 00:38:27,360 en ny midlertidig tabell som er bredere, som er større, 892 00:38:27,360 --> 00:38:29,450 som har alle kolonner fra dem begge. 893 00:38:29,450 --> 00:38:33,510 Og det, ganske enkelt, ville være syntaks for å gjøre noe som dette. 894 00:38:33,510 --> 00:38:35,540 >> Så, det er dette på forhånd, men det kommer 895 00:38:35,540 --> 00:38:38,950 å være andre design avgjørelsene du har å gjøre, ikke bare med indekser 896 00:38:38,950 --> 00:38:40,550 men også å kjøre inn i utfordringene. 897 00:38:40,550 --> 00:38:43,360 Faktisk, det er en utfordring i noen database design 898 00:38:43,360 --> 00:38:47,930 der noen ganger to folk kanskje vil for å få tilgang til de samme radene i databasen 899 00:38:47,930 --> 00:38:48,530 tabell. 900 00:38:48,530 --> 00:38:51,450 Så, dette er noe som vi vil møter i PSet7 også. 901 00:38:51,450 --> 00:38:54,686 >> Men jeg tenkte jeg skulle se på en angrep som er mulig i SQL. 902 00:38:54,686 --> 00:38:56,560 Hva er noen av de problemer som kan oppstå? 903 00:38:56,560 --> 00:38:58,170 Så møter du dette i PSet7. 904 00:38:58,170 --> 00:39:01,874 Og vi fortelle deg direkte hva koding løsning på dette problemet er. 905 00:39:01,874 --> 00:39:04,790 Men hvis du tar et høyere nivå klasse, spesielt i operativsystemer, 906 00:39:04,790 --> 00:39:06,950 du kommer til å støte en sak av atomicity, 907 00:39:06,950 --> 00:39:10,080 problemet med å prøve å gjøre flere ting på en gang 908 00:39:10,080 --> 00:39:11,000 uten avbrudd. 909 00:39:11,000 --> 00:39:14,560 >> Og jeg tenkte jeg skulle introdusere dette Ideen til PSet7 med en metafor 910 00:39:14,560 --> 00:39:18,160 at jeg lærte meg selv i Margo Seltzer sin CS164 operativsystemer 911 00:39:18,160 --> 00:39:18,990 klasse år siden. 912 00:39:18,990 --> 00:39:22,230 Anta at du har en av disse dorm kjøleskap i din hybel eller hus, 913 00:39:22,230 --> 00:39:24,474 og du har en ekte forkjærlighet for melk. 914 00:39:24,474 --> 00:39:27,140 Og så kommer du hjem fra klassene en dag, du åpner kjøleskapet. 915 00:39:27,140 --> 00:39:27,620 Å, faen. 916 00:39:27,620 --> 00:39:28,870 Det er ingen melk i kjøleskapet. 917 00:39:28,870 --> 00:39:32,470 Så lukker du kjøleskap, låse døren, låse dorm, 918 00:39:32,470 --> 00:39:34,770 gå rundt hjørnet til CVS, komme på linje, 919 00:39:34,770 --> 00:39:36,312 og begynne å sjekke ut for litt melk. 920 00:39:36,312 --> 00:39:38,978 Og det kommer til å ta en stund, fordi de jævla selv kassen 921 00:39:38,978 --> 00:39:40,570 tellere ta en evighet å bruke uansett. 922 00:39:40,570 --> 00:39:41,950 Så i mellomtiden, kommer romkameraten hjem. 923 00:39:41,950 --> 00:39:43,470 Han eller hun virkelig liker melk også. 924 00:39:43,470 --> 00:39:45,520 De kommer inn i hybel, åpner kjøleskapet, oh, darn det. 925 00:39:45,520 --> 00:39:46,490 Det er ikke mer melk. 926 00:39:46,490 --> 00:39:49,040 >> Så, han eller hun også går rundt hjørnet. 927 00:39:49,040 --> 00:39:51,670 Men nå, siden det er som to eller tre eller fire CVSes nærheten, 928 00:39:51,670 --> 00:39:53,800 de måtte gå til en av de ulike de på torget. 929 00:39:53,800 --> 00:39:55,830 Og så nå, et par minutter senere, dere begge 930 00:39:55,830 --> 00:39:58,060 komme hjem og ugh, verste problemet noensinne. 931 00:39:58,060 --> 00:40:00,967 Nå har du for mye melk fordi det kommer til å gå sur. 932 00:40:00,967 --> 00:40:03,050 Og du liker melk, men du vet egentlig ikke liker melk. 933 00:40:03,050 --> 00:40:06,730 >> Så nå, dette var en dyr feil fordi dere begge 934 00:40:06,730 --> 00:40:09,870 gjort en beslutning basert på tilstand av noen variabel som 935 00:40:09,870 --> 00:40:12,660 var i ferd å bli endret av deg, 936 00:40:12,660 --> 00:40:14,560 initiativtaker kommer til å få melk. 937 00:40:14,560 --> 00:40:17,785 Så, hva er kanskje et menneske løsning på det problemet? 938 00:40:17,785 --> 00:40:18,660 PUBLIKUM: [uhørbart] 939 00:40:18,660 --> 00:40:19,430 DAVID MALAN: Legg igjen en kommentar, ikke sant? 940 00:40:19,430 --> 00:40:21,850 Alltid la et notat, hvis du er kjent med at showet. 941 00:40:21,850 --> 00:40:23,100 Ja, det er to av oss. 942 00:40:23,100 --> 00:40:25,940 Så, la alltid et notat, eller bokstavelig talt låse kjøleskapet 943 00:40:25,940 --> 00:40:28,602 med noen form for hengelås eller noe over toppen sånn. 944 00:40:28,602 --> 00:40:31,310 Men det er faktisk kommer til å være Hovedproblemet med database design, 945 00:40:31,310 --> 00:40:34,710 spesielt når du kan ha flere nettlesere, flere bærbare datamaskiner, 946 00:40:34,710 --> 00:40:37,450 flere brukere alle prøver å oppdatere informasjon på en gang. 947 00:40:37,450 --> 00:40:40,590 Særlig følsomme opplysninger som finansiell informasjon, 948 00:40:40,590 --> 00:40:43,350 der med en aksjehandel nettsiden som du vil bli bygget, 949 00:40:43,350 --> 00:40:47,270 hva om du ønsker å sjekke hvor mye penger du har og hvis du har nok, 950 00:40:47,270 --> 00:40:48,490 kjøpe noen aksjer? 951 00:40:48,490 --> 00:40:50,899 >> Men hva om noen andre som har en felles konto med deg 952 00:40:50,899 --> 00:40:52,690 er samtidig prøver å kjøpe noen aksjer? 953 00:40:52,690 --> 00:40:55,190 Så, er han eller hun sjekker saldo, både for deg 954 00:40:55,190 --> 00:40:57,540 få tilbake den samme Svaret er det ingen melk. 955 00:40:57,540 --> 00:41:00,580 Eller begge av dere kommer tilbake svaret, du har $ 100 i kontoen. 956 00:41:00,580 --> 00:41:04,680 Begge du prøver å ta avgjørelsen å kjøpe en andel av litt selskap lager. 957 00:41:04,680 --> 00:41:06,130 >> Og nå, hva skjer? 958 00:41:06,130 --> 00:41:07,140 Du har to aksjer? 959 00:41:07,140 --> 00:41:08,420 Du har ingen aksjer? 960 00:41:08,420 --> 00:41:10,320 Problemer som kan oppstå. 961 00:41:10,320 --> 00:41:11,755 Så vil vi møte det. 962 00:41:11,755 --> 00:41:14,630 SQL-injeksjon angrep, heldigvis, er noe vi vil hjelpe deg med, 963 00:41:14,630 --> 00:41:17,430 men disse er atrociously vanlig i disse dager fortsatt. 964 00:41:17,430 --> 00:41:18,680 Så, dette er bare et eksempel. 965 00:41:18,680 --> 00:41:21,290 Jeg gjør ingen påstander om at Harvard PIN-systemet er 966 00:41:21,290 --> 00:41:23,130 sårbare for denne spesielle angrepet. 967 00:41:23,130 --> 00:41:24,160 Vi har prøvd. 968 00:41:24,160 --> 00:41:26,120 Men, du vet at vi har et felt som dette. 969 00:41:26,120 --> 00:41:29,620 Og Yale netto ID har en lignende ser skjermen i disse dager. 970 00:41:29,620 --> 00:41:33,190 Og det viser seg, at kanskje PIN-systemet er implementert i PHP. 971 00:41:33,190 --> 00:41:37,050 >> Og hvis det were-- det er not-- de kan ha kode som ser slik ut. 972 00:41:37,050 --> 00:41:38,210 De har to variable. 973 00:41:38,210 --> 00:41:42,495 Gi meg brukernavn og passord fra stillingen super global variabel 974 00:41:42,495 --> 00:41:43,970 som vi snakket om tidligere. 975 00:41:43,970 --> 00:41:47,310 Kanskje Harvard har en spørring som SELECT stjerne fra brukere 976 00:41:47,310 --> 00:41:50,005 der brukernavn er lik som og passord tilsvarer det. 977 00:41:50,005 --> 00:41:51,880 Og legg merke til at jeg bare plugge den i å bruke 978 00:41:51,880 --> 00:41:55,050 krøllete brace notasjon fra den andre dag, som betyr å bare plugge inn en verdi 979 00:41:55,050 --> 00:41:55,550 her. 980 00:41:55,550 --> 00:41:57,449 Jeg bruker ikke den spørsmålstegn teknikk. 981 00:41:57,449 --> 00:41:59,240 Jeg har ikke noen andre eller tredje argumenter. 982 00:41:59,240 --> 00:42:02,350 Jeg er bare bokstavelig talt konstruere strengen selv. 983 00:42:02,350 --> 00:42:04,930 >> Problemet er imidlertid at hvis noen liker en scroob, 984 00:42:04,930 --> 00:42:09,020 som er en referanse til en film, logger på med noe sånt som dette, 985 00:42:09,020 --> 00:42:11,250 og jeg har fjernet prikkene som vanligvis dekke opp 986 00:42:11,250 --> 00:42:14,370 passord, hva om han er spesielt skadelig 987 00:42:14,370 --> 00:42:18,860 og hans passord kanskje er 12345, per filmen heter "Spaceballs" 988 00:42:18,860 --> 00:42:21,970 men han kritisk typer en enkelt sitat etter fem, 989 00:42:21,970 --> 00:42:24,790 så bokstavelig ordet eller i rommet, og deretter sitat, 990 00:42:24,790 --> 00:42:29,160 unquote en er sitat en, Men legg merke til han utelatt hva? 991 00:42:29,160 --> 00:42:32,700 Han utelatt sitatet til høyre og han utelatt sitatet til venstre. 992 00:42:32,700 --> 00:42:35,170 >> For hvis dette angriper scroob sin antagelse 993 00:42:35,170 --> 00:42:38,160 er at folk som skrev dette PHP-koden ikke var så lyse, 994 00:42:38,160 --> 00:42:42,990 kanskje de bare har noen enkelt siterer rundt interpole 995 00:42:42,990 --> 00:42:45,210 av en variabel i klammeparentes? 996 00:42:45,210 --> 00:42:48,620 Og så kanskje, kunne snill han av fullføre sin tanke 997 00:42:48,620 --> 00:42:53,290 for dem, men på en måte som vil å la ham hacket inn PIN-system. 998 00:42:53,290 --> 00:42:55,310 Med andre ord, antar at dette er den koden 999 00:42:55,310 --> 00:42:57,140 og vi nå plugge i hva scroob skrevet. 1000 00:42:57,140 --> 00:42:58,770 Og det er rødt, fordi det er ille. 1001 00:42:58,770 --> 00:43:01,310 >> Og den underliggende tekst er det han har skrevet i, 1002 00:43:01,310 --> 00:43:05,510 scroob kunne lure Harvard server til å bygge en SQL-spørring 1003 00:43:05,510 --> 00:43:07,440 strengen som ser ut som dette. 1004 00:43:07,440 --> 00:43:11,760 Passord tilsvarer 12345 eller en er lik en. 1005 00:43:11,760 --> 00:43:14,820 Resultatet av dette, logisk, er at dette vil logge scroob 1006 00:43:14,820 --> 00:43:18,360 i Hvis hans passord er 12345 eller hvis en er lik 1007 00:43:18,360 --> 00:43:22,660 en, noe som er selvsagt alltid er sann, som betyr scroob alltid får inn. 1008 00:43:22,660 --> 00:43:26,060 >> Og så, måten å fikse dette, som i mange tilfeller 1009 00:43:26,060 --> 00:43:28,140 ville være å skrive mer defensivt. 1010 00:43:28,140 --> 00:43:30,390 Å bruke noe sånt som vår Selve søket funksjon, som 1011 00:43:30,390 --> 00:43:33,980 du vil se i PSet7, hvor vi kobler noe som spørsmålstegn her. 1012 00:43:33,980 --> 00:43:35,980 Og skjønnhet spørring funksjon som vi 1013 00:43:35,980 --> 00:43:40,010 gi deg er det beskytter mot disse såkalte SQL-injeksjon angrep, der 1014 00:43:40,010 --> 00:43:44,260 noen lure koden inn injisere sin egen SQL-kode. 1015 00:43:44,260 --> 00:43:47,380 Fordi hva spørringen funksjon vi gir deg faktisk vil gjøre, 1016 00:43:47,380 --> 00:43:51,270 hvis du bruker spørsmålstegn syntaks og en andre og en tredje argument her 1017 00:43:51,270 --> 00:43:54,590 er hva gjorde det legge til innspill som brukeren gitt? 1018 00:43:54,590 --> 00:43:56,060 De backslash siterer. 1019 00:43:56,060 --> 00:43:58,590 >> Så slipper det noe potensielt farlige tegn. 1020 00:43:58,590 --> 00:44:01,000 Dette ser rart nå, men det er ikke sårbar 1021 00:44:01,000 --> 00:44:03,260 fordi det ikke endre logikken lenger 1022 00:44:03,260 --> 00:44:06,470 fordi det hele passord er nå et enkelt sitat som ikke er det, 1023 00:44:06,470 --> 00:44:07,596 faktisk, scroob passord. 1024 00:44:07,596 --> 00:44:09,845 Så har det vært noen vitser om dette i løpet av årene. 1025 00:44:09,845 --> 00:44:12,570 Så dette var et bilde tatt av noen geek på en parkeringsplass 1026 00:44:12,570 --> 00:44:16,620 hvorved du kanskje vet at enkelte byer og stater prøver å skanne lisens 1027 00:44:16,620 --> 00:44:19,460 plate til å fakturere deg eller billett hvis du går gjennom uten, som, 1028 00:44:19,460 --> 00:44:20,660 E-Z Pass ting. 1029 00:44:20,660 --> 00:44:24,490 Så, denne personen antas at kanskje folk skrive e-Z Pass system 1030 00:44:24,490 --> 00:44:28,240 var ikke så lyse, og kanskje de bare bundet sammen for en streng, 1031 00:44:28,240 --> 00:44:32,190 slik at han eller hun kunne ikke skadelig ikke bare fullføre sin tanke, 1032 00:44:32,190 --> 00:44:35,150 men faktisk utføre en dårlig kommando, som vi ikke har nevnt ennå, 1033 00:44:35,150 --> 00:44:36,380 men du kan sikkert gjette. 1034 00:44:36,380 --> 00:44:39,820 At i tillegg til å slette og sette inn og oppdatere og velge, 1035 00:44:39,820 --> 00:44:43,370 det er også et nøkkelord som heter drop, som bokstavelig talt sletter alt 1036 00:44:43,370 --> 00:44:45,300 i databasen, noe er spesielt ille. 1037 00:44:45,300 --> 00:44:48,760 >> Vi kan zoome inn på dette hvis det er litt vanskelig å se. 1038 00:44:48,760 --> 00:44:52,300 Dette, nå er en kjent tegneserie det er fantastisk flink nå 1039 00:44:52,300 --> 00:44:53,145 og forståelig. 1040 00:44:53,145 --> 00:45:00,880 1041 00:45:00,880 --> 00:45:04,750 >> [LAUGHTER] 1042 00:45:04,750 --> 00:45:05,910 >> Ja, kult. 1043 00:45:05,910 --> 00:45:06,800 Kind of geeking ut. 1044 00:45:06,800 --> 00:45:08,800 Så disse er altså SQL-injeksjon angrep. 1045 00:45:08,800 --> 00:45:13,050 Og de er så lett å unngå ved å bruke den riktige koden eller de riktige bibliotekene. 1046 00:45:13,050 --> 00:45:15,947 Og du vil se i PSet7, det er Derfor gir vi deg spørringen funksjon. 1047 00:45:15,947 --> 00:45:17,780 Så, et par teasers at vi trodde vi skulle 1048 00:45:17,780 --> 00:45:19,930 gi deg her i vår værende minutter sammen. 1049 00:45:19,930 --> 00:45:24,030 Så, som du husker fra uke null, vi introduserte disse to lyspærer som 1050 00:45:24,030 --> 00:45:26,610 er hyggelig, ikke bare fordi de er pen og er fargerike, 1051 00:45:26,610 --> 00:45:29,450 men fordi de støtter noe kalles en API, et program 1052 00:45:29,450 --> 00:45:31,980 Programming Interface Og i CS50 så langt, vi har 1053 00:45:31,980 --> 00:45:34,440 hovedsakelig fokusert på GET og POST, men det viser seg 1054 00:45:34,440 --> 00:45:37,390 det er andre HTTP verb som PUT. 1055 00:45:37,390 --> 00:45:39,430 >> Og faktisk, dette var et lysbilde fra uke null 1056 00:45:39,430 --> 00:45:44,930 der hvis du skriver kode som sender a la PSet6 en HTTP-forespørsel som 1057 00:45:44,930 --> 00:45:49,647 ser slik ut med denne del av teksten på bunnen, som kalles JSON, 1058 00:45:49,647 --> 00:45:52,230 eller Javascript Object Notation at vi skal snakke om neste uke, 1059 00:45:52,230 --> 00:45:57,030 du kan slå på eller slå av eller endring fargen på lysene som de. 1060 00:45:57,030 --> 00:46:00,480 Så hvis CS50 har også i tillegg til noe av disse lyspærer her i New Haven 1061 00:46:00,480 --> 00:46:02,480 Hvis du ønsker å låne dem for siste prosjekter, 1062 00:46:02,480 --> 00:46:04,370 også noen Microsoft Band, som er som 1063 00:46:04,370 --> 00:46:07,619 klokker som du bærer rundt håndleddet som på samme måte har en API, slik at du 1064 00:46:07,619 --> 00:46:10,040 kan skrive din egen programvare for dem. 1065 00:46:10,040 --> 00:46:12,490 >> Vi har en konto med Apples iOS-koden slik 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 som faktisk kjører på dem. 1068 00:46:17,707 --> 00:46:19,540 Vi har en hel haug av Arduinos, som er 1069 00:46:19,540 --> 00:46:22,010 bitte små datamaskiner uten tilfeller, i hovedsak, 1070 00:46:22,010 --> 00:46:25,240 at du kan koble til via USB, vanligvis til din egen Mac eller PC, 1071 00:46:25,240 --> 00:46:28,810 skrive kode som kjører på disse fysiske enheter som ofte har sensorer på dem 1072 00:46:28,810 --> 00:46:30,790 slik at du kan samhandle med den virkelige verden. 1073 00:46:30,790 --> 00:46:32,860 Vi har en hel haug av Leap Motion enheter, 1074 00:46:32,860 --> 00:46:36,500 som er USB-enheter for Mac og PCer, her og igjen, i New Haven. 1075 00:46:36,500 --> 00:46:40,080 Og hvis du kobler den til Mac, du faktisk kan kontrollere datamaskinen 1076 00:46:40,080 --> 00:46:42,550 ved å skrive programvare som via infrarøde stråler, 1077 00:46:42,550 --> 00:46:46,360 finner ut hvor menneskehender er, selv uten å røre tastaturet. 1078 00:46:46,360 --> 00:46:49,135 Vi tenkte vi skulle dele en rask glimt på dette, for eksempel. 1079 00:46:49,135 --> 00:46:51,428 >> [MUSIC SPILLE] 1080 00:46:51,428 --> 00:47:55,840 1081 00:47:55,840 --> 00:47:57,590 Så har vi en hel haug av disse tingene, 1082 00:47:57,590 --> 00:48:01,040 Også kalt Myo armen band som du satt over underarmen 1083 00:48:01,040 --> 00:48:04,595 og deretter kan du kontrollere den virkelige verden eller den virtuelle verden som dette. 1084 00:48:04,595 --> 00:48:06,471 >> [MUSIC SPILLE] 1085 00:48:06,471 --> 00:49:17,580 1086 00:49:17,580 --> 00:49:20,920 Eller, vi har også noen Google Papp, som er bokstavelig talt, som, 1087 00:49:20,920 --> 00:49:24,841 en pappeske du kan sette på din ansikt, men raset i telefonen i det 1088 00:49:24,841 --> 00:49:27,590 slik at du setter glasset på Telefonen veldig nær øynene. 1089 00:49:27,590 --> 00:49:30,190 Og Google papp er ganske billig på $ 10 eller $ 20. 1090 00:49:30,190 --> 00:49:32,230 Og det har lite objektiver som litt av skift 1091 00:49:32,230 --> 00:49:35,900 bildet på skjermen for menneskelig øynene for å gi deg en følelse av dybde 1092 00:49:35,900 --> 00:49:39,550 slik at du faktisk har en 3D- miljø foran deg. 1093 00:49:39,550 --> 00:49:42,927 Vi har også noen Samsung Gear, som er den dyrere versjon av denne, 1094 00:49:42,927 --> 00:49:46,010 men som kan gli i et tilsvar Android-telefon, og gi deg en illusjon 1095 00:49:46,010 --> 00:49:48,309 of-- eller gi opplevelsen virtuell virkelighet. 1096 00:49:48,309 --> 00:49:50,850 Og i våre to siste minutter, vi tenkte vi skulle prøve å gjøre dette. 1097 00:49:50,850 --> 00:49:55,250 Hvis jeg kan projisere hva Colton har her bare for å skjerpe appetitten, 1098 00:49:55,250 --> 00:49:58,442 la meg gå videre og kaste opp på storskjermen her. 1099 00:49:58,442 --> 00:49:59,400 La meg drepe lysene. 1100 00:49:59,400 --> 00:50:02,290 Colton, ønsker du å gå videre og satt på cella for et øyeblikk 1101 00:50:02,290 --> 00:50:05,171 og kom over til midt på scenen? 1102 00:50:05,171 --> 00:50:07,420 Og ønsker du å project-- dette er hva Colton ser. 1103 00:50:07,420 --> 00:50:10,560 >> Nå, Wi-Fi i her er ikke så sterk for denne enheten 1104 00:50:10,560 --> 00:50:13,870 at dette er super overbevisende, men Colton er bokstavelig 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 bare ett bilde. 1107 00:50:16,796 --> 00:50:19,920 Du ser hans venstre og høyre øye at hjernen hans er å sy sammen 1108 00:50:19,920 --> 00:50:22,260 i en tredimensjonal miljø på ansiktet hans. 1109 00:50:22,260 --> 00:50:24,319 Han har nettopp valgt et menyvalg her. 1110 00:50:24,319 --> 00:50:27,360 Og så igjen, har han på seg dette headsettet med en Samsung telefon på det som er 1111 00:50:27,360 --> 00:50:29,080 trådløst prosjektering til vår overhead. 1112 00:50:29,080 --> 00:50:30,349 Nå er du på Mars, tror jeg? 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ørbart]. 1115 00:50:32,181 --> 00:50:34,250 [LAUGHTER] 1116 00:50:34,250 --> 00:50:36,374 >> DAVID MALAN: Slår ut Mars har disse menyene. 1117 00:50:36,374 --> 00:50:41,590 >> COLTON: [uhørbart] noen kule steder hvis vi ønsker å gå to-- 1118 00:50:41,590 --> 00:50:43,330 >> DAVID MALAN: Hvor skal vi ønsker å gå? 1119 00:50:43,330 --> 00:50:45,837 >> COLTON: [uhørbart] 1120 00:50:45,837 --> 00:50:48,170 DAVID MALAN: Og la oss se hvor Colton tar oss nå. 1121 00:50:48,170 --> 00:50:48,961 COLTON: [uhørbart] 1122 00:50:48,961 --> 00:50:52,830 1123 00:50:52,830 --> 00:50:56,380 >> DAVID MALAN: Så, det er så mange forskjellige steder du kan ta deg selv. 1124 00:50:56,380 --> 00:51:00,590 Det er FAPIs via som du kan skrive spill eller interaksjoner som 1125 00:51:00,590 --> 00:51:01,950 drives, til slutt, på telefonen. 1126 00:51:01,950 --> 00:51:03,908 Så, du egentlig bare skriver en mobiltelefon app. 1127 00:51:03,908 --> 00:51:06,380 Men takket være programvaren og grafikkfunksjonene, 1128 00:51:06,380 --> 00:51:08,765 nå Colton er i denne bitte liten hytte. 1129 00:51:08,765 --> 00:51:10,515 Og med fare for overveldende oss selv, 1130 00:51:10,515 --> 00:51:13,330 Colton og jeg vil holde rundt for mens på slutten av klassen her i dag 1131 00:51:13,330 --> 00:51:14,300 Hvis du ønsker å komme opp og spille. 1132 00:51:14,300 --> 00:51:16,350 Og vi vil bringe dem tilbake neste uke også. 1133 00:51:16,350 --> 00:51:18,420 Uten videre om og men det er det for i dag. 1134 00:51:18,420 --> 00:51:21,990 Vi sees neste uke. 1135 00:51:21,990 --> 00:51:24,140 >> [MUSIC - Ragga TWINS, "dårlig menneske"] 1136 00:51:24,140 --> 00:55:23,146