1 00:00:00,000 --> 00:00:02,405 >> [MUSIK SPELA] 2 00:00:02,405 --> 00:00:10,439 3 00:00:10,439 --> 00:00:11,980 DAVID MALAN: Okej, är detta CS50. 4 00:00:11,980 --> 00:00:13,740 Detta är slutet av veckan åtta. 5 00:00:13,740 --> 00:00:15,887 Och idag, vi börjar att fylla i vissa bitar 6 00:00:15,887 --> 00:00:17,720 när det gäller att bygga saker på webben. 7 00:00:17,720 --> 00:00:20,020 Så minns att på måndag Vi tillbringar mycket mer tid 8 00:00:20,020 --> 00:00:22,530 på PHP, vilket är denna dynamiska programmeringsspråk som 9 00:00:22,530 --> 00:00:26,872 låter oss utgång, bland annat saker, HTML och andra sådana innehåll 10 00:00:26,872 --> 00:00:27,830 att vi kommer att vilja se. 11 00:00:27,830 --> 00:00:30,871 Men vi har inte riktigt tittat på hur vi kommer att lagra någon information. 12 00:00:30,871 --> 00:00:34,477 I själva verket, nästan alla av att super intressanta webbplatser du besöker idag 13 00:00:34,477 --> 00:00:36,560 har någon form av databas på baksidan slutet, eller hur? 14 00:00:36,560 --> 00:00:39,540 Facebook lagrar säkert massor av uppgifter om oss alla och Gmail lagrar alla 15 00:00:39,540 --> 00:00:40,210 dina e-postmeddelanden. 16 00:00:40,210 --> 00:00:44,150 >> Och så många andra platser är inte bara statiskt innehåll som är informativt. 17 00:00:44,150 --> 00:00:45,640 Det är faktiskt dynamiskt på något sätt. 18 00:00:45,640 --> 00:00:48,480 Du ger input, uppdaterar den sidorna för andra människor. 19 00:00:48,480 --> 00:00:50,620 Du får meddelanden du skickar meddelanden, och så vidare. 20 00:00:50,620 --> 00:00:54,250 Så idag, tittar vi närmare på de grunderna för ett projekt 21 00:00:54,250 --> 00:00:57,330 att du kommer att dyka in i nästa vecka, CS50 Finance, som 22 00:00:57,330 --> 00:01:00,509 faktiskt kommer att få dig att bygga något som inte i C, men i PHP. 23 00:01:00,509 --> 00:01:02,550 En hemsida som ser lite ungefär så här 24 00:01:02,550 --> 00:01:05,810 som gör det möjligt att köpa och sälja bestånd som faktiskt 25 00:01:05,810 --> 00:01:09,044 kommer att utnyttja realtid stockuppgifter från Yahoo Finance. 26 00:01:09,044 --> 00:01:11,960 Och så i slutändan, kommer du att ha illusion för dig själv och för användare 27 00:01:11,960 --> 00:01:14,550 att du faktiskt ska köpa och sälja aktier och få nästan i realtid 28 00:01:14,550 --> 00:01:16,800 uppdateringar, hantera en portfölj, vilka alla 29 00:01:16,800 --> 00:01:20,310 kommer att kräva att ha, i slutändan, en databas med användare. 30 00:01:20,310 --> 00:01:23,330 >> Så, med egna ord, speciellt om du inte 31 00:01:23,330 --> 00:01:25,670 super förtrogenhet med data vetenskap eller databaser, vad 32 00:01:25,670 --> 00:01:30,790 vet du en databas för att vara just nu, i icke-tekniska termer? 33 00:01:30,790 --> 00:01:32,300 Vad är det? 34 00:01:32,300 --> 00:01:36,882 Hur skulle du beskriva det en rumskompis eller en vän? 35 00:01:36,882 --> 00:01:40,100 >> PUBLIK: [OHÖRBAR] Information [OHÖRBAR] 36 00:01:40,100 --> 00:01:44,430 >> DAVID MALAN: Så, en förteckning över uppgifter eller en store-- en lista med information 37 00:01:44,430 --> 00:01:47,160 som du kanske vill spara om något, som en användare. 38 00:01:47,160 --> 00:01:50,190 Och vad gör användarna har förknippade med dem? 39 00:01:50,190 --> 00:01:53,160 Om du är en användare på Facebook eller Gmail, vilka är de egenskaper 40 00:01:53,160 --> 00:01:54,940 att vi alla användare har? 41 00:01:54,940 --> 00:01:58,530 Liksom, vad som kan vara en del av kolumner i tabellen som vi 42 00:01:58,530 --> 00:01:59,390 hänvisade förra gången? 43 00:01:59,390 --> 00:02:01,140 Eftersom igen, kan du tänka på en databas 44 00:02:01,140 --> 00:02:05,810 verkligen som en fancy Excel-fil eller Google Kalkylblad eller Apple Numbers fil. 45 00:02:05,810 --> 00:02:08,280 >> Så, vad tycker du om när du tänker på en användare? 46 00:02:08,280 --> 00:02:11,290 Vad har de? 47 00:02:11,290 --> 00:02:11,790 Vad är det? 48 00:02:11,790 --> 00:02:12,470 >> PUBLIK: Ett namn. 49 00:02:12,470 --> 00:02:13,303 >> DAVID MALAN: Ett namn. 50 00:02:13,303 --> 00:02:16,840 Så om namnet, liksom David Malan skulle vara namnet på en viss användare. 51 00:02:16,840 --> 00:02:17,980 Vad gör en användare har? 52 00:02:17,980 --> 00:02:18,770 >> Publik: Ett ID. 53 00:02:18,770 --> 00:02:19,561 >> DAVID MALAN: Ett ID. 54 00:02:19,561 --> 00:02:23,320 Så, som en ID-nummer, som din Harvard ID eller din Yale Net ID eller liknande. 55 00:02:23,320 --> 00:02:24,923 Vad kan en användare ha? 56 00:02:24,923 --> 00:02:25,890 >> PUBLIK: Lösenord. 57 00:02:25,890 --> 00:02:29,240 >> DAVID MALAN: Ett lösenord, kanske en adress, kanske ett telefonnummer, kanske 58 00:02:29,240 --> 00:02:30,050 en e-postadress. 59 00:02:30,050 --> 00:02:32,640 Så det finns knippen av fält och detta kunde sorts tappa kontrollen 60 00:02:32,640 --> 00:02:34,760 snabbt så fort du börjar förverkliga, åh, låt oss lagra detta 61 00:02:34,760 --> 00:02:36,190 och låt oss lagra detta och det. 62 00:02:36,190 --> 00:02:37,657 >> Men hur ska vi egentligen göra det? 63 00:02:37,657 --> 00:02:39,740 Så återigen, den mentala modell att ha för i dag som vi 64 00:02:39,740 --> 00:02:42,320 dyka in i den faktiska SQL, Structured Query Language, 65 00:02:42,320 --> 00:02:44,186 är en databas som ser ut så här. 66 00:02:44,186 --> 00:02:45,310 Det är bara rader och kolumner. 67 00:02:45,310 --> 00:02:48,309 Och ni kan föreställa Google Spreadsheets eller valfritt antal andra program. 68 00:02:48,309 --> 00:02:52,130 Men vad är nyckeln om MySQL, som är den databasprogram vi kommer att använda, 69 00:02:52,130 --> 00:02:54,920 det fritt öppet available-- Facebook användningar 70 00:02:54,920 --> 00:02:59,200 det och valfritt antal andra websites-- databas lagrar saker relationellt. 71 00:02:59,200 --> 00:03:01,770 Och en relationsdatabas betyder bara en som bokstavligen 72 00:03:01,770 --> 00:03:03,672 lagrar data i rader och kolumner. 73 00:03:03,672 --> 00:03:04,630 Det är så enkelt är det. 74 00:03:04,630 --> 00:03:07,230 >> Så även något som Oracle som du kanske har generellt hört talas om 75 00:03:07,230 --> 00:03:08,271 är en relationsdatabas. 76 00:03:08,271 --> 00:03:10,929 Och under huven, det lagrar data i rader och kolumner. 77 00:03:10,929 --> 00:03:12,970 Och Oracle avgifter du en massa pengar att göra det, 78 00:03:12,970 --> 00:03:15,550 medan MySQL avgifter du ingenting för densamma. 79 00:03:15,550 --> 00:03:18,790 Så är SQL kommer att ge oss minst fyra operationer. 80 00:03:18,790 --> 00:03:23,190 Förmågan att välja data, som läs- uppgifter, infoga, ta bort och uppdatera data. 81 00:03:23,190 --> 00:03:25,525 Med andra ord, de är verkligen de fyra knapptryckningar 82 00:03:25,525 --> 00:03:28,950 som kommer att tillåta oss att ändra saker i dessa rader och kolumner. 83 00:03:28,950 --> 00:03:33,250 >> Verktyget som vi använder i dag, särskilt att lära SQL och att spela med det 84 00:03:33,250 --> 00:03:34,627 återigen kallas PHP MyAdmin. 85 00:03:34,627 --> 00:03:35,460 Det är webbaserat verktyg. 86 00:03:35,460 --> 00:03:38,200 Total tillfällighet att det är skrivet i PHP. 87 00:03:38,200 --> 00:03:42,400 Men det kommer att ge oss en grafisk användargränssnitt så att vi kan faktiskt 88 00:03:42,400 --> 00:03:46,054 skapa dessa rader och kolumner och sedan prata med dem via kod. 89 00:03:46,054 --> 00:03:47,970 Så, låt oss nu börja vad jag tror är uppriktigt sagt 90 00:03:47,970 --> 00:03:51,000 typ av roligt processen för bygga den bakre änden av webbplatser, 91 00:03:51,000 --> 00:03:54,580 de delar som användarna gör inte se, men säkert bryr sig om, 92 00:03:54,580 --> 00:03:56,170 eftersom det är ganska datas går. 93 00:03:56,170 --> 00:03:59,570 Så, som liknar C och en lite mindre som PHP, 94 00:03:59,570 --> 00:04:04,954 SQL, eller en databas som stöder SQL, har åtminstone dessa datatyper 95 00:04:04,954 --> 00:04:05,870 och klasar av andra. 96 00:04:05,870 --> 00:04:08,107 CHAR, VARCHAR, INT, bigint, DECIMAL och DATETIME. 97 00:04:08,107 --> 00:04:09,940 Och det finns en hel massa andra funktioner, 98 00:04:09,940 --> 00:04:11,940 men låt oss göra detta genom att sätt att faktiska exempel. 99 00:04:11,940 --> 00:04:16,450 >> Jag kommer att gå in i CS50 IDE där, i förväg, har jag loggade in 100 00:04:16,450 --> 00:04:19,372 och jag har också besökt en URL för detta verktyg som kallas PHP MyAdmin. 101 00:04:19,372 --> 00:04:22,580 Och problemet satt sju, kommer vi att berätta exakt hur att komma till detta gränssnitt 102 00:04:22,580 --> 00:04:23,200 också. 103 00:04:23,200 --> 00:04:25,640 På det övre vänstra hörnet, märker det säger föreläsa. 104 00:04:25,640 --> 00:04:27,610 Och det betyder bara att i förväg, skapade jag 105 00:04:27,610 --> 00:04:31,360 en tom databas som kallas föreläsning som inte har några kalkylark i det än. 106 00:04:31,360 --> 00:04:32,600 Det finns inga rader och kolumner. 107 00:04:32,600 --> 00:04:34,308 Eftersom den första som vi ska göra 108 00:04:34,308 --> 00:04:37,100 är att börja skapa en tabell som kommer att lagra våra användare. 109 00:04:37,100 --> 00:04:39,100 >> Så, bokstavligen över här till höger, jag 110 00:04:39,100 --> 00:04:42,070 kommer att berätta databasen Jag vill ha en tabell som kallas användare. 111 00:04:42,070 --> 00:04:44,845 Så, är detta som fil som jag vill lagra alla mina data. 112 00:04:44,845 --> 00:04:45,720 Och hur många kolumner? 113 00:04:45,720 --> 00:04:47,740 Nåväl, låt oss hålla det enkelt för nu. 114 00:04:47,740 --> 00:04:51,855 Jag vill bara att lagra som en användarnamn och ett namn på en användare. 115 00:04:51,855 --> 00:04:53,020 Vi kommer att börja i liten skala. 116 00:04:53,020 --> 00:04:55,370 Så, jag vill ha två kolumner totalt. 117 00:04:55,370 --> 00:04:57,360 Och jag kommer att gå vidare och klicka på Gå. 118 00:04:57,360 --> 00:04:59,210 Och sedan, för dessa kolumner, vad jag ska 119 00:04:59,210 --> 00:05:04,576 att do-- om denna Internet cooperates-- okej, 120 00:05:04,576 --> 00:05:05,950 så vi ska försöka det igen. 121 00:05:05,950 --> 00:05:09,180 Jag ska skapa en tabell som kallas Användare med två kolumner, klicka på Gå, OK. 122 00:05:09,180 --> 00:05:10,520 Nu har vi fått det riktigt snabbt. 123 00:05:10,520 --> 00:05:12,065 Tack, mycket bra gjort. 124 00:05:12,065 --> 00:05:14,440 Okej, så vad vill vi dessa kolumner att kallas? 125 00:05:14,440 --> 00:05:16,080 >> Så, är en kommer att kallas Användarnamn. 126 00:05:16,080 --> 00:05:19,480 Så allt jag ser här-- och gränssnittet uppriktigt sagt blir lite fult så småningom, 127 00:05:19,480 --> 00:05:21,270 när du börjar skriva i alla dessa data. 128 00:05:21,270 --> 00:05:27,450 Men vad är trevligt är den sortens paradoxalt nog, jag skapar kolumner, 129 00:05:27,450 --> 00:05:29,977 men verktyget har dåraktigt lade ut dem i rader 130 00:05:29,977 --> 00:05:31,560 så att jag kan konfigurera dessa kolumner. 131 00:05:31,560 --> 00:05:33,550 Så det finns två ämnen där under namn. 132 00:05:33,550 --> 00:05:36,180 Och en av dessa områden I vill kallas användarnamn, 133 00:05:36,180 --> 00:05:38,000 och annat område jag vill ringa namn. 134 00:05:38,000 --> 00:05:40,340 >> Och nu måste jag välja datatyper för dessa saker. 135 00:05:40,340 --> 00:05:42,330 Så, medan i Excel och Google Spreadsheets, 136 00:05:42,330 --> 00:05:45,531 Om du vill ha en kolumn, du bokstavligen bara skriva namn eller användarnamn, tryck Enter. 137 00:05:45,531 --> 00:05:48,030 Kanske du gör det fetstil bara för tydlighetens skull, men det är det. 138 00:05:48,030 --> 00:05:50,140 Du behöver inte ange typer av kolumnerna. 139 00:05:50,140 --> 00:05:53,790 Nu i Google Spreadsheets eller Excel, du kan ange hur uppgifterna återges. 140 00:05:53,790 --> 00:05:58,120 Du kan gå till Format-menyn, och du kan ange visa detta som dollartecken, 141 00:05:58,120 --> 00:05:59,900 visa detta som en flyttalsvärde. 142 00:05:59,900 --> 00:06:01,990 >> Så det är i samma anda som att det vi håller på att göra, 143 00:06:01,990 --> 00:06:04,740 men detta faktiskt kommer att tvinga data för att vara en viss typ. 144 00:06:04,740 --> 00:06:07,750 Nu, även om en stund sedan jag sade att det finns bara ett fåtal datatyper, 145 00:06:07,750 --> 00:06:11,120 det finns faktiskt en hel del, och de är 146 00:06:11,120 --> 00:06:12,910 i varierande grad av specificitet. 147 00:06:12,910 --> 00:06:14,970 Och som en sidoreplik, du kan även göra snygga saker 148 00:06:14,970 --> 00:06:17,520 liknande lagrings geometrier insidan av en databas. 149 00:06:17,520 --> 00:06:19,250 Du kan lagra saker som GPS-koordinater 150 00:06:19,250 --> 00:06:22,420 och faktiskt hitta, matematiskt, punkter som är nära varandra. 151 00:06:22,420 --> 00:06:24,128 Men vi kommer att hålla detta super enkelt 152 00:06:24,128 --> 00:06:26,800 och gå upp till här, alla de så kallade strängtyper. 153 00:06:26,800 --> 00:06:29,240 >> Så, här är en lista över en massa alternativ. 154 00:06:29,240 --> 00:06:32,740 CHAR, VARCHAR TINYTEXT, MEDIUMTEXT, LONGTEXT. 155 00:06:32,740 --> 00:06:34,110 Och det är ganska överväldigande. 156 00:06:34,110 --> 00:06:37,610 Och tyvärr, något paradoxalt nog till C, 157 00:06:37,610 --> 00:06:40,120 en CHAR är egentligen inte en CHAR. 158 00:06:40,120 --> 00:06:44,170 Om du anger i en databas att din datatyp är CHAR, 159 00:06:44,170 --> 00:06:47,390 det betyder att ja, det är en CHAR, men det är en eller flera bokst. 160 00:06:47,390 --> 00:06:49,630 Och du måste ange hur många TECKEN du vill. 161 00:06:49,630 --> 00:06:51,636 Så, vad är en typisk längd för ett användarnamn? 162 00:06:51,636 --> 00:06:52,760 Finns det en gräns normalt? 163 00:06:52,760 --> 00:06:53,920 >> PUBLIK: [OHÖRBAR] 164 00:06:53,920 --> 00:06:55,050 >> DAVID MALAN: 16 kanske? 165 00:06:55,050 --> 00:06:55,990 Något sådant. 166 00:06:55,990 --> 00:06:57,948 Ni vet, tillbaka i dag, det brukade vara åtta. 167 00:06:57,948 --> 00:07:00,289 Ibland är det 16, ibland det är ännu mer än så. 168 00:07:00,289 --> 00:07:02,080 Och så gör det inte menar ge mig en CHAR. 169 00:07:02,080 --> 00:07:04,730 Detta betyder att jag måste ange längden av fältet, 170 00:07:04,730 --> 00:07:07,402 och nu kan jag säga något i stil med 16. 171 00:07:07,402 --> 00:07:08,610 Och det finns en avvägning här. 172 00:07:08,610 --> 00:07:11,360 Så vi får se i ett ögonblick att detta innebär en, 173 00:07:11,360 --> 00:07:14,620 varje användarnamn måste vara 16 tecken. 174 00:07:14,620 --> 00:07:18,720 Men vänta en minut, M-A-L-A-N. Om det är mitt användarnamn och jag använder bara fem, 175 00:07:18,720 --> 00:07:23,070 vad skulle du föreslå att databasen att göra för de andra 11 tecken som 176 00:07:23,070 --> 00:07:24,471 Jag har reserverat plats för? 177 00:07:24,471 --> 00:07:25,220 Vad skulle du göra? 178 00:07:25,220 --> 00:07:26,480 >> PUBLIK: [OHÖRBAR] 179 00:07:26,480 --> 00:07:27,160 >> DAVID MALAN: Ja, precis göra dem alla null. 180 00:07:27,160 --> 00:07:28,290 Gör dem utrymmen. 181 00:07:28,290 --> 00:07:30,816 Men förmodligen noll, så en massa omvända snedstreck nollor. 182 00:07:30,816 --> 00:07:33,190 Så, å ena sidan, vi har Nu såg till att mitt användarnamn 183 00:07:33,190 --> 00:07:34,780 kan vara mer än 16 tecken. 184 00:07:34,780 --> 00:07:37,590 Och den andra sidan av det är att om jag hade en riktigt långt namn 185 00:07:37,590 --> 00:07:39,940 eller ville ha en riktigt lång användarnamn som vissa av er 186 00:07:39,940 --> 00:07:44,840 killar kan ha i att högskolan eller på Yale.edu, kan du inte ha en. 187 00:07:44,840 --> 00:07:47,177 Och så i själva verket, om du har någonsin registrerats för en webbplats 188 00:07:47,177 --> 00:07:49,385 och du får skrek på att säga ditt lösenord är för lång 189 00:07:49,385 --> 00:07:52,710 eller ditt användarnamn är för lång, det är bara för att en programmerare, när 190 00:07:52,710 --> 00:07:55,500 konfigurera sin databas, beslutat att detta område kommer att 191 00:07:55,500 --> 00:07:57,150 vara längre än denna längd. 192 00:07:57,150 --> 00:08:00,580 >> Okej, så vad händer om Vi fortsätter att nämna? 193 00:08:00,580 --> 00:08:05,240 Hur länge ska en typisk människas namn vara? 194 00:08:05,240 --> 00:08:07,492 Hur många tecken, 16? 195 00:08:07,492 --> 00:08:09,450 Jag gissar att vi kunde hitta någon i det här rummet 196 00:08:09,450 --> 00:08:13,210 där av hans eller hennes första plus sista namn är längre än 16 tecken. 197 00:08:13,210 --> 00:08:14,850 Så, vad är bättre än att 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 >> PUBLIK: [OHÖRBAR] 203 00:08:21,855 --> 00:08:23,700 DAVID MALAN: 5000, herregud. 204 00:08:23,700 --> 00:08:26,309 Så, det är förmodligen en anständig övre gräns, skall vi säga. 205 00:08:26,309 --> 00:08:28,350 Och här har vi typ av har att göra en bedömning. 206 00:08:28,350 --> 00:08:30,400 Precis, det finns inget rätt svar här. 207 00:08:30,400 --> 00:08:32,740 Oändlig är inte fullt möjligt, eftersom vi är så småningom 208 00:08:32,740 --> 00:08:34,781 kommer att have-- vi är kommer att köra slut på minne. 209 00:08:34,781 --> 00:08:36,909 Så måste vi göra en dom samtal vid något tillfälle. 210 00:08:36,909 --> 00:08:41,010 >> Mycket vanliga skulle vara, till exempel, att use-- och låt mig ange CHAR här 211 00:08:41,010 --> 00:08:46,050 som before-- 255 var bokstavligen övre gräns för denna databasprogram 212 00:08:46,050 --> 00:08:46,700 för flera år sedan. 213 00:08:46,700 --> 00:08:48,575 Och så en massa människor vill bara säga, bra. 214 00:08:48,575 --> 00:08:49,420 255 är gränsen. 215 00:08:49,420 --> 00:08:50,620 Låt oss bara använda max. 216 00:08:50,620 --> 00:08:51,870 Och det är ganska löjligt. 217 00:08:51,870 --> 00:08:55,060 Liksom, om du skriver någons namn för 200 plus tecken, 218 00:08:55,060 --> 00:08:56,140 det lite löjligt. 219 00:08:56,140 --> 00:08:59,624 >> Men, kom ihåg att ASCII inte det enda systemet för tecken. 220 00:08:59,624 --> 00:09:01,540 Och så, i synnerhet i en Många asiatiska språk 221 00:09:01,540 --> 00:09:04,248 där det finns tecken som vi kan inte uttrycka på tangentbord som min USA 222 00:09:04,248 --> 00:09:08,209 tangentbord, vissa tecken faktiskt ta upp 16 bitar i stället för åtta bitar. 223 00:09:08,209 --> 00:09:10,250 Och så, denna faktiskt är inte så orimligt 224 00:09:10,250 --> 00:09:12,250 att vi behöver mer utrymme om vi vill passa 225 00:09:12,250 --> 00:09:16,252 större tecken än själva USA centrerad som vi har tenderat att diskutera. 226 00:09:16,252 --> 00:09:17,460 Så behöver vi några övre gräns. 227 00:09:17,460 --> 00:09:21,470 Jag vet inte vad det bästa är, men 255 är i allmänhet en vanlig en. 228 00:09:21,470 --> 00:09:22,700 25 känns lite. 229 00:09:22,700 --> 00:09:23,857 16, 32 känner sig låg. 230 00:09:23,857 --> 00:09:25,690 Jag skulle missta sig på sidan något högre. 231 00:09:25,690 --> 00:09:27,330 Men det finns en avvägning, som alltid. 232 00:09:27,330 --> 00:09:31,902 Vad är kanske självklart avvägning att reservera 255 bokst 233 00:09:31,902 --> 00:09:33,360 för allas namn i min databas? 234 00:09:33,360 --> 00:09:34,230 >> PUBLIK: [OHÖRBAR] 235 00:09:34,230 --> 00:09:34,510 >> DAVID MALAN: Vad är det? 236 00:09:34,510 --> 00:09:35,430 >> PUBLIK: [OHÖRBAR] 237 00:09:35,430 --> 00:09:37,138 >> DAVID MALAN: Det är en mycket minne, eller hur? 238 00:09:37,138 --> 00:09:42,280 M-A-L-A-N. Jag har bara slösat bort 250 tecken bara för att lagra mitt namn 239 00:09:42,280 --> 00:09:46,000 defensivt, bara i fall någon i klassen har en riktigt långt namn. 240 00:09:46,000 --> 00:09:47,940 Det känns som en onödig kompromiss. 241 00:09:47,940 --> 00:09:52,040 >> Så visar det sig att SQL, denna databasspråket, 242 00:09:52,040 --> 00:09:55,480 faktiskt stöder något kallas VARCHAR eller variabel TECKEN. 243 00:09:55,480 --> 00:09:59,390 Och detta är typ av trevligt att detta kan du ange inte en fast 244 00:09:59,390 --> 00:10:01,900 bredd, utan snarare en variabel bredd. 245 00:10:01,900 --> 00:10:05,060 Och mer specifikt, en maximal bredd av fältet. 246 00:10:05,060 --> 00:10:08,901 Så, innebär detta att ett namn kan vara mer än 250 tecken, 247 00:10:08,901 --> 00:10:10,150 men det kan säkert bli färre. 248 00:10:10,150 --> 00:10:11,733 Och databasen kommer att vara smart. 249 00:10:11,733 --> 00:10:14,860 Om du sätter i M-A-L-A-N, Det kommer bara att använda fem, 250 00:10:14,860 --> 00:10:18,120 kanske sex byte för liknande en bakre tomtecken, 251 00:10:18,120 --> 00:10:23,330 och inte spendera en extra 249 eller 250 bytes i onödan. 252 00:10:23,330 --> 00:10:27,380 >> Så verkar det som om jag borde har börjat med den här historien. 253 00:10:27,380 --> 00:10:29,140 Men det finns alltid en avvägning. 254 00:10:29,140 --> 00:10:33,024 Så, å ena sidan, ett användarnamn jag har specificerade för att vara svårt kodas vid 16, 255 00:10:33,024 --> 00:10:34,940 och kanske det var inte rätt samtalet, kanske det 256 00:10:34,940 --> 00:10:40,040 är, men varför inte använda VARCHARs för allt? 257 00:10:40,040 --> 00:10:42,020 >> Det finns en anledning. 258 00:10:42,020 --> 00:10:46,200 Varför inte använda VARCHARs för varje område vars längd du inte vet i förväg 259 00:10:46,200 --> 00:10:48,180 om det verkar vara en stor sak, eller hur? 260 00:10:48,180 --> 00:10:50,482 Använd bara så mycket utrymme som du behöver upp till denna gräns? 261 00:10:50,482 --> 00:10:51,271 >> PUBLIK: Långsammare. 262 00:10:51,271 --> 00:10:52,146 DAVID MALAN: Speller? 263 00:10:52,146 --> 00:10:53,120 PUBLIK: Gör det långsammare? 264 00:10:53,120 --> 00:10:53,970 DAVID MALAN: Åh, det är långsammare. 265 00:10:53,970 --> 00:10:55,720 Bra, det är nästan alltid svaret, uppriktigt sagt. 266 00:10:55,720 --> 00:10:56,520 Liksom, vad är avvägning? 267 00:10:56,520 --> 00:10:58,570 Det antingen kostar mer utrymme eller det kostar mer tid. 268 00:10:58,570 --> 00:11:00,111 Så i det här fallet, kan det vara långsammare. 269 00:11:00,111 --> 00:11:00,920 Varför? 270 00:11:00,920 --> 00:11:05,830 >> PUBLIK: [OHÖRBAR] bestämning [OHÖRBAR]. 271 00:11:05,830 --> 00:11:06,640 >> DAVID MALAN: Good. 272 00:11:06,640 --> 00:11:09,670 Så, du kanske minns från och med PSED5, leka med din inställning 273 00:11:09,670 --> 00:11:12,750 i ordlistan, om du måste allokera minne dynamiskt eller behålla 274 00:11:12,750 --> 00:11:14,630 odla en buffert, som kan faktiskt vara långsam. 275 00:11:14,630 --> 00:11:16,963 Om du måste ringa malloc under huven och kanske 276 00:11:16,963 --> 00:11:19,610 det är vad MySQL gör, så säkert som skulle kunna vara fallet. 277 00:11:19,610 --> 00:11:22,430 Och om du tror att vägen tillbaka till PSet-- eller till och med 278 00:11:22,430 --> 00:11:26,340 veckor två, när vi gjorde saker som binär sökning eller ens linjär sökning, 279 00:11:26,340 --> 00:11:30,690 en av de fina sakerna med varje ord i en databas eller varje ord i en kolonn 280 00:11:30,690 --> 00:11:33,690 är exakt samma längd, även om en hel massa av dessa tecken 281 00:11:33,690 --> 00:11:37,390 är tomma, är att du kan använda random access på dina data, eller hur? 282 00:11:37,390 --> 00:11:40,310 >> Om du vet att varje Ordet är 16 tecken bort, 283 00:11:40,310 --> 00:11:46,460 du kan använda pekare aritmetik, så att tala och gå till oss 16, 32, 48, 64, 284 00:11:46,460 --> 00:11:49,589 och du kan bara hoppa direkt med aritmetisk 285 00:11:49,589 --> 00:11:51,130 något av orden i din databas. 286 00:11:51,130 --> 00:11:54,280 Medan om det är en VARCHAR vad gör du i stället måste göra? 287 00:11:54,280 --> 00:11:55,960 >> [Telefonen ringer] 288 00:11:55,960 --> 00:11:58,680 >> Om det är en VARCHAR, du kan inte använda random access. 289 00:11:58,680 --> 00:12:01,341 Vad du måste leta efter eller göra? 290 00:12:01,341 --> 00:12:01,840 Yeah? 291 00:12:01,840 --> 00:12:03,240 >> PUBLIK: [OHÖRBAR] 292 00:12:03,240 --> 00:12:04,310 >> DAVID MALAN: Titta genom whole-- spår 293 00:12:04,310 --> 00:12:06,518 genom hela listan letar efter vad, mest troligt? 294 00:12:06,518 --> 00:12:08,356 Vilken typ av speciellt värde? 295 00:12:08,356 --> 00:12:09,230 PUBLIK: [OHÖRBAR] 296 00:12:09,230 --> 00:12:11,105 DAVID MALAN: Söker för nolltermine 297 00:12:11,105 --> 00:12:13,637 att avgränsa separationen av ord. 298 00:12:13,637 --> 00:12:15,720 Så återigen, en avvägning, och det finns inget rätt svar. 299 00:12:15,720 --> 00:12:18,380 Men det är här, i synnerhet när dina användare får vara många 300 00:12:18,380 --> 00:12:21,700 och din last på dina servrar, den antalet personer som använder den blir hög, 301 00:12:21,700 --> 00:12:23,650 dessa är faktiskt icke-triviala beslut. 302 00:12:23,650 --> 00:12:26,640 Så, kan vi lämna dessa som detta, men Låt oss bläddra ner över till höger 303 00:12:26,640 --> 00:12:27,332 här. 304 00:12:27,332 --> 00:12:30,290 Nu finns det ett par kolumner där vi måste göra en bedömning. 305 00:12:30,290 --> 00:12:35,170 Är det vettigt att låta en användares namn, en användares användarnamn eller en användares 306 00:12:35,170 --> 00:12:36,370 Namn, vara null? 307 00:12:36,370 --> 00:12:37,610 Det vill säga, bara tom. 308 00:12:37,610 --> 00:12:40,360 Känns lite meningslöst, så jag är kommer inte att kontrollera dessa lådor. 309 00:12:40,360 --> 00:12:42,670 Men det visar sig i en databas, kan man säga, 310 00:12:42,670 --> 00:12:44,620 någon kan valfritt ha detta värde. 311 00:12:44,620 --> 00:12:47,180 Den här kolumnen har inte att faktiskt vara där. 312 00:12:47,180 --> 00:12:48,570 >> Nu finns det här rullgardinsmenyn. 313 00:12:48,570 --> 00:12:50,810 Och märker jag är fortfarande i första raden där, 314 00:12:50,810 --> 00:12:52,520 så jag talar om användarnamn nu. 315 00:12:52,520 --> 00:12:56,290 Och det visar sig att en databas, till skillnad från en enkel ren kalkylblad, 316 00:12:56,290 --> 00:12:58,520 har kraftfulla funktioner som kallas index. 317 00:12:58,520 --> 00:13:02,600 Och ett index är ett sätt att tala om databas i förväg att jag den humana 318 00:13:02,600 --> 00:13:03,900 är smartare än du. 319 00:13:03,900 --> 00:13:10,430 >> Jag vet vilka typer av frågor, väljer eller infoga eller radera eller uppdatera, 320 00:13:10,430 --> 00:13:13,182 att min kod kommer att sluta upp gör på denna databas. 321 00:13:13,182 --> 00:13:14,390 Jag vill läsa en hel del data. 322 00:13:14,390 --> 00:13:15,681 Jag vill infoga en hel del data. 323 00:13:15,681 --> 00:13:17,530 Jag vill hela tiden radera en hel del data. 324 00:13:17,530 --> 00:13:21,520 Om jag vet att jag kommer att vara åtkomst till ett fält som användarnamn en hel del, 325 00:13:21,520 --> 00:13:24,770 Jag kan förebyggande syfte berätta databas, jag vet mer än du, 326 00:13:24,770 --> 00:13:29,220 och jag vill dekret som Du bör index här fältet. 327 00:13:29,220 --> 00:13:33,200 När indexera ett fält eller en kolumn innebär att databasen i förväg 328 00:13:33,200 --> 00:13:37,040 ska låna några idéer från, liksom, vecka fyra och fem och sex från CS50 329 00:13:37,040 --> 00:13:39,240 och faktiskt bygga upp något som en binär sökning 330 00:13:39,240 --> 00:13:41,560 träd eller något allmänt kallas en B träd 331 00:13:41,560 --> 00:13:43,410 att du skulle lära i en klass som CS124 332 00:13:43,410 --> 00:13:46,710 vid Harvard, en algoritmer klass, eller valfritt antal andra platser. 333 00:13:46,710 --> 00:13:49,570 >> Databasen och det smarta människor som genomfört det 334 00:13:49,570 --> 00:13:53,880 kommer att räkna ut hur man lagrar denna tabell av information 335 00:13:53,880 --> 00:13:57,061 i minnet så att sökningar och övrig verksamhet är supersnabb. 336 00:13:57,061 --> 00:13:58,060 Du behöver inte göra det. 337 00:13:58,060 --> 00:14:00,640 Du behöver inte genomföra linjär sökning eller binär sökning 338 00:14:00,640 --> 00:14:03,300 eller merge sort eller val sort, något av detta. 339 00:14:03,300 --> 00:14:06,590 Databasen gör det åt dig om du berättar det förebyggande syfte att indexera detta område. 340 00:14:06,590 --> 00:14:09,100 >> Och du kan se också, det finns vissa andra egenskaper 341 00:14:09,100 --> 00:14:11,010 Vi kan tala om databasen för att genomdriva. 342 00:14:11,010 --> 00:14:16,431 Vad kan det betyda om jag väljer Unik från denna meny, bara intuitivt? 343 00:14:16,431 --> 00:14:16,930 Yeah? 344 00:14:16,930 --> 00:14:17,889 >> PUBLIK: [OHÖRBAR] 345 00:14:17,889 --> 00:14:19,930 DAVID MALAN: Ja, användarnamn måste vara unikt. 346 00:14:19,930 --> 00:14:23,330 Är detta en bra sak eller en dålig sak för en databas för en webbplats med användare? 347 00:14:23,330 --> 00:14:24,965 Om användarnamn vara unik? 348 00:14:24,965 --> 00:14:25,880 Ja, antagligen. 349 00:14:25,880 --> 00:14:27,800 Om det är vad fält vi använder för att logga in, 350 00:14:27,800 --> 00:14:31,867 du egentligen inte vill människor som har samma känsla eller samma användarnamn. 351 00:14:31,867 --> 00:14:33,700 Så kan vi ha databas genomdriva det så 352 00:14:33,700 --> 00:14:37,880 som nu i min PHP-kod eller något annat språk, Jag behöver inte, till exempel, kontrollera 353 00:14:37,880 --> 00:14:41,490 nödvändigtvis gör detta användarnamn existerar innan jag låta någon registrera? 354 00:14:41,490 --> 00:14:46,690 Databasen kommer inte att låta två personer som heter David eller Malans registrera sig i det här fallet. 355 00:14:46,690 --> 00:14:50,030 >> Och som en sidoreplik, även om detta menyn kan du bara välja en, 356 00:14:50,030 --> 00:14:54,550 ett unikt index är ett som är indexeras för supersnabb prestanda, 357 00:14:54,550 --> 00:14:56,100 men det upprätthåller också unika. 358 00:14:56,100 --> 00:14:58,850 Och vi ska återkomma till vad andra två betyda på bara ett ögonblick. 359 00:14:58,850 --> 00:15:00,930 Under tiden, om jag går till min andra raden, som 360 00:15:00,930 --> 00:15:06,230 är användarens namn, ska jag ange att namnet ska vara unikt? 361 00:15:06,230 --> 00:15:09,550 Nej, eftersom du kan säkert have-- det finns ingen två David 362 00:15:09,550 --> 00:15:11,050 Malans i det här rummet, troligen. 363 00:15:11,050 --> 00:15:14,290 Men om vi väljer ett annat namn, Vi kan säkert ha kollisioner. 364 00:15:14,290 --> 00:15:16,130 >> Tänk tillbaka på hash tabeller och liknande. 365 00:15:16,130 --> 00:15:18,604 Så vi verkligen inte vill ha att göra namnfältet unika. 366 00:15:18,604 --> 00:15:21,270 Så vi ska bara lämna det såsom streck, streck, streck, ingenting. 367 00:15:21,270 --> 00:15:22,660 Och jag kommer att lämna allt annat ensam. 368 00:15:22,660 --> 00:15:25,035 I själva verket, de flesta av dessa områden Vi kommer inte att bry sig om. 369 00:15:25,035 --> 00:15:27,830 Och när jag är redo att spara, Om internet samarbetar, 370 00:15:27,830 --> 00:15:35,032 Jag klickar på Spara, och mycket, mycket, mycket långsamt gör databasen bli frälst. 371 00:15:35,032 --> 00:15:37,240 Och nu är jag tillbaka till denna gränssnitt, som visserligen, 372 00:15:37,240 --> 00:15:38,680 är överväldigande vid första anblicken. 373 00:15:38,680 --> 00:15:42,450 Men allt jag ska göra är att klicka på ordet Användare på övre vänstra. 374 00:15:42,450 --> 00:15:47,630 Jag kommer att gå upp här, klicka Användare och som standard, det 375 00:15:47,630 --> 00:15:50,180 har utfört en del SQL, men mer om detta i ett ögonblick. 376 00:15:50,180 --> 00:15:52,654 Här är bara en sammanfattning av vad jag gjorde. 377 00:15:52,654 --> 00:15:55,320 Och inte oroa dig att du ser nämna i latin och svenska här. 378 00:15:55,320 --> 00:16:00,490 De är bara standard inställningar, eftersom MySQL ursprungligen, 379 00:16:00,490 --> 00:16:04,000 eller PHP MyAdmin, en av de två som hände som ska skrivas av några svenska folket. 380 00:16:04,000 --> 00:16:06,100 Men det är irrelevant i vårt fall här. 381 00:16:06,100 --> 00:16:08,280 >> Okej, så varför är allt detta intressant? 382 00:16:08,280 --> 00:16:13,050 Det visar sig, kan jag infoga data i en databas genom att skriva kod. 383 00:16:13,050 --> 00:16:15,940 Och jag gå vidare och i min fil här, jag är 384 00:16:15,940 --> 00:16:19,000 kommer att gå vidare och låtsas som detta är kopplad till databasen, som 385 00:16:19,000 --> 00:16:23,040 är det inte just nu, men det kommer vara när vi kommer till problem ställa sju. 386 00:16:23,040 --> 00:16:25,640 Och jag kommer att gå vidare och utföra en funktion som kallas fråga, 387 00:16:25,640 --> 00:16:28,730 som vi kommer att ge dig problem set sju distributions kod, att 388 00:16:28,730 --> 00:16:31,490 tar minst en argument som ligger bara en sträng. 389 00:16:31,490 --> 00:16:33,460 En sträng av SQL-kod. 390 00:16:33,460 --> 00:16:36,700 Så du är på väg att lära sig skriva Structured Query Language. 391 00:16:36,700 --> 00:16:41,270 >> Om jag vill infoga en ny rad i min databas för att någon har lämnat 392 00:16:41,270 --> 00:16:47,600 ett formulär för att min kod, jag skulle bokstavligen skriva INSERT INTO användare följande 393 00:16:47,600 --> 00:16:52,800 fält: användarnamn, kommatecken, namn, värden, 394 00:16:52,800 --> 00:16:57,480 och nu behöver jag för att infoga något som Malan, och citationstecken, 395 00:16:57,480 --> 00:17:01,490 unquote David Malan. " Och nu även för dem obekanta med SQL, 396 00:17:01,490 --> 00:17:07,830 Varför använder jag apostrof insidan av denna gröna sträng? 397 00:17:07,830 --> 00:17:10,790 398 00:17:10,790 --> 00:17:13,040 Vad kan vara orsaken här? 399 00:17:13,040 --> 00:17:14,609 >> Märker jag är co-mingel två språk. 400 00:17:14,609 --> 00:17:18,099 Query är en PHP-funktionen, men det tar ett argument. 401 00:17:18,099 --> 00:17:21,740 Och detta argument måste själv vara skrivet på ett annat språk som kallas 402 00:17:21,740 --> 00:17:23,500 SQL, Structured Query Language. 403 00:17:23,500 --> 00:17:27,940 Så, allt som jag har just belyst här 404 00:17:27,940 --> 00:17:30,380 är detta språk kallas SQL. 405 00:17:30,380 --> 00:17:36,290 Så, vad är det med enkla citattecken, precis som en snabb kontroll förstånd? 406 00:17:36,290 --> 00:17:37,324 Varsegod. 407 00:17:37,324 --> 00:17:37,990 De är strängar. 408 00:17:37,990 --> 00:17:41,590 Så, citationstecken, unquote Malan och citationstecken, unquote David Malan är strängar. 409 00:17:41,590 --> 00:17:45,210 Och bara tänker intuitivt nu, att veta vad du vet om C och PHP, 410 00:17:45,210 --> 00:17:50,220 varför gjorde jag inte göra det här, som jag brukar begagnade citationstecken för strängar? 411 00:17:50,220 --> 00:17:52,310 Varför ville jag inte göra det? 412 00:17:52,310 --> 00:17:52,810 Yeah? 413 00:17:52,810 --> 00:17:53,685 >> PUBLIK: [OHÖRBAR] 414 00:17:53,685 --> 00:17:56,695 415 00:17:56,695 --> 00:17:57,570 DAVID MALAN: Exakt. 416 00:17:57,570 --> 00:17:59,653 Eftersom jag redan använder citattecken på vägen 417 00:17:59,653 --> 00:18:01,929 utanför av argumentet till PHP-funktionen, 418 00:18:01,929 --> 00:18:03,470 Jag skulle bara förvirra tolken. 419 00:18:03,470 --> 00:18:04,860 Det kommer inte vet, dessa går ihop? 420 00:18:04,860 --> 00:18:05,735 Gör dessa går ihop? 421 00:18:05,735 --> 00:18:06,810 Gör dessa går ihop? 422 00:18:06,810 --> 00:18:08,070 Så jag växlar i stället. 423 00:18:08,070 --> 00:18:11,784 >> Eller jag kunde göra något sånt här, bakstreck citat eller backslash citat. 424 00:18:11,784 --> 00:18:14,200 Ärligt talat, det bara börjar få mycket oläslig och ful. 425 00:18:14,200 --> 00:18:16,790 Men det skulle uppnå samma resultat samt. 426 00:18:16,790 --> 00:18:19,760 >> Så om jag skulle köra detta frågan nu, låt oss se vad som händer. 427 00:18:19,760 --> 00:18:22,740 Jag kommer att gå vidare nu och ganska än köra PHP-koden, som 428 00:18:22,740 --> 00:18:24,610 är där du kommer att spela i problembild sju, 429 00:18:24,610 --> 00:18:27,200 Jag ska i stället gå till PHP MyAdmin. 430 00:18:27,200 --> 00:18:29,770 Och jag manuellt gå gå till fliken SQL, 431 00:18:29,770 --> 00:18:31,580 och låt mig zooma in på gränssnittet. 432 00:18:31,580 --> 00:18:34,007 Och jag kommer att klistra in det jag just skrev. 433 00:18:34,007 --> 00:18:36,090 Och färgkodningen har förändrats lite nu, 434 00:18:36,090 --> 00:18:38,750 bara för att programformaten saker lite annorlunda. 435 00:18:38,750 --> 00:18:41,960 Men märker att allt jag har gjort är jag har sagt, sätt in användare. 436 00:18:41,960 --> 00:18:45,790 Jag har angett, då, i en komma separerade parentes listan två 437 00:18:45,790 --> 00:18:48,850 fält som jag vill infoga, och då jag har bokstavligen nämnda värden 438 00:18:48,850 --> 00:18:51,510 följt av en annan Paren, och sedan de två värdena 439 00:18:51,510 --> 00:18:53,520 Jag vill plug-in, och nu för bra åtgärd, 440 00:18:53,520 --> 00:18:55,010 Jag ska sätta ett semikolon i slutet. 441 00:18:55,010 --> 00:18:56,570 Så detta är inte C. Detta är inte PHP. 442 00:18:56,570 --> 00:18:59,970 Detta är nu SQL, och jag klistrar in det i denna webbaserade gränssnitt som är 443 00:18:59,970 --> 00:19:02,710 bara att låta mig, så fort jag klickar Go, 444 00:19:02,710 --> 00:19:08,060 verkställa denna fråga på databasen kör inne i CS50 IDE. 445 00:19:08,060 --> 00:19:09,470 >> Så det här är bra. 446 00:19:09,470 --> 00:19:12,520 Observera att nämnda en rad införas, gick supersnabb, 447 00:19:12,520 --> 00:19:15,190 0,0054 sekunder för att sätta dessa uppgifter. 448 00:19:15,190 --> 00:19:16,610 Så, det låter ganska frisk. 449 00:19:16,610 --> 00:19:19,350 Det omformaterad min förfrågan för mig här bara för att se det 450 00:19:19,350 --> 00:19:21,730 i form av färgkodade version. 451 00:19:21,730 --> 00:19:24,540 Men nu om jag klickar Bläddra, märker att även 452 00:19:24,540 --> 00:19:29,070 även om det finns en hel del skräp på skärmen har mitt bord nu två rader. 453 00:19:29,070 --> 00:19:30,700 >> Så, låt mig gå vidare och göra en annan. 454 00:19:30,700 --> 00:19:33,760 I stället för detta, låt mig gå till fliken SQL igen. 455 00:19:33,760 --> 00:19:40,723 Och den här gången ska jag sätta något liknande Rob och hans namn kommer att vara Rob Bowden. 456 00:19:40,723 --> 00:19:42,330 Bowden. 457 00:19:42,330 --> 00:19:44,040 Låt oss klicka på Spara. 458 00:19:44,040 --> 00:19:46,140 Oops, snarare gå. 459 00:19:46,140 --> 00:19:48,890 >> Klicka på Bläddra igen, och Nu märker jag har två rader. 460 00:19:48,890 --> 00:19:52,390 Så detta är bara ett sätt mer komplex sätt att öppna upp Google kalkylark 461 00:19:52,390 --> 00:19:54,010 och bara skriva en rad i en kolonn. 462 00:19:54,010 --> 00:19:57,070 Men vad är nyckeln är att vi nu har syntaxen 463 00:19:57,070 --> 00:20:00,220 som att skriva kod så att i slutändan, vi kunde faktiskt 464 00:20:00,220 --> 00:20:01,790 göra en del och detta. 465 00:20:01,790 --> 00:20:05,380 Minns att PHP stöder super globala variabler. 466 00:20:05,380 --> 00:20:08,415 >> Vad är inne i dollar logga streck FÅ i PHP? 467 00:20:08,415 --> 00:20:10,290 Vi tog en titt på en eller två enkla exempel. 468 00:20:10,290 --> 00:20:15,640 Och i PSet6, minns du hello dot PHP som använder denna variabel. 469 00:20:15,640 --> 00:20:17,870 Vad går in där? 470 00:20:17,870 --> 00:20:21,015 Eller vad är det? 471 00:20:21,015 --> 00:20:22,522 Lite högre. 472 00:20:22,522 --> 00:20:23,790 >> PUBLIK: [OHÖRBAR] 473 00:20:23,790 --> 00:20:25,030 >> DAVID MALAN: Det är en snö utsäde av array, som 474 00:20:25,030 --> 00:20:27,714 är bara ett fint sätt att säga en matris som har nyckelpar värde. 475 00:20:27,714 --> 00:20:28,880 Och nycklarna är inte numeriskt. 476 00:20:28,880 --> 00:20:30,420 De är ord eller strängar. 477 00:20:30,420 --> 00:20:32,750 Och särskilt vad är de nyckelpar värde? 478 00:20:32,750 --> 00:20:35,110 Var kommer de ifrån? 479 00:20:35,110 --> 00:20:35,620 Förlåt? 480 00:20:35,620 --> 00:20:36,994 >> PUBLIK: [OHÖRBAR] 481 00:20:36,994 --> 00:20:37,660 DAVID MALAN: Nej? 482 00:20:37,660 --> 00:20:40,700 Var gör de nyckel värdepar ifrån? 483 00:20:40,700 --> 00:20:42,490 Säg det igen? 484 00:20:42,490 --> 00:20:44,610 Igen? 485 00:20:44,610 --> 00:20:46,472 Är jag den enda hörsel något? 486 00:20:46,472 --> 00:20:47,810 >> [LAUGHTER] 487 00:20:47,810 --> 00:20:49,042 >> Det är rätt, ja? 488 00:20:49,042 --> 00:20:50,435 >> PUBLIK: [OHÖRBAR] 489 00:20:50,435 --> 00:20:52,560 DAVID MALAN: Ja, de kommer från frågesträngen. 490 00:20:52,560 --> 00:20:55,380 Så, om du spola tillbaka i tid för att när vi har spelat med Google 491 00:20:55,380 --> 00:20:59,600 och vi har gått till Google.com snedstreck Sök frågetecken q lika katter, 492 00:20:59,600 --> 00:21:03,550 om jag skulle trycka Enter och om Google genomfördes i PHP, 493 00:21:03,550 --> 00:21:07,017 PHP-kod som Google skrev skulle ha tillgång till dollartecken 494 00:21:07,017 --> 00:21:11,600 streck GET inuti vilket är en viktig kallas Q och ett värde 495 00:21:11,600 --> 00:21:17,680 kallas katter som det då kan använda används för att göra en verklig sökning med. 496 00:21:17,680 --> 00:21:20,860 >> Så i själva verket, vad jag ska gör nu är att gå tillbaka till min PHP-kod 497 00:21:20,860 --> 00:21:23,140 att du återigen kommer att se mer av i PSet7. 498 00:21:23,140 --> 00:21:25,440 Och istället för att plugga i hårt kodade värden som 499 00:21:25,440 --> 00:21:27,630 verkar inte som en mycket dynamisk webbplats, 500 00:21:27,630 --> 00:21:30,680 Jag ska ge dig en teaser av vad din faktiska kod skulle göra. 501 00:21:30,680 --> 00:21:32,854 Du skulle sätta in två frågetecken så här. 502 00:21:32,854 --> 00:21:34,270 Jag vet inte vad användarnamnet är. 503 00:21:34,270 --> 00:21:37,390 Jag vet inte vad Namnet kommer att bli, 504 00:21:37,390 --> 00:21:39,470 men jag vet att jag kan få dem dynamiskt. 505 00:21:39,470 --> 00:21:43,420 >> Så, om koden vi skriver nu är koden som körs på Googles servrar, 506 00:21:43,420 --> 00:21:46,940 eller om detta är hello prick PHP, som levereras med PSet6, 507 00:21:46,940 --> 00:21:48,650 Jag kommer att passera in frågefunktionen 508 00:21:48,650 --> 00:21:51,450 precis som printf, två andra argument. 509 00:21:51,450 --> 00:21:57,120 GET, citationstecken, unquote användarnamn, och GET, citationstecken, unquote namn. 510 00:21:57,120 --> 00:22:00,720 Och nu märker vad allmänna strukturen är här. 511 00:22:00,720 --> 00:22:03,320 Jag har till vänster sidan av samtalet, 512 00:22:03,320 --> 00:22:05,480 denna funktion kallas frågan i PHP. 513 00:22:05,480 --> 00:22:08,160 Jag har fortfarande som en första argument, bara en textsträng. 514 00:22:08,160 --> 00:22:11,000 >> Men att textsträng är skriven på ett språk som kallas SQL. 515 00:22:11,000 --> 00:22:12,616 Och ärligt talat, det är inte en stor språk. 516 00:22:12,616 --> 00:22:14,990 Vi kommer bara att tala om det formellt idag, verkligen. 517 00:22:14,990 --> 00:22:17,031 Och sedan i problem set sju, det finns relativt 518 00:22:17,031 --> 00:22:18,800 några funktioner som vi är kommer att utnyttja. 519 00:22:18,800 --> 00:22:22,530 De frågetecken, men menar ansluta ett värde här och koppla in ett annat värde 520 00:22:22,530 --> 00:22:23,130 här. 521 00:22:23,130 --> 00:22:26,010 Och varsel, har jag utelämnat vad från hela quote-- jävla 522 00:22:26,010 --> 00:22:30,470 det-- runt citatet markerar den här gången. 523 00:22:30,470 --> 00:22:34,930 Jag har utelämnat citatet märken runt frågetecken, 524 00:22:34,930 --> 00:22:36,410 ledsen, den här gången. 525 00:22:36,410 --> 00:22:38,870 >> Så, vad är trevligt om det här frågetecken funktion som 526 00:22:38,870 --> 00:22:42,830 PHP tenderar att stödja, Ruby och Python och andra språk, 527 00:22:42,830 --> 00:22:45,730 Detta betyder bara plugg i vissa värdera här och vet du vad? 528 00:22:45,730 --> 00:22:48,300 Du räkna ut om du vill använda apostrof eller citationstecken. 529 00:22:48,300 --> 00:22:50,966 Bry dig inte om mig med dem intellektuellt ointressant detaljer. 530 00:22:50,966 --> 00:22:53,780 Men, se till att det är rätt så att min kod är ytterst 531 00:22:53,780 --> 00:22:57,010 operativ och säker, vilket kommer att ha en mening innan länge. 532 00:22:57,010 --> 00:23:00,460 >> Nu, hur många argument totalt, bara för att vara tydlig, är sökfunktion tagande? 533 00:23:00,460 --> 00:23:05,240 534 00:23:05,240 --> 00:23:07,581 Någon som vill rösta för mer än två? 535 00:23:07,581 --> 00:23:08,080 Tre? 536 00:23:08,080 --> 00:23:10,001 Visst, varför? 537 00:23:10,001 --> 00:23:10,920 Varför tre? 538 00:23:10,920 --> 00:23:12,305 >> PUBLIK: [OHÖRBAR] 539 00:23:12,305 --> 00:23:13,180 DAVID MALAN: Exakt. 540 00:23:13,180 --> 00:23:14,610 Den första delen är den sträng. 541 00:23:14,610 --> 00:23:18,640 Det andra argumentet är dollartecken streck GET fäste användarnamn. 542 00:23:18,640 --> 00:23:21,950 Och det tredje argumentet är Samma sak, men bara namnet. 543 00:23:21,950 --> 00:23:24,590 Så med andra ord, nu om jag hade ett webbformulär 544 00:23:24,590 --> 00:23:27,149 som hade till textfält, en för användarens användarnamn, 545 00:23:27,149 --> 00:23:29,690 en för hans eller hennes namn, bara som du skulle se på en webbplats 546 00:23:29,690 --> 00:23:32,120 när du registrerar dig för någon hemsida, denna styrka 547 00:23:32,120 --> 00:23:35,450 vara koden på bakändan som faktiskt gör insättningen nu 548 00:23:35,450 --> 00:23:37,220 i databasen. 549 00:23:37,220 --> 00:23:40,870 >> Nu däremot, låt oss snabbspola framåt. 550 00:23:40,870 --> 00:23:43,840 Antag att en användare är nu logga in och du vill 551 00:23:43,840 --> 00:23:48,860 att skriva PHP-kod som kontrollerar om den person som just loggat in 552 00:23:48,860 --> 00:23:52,250 är faktiskt en användare, kan du Använd ganska enkel syntax. 553 00:23:52,250 --> 00:23:55,832 Man kan säga SELECT, låt oss säga stjärna, där stjärnan betyder allt. 554 00:23:55,832 --> 00:23:57,540 Jag vet inte vad jag vill, så bara ge mig 555 00:23:57,540 --> 00:24:01,585 alla kolumner från bordet kallas användare där, och det är trevligt. 556 00:24:01,585 --> 00:24:03,710 Välj stöder vad kallas ett predikat, vilket är 557 00:24:03,710 --> 00:24:06,630 som ett sätt att kvalificera vad du vill. 558 00:24:06,630 --> 00:24:10,590 Där användarnamn är lika citationstecken, unquote Malan. 559 00:24:10,590 --> 00:24:13,680 Så även här, har jag inbäddade inuti argumentet 560 00:24:13,680 --> 00:24:16,110 till en PHP-funktionen, en linje av SQL-kod. 561 00:24:16,110 --> 00:24:18,680 Och det SQL-kod här tiden bokstavligen gå 562 00:24:18,680 --> 00:24:21,790 för att söka efter offert, unquote Malan. 563 00:24:21,790 --> 00:24:24,420 >> Nu är inte så bra, så jag kommer att hoppa över den 564 00:24:24,420 --> 00:24:28,650 och jag kommer att lägga undan detta tips från Brady, och gå 565 00:24:28,650 --> 00:24:30,990 och plug-in istället ett frågetecken här. 566 00:24:30,990 --> 00:24:33,290 Så, bara för att vara tydlig, vad bör min andra argument 567 00:24:33,290 --> 00:24:37,480 att om någon har just loggat in och jag vill kontrollera om han eller hon är faktiskt 568 00:24:37,480 --> 00:24:39,265 en användare? 569 00:24:39,265 --> 00:24:40,140 PUBLIK: [OHÖRBAR] 570 00:24:40,140 --> 00:24:40,890 DAVID MALAN: Ja. 571 00:24:40,890 --> 00:24:44,120 Jag hör dollartecken streck FÅ citationstecken, unquote användarnamn. 572 00:24:44,120 --> 00:24:50,040 Och det skulle återvända till mig någon av raderna i min databas 573 00:24:50,040 --> 00:24:51,986 som har ett användarnamn av Malan. 574 00:24:51,986 --> 00:24:54,860 Nu förhoppningsvis kommer jag att komma tillbaka noll om Malan har aldrig varit här, 575 00:24:54,860 --> 00:24:56,290 eller en om han har. 576 00:24:56,290 --> 00:24:59,026 Jag borde inte få tillbaka två eller tre eller fyra. 577 00:24:59,026 --> 00:24:59,526 Varför? 578 00:24:59,526 --> 00:25:00,220 >> PUBLIK: [OHÖRBAR] 579 00:25:00,220 --> 00:25:01,120 >> DAVID MALAN: Jag sade unikt, rätt? 580 00:25:01,120 --> 00:25:01,750 Enkla anledningen. 581 00:25:01,750 --> 00:25:04,030 Eftersom jag sa att det har fått till vara unik, precis logiskt, 582 00:25:04,030 --> 00:25:07,940 du kan bara ha noll eller ett Malans i detta speciella databastabell. 583 00:25:07,940 --> 00:25:10,965 Nu som en sidoreplik, bara så du har sett det, även om jag fortsätta använda GET 584 00:25:10,965 --> 00:25:14,350 och även om PSet6 används endast GET, kan du säkert ha POST. 585 00:25:14,350 --> 00:25:17,212 Och minns att Post är en annan teknik för att lämna information 586 00:25:17,212 --> 00:25:19,170 från ett formulär, men det inte dyker upp i webbadressen. 587 00:25:19,170 --> 00:25:22,690 Det är lite säkrare säkert för saker som användarnamn och lösenord, 588 00:25:22,690 --> 00:25:25,210 som PSet7 kommer i själva verket innebära. 589 00:25:25,210 --> 00:25:28,130 >> Så, låt oss göra detta i PHP MyAdmin och se vad som händer. 590 00:25:28,130 --> 00:25:30,020 Jag kommer att gå till fliken MySQL. 591 00:25:30,020 --> 00:25:34,450 Och lägg märke till att standardvärdet för PHP MyAdmin, bara att försöka vara till hjälp, 592 00:25:34,450 --> 00:25:37,050 är att välja stjärnan från användare där en. 593 00:25:37,050 --> 00:25:39,430 Tja, är man alltid sant, så Detta har fåniga effektiva 594 00:25:39,430 --> 00:25:40,400 för att bara markera allt. 595 00:25:40,400 --> 00:25:42,691 Men jag kommer att vara lite mer pedantisk och manuellt 596 00:25:42,691 --> 00:25:45,920 Skriv ut SELECT stjärna från användarna. 597 00:25:45,920 --> 00:25:48,294 >> Nu tekniskt, kan du citera namnet i tabellerna. 598 00:25:48,294 --> 00:25:50,460 Det är ovanligt att du måste, men märker dessa inte 599 00:25:50,460 --> 00:25:52,240 dina vanliga offerter på amerikanskt tangentbord. 600 00:25:52,240 --> 00:25:54,760 Detta är den så kallade baklängescitationstecken, som är i allmänhet på det övre vänstra 601 00:25:54,760 --> 00:25:56,000 hörnet av tangentbordet. 602 00:25:56,000 --> 00:25:58,500 Men det är ovanligt att du kommer faktiskt behöver bry med det, 603 00:25:58,500 --> 00:25:59,950 så jag ska bara utelämna dem ändå. 604 00:25:59,950 --> 00:26:02,280 Så nu, låt mig gå vidare och träffa gå. 605 00:26:02,280 --> 00:26:06,616 Och hur många rader ska jag få tillbaka när jag väljer stjärnan från användare? 606 00:26:06,616 --> 00:26:08,407 >> PUBLIK: [OHÖRBAR] 607 00:26:08,407 --> 00:26:09,990 DAVID MALAN: Antalet rader, säker. 608 00:26:09,990 --> 00:26:12,390 Men hur många i detta konkret historia just nu? 609 00:26:12,390 --> 00:26:14,640 Två, eftersom det inte fanns mig och det fanns Rob. 610 00:26:14,640 --> 00:26:19,370 Så, om jag klickar Go, ser jag visuellt att Jag har fått tillbaka, ja, två rader. 611 00:26:19,370 --> 00:26:22,060 Det finns en hel del skräp på skärm, men jag ser bara två rader. 612 00:26:22,060 --> 00:26:28,580 Däremot om jag gör det igen och göra SELECT stjärnan från användare, där användarnamn 613 00:26:28,580 --> 00:26:31,840 lika citationstecken, unquote Malan, nu om jag klickar Go, 614 00:26:31,840 --> 00:26:33,970 Jag kommer bara att få tillbaka en rad. 615 00:26:33,970 --> 00:26:36,499 Och slutligen, om jag gör ungefär så här, antar 616 00:26:36,499 --> 00:26:38,290 att jag inte bryr sig om få allt, 617 00:26:38,290 --> 00:26:41,020 som är typ av meningslöst nu, eftersom det finns bara två kolumner. 618 00:26:41,020 --> 00:26:43,103 Det är inte som jag väljer en enorm mängd data. 619 00:26:43,103 --> 00:26:46,720 Anta att jag gå vidare och markerar namn FRÅN 620 00:26:46,720 --> 00:26:51,990 användare, där användarnamn är lika Malan, vad är trevligt om SQL ärligt, 621 00:26:51,990 --> 00:26:54,290 är att det egentligen bara gör vad du säger den att göra. 622 00:26:54,290 --> 00:26:57,550 Det är ganska kortfattad, men du bokstavligen bara tala om vad du vill göra. 623 00:26:57,550 --> 00:27:01,130 Välj namn från användare där användarnamnet lika Malan. 624 00:27:01,130 --> 00:27:03,440 Och det är verkligen så explicit. 625 00:27:03,440 --> 00:27:08,410 Så nu om jag slog Go, hur många rader jag kommer att komma tillbaka? 626 00:27:08,410 --> 00:27:10,770 En, eftersom det är bara Malan, förhoppningsvis. 627 00:27:10,770 --> 00:27:13,100 Eller noll om han inte där, men ett maximalt. 628 00:27:13,100 --> 00:27:17,610 >> Och hur många kolumner får jag tillbaka? 629 00:27:17,610 --> 00:27:18,450 Hur många kolumner? 630 00:27:18,450 --> 00:27:20,658 Den här gången, jag ska bara att få en eftersom jag inte 631 00:27:20,658 --> 00:27:22,380 välj stjärna, vilket är allt. 632 00:27:22,380 --> 00:27:27,900 Nu ska jag välja bara namn, så jag bara få tillbaka en kolumn och en rad. 633 00:27:27,900 --> 00:27:31,730 Och det ser slags lämpligt löjligt, bara titta super 634 00:27:31,730 --> 00:27:33,060 liten så här. 635 00:27:33,060 --> 00:27:34,290 Så, vad som verkligen händer? 636 00:27:34,290 --> 00:27:36,890 När du kör en SQL fråga med select, 637 00:27:36,890 --> 00:27:38,700 vad du får tillbaka från databasen 638 00:27:38,700 --> 00:27:42,970 är som en temporär tabell med rader och kolumner, kanske, 639 00:27:42,970 --> 00:27:46,260 men att utelämna allt som faktiskt inte som du väljer. 640 00:27:46,260 --> 00:27:49,010 Så, det är som om någon hade en stor kalkylblad med alla elever 641 00:27:49,010 --> 00:27:51,610 registrerats för vissa studentgrupp, och du säger, 642 00:27:51,610 --> 00:27:55,097 ge mig alla nybörjare som har registrerats för vår studentgrupp, vad 643 00:27:55,097 --> 00:27:56,930 din kollega i studentgruppen kan göra 644 00:27:56,930 --> 00:27:58,430 är de bara kunde lämna du hela kalkylbladet. 645 00:27:58,430 --> 00:27:59,742 Det är som att säga att välja stjärna. 646 00:27:59,742 --> 00:28:02,200 Och det är lite irriterande om du bara ville nybörjare. 647 00:28:02,200 --> 00:28:05,640 Och så, om du istället sagt, välj stjärna från databastabell 648 00:28:05,640 --> 00:28:08,470 där år lika med citationstecken, unquote förstaårselev, 649 00:28:08,470 --> 00:28:10,810 det är som om din vän i studentgruppen 650 00:28:10,810 --> 00:28:13,770 bokstavligen fram och kopieras endast gröngölingar rader, 651 00:28:13,770 --> 00:28:16,780 klistras in dem i ett nytt Google Kalkylblad eller en Excel-fil, 652 00:28:16,780 --> 00:28:18,860 och överlämnade du tillbaka endast resulterande filen. 653 00:28:18,860 --> 00:28:21,710 Det är allt som händer på begrepps här. 654 00:28:21,710 --> 00:28:23,920 >> Så i slutändan kan vi göra några ganska snygga saker 655 00:28:23,920 --> 00:28:26,560 genom att lagra saker som användarnamn och lösenord och liknande. 656 00:28:26,560 --> 00:28:30,310 Men, visar det sig, ska vi göra lite annorlunda än här. 657 00:28:30,310 --> 00:28:34,750 Det är inte så smart att bara lagra ett användarnamn och ett lösenord. 658 00:28:34,750 --> 00:28:37,790 Någon tidigare, tror jag här nere, föreslog ett ID. 659 00:28:37,790 --> 00:28:40,787 Nu ett ID kan vara som en Harvard-ID eller Yales Net ID, 660 00:28:40,787 --> 00:28:42,870 men det kan vara ännu enklare i vår databas fall. 661 00:28:42,870 --> 00:28:45,120 Och faktiskt, det vanligaste fallet är att ha en annan kolumn. 662 00:28:45,120 --> 00:28:46,953 Och jag kommer att gå framåt och redigera mitt bord. 663 00:28:46,953 --> 00:28:49,521 Och om du leka med detta gränssnitt för PSet7, 664 00:28:49,521 --> 00:28:51,770 ser du att du kan kontrollera denna knapp här och lägg 665 00:28:51,770 --> 00:28:53,750 ett fält i början av tabellen. 666 00:28:53,750 --> 00:28:56,720 Och nu om jag klickar Go, det kommer att ge mig en av dessa former 667 00:28:56,720 --> 00:28:57,600 från tidigare. 668 00:28:57,600 --> 00:29:00,170 Jag kommer att lägga till ett fält som kallas ID. 669 00:29:00,170 --> 00:29:03,070 Och jag kommer att göra det en numerisk typ. 670 00:29:03,070 --> 00:29:05,362 >> Jag har en hel drös värden för mätvärden. 671 00:29:05,362 --> 00:29:08,677 Jag kommer bara att välja en INT och inte oroa sig för skilda storlekar. 672 00:29:08,677 --> 00:29:10,510 Jag behöver inte ange en längd eller ett värde, 673 00:29:10,510 --> 00:29:13,710 eftersom det kommer att bli 32 bitar oavsett vad. 674 00:29:13,710 --> 00:29:16,070 Attribut, vi inte se innan. 675 00:29:16,070 --> 00:29:18,410 Något intresse i något av dessa menyalternativ här gången? 676 00:29:18,410 --> 00:29:21,890 677 00:29:21,890 --> 00:29:23,745 För en INT? 678 00:29:23,745 --> 00:29:24,620 Vad gjorde ni föreslår? 679 00:29:24,620 --> 00:29:27,350 680 00:29:27,350 --> 00:29:28,445 Nej? 681 00:29:28,445 --> 00:29:29,570 Gör något av dessa vettigt? 682 00:29:29,570 --> 00:29:30,536 Yeah. 683 00:29:30,536 --> 00:29:31,900 Ja, osignerad, eller hur? 684 00:29:31,900 --> 00:29:35,930 >> I allmänhet att om vi ska ge alla ett unikt nummer, som 685 00:29:35,930 --> 00:29:38,200 är där den här historien är gå, jag verkligen bara är intresserad av 686 00:29:38,200 --> 00:29:41,919 en person att ha numret som noll och en och två och tre och fyra. 687 00:29:41,919 --> 00:29:43,710 Jag behöver inte ta itu med negativa tal. 688 00:29:43,710 --> 00:29:45,210 Det verkar precis som onödig komplexitet. 689 00:29:45,210 --> 00:29:48,470 Jag vill fyra miljarder möjliga värden, inte fyra miljarder möjliga värden, 690 00:29:48,470 --> 00:29:50,699 så jag bara fördubblat kapacitet min INT. 691 00:29:50,699 --> 00:29:53,490 Som en sidoreplik, om du vill relatera detta till något som Facebook, 692 00:29:53,490 --> 00:29:56,190 tillbaka i form av min dag när Facebook först kom ut, 693 00:29:56,190 --> 00:29:59,510 Jag tror vad de var använder i sin MySQL-databas 694 00:29:59,510 --> 00:30:02,856 att lagra en användares identifierare, var bara en INT. 695 00:30:02,856 --> 00:30:05,230 Men naturligtvis finns det en hel del av verkliga människor i världen. 696 00:30:05,230 --> 00:30:07,438 Det finns en hel del falska Facebook konton i världen. 697 00:30:07,438 --> 00:30:11,701 Och så småningom, Facebook svämmade storleken på en INT, en 4 miljarder 698 00:30:11,701 --> 00:30:12,200 värde. 699 00:30:12,200 --> 00:30:15,032 Vilket är varför, om du tittar runt och det finns webbplatser 700 00:30:15,032 --> 00:30:16,740 som kan berätta vad ditt unika ID är. 701 00:30:16,740 --> 00:30:19,781 Och om du aldrig valt ett användarnamn i Facebook kommer du att se din unika ID. 702 00:30:19,781 --> 00:30:23,080 Jag tycker det är profil dot PHP frågetecken ID är lika med något. 703 00:30:23,080 --> 00:30:27,210 Det är nu något som en stor INT, eller en lång lång om du vill, 704 00:30:27,210 --> 00:30:29,700 som är en 64-bitars värde eller något liknande. 705 00:30:29,700 --> 00:30:33,620 >> Så även i den verkliga världen gör dessa frågor i slutändan ibland roll. 706 00:30:33,620 --> 00:30:37,600 Och det visar sig här, om jag ge alla mina användare ett unikt ID, 707 00:30:37,600 --> 00:30:41,750 Jag vill vara super tydlig och minimalt gör detta område unikt. 708 00:30:41,750 --> 00:30:44,750 Men det visar sig att det finns en bit nomenklatur idag också 709 00:30:44,750 --> 00:30:46,470 det är en primärnyckel. 710 00:30:46,470 --> 00:30:49,800 Om du skapar en databas bord och du vet i förväg 711 00:30:49,800 --> 00:30:55,580 att en av kolumnerna i tabellen bör och kommer identifiera rader 712 00:30:55,580 --> 00:30:58,500 i tabellen, vill du ange den och berätta databasen, 713 00:30:58,500 --> 00:31:00,250 detta är min primärnyckel. 714 00:31:00,250 --> 00:31:02,110 Det kan finnas dubbletter i andra områden, 715 00:31:02,110 --> 00:31:06,330 men jag säger databasen som detta är min primära, min viktigaste område, 716 00:31:06,330 --> 00:31:08,420 som garanterat att vara unik. 717 00:31:08,420 --> 00:31:09,660 >> Nu verkar det överflödigt. 718 00:31:09,660 --> 00:31:13,830 Jag föreslår nu att vi lägga till genom att klicka på Spara här, 719 00:31:13,830 --> 00:31:17,210 ett fält called-- och jag kommer att gå vidare och klicka på AI, 720 00:31:17,210 --> 00:31:19,720 Vi ska återkomma till att i ett ögonblick, Spara. 721 00:31:19,720 --> 00:31:22,540 Jag föreslår nu att mitt bord se ut så här. 722 00:31:22,540 --> 00:31:26,305 Jag har en INT område som kallas ID, en CHAR fält med namnet användarnamn, 723 00:31:26,305 --> 00:31:31,100 en VARCHAR fält som heter namn, men ID, om det är primär och därför unik, 724 00:31:31,100 --> 00:31:33,760 varför jag slösar bara tid att införa vad 725 00:31:33,760 --> 00:31:39,140 effektivt sätt är en andra unik område som kallas ID som är en INT? 726 00:31:39,140 --> 00:31:41,980 >> Användarnamn, minns, var redan unikt, sade vi. 727 00:31:41,980 --> 00:31:45,350 Så bara logiskt, behöver du inte någon databas erfarenhet att resonera 728 00:31:45,350 --> 00:31:47,570 genom detta, varför jag kanske har infört 729 00:31:47,570 --> 00:31:50,065 en INT som min unik identifierare som också? 730 00:31:50,065 --> 00:31:52,740 731 00:31:52,740 --> 00:31:53,930 Vad this-- säger det igen? 732 00:31:53,930 --> 00:31:55,580 >> PUBLIK: [OHÖRBAR] 733 00:31:55,580 --> 00:31:59,534 >> DAVID MALAN: Random tillgång är lättare, varför? 734 00:31:59,534 --> 00:32:00,410 >> PUBLIK: [OHÖRBAR] 735 00:32:00,410 --> 00:32:02,367 DAVID MALAN: Ja, det är bara åtkomst nummer. 736 00:32:02,367 --> 00:32:04,750 Så, om du tänker på denna verkligt är en tabell, som en matris, 737 00:32:04,750 --> 00:32:07,690 nu har jag unika identifierare att jag kan hoppa runt. 738 00:32:07,690 --> 00:32:11,520 Och bättre än som fortfarande är att hur stor är en INT kommer att bli igen? 739 00:32:11,520 --> 00:32:14,450 740 00:32:14,450 --> 00:32:15,800 32 bitar eller fyra byte. 741 00:32:15,800 --> 00:32:17,750 >> Hur stort är mitt användarnamn kommer att bli? 742 00:32:17,750 --> 00:32:20,310 743 00:32:20,310 --> 00:32:21,990 Maximalt? 744 00:32:21,990 --> 00:32:22,880 16 bytes. 745 00:32:22,880 --> 00:32:26,080 >> Så, om du verkligen bry sig om resultatet av din kod, 746 00:32:26,080 --> 00:32:31,390 tänker tillbaka på PSet5, skulle du föredrar att söka efter ett fyra byte värde eller en 16 747 00:32:31,390 --> 00:32:32,240 byte värde, eller hur? 748 00:32:32,240 --> 00:32:33,810 Det är verkligen så enkelt är det. 749 00:32:33,810 --> 00:32:38,060 Du måste göra fyra gånger så mycket arbete för att söka efter användarnamn eftersom dessa 750 00:32:38,060 --> 00:32:38,830 är 16 bytes. 751 00:32:38,830 --> 00:32:41,320 Så, har du bokstavligen jämföra alla 16 byte för att vara 752 00:32:41,320 --> 00:32:43,140 säkert ja, det här användarnamnet jag vill. 753 00:32:43,140 --> 00:32:46,610 Medan för en INT kan du gör det med bara fyra byte. 754 00:32:46,610 --> 00:32:49,212 >> Och som en sidoreplik för dem intresserad av hårdvara, 755 00:32:49,212 --> 00:32:52,420 det visar sig att du kan passa något liknande en INT eller en 32-bitars värde i något 756 00:32:52,420 --> 00:32:55,330 kallas ett register i en dator CPU, vilket betyder att det är super, 757 00:32:55,330 --> 00:32:58,400 supersnabb, även vid lägsta nivå av datorns hårdvara. 758 00:32:58,400 --> 00:33:00,530 Så det är bara fördelar runt. 759 00:33:00,530 --> 00:33:01,530 Så, vad innebär det? 760 00:33:01,530 --> 00:33:04,850 Faktum är att när du designar en databastabell, nästan hela tiden 761 00:33:04,850 --> 00:33:07,170 kommer ni att ha inte bara de data du bryr dig om, 762 00:33:07,170 --> 00:33:09,280 men också något som en unik identifierare 763 00:33:09,280 --> 00:33:11,280 eftersom detta kommer att Låt oss göra andra saker. 764 00:33:11,280 --> 00:33:13,160 Och låt oss resa över ett problem här. 765 00:33:13,160 --> 00:33:15,990 >> Antag att användarna har inte bara användarnamn och namn, 766 00:33:15,990 --> 00:33:19,540 men de har också saker som städer och stater och postnummer, åtminstone 767 00:33:19,540 --> 00:33:20,432 här i USA. 768 00:33:20,432 --> 00:33:22,390 Så jag kommer att gå vidare och bara snabbt säga, 769 00:33:22,390 --> 00:33:26,180 ge mig tre fler kolumner i slutet av tabellen. 770 00:33:26,180 --> 00:33:28,900 Och detta kommer att bli City, detta kommer att vara staten, 771 00:33:28,900 --> 00:33:30,400 och detta kommer att bli Zip. 772 00:33:30,400 --> 00:33:32,710 >> Nu City, vilken datatyper bör detta vara, kanske? 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 Jag vet inte vad längsta ortsnamn är. 776 00:33:37,780 --> 00:33:40,571 Någonstans i USA, det finns förmodligen några löjligt långt ord, 777 00:33:40,571 --> 00:33:43,605 så låt oss bara gå med 255, något historiskt eller godtyckligt. 778 00:33:43,605 --> 00:33:44,730 Staten, vad du vill göra? 779 00:33:44,730 --> 00:33:48,380 780 00:33:48,380 --> 00:33:50,367 Dom samtal, eller hur? 781 00:33:50,367 --> 00:33:51,700 Vad är kanske den mest effektiva? 782 00:33:51,700 --> 00:33:53,500 Hur många tecken? 783 00:33:53,500 --> 00:33:55,950 Kanske bara två, om vi kan komma undan med att göra just, 784 00:33:55,950 --> 00:33:58,250 liknande, MA för Massachusetts och så vidare. 785 00:33:58,250 --> 00:34:00,520 Så jag kommer att gå en CHAR värde av två. 786 00:34:00,520 --> 00:34:03,080 >> Postnummer är intressant. 787 00:34:03,080 --> 00:34:06,679 Vi är här i 02138, så att föreslår vi bör använda vad? 788 00:34:06,679 --> 00:34:07,470 Det är en INT, eller hur? 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 skulle fungera. 792 00:34:14,521 --> 00:34:15,020 Nej? 793 00:34:15,020 --> 00:34:18,920 794 00:34:18,920 --> 00:34:20,870 TECKEN eller fem, men jag vill ha en INT. 795 00:34:20,870 --> 00:34:23,710 Varför trycka tillbaka på en INT? 796 00:34:23,710 --> 00:34:26,820 Övertyga mig från detta. 797 00:34:26,820 --> 00:34:29,210 Vad är dum om en INT, min idé? 798 00:34:29,210 --> 00:34:29,871 Yeah. 799 00:34:29,871 --> 00:34:31,199 >> PUBLIK: Ta upp mer minne. 800 00:34:31,199 --> 00:34:32,909 >> DAVID MALAN: Ta upp mer minne. 801 00:34:32,909 --> 00:34:35,310 Fyra byte, men du är föreslå ett postnummer 802 00:34:35,310 --> 00:34:39,000 som fem bytes eller någon var som en CHAR, som känns som eh, det är inte riktigt 803 00:34:39,000 --> 00:34:39,620 fallet. 804 00:34:39,620 --> 00:34:40,489 >> Tja, rolig historia. 805 00:34:40,489 --> 00:34:43,179 År sedan, när jag brukade använda Microsoft Outlook för min e-post, 806 00:34:43,179 --> 00:34:45,150 Jag ville så småningom att byta till Gmail. 807 00:34:45,150 --> 00:34:48,949 Och så, exporterade jag alla mina kontakter från Outlook som en CSV-fil. 808 00:34:48,949 --> 00:34:50,699 Kommaseparerade värden, som just innebar att jag 809 00:34:50,699 --> 00:34:54,060 hade alla mina vänner namn och sista namn och telefonnummer och postnummer 810 00:34:54,060 --> 00:34:54,747 och allt detta. 811 00:34:54,747 --> 00:34:56,580 Och sedan gjorde jag misstaget att öppna upp 812 00:34:56,580 --> 00:34:58,640 i Excel, vilket är en kalkylprogram som 813 00:34:58,640 --> 00:35:00,289 förstår CSV-filer som vi har sett. 814 00:35:00,289 --> 00:35:03,080 Men då måste jag ha hit, liksom, Kommando eller kontroll S vid ett tillfälle. 815 00:35:03,080 --> 00:35:06,250 Och Excel tydligen vid tidpunkten hade en funktion där helst det 816 00:35:06,250 --> 00:35:08,100 såg ett antal, det försökte vara till hjälp. 817 00:35:08,100 --> 00:35:11,610 Och om det numret började med nollor, det skulle bara bli av med dem. 818 00:35:11,610 --> 00:35:13,420 Varför tror du behöver ledande nollor på heltal? 819 00:35:13,420 --> 00:35:15,140 De är meningslösa, matematiskt. 820 00:35:15,140 --> 00:35:17,530 De är inte menings i US Postal systemet. 821 00:35:17,530 --> 00:35:19,954 Så har jag haft i år, till denna dag, jag fortfarande 822 00:35:19,954 --> 00:35:22,370 har vänner som när sällsynta fall som jag behöver någons 823 00:35:22,370 --> 00:35:24,078 itu med dessa dagar, Jag kommer fortfarande se att jag 824 00:35:24,078 --> 00:35:26,767 har en vän i Cambridge, Massachusetts, 2138. 825 00:35:26,767 --> 00:35:29,350 Och det är irriterande om du är försöka sortera av programmatiskt 826 00:35:29,350 --> 00:35:30,975 generera kuvert eller bara krafsa ner det. 827 00:35:30,975 --> 00:35:33,599 Och det är på grund av detta skäl, Jag valde fel datatyp. 828 00:35:33,599 --> 00:35:34,490 Så, jag älskar din idé. 829 00:35:34,490 --> 00:35:35,650 Låt oss använda en CHAR fält. 830 00:35:35,650 --> 00:35:38,340 Fem tecken, med undantag Det finns ett hörn fallet. 831 00:35:38,340 --> 00:35:42,220 Om du fortfarande skicka e-post ibland postnummer dessa dagar, 832 00:35:42,220 --> 00:35:45,360 de är, liksom, plus fyra. 833 00:35:45,360 --> 00:35:48,200 Så behöver vi ett bindestreck och sedan Vi behöver fyra fler nummer. 834 00:35:48,200 --> 00:35:50,330 Så för att vara ärlig, skulle det gå många olika sätt. 835 00:35:50,330 --> 00:35:52,371 >> För nu, jag kommer att hålla det enkelt och jag är bara 836 00:35:52,371 --> 00:35:54,780 kommer att säga att det är en fem CHAR värde och vi är 837 00:35:54,780 --> 00:35:56,739 kommer att hoppa över hela streck plus fyra. 838 00:35:56,739 --> 00:35:58,280 Men det är dessa typer av kompromisser. 839 00:35:58,280 --> 00:36:00,196 Och du kan tänka på Samma problem uppstår 840 00:36:00,196 --> 00:36:01,860 med telefonnummer eller andra områden. 841 00:36:01,860 --> 00:36:04,350 >> Och nu, detta är faktiskt en dåraktig väg att gå ner. 842 00:36:04,350 --> 00:36:08,000 Antag både Rob och jag och Hannah och Maria och [? Davon?] Och Andy 843 00:36:08,000 --> 00:36:12,820 och andra på personalen alla lever i Cambridge, Massachusetts, 02138. 844 00:36:12,820 --> 00:36:17,970 Detta känner faktiskt dum att jag lägga till min användare bord, stad, stat, 845 00:36:17,970 --> 00:36:18,630 och zip. 846 00:36:18,630 --> 00:36:20,980 Varför? 847 00:36:20,980 --> 00:36:21,960 >> PUBLIK: [OHÖRBAR] 848 00:36:21,960 --> 00:36:22,918 >> DAVID MALAN: Säg igen? 849 00:36:22,918 --> 00:36:24,310 PUBLIK: [OHÖRBAR] 850 00:36:24,310 --> 00:36:25,850 >> DAVID MALAN: De är alltid kommer att gå ihop, eller hur? 851 00:36:25,850 --> 00:36:28,660 När det visar sig, vi brukade tänka detta var fallet tills vi uttömmande 852 00:36:28,660 --> 00:36:30,570 sökt hela USA, och visar sig att det 853 00:36:30,570 --> 00:36:32,653 är några inkonsekvenser där flera städer har 854 00:36:32,653 --> 00:36:35,060 samma zip, vilket är konstigt. 855 00:36:35,060 --> 00:36:40,580 Men, om vi stipulerar nu att 02138 är alltid Cambridge, Massachusetts, 856 00:36:40,580 --> 00:36:44,910 varför i hela världen skulle du lagrar i databasen Cambridge och MA och 02138 857 00:36:44,910 --> 00:36:49,357 för mig och Hannah och Rob och för [? Davon?] Och för andra som lever 858 00:36:49,357 --> 00:36:51,190 här i Cambridge, är det helt överflödig. 859 00:36:51,190 --> 00:36:54,480 >> Vi borde komma undan med bara lagra vad? 860 00:36:54,480 --> 00:36:55,610 Bara den postnummer. 861 00:36:55,610 --> 00:36:58,660 Men sedan, om vi lagrar bara postnummer, jag vill, förmodligen, 862 00:36:58,660 --> 00:37:02,160 till min hemsida att veta var 02138 är. 863 00:37:02,160 --> 00:37:03,910 Så jag behöver en annan tabell. 864 00:37:03,910 --> 00:37:04,697 Och det är OK. 865 00:37:04,697 --> 00:37:07,530 Och i själva verket är detta ett av de konstruktionsprocesser utforma tabeller 866 00:37:07,530 --> 00:37:11,472 att du kommer att göra i PSet7 samt vari du vill faktor gemensamma data. 867 00:37:11,472 --> 00:37:14,430 Precis som vi har factoring ut gemensam kod och factoring ut gemensamt 868 00:37:14,430 --> 00:37:17,380 stilar från CSS, här även i databasen, 869 00:37:17,380 --> 00:37:21,180 om jag behöver bara 02138 för att unikt identifiera någons hemstad, 870 00:37:21,180 --> 00:37:25,020 lagrar inte Cambridge, Mass för varje darn användare i tabellen. 871 00:37:25,020 --> 00:37:29,770 >> I stället har en separat tabell som kallas Dragkedjor som ska ha vad kolumner? 872 00:37:29,770 --> 00:37:33,490 Förmodligen en ID-fält, därför att precis, för de principer som vi pratar om nu. 873 00:37:33,490 --> 00:37:35,720 Förmodligen en zip fält för 02.138. 874 00:37:35,720 --> 00:37:38,400 Och då förmodligen vad andra kolumner? 875 00:37:38,400 --> 00:37:42,950 Stad och stat, men har bara en raden för 02138, en rad för 02139, 876 00:37:42,950 --> 00:37:44,772 en rad för 90210-. 877 00:37:44,772 --> 00:37:46,730 Och det är bokstavligen alla postnummer jag vet. 878 00:37:46,730 --> 00:37:49,012 >> Så nu, vad kan man göra? 879 00:37:49,012 --> 00:37:51,220 Detta är problematiskt, eftersom nu har jag två tabeller. 880 00:37:51,220 --> 00:37:54,660 Så, mina användare är mestadels hit, men deras stad statusinformation är 881 00:37:54,660 --> 00:37:55,390 här. 882 00:37:55,390 --> 00:37:58,635 Så visar det sig med SQL, det finns faktiskt ett sätt att koppla ihop information, 883 00:37:58,635 --> 00:38:00,470 och du kommer att se detta i Pset. 884 00:38:00,470 --> 00:38:03,000 >> Men det visar sig att du kan göra något sånt här. 885 00:38:03,000 --> 00:38:10,501 SELECT stjärnan från användarna, GÅ blixtlås PÅ användare dot zip lika blixtlås dot zip. 886 00:38:10,501 --> 00:38:13,360 Vilket är lite ordrik, visserligen, men detta bara 887 00:38:13,360 --> 00:38:17,590 innebär att välja allt från processen för att ta min användare bord 888 00:38:17,590 --> 00:38:19,580 och min blixtlås tabell. 889 00:38:19,580 --> 00:38:22,120 Gå med dem på ett område de har i kolumn. 890 00:38:22,120 --> 00:38:24,780 Så, bokstavligen göra något så här, och ge mig tillbaka 891 00:38:24,780 --> 00:38:27,360 en ny temporär tabell det är bredare, som är större, 892 00:38:27,360 --> 00:38:29,450 som har alla de kolumner från båda. 893 00:38:29,450 --> 00:38:33,510 Och det helt enkelt skulle vara syntax för att göra något sådant. 894 00:38:33,510 --> 00:38:35,540 >> Så det finns detta i förväg, men det kommer 895 00:38:35,540 --> 00:38:38,950 att finnas andra designbeslut du kommer måste göra, inte bara med index 896 00:38:38,950 --> 00:38:40,550 men också kör i utmaningar. 897 00:38:40,550 --> 00:38:43,360 I själva verket finns det en utmaning i alla databasdesign 898 00:38:43,360 --> 00:38:47,930 varigenom ibland två personer kanske vill att komma åt samma raderna i databasen 899 00:38:47,930 --> 00:38:48,530 tabell. 900 00:38:48,530 --> 00:38:51,450 Så detta är något som vi ska stöta på i PSet7 också. 901 00:38:51,450 --> 00:38:54,686 >> Men jag tänkte att jag skulle titta på en attack som är möjligt i SQL. 902 00:38:54,686 --> 00:38:56,560 Vad är några av de problem som kan uppstå? 903 00:38:56,560 --> 00:38:58,170 Så kommer du stöter på detta i PSet7. 904 00:38:58,170 --> 00:39:01,874 Och vi berätta direkt vad kodning lösning på detta problem är. 905 00:39:01,874 --> 00:39:04,790 Men om du tar en högre nivå klass, speciellt i operativsystem, 906 00:39:04,790 --> 00:39:06,950 du kommer att stöta på en fråga om atomicity, 907 00:39:06,950 --> 00:39:10,080 problemet att försöka göra flera saker på en gång 908 00:39:10,080 --> 00:39:11,000 utan avbrott. 909 00:39:11,000 --> 00:39:14,560 >> Och jag trodde att jag skulle införa detta idé för PSet7 med en metafor 910 00:39:14,560 --> 00:39:18,160 att jag lärde mig i Margo Seltzer operativsystem CS164 911 00:39:18,160 --> 00:39:18,990 klass år sedan. 912 00:39:18,990 --> 00:39:22,230 Anta att du har en av dessa sovsal kylskåp i ditt studentrum eller hus, 913 00:39:22,230 --> 00:39:24,474 och du har en verklig förkärlek för mjölk. 914 00:39:24,474 --> 00:39:27,140 Och så, du kommer hem från klasser en dag, du öppnar kylskåpet. 915 00:39:27,140 --> 00:39:27,620 Åh, fan det. 916 00:39:27,620 --> 00:39:28,870 Det finns ingen mjölk i kylskåpet. 917 00:39:28,870 --> 00:39:32,470 Så nära du kylskåpet, låsa dörren, låsa sovsal, 918 00:39:32,470 --> 00:39:34,770 gå runt hörnet CVS, få i rad, 919 00:39:34,770 --> 00:39:36,312 och börja kolla in för lite mjölk. 920 00:39:36,312 --> 00:39:38,978 Och det kommer att ta ett tag, eftersom de jävla själv kassan 921 00:39:38,978 --> 00:39:40,570 räknare tar evigheter att använda ändå. 922 00:39:40,570 --> 00:39:41,950 Så under tiden, kommer din rumskompis hem. 923 00:39:41,950 --> 00:39:43,470 Han eller hon verkligen gillar mjölk också. 924 00:39:43,470 --> 00:39:45,520 De kommer in i studentrummet, öppna kylskåpet, åh, darn det. 925 00:39:45,520 --> 00:39:46,490 Det finns inget mer mjölk. 926 00:39:46,490 --> 00:39:49,040 >> Så, han eller hon också går runt hörnet. 927 00:39:49,040 --> 00:39:51,670 Men nu, eftersom det är som två eller tre eller fyra CVSes närheten, 928 00:39:51,670 --> 00:39:53,800 de råkar gå till en av de olika listor på torget. 929 00:39:53,800 --> 00:39:55,830 Och så nu, ett par minuter senare, ni båda 930 00:39:55,830 --> 00:39:58,060 komma hem och ugh, värsta problemet någonsin. 931 00:39:58,060 --> 00:40:00,967 Nu har du för mycket mjölk eftersom det kommer att gå sura. 932 00:40:00,967 --> 00:40:03,050 Och du gillar mjölk, men du inte riktigt gillar mjölk. 933 00:40:03,050 --> 00:40:06,730 >> Så nu, det här var en dyr misstag eftersom ni båda 934 00:40:06,730 --> 00:40:09,870 fattat beslut grundar sig på tillstånd av något variabel som 935 00:40:09,870 --> 00:40:12,660 var i färd med att ändras av dig, 936 00:40:12,660 --> 00:40:14,560 initiativtagare kommer att få mjölk. 937 00:40:14,560 --> 00:40:17,785 Så, vad är kanske en människa lösning på detta problem? 938 00:40:17,785 --> 00:40:18,660 PUBLIK: [OHÖRBAR] 939 00:40:18,660 --> 00:40:19,430 DAVID MALAN: Lämna ett meddelande, eller hur? 940 00:40:19,430 --> 00:40:21,850 Lämna alltid en anteckning, om du är bekant med den show. 941 00:40:21,850 --> 00:40:23,100 Ja, det finns två av oss. 942 00:40:23,100 --> 00:40:25,940 Så, alltid lämna ett meddelande, eller bokstavligen låsa kylskåpet 943 00:40:25,940 --> 00:40:28,602 med någon typ av hänglås eller något over the top sånt. 944 00:40:28,602 --> 00:40:31,310 Men det är faktiskt kommer att bli nyckel problem med databasdesign, 945 00:40:31,310 --> 00:40:34,710 särskilt när du kan ha flera webbläsare, flera bärbara datorer, 946 00:40:34,710 --> 00:40:37,450 flera användare alla försöker uppdatera information på en gång. 947 00:40:37,450 --> 00:40:40,590 Särskilt känslig information som finansiell information, 948 00:40:40,590 --> 00:40:43,350 varigenom, med en aktiehandel webbplats som du kommer att bygga, 949 00:40:43,350 --> 00:40:47,270 vad händer om du vill kontrollera hur mycket pengar du har och sedan om du har tillräckligt, 950 00:40:47,270 --> 00:40:48,490 köpa några lager? 951 00:40:48,490 --> 00:40:50,899 >> Men vad händer om någon annan som har ett gemensamt konto med dig 952 00:40:50,899 --> 00:40:52,690 är samtidigt försöker att köpa några lager? 953 00:40:52,690 --> 00:40:55,190 Så, är han eller hon kontrollerar saldo, både av er 954 00:40:55,190 --> 00:40:57,540 få tillbaka samma svar, det finns ingen mjölk. 955 00:40:57,540 --> 00:41:00,580 Eller båda du får tillbaka svaret, Du har $ 100 på kontot. 956 00:41:00,580 --> 00:41:04,680 Båda du försöker att fatta beslut att köpa en aktie i något företag lager. 957 00:41:04,680 --> 00:41:06,130 >> Och nu, vad händer? 958 00:41:06,130 --> 00:41:07,140 Du har två aktier? 959 00:41:07,140 --> 00:41:08,420 Du har inga aktier? 960 00:41:08,420 --> 00:41:10,320 Problem som som kan uppstå. 961 00:41:10,320 --> 00:41:11,755 Så kommer vi möter det. 962 00:41:11,755 --> 00:41:14,630 SQL injection attacker, tack och lov, är något vi kommer att hjälpa dig med, 963 00:41:14,630 --> 00:41:17,430 men dessa är atrociously vanliga dessa dagar fortfarande. 964 00:41:17,430 --> 00:41:18,680 Så detta är bara ett exempel. 965 00:41:18,680 --> 00:41:21,290 Jag gör inga anspråk som Harvard-PIN-system är 966 00:41:21,290 --> 00:41:23,130 sårbara för denna attack. 967 00:41:23,130 --> 00:41:24,160 Vi har provat. 968 00:41:24,160 --> 00:41:26,120 Men, du vet att vi har ett område som detta. 969 00:41:26,120 --> 00:41:29,620 Och Yales Net ID har en liknande ser skärmen i dessa dagar. 970 00:41:29,620 --> 00:41:33,190 Och det visar sig, att kanske PIN-systemet genomförs i PHP. 971 00:41:33,190 --> 00:41:37,050 >> Och om det were-- det är inte-- de kan ha kod som ser ut så här. 972 00:41:37,050 --> 00:41:38,210 De har två variabler. 973 00:41:38,210 --> 00:41:42,495 Ge mig användarnamn och lösenord från posten super globala variabeln 974 00:41:42,495 --> 00:41:43,970 som vi talat om tidigare. 975 00:41:43,970 --> 00:41:47,310 Kanske Harvard har en fråga som SELECT stjärna från användare 976 00:41:47,310 --> 00:41:50,005 där användarnamn är lika stor som och lösenord är lika stor som. 977 00:41:50,005 --> 00:41:51,880 Och märker att jag är bara ansluta den använda 978 00:41:51,880 --> 00:41:55,050 lockigt stag notation från andra dag, vilket betyder bara att koppla in ett värde 979 00:41:55,050 --> 00:41:55,550 här. 980 00:41:55,550 --> 00:41:57,449 Jag är inte använder frågetecken teknik. 981 00:41:57,449 --> 00:41:59,240 Jag har inte någon sekund eller tredje argument. 982 00:41:59,240 --> 00:42:02,350 Jag är bara bokstavligen konstruera strängen själv. 983 00:42:02,350 --> 00:42:04,930 >> Problemet är dock att Om någon vill ha en scroob, 984 00:42:04,930 --> 00:42:09,020 som är en referens till en film, loggar in med något sånt här, 985 00:42:09,020 --> 00:42:11,250 och jag har tagit bort prickarna som brukar täcka upp 986 00:42:11,250 --> 00:42:14,370 lösenord, tänk om han är särskilt skadlig 987 00:42:14,370 --> 00:42:18,860 och hans lösenord kanske är 12345, per filmen kallas "våras för rymden," 988 00:42:18,860 --> 00:42:21,970 men han kritiskt typer ett enda anbud efter fem, 989 00:42:21,970 --> 00:42:24,790 sedan bokstavligen ord eller i utrymmet, och sedan citationstecken, 990 00:42:24,790 --> 00:42:29,160 unquote en lika citat en, men märker att han har utelämnats vad? 991 00:42:29,160 --> 00:42:32,700 Han har utelämnats citatet till höger och han utelämnade citatet till vänster. 992 00:42:32,700 --> 00:42:35,170 >> För om detta angripare scroob s antagande 993 00:42:35,170 --> 00:42:38,160 är att de personer som skrev Detta PHP-kod var inte så ljusa, 994 00:42:38,160 --> 00:42:42,990 kanske de bara har några enstaka citerar runt interpole 995 00:42:42,990 --> 00:42:45,210 av en variabel i klammerparenteser? 996 00:42:45,210 --> 00:42:48,620 Och så kanske han kunde slag av slutföra sina tankar 997 00:42:48,620 --> 00:42:53,290 för dem, men på ett sätt som kommer att låta honom hackat sig in PIN-systemet. 998 00:42:53,290 --> 00:42:55,310 Med andra ord, antag att den är koden 999 00:42:55,310 --> 00:42:57,140 och vi nu koppla in vad scroob skrivit. 1000 00:42:57,140 --> 00:42:58,770 Och det är rött, eftersom det är illa. 1001 00:42:58,770 --> 00:43:01,310 >> Och den underliggande text är vad han skrev in, 1002 00:43:01,310 --> 00:43:05,510 scroob kunde lura Harvard server till att bygga en SQL-fråga 1003 00:43:05,510 --> 00:43:07,440 sträng som ser ut så här. 1004 00:43:07,440 --> 00:43:11,760 Lösenord motsvarar 12345 eller en lika med ett. 1005 00:43:11,760 --> 00:43:14,820 Vars resultat, logiskt, är att detta kommer att logga scroob 1006 00:43:14,820 --> 00:43:18,360 i om hans lösenord är 12345 eller om en likar 1007 00:43:18,360 --> 00:43:22,660 en, vilket naturligtvis alltid sant, vilket innebär scroob alltid får i. 1008 00:43:22,660 --> 00:43:26,060 >> Och så, det sätt att fixa detta, liksom i många fall, 1009 00:43:26,060 --> 00:43:28,140 skulle vara att skriva mer på defensiven. 1010 00:43:28,140 --> 00:43:30,390 Om du vill använda något som vår faktiska sökfunktion, som 1011 00:43:30,390 --> 00:43:33,980 du ser i PSet7, där vi koppla in något som frågetecken här. 1012 00:43:33,980 --> 00:43:35,980 Och skönheten i fråge funktion som vi 1013 00:43:35,980 --> 00:43:40,010 ge dig är det försvarar mot dessa så kallade SQL injection attacker, där 1014 00:43:40,010 --> 00:43:44,260 någon lura din kod i injicera sin egen SQL-kod. 1015 00:43:44,260 --> 00:43:47,380 Eftersom vad sökfunktion Vi ger dig faktiskt kommer att göra, 1016 00:43:47,380 --> 00:43:51,270 om du använder frågetecken syntax och en andra och en tredje argument här, 1017 00:43:51,270 --> 00:43:54,590 är vad gjorde det lägga till ingång som användaren tillhandahålls? 1018 00:43:54,590 --> 00:43:56,060 De backslash citerar. 1019 00:43:56,060 --> 00:43:58,590 >> Så, undgår det potentiellt farliga tecken. 1020 00:43:58,590 --> 00:44:01,000 Detta verkar konstigt nu, men det är inte sårbar 1021 00:44:01,000 --> 00:44:03,260 eftersom den inte ändra logiken längre 1022 00:44:03,260 --> 00:44:06,470 eftersom det hela lösenord är nu ett enda anbud som inte är, 1023 00:44:06,470 --> 00:44:07,596 i själva verket, scroob lösenord. 1024 00:44:07,596 --> 00:44:09,845 Så det har varit några skämt om detta under årens lopp. 1025 00:44:09,845 --> 00:44:12,570 Så detta var ett foto som tagits vissa nörd på en parkeringsplats 1026 00:44:12,570 --> 00:44:16,620 där du kanske vet att vissa städer och stater försöker skanna din licens 1027 00:44:16,620 --> 00:44:19,460 platta att fakturera dig eller biljett du om du går igenom utan, liksom, 1028 00:44:19,460 --> 00:44:20,660 E-Z Pass sak. 1029 00:44:20,660 --> 00:44:24,490 Så, denna person förutsätts att kanske folk skriver E-Z Pass-systemet 1030 00:44:24,490 --> 00:44:28,240 var inte så ljusa, och kanske de bara sammanlänkas ihop en sträng, 1031 00:44:28,240 --> 00:44:32,190 så att han eller hon inte kunde uppsåt inte bara fylla sina tankar, 1032 00:44:32,190 --> 00:44:35,150 men faktiskt utföra en dålig kommando, som vi inte har nämnt ännu, 1033 00:44:35,150 --> 00:44:36,380 men du kan nog gissa. 1034 00:44:36,380 --> 00:44:39,820 Att dessutom ta bort och infoga och uppdatera och välj, 1035 00:44:39,820 --> 00:44:43,370 det finns också ett nyckelord som kallas droppe, som bokstavligen tar bort allt 1036 00:44:43,370 --> 00:44:45,300 i databasen, vilket är särskilt dålig. 1037 00:44:45,300 --> 00:44:48,760 >> Vi kan zooma in på detta om det är lite svårt att se. 1038 00:44:48,760 --> 00:44:52,300 Detta, nu, är en berömd film det är härligt smart nu 1039 00:44:52,300 --> 00:44:53,145 och förståeligt. 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, cool. 1043 00:45:05,910 --> 00:45:06,800 Typ av geeking ut. 1044 00:45:06,800 --> 00:45:08,800 Så dessa är alltså SQL injection attacker. 1045 00:45:08,800 --> 00:45:13,050 Och de är så lätt att undvika genom att använda rätt kod eller rätt biblioteken. 1046 00:45:13,050 --> 00:45:15,947 Och du ser i PSet7, det är varför ger vi dig sökfunktion. 1047 00:45:15,947 --> 00:45:17,780 Så, ett par teasers att vi trodde att vi skulle 1048 00:45:17,780 --> 00:45:19,930 ge dig här i vår återstående minuter tillsammans. 1049 00:45:19,930 --> 00:45:24,030 Så, som ni minns från vecka noll, vi infört dessa två lampor som 1050 00:45:24,030 --> 00:45:26,610 är trevliga, inte bara på grund de är ganska och är färgstarka, 1051 00:45:26,610 --> 00:45:29,450 men eftersom de stöder något kallas en API, ett program 1052 00:45:29,450 --> 00:45:31,980 Programming Interface Och i CS50 hittills, vi har 1053 00:45:31,980 --> 00:45:34,440 mestadels fokuserat på GET och POST, men det visar sig 1054 00:45:34,440 --> 00:45:37,390 det finns andra HTTP-verb som PUT. 1055 00:45:37,390 --> 00:45:39,430 >> Och faktiskt, var detta en bild från vecka noll 1056 00:45:39,430 --> 00:45:44,930 där om du skriver kod som skickar a la PSet6 en HTTP-förfrågan som 1057 00:45:44,930 --> 00:45:49,647 ser ut så här med denna bit av text vid botten, som kallas JSON, 1058 00:45:49,647 --> 00:45:52,230 eller JavaScript Object Notation att vi ska prata om nästa vecka, 1059 00:45:52,230 --> 00:45:57,030 Du kan slå på eller stänga av eller ändra färgen av ljus som de. 1060 00:45:57,030 --> 00:46:00,480 Så om CS50 har också förutom några av dessa glödlampor här i New Haven 1061 00:46:00,480 --> 00:46:02,480 Om du vill låna dem för examensarbeten, 1062 00:46:02,480 --> 00:46:04,370 också några Microsoft Band, som är som 1063 00:46:04,370 --> 00:46:07,619 klockor som du bär runt handleden som på liknande sätt har ett API så att du 1064 00:46:07,619 --> 00:46:10,040 kan skriva din egen programvara för dem. 1065 00:46:10,040 --> 00:46:12,490 >> Vi har ett konto med Apples iOS-kod så 1066 00:46:12,490 --> 00:46:15,510 att om 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 skriva kod som faktiskt körs på dem. 1068 00:46:17,707 --> 00:46:19,540 Vi har en hel drös av Arduinos, som är 1069 00:46:19,540 --> 00:46:22,010 pyttesmå datorer utan fall, i huvudsak, 1070 00:46:22,010 --> 00:46:25,240 att du kan ansluta via USB, typiskt till din egen Mac eller PC, 1071 00:46:25,240 --> 00:46:28,810 skriva kod som körs på dessa fysiska enheter som ofta har sensorer på dem 1072 00:46:28,810 --> 00:46:30,790 så att du kan interagera med den verkliga världen. 1073 00:46:30,790 --> 00:46:32,860 Vi har en hel drös av Leap Motion enheter, 1074 00:46:32,860 --> 00:46:36,500 som är USB-enheter för Mac och Datorer, här och igen, i New Haven. 1075 00:46:36,500 --> 00:46:40,080 Och om du ansluter den till din Mac, du kan faktiskt styra din dator 1076 00:46:40,080 --> 00:46:42,550 genom att skriva programvara att via infraröda strålar, 1077 00:46:42,550 --> 00:46:46,360 siffror på var dina mänskliga händer, även utan att röra tangentbordet. 1078 00:46:46,360 --> 00:46:49,135 Vi trodde att vi skulle dela en snabb inblick i denna, till exempel. 1079 00:46:49,135 --> 00:46:51,428 >> [MUSIK SPELA] 1080 00:46:51,428 --> 00:47:55,840 1081 00:47:55,840 --> 00:47:57,590 Så har vi en hel gäng av dessa saker, 1082 00:47:57,590 --> 00:48:01,040 Även kallad Myo arm band som du lägger över din underarm 1083 00:48:01,040 --> 00:48:04,595 och sedan kan du styra den verkliga värld eller den virtuella världen som den här. 1084 00:48:04,595 --> 00:48:06,471 >> [MUSIK SPELA] 1085 00:48:06,471 --> 00:49:17,580 1086 00:49:17,580 --> 00:49:20,920 Eller, har vi också några Google Kartong, som är bokstavligen, liksom, 1087 00:49:20,920 --> 00:49:24,841 en kartong som du kan sätta på din ansikte, men glida i telefonen i det 1088 00:49:24,841 --> 00:49:27,590 så att du sätter glaset i din telefon riktigt nära dina ögon. 1089 00:49:27,590 --> 00:49:30,190 Och Google Kartong är ganska billigt på $ 10 eller $ 20. 1090 00:49:30,190 --> 00:49:32,230 Och det har små linser som är något av skift 1091 00:49:32,230 --> 00:49:35,900 bilden på skärmen för mänskliga ögon för att ge dig en känsla av djup 1092 00:49:35,900 --> 00:49:39,550 så att du faktiskt har en 3D miljö framför dig. 1093 00:49:39,550 --> 00:49:42,927 Vi har också några Samsung Gear, som är den dyrare version av denna, 1094 00:49:42,927 --> 00:49:46,010 men som kan på liknande sätt glida i en Android-telefon och ger dig illusionen 1095 00:49:46,010 --> 00:49:48,309 of-- eller ge upplevelsen virtuell verklighet. 1096 00:49:48,309 --> 00:49:50,850 Och i våra två sista minuter, vi trodde att vi skulle försöka göra detta. 1097 00:49:50,850 --> 00:49:55,250 Om jag kan projicera vad Colton har här bara för att fundera, 1098 00:49:55,250 --> 00:49:58,442 Låt mig gå vidare och kasta upp på den stora skärmen här. 1099 00:49:58,442 --> 00:49:59,400 Låt mig döda lampor. 1100 00:49:59,400 --> 00:50:02,290 Colton, vill du gå vidare och sätta på din cell för ett ögonblick 1101 00:50:02,290 --> 00:50:05,171 och kom över till mitt på scenen? 1102 00:50:05,171 --> 00:50:07,420 Och vill du project-- detta är vad Colton ser. 1103 00:50:07,420 --> 00:50:10,560 >> Nu är Wi-Fi här inte så stark för denna enhet 1104 00:50:10,560 --> 00:50:13,870 att detta är super övertygande, men Colton är bokstavligen 1105 00:50:13,870 --> 00:50:15,710 i denna magiska futuristiska plats. 1106 00:50:15,710 --> 00:50:16,796 Han ser bara en bild. 1107 00:50:16,796 --> 00:50:19,920 Du ser hans vänster och höger öga att hans hjärna är sy ihop 1108 00:50:19,920 --> 00:50:22,260 i ett tredimensionellt miljö på hans ansikte. 1109 00:50:22,260 --> 00:50:24,319 Han har bara valt ett menyalternativ här. 1110 00:50:24,319 --> 00:50:27,360 Och så igen, han bär headsetet med en Samsung telefon på det som är 1111 00:50:27,360 --> 00:50:29,080 trådlöst skjuter till vår overhead. 1112 00:50:29,080 --> 00:50:30,349 Nu är du på Mars, tror jag? 1113 00:50:30,349 --> 00:50:31,140 COLTON: Jag tror det. 1114 00:50:31,140 --> 00:50:32,181 Jag är inte säker [OHÖRBAR]. 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 dessa menyer. 1117 00:50:36,374 --> 00:50:41,590 >> COLTON: [OHÖRBAR] några häftiga platser om vi vill gå att-- 1118 00:50:41,590 --> 00:50:43,330 >> DAVID MALAN: Var vill vi gå? 1119 00:50:43,330 --> 00:50:45,837 >> COLTON: [OHÖRBAR] 1120 00:50:45,837 --> 00:50:48,170 DAVID MALAN: Och låt oss se där Coltons tar oss nu. 1121 00:50:48,170 --> 00:50:48,961 COLTON: [OHÖRBAR] 1122 00:50:48,961 --> 00:50:52,830 1123 00:50:52,830 --> 00:50:56,380 >> DAVID MALAN: Så, det finns så många olika ställen du kan ta dig. 1124 00:50:56,380 --> 00:51:00,590 Det finns FAPIs via vilken du kan skriva spel eller interaktioner som 1125 00:51:00,590 --> 00:51:01,950 springa, i sista hand, på telefonen. 1126 00:51:01,950 --> 00:51:03,908 Så, du verkligen bara skriver en mobiltelefon app. 1127 00:51:03,908 --> 00:51:06,380 Men tack vare programvaran och grafikfunktioner, 1128 00:51:06,380 --> 00:51:08,765 nu Colton är i detta liten liten stuga. 1129 00:51:08,765 --> 00:51:10,515 Och med risk för överväldigande oss, 1130 00:51:10,515 --> 00:51:13,330 Colton och jag ska hålla sig för medan i slutet av klassen här i dag 1131 00:51:13,330 --> 00:51:14,300 Om du vill komma upp och spela. 1132 00:51:14,300 --> 00:51:16,350 Och vi ska föra dem tillbaka nästa vecka också. 1133 00:51:16,350 --> 00:51:18,420 Utan vidare det är det för dag. 1134 00:51:18,420 --> 00:51:21,990 Vi ses nästa vecka. 1135 00:51:21,990 --> 00:51:24,140 >> [MUSIK - Ragga Twins "BAD MAN"] 1136 00:51:24,140 --> 00:55:23,146