[Musik spiller] DAVID MALAN: Okay, det er CS50. Dette er slutningen af ​​ugen otte. Og i dag, starter vi at udfylde nogle stykker når det kommer til bygning ting på nettet. Så minde om, at på mandag vi bruger en masse mere tid på PHP, som er denne dynamik programmeringssprog, lader os udgang, blandt andet ting, HTML og andre sådant indhold at vi vil få lyst til at se. Men vi har ikke rigtig set på, hvordan vi kommer til at gemme alle oplysninger. Faktisk næsten enhver af at super interessante websteder, du besøger i dag har en form for database på bagsiden ende, ikke? Facebook sikkert gemmer masser af data om os alle og Gmail gemmer alle af dine e-mails. Og så, mange andre steder er ikke bare statisk indhold, der er oplysende. Det er faktisk dynamisk på en eller anden måde. Du giver input, opdaterer det siderne for andre mennesker. Du får beskeder, du sender beskeder, og så videre. Så i dag, ser vi nærmere på fundamentet for et projekt at du vil dykke ned i næste uge, CS50 Finance, som er faktisk vil have dig med at opbygge noget ikke i C, men i PHP. En hjemmeside, der ser en lidt noget som dette der gør det muligt at købe og sælge bestande, der faktisk kommer til at trække på realtid lager data fra Yahoo Finance. Og så i sidste ende, vil du have den illusion for dig selv og for brugere at du rent faktisk køber og sælger lagre og få næsten realtid opdateringer, styre en portefølje, som alle vil kræve at have, sidste ende, en database over brugere. Så med dine egne ord, især hvis du ikke er Super fortrolig med computeren videnskab eller databaser, hvad kender du en database til at være lige nu, i ikke-tekniske termer? Hvad er det? Hvordan vil du beskrive det til en roommate eller en ven? PUBLIKUM: [uhørligt] oplysninger [uhørligt] DAVID MALAN: Så en liste over oplysninger, eller en store-- en liste over oplysninger at du måske ønsker at gemme om noget, som en bruger. Og hvad gør brugere forbundet med dem? Hvis du er en bruger på Facebook eller Gmail, hvad er de egenskaber at vi alle brugere have? Ligesom, hvad der kunne være nogle af de kolonner i regnearket, som vi hentydede sidste gang? Fordi igen, kan du tænke på en database virkelig som en fancy Excel-fil eller Google Regneark eller Apple Numbers fil. Så, hvad synes du om når du tænker på en bruger? Hvad har de? Hvad er det? PUBLIKUM: Et navn. DAVID MALAN: Et navn. Så hvis navn, ligesom David Malan ville være navnet på nogle bruger. Hvad andre gør en bruger have? PUBLIKUM: En id. DAVID MALAN: En id. Så ligesom et ID-nummer, som din Harvard Id eller din Yale Net-ID eller lignende. Hvad andet kan en bruger have? PUBLIKUM: Kodeord. DAVID MALAN: Et kodeord, måske en adresse, måske et telefonnummer, måske en e-mailadresse. Så der er bundter af marker og dette kunne slags spiral ud af kontrol hurtigt, så snart du begynder indse, åh, lad os gemme denne og lad os gemme dette og hint. Men hvordan gør vi rent faktisk gør det? Så igen, den mentale model at have for dag som vi dykke ned i selve SQL, Structured Query Language, er en database, der ligner dette. Det er bare rækker og kolonner. Og du kan forestille Google Regneark eller en række andre programmer. Men hvad er nøglen om MySQL, som er den databasesoftware vi kommer til at bruge, det frit åbent available-- Facebook anvendelser det og en række andre websites-- database gemmer tingene relationelt. Og en relationsdatabase betyder bare en, der bogstavelig talt gemmer sine data i rækker og kolonner. Det er så simpelt er det. Så selv noget lignende Oracle, som du måske har generelt hørt om er en relationsdatabase. Og under kølerhjelmen, det gemmer data i rækker og kolonner. Og Oracle afgifter du en masse penge til at gøre det, mens MySQL afgifter dig noget for det samme. Så er SQL vil give os mindst fire operationer. Evnen til at vælge data, som læste data, indsætte, slette og opdatere data. Med andre ord dem, er virkelig de fire centrale operationer der kommer til at give os mulighed for at ændre ting i disse rækker og kolonner. Værktøjet, som vi vil bruge i dag, især at lære SQL og at lege med det igen kaldes PHP MyAdmin. Det er web-baseret værktøj. Total tilfældighed, at det er skrevet i PHP. Men det kommer til at give os en grafisk brugergrænseflade, så vi rent faktisk kan oprette disse rækker og kolonner og derefter tale med dem via kode. Så lad os nu begynde at hvad jeg synes er helt ærligt slags sjove processen med bygge bagenden af ​​hjemmesider, de dele, at brugerne ikke se, men sikkert gør sig om, fordi det er snarere Datas gang. Så ligner C og en lidt mindre som PHP, SQL eller en database, der understøtter SQL, har mindst disse datatyper og klaser af andre. CHAR, VARCHAR, INT, BIGINT, DECIMAL, og DATETIME. Og der er en hel bundt af andre funktioner, men lad os gøre dette ved måde faktiske eksempel. Jeg har tænkt mig at gå ind i CS50 IDE hvor der i forvejen, har jeg logget ind og jeg har også besøgt en URL til dette værktøj kaldet PHP MyAdmin. Og i problemer sæt syv, vil vi fortælle dig nøjagtigt, hvordan man kommer til denne grænseflade samt. På øverste venstre hjørne, mærke til det siger foredrag. Og det betyder bare, at i forvejen, skabte jeg en tom database kaldet forelæsning der har ingen regneark i det endnu. Der er ingen rækker og kolonner. Fordi den første ting, vi vil gøre er begynde at oprette en tabel der kommer til at gemme vores brugere. Så bogstaveligt talt over her til højre, jeg er vil fortælle databasen Jeg vil have en tabel kaldet Brugere. Så det er ligesom den fil, jeg ønsker at gemme alle mine data. Og hvor mange kolonner? Nå, lad os holde det simpelt for nu. Jeg ønsker blot at gemme som en brugernavn og et navn for en bruger. Vi vil starte små. Så jeg vil have to kolonner alt. Og jeg har tænkt mig at gå videre og klik på Gå. Og så, for disse kolonner, hvad jeg vil at do-- hvis denne internet cooperates-- okay, så vi kommer til at prøve det igen. Jeg har tænkt mig at oprette en tabel kaldet Brugere med to kolonner, skal du klikke på OK, OK. Nu har vi fået det rigtig hurtigt. Tak, meget godt klaret. Okay, så hvad ønsker vi disse kolonner skal hedde? Så er man kommer til at hedde Brugernavn. Så alt jeg ser her-- og grænsefladen ærligt talt bliver lidt grimt til sidst, når du begynder at skrive i alle disse data. Men hvad er rart er, at slags paradoksalt nok, jeg skaber kolonner, men værktøjet har tåbeligt lagde dem ud i rækker så jeg kan konfigurere disse kolonner. Så der er to emner der under Navn. Og en af ​​disse felter jeg vil kaldes brugernavn, og det andet område, jeg vil ringe til Navn. Og nu jeg nødt til at vælge datatyper for disse ting. Så mens der i Excel og Google Regneark, hvis du ønsker en kolonne, du bogstaveligt talt bare skrive navn eller brugernavn, tryk Enter. Måske du gør det fed ansigt bare for klarhed, men det er det. Du behøver ikke angive typer af søjlerne. Nu i Google Regneark eller Excel, du kunne angive, hvordan data bliver gjort. Du kan gå til menuen Formater og du kan angive vis denne lignende dollartegn, vis denne som en floating point-værdi. Så det er ens i ånd til at det, vi er ved at gøre, men det er faktisk kommer til at tvinge at dataene er en bestemt type. Nu, selvom et øjeblik siden jeg sagde, at der er kun et par datatyper, der er faktisk en hel masse, og de er i varierende grader af specificitet. Og som en sidebemærkning, du kan endda gøre smarte ting ligesom opbevaring geometrier inde i en database. Du kan gemme ting ligesom GPS-koordinater og faktisk finde, matematisk, punkter, som er tæt på andre. Men vi kommer til at holde dette super enkel og gå op til her, alle de såkaldte string typer. Så her er en liste over en hel masse muligheder. CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. Og det er lidt overvældende. Og desværre, noget paradoksalt nok til C, en CHAR er egentlig ikke en CHAR. Hvis du angiver i en database at dine data type er CHAR, det betyder, at ja, det er en CHAR, men det er en eller flere tegn. Og du er nødt til at specificere hvor mange tegn, du ønsker. Så, hvad er en typisk længde for et brugernavn? Er der en grænse typisk? PUBLIKUM: [uhørligt] DAVID MALAN: 16 måske? Noget i den stil. Du ved, tilbage i dag, det plejede at være otte. Nogle gange er det 16, nogle gange Det er endnu mere end det. Og så, det ikke er tilfældet betyder give mig en CHAR. Det betyder, at jeg er nødt til at specificere længden af ​​feltet, og nu kan jeg sige noget lignende 16. Og der er en afvejning her. Så vil vi se på et øjeblik at dette betyder en, hver brugernavn skal være 16 tegn. Men vent et øjeblik, M-A-L-A-N. Hvis det er mit brugernavn og jeg bruger kun fem, hvad ville du foreslå, at databasen at gøre for de andre 11 tegn, Jeg har reserveret plads til? Hvad ville du gøre? PUBLIKUM: [uhørligt] DAVID MALAN: Ja, bare gøre dem alle null. Gør dem rum. Men sandsynligvis null, så en masse backslash nuller. Så på den ene side, vi har nu sørget for, at mit brugernavn kan ikke være mere end 16 tegn. Og bagsiden af ​​det er at hvis jeg havde en rigtig langt navn eller ønskede en virkelig lang brugernavn ligesom nogle af jer fyre kan have i at kollegiet eller på Yale.edu, kan du ikke har en. Og så i virkeligheden, hvis du har nogensinde registreret for en hjemmeside og du får råbte på at sige dit kodeord er for lang eller dit brugernavn er for lang, er det simpelthen fordi en programmør, når konfigurere sin database, besluttede, at dette område vil være længere end denne længde. Okay, så hvad hvis vi går videre til at navngive? Hvor længe skal en typiske menneske navn være? Hvor mange tegn, 16? Jeg kan gætte vi kunne finde nogen i dette rum hvor ved hans eller hendes første plus sidste navn er længere end 16 tegn. Så hvad er bedre end det, 17? 18? 25? Større? 30? PUBLIKUM: [uhørligt] DAVID MALAN: 5.000, åh min Gud. Så det er sandsynligvis en anstændig øvre grænse, skal vi sige. Og her vi slags har at foretage en dom opkald. Ligesom, der er ingen rigtige svar her. Infinite er ikke helt muligt, fordi vi er i sidste ende kommer til at have-- vi er kommer til at løbe tør for hukommelse. Så vi er nødt til at gøre en dom opkald på et tidspunkt. Meget almindelig ville være, for eksempel, at use-- og lad mig præcisere CHAR her som before-- 255 var bogstaveligt øvre grænse for denne database-software år siden. Og så, en masse mennesker ville bare sige, fint. 255 er den grænse. Lad os bare bruge det maksimale. Og det er temmelig latterligt. Ligesom, hvis du skriver en person er navn til 200 plus tegn, at en smule latterligt. Men husk, at ASCII ikke det eneste system for tegn. Og så, især i en masse asiatiske sprog hvor der er tegn kan vi ikke udtrykke på tastaturer som min amerikanske tastatur, nogle tegn faktisk tage 16 bit i stedet for otte bits. Og så, det faktisk er ikke alt, urimelig at vi har brug for mere plads, hvis vi ønsker at passe større tegn end selve USA centric dem vi har tendens til at diskutere. Så vi har brug for nogle øvre grænse. Jeg ved ikke, hvad det bedste er, men 255 er generelt et almindeligt. 25 føler lav. 16, 32 føler lav. Jeg vil fejle på siden af noget højere. Men der er en afvejning, som altid. Hvad er det måske indlysende afvejning for at reservere 255 tegn for alles navn i min database? PUBLIKUM: [uhørligt] DAVID MALAN: Hvad er det? PUBLIKUM: [uhørligt] DAVID MALAN: Det er en masse hukommelse, right? M-A-L-A-N. Jeg har netop spildt 250 tegn bare at gemme mit navn defensivt, bare i tilfælde nogen i klassen har en virkelig langt navn. Det virker som en urimelig afvejning. Så det viser sig, at SQL, denne database sprog, faktisk understøtter noget kaldet VARCHAR eller variabel CHAR. Og det er slags rart i, at dette giver dig mulighed for at angive ikke en fast bredde, men snarere en variabel bredde. Og mere specifikt en maksimale bredde af feltet. Så betyder det, at et navn kan ikke være mere end 250 tegn, men det kan helt sikkert være færre. Og databasen vil være smart. Hvis du sætter i M-A-L-A-N, det er kun kommer til at bruge fem, måske seks bytes for ligesom en bageste null-tegn, og ikke bruge en ekstra 249 eller 250 byte unødigt. Så det ser ud som jeg burde har startet med denne historie. Men der er altid en afvejning. Så på den ene side et brugernavn jeg har specificeret til at blive hårdt kodet ved 16, og måske det var ikke den rigtige opkald, måske det er, men hvorfor ikke bruge VARCHARs for alt? Den eksisterer for en grund. Hvorfor ikke bruge VARCHARs for hvert felt hvis længde, du ikke kender i forvejen hvis det synes at være en stor ting, right? Brug kun så meget plads som du har brug for op til denne grænse? PUBLIKUM: Langsommere. DAVID MALAN: Speller? PUBLIKUM: Gør det langsommere? DAVID MALAN: Åh, det er langsommere. Godt, det er næsten altid svaret, helt ærligt. Ligesom, hvad er tradeoff? Det enten koster mere plads eller det koster mere tid. Så i dette tilfælde, kan det være langsommere. Hvorfor? PUBLIKUM: [uhørligt] bestemme [uhørligt]. DAVID MALAN: God. Så kan du husker fra selv PSED5, leger med din tilgang til ordbogen, hvis du skal allokere hukommelse dynamisk eller beholde dyrkning af en buffer, der kan faktisk være langsom. Hvis du nødt til at kalde malloc under kølerhjelmen og måske det er, hvad MySQL gør, så sikkert, der kunne være tilfældet. Og hvis du tror måde tilbage til PSet-- eller endda uger to, da vi gjorde ting som binær søgning eller endda lineær søgning, en af ​​de gode ting ved hvert ord i en database eller hvert ord i en kolonne være nøjagtig den samme længde, selv hvis en hel masse af disse tegn er tomme, er, at du kan bruge random access på dine data, ikke? Hvis du ved, at hver ord er 16 tegn væk, du kan bruge pointer aritmetik, så at tale, og gå til os 16, 32, 48, 64, og du kan bare hoppe øjeblikkeligt ved hjælp af aritmetiske ethvert af ordene i databasen. Hvorimod hvis det er en VARCHAR, hvad har du i stedet nødt til at gøre? [Telefonen ringer] Hvis det er en VARCHAR, du kan ikke bruge random access. Hvad du nødt til at kigge efter eller gøre? Ja? PUBLIKUM: [uhørligt] DAVID MALAN: Look gennem whole-- spor gennem hele listen udkig efter, hvad, sandsynligvis? Hvilken slags særlig værdi? PUBLIKUM: [uhørligt] DAVID MALAN: Leder for null terminatorer at afgrænse adskillelsen af ​​ord. Så igen, en afvejning, og der er ingen rigtige svar. Men det er her, især når dine brugere kommer til at være mange og din belastning på dine servere, den Antallet af mennesker, der bruger det får højt, disse faktisk er nontrivial beslutninger. Så kan vi lade disse som dette, men Lad os rulle ned over til højre her. Nu er der et par kolonner hvor vi er nødt til at foretage en dom opkald. Giver det mening at tillade en brugers navn, en brugers brugernavn eller en brugers navn, for at være nul? Det vil sige, lige tomt. Føles lidt meningsløse, så jeg er ikke kommer til at kontrollere disse bokse. Men det viser sig i en database, kan man sige, nogen kan eventuelt have denne værdi. Denne kolonne har ikke faktisk være der. Nu er der denne rullemenuen. Og læg mærke til jeg er stadig i første række er, så jeg taler om brugernavn nu. Og det viser sig, at en database, I modsætning til en simpel simpel regneark, har kraftfulde funktioner kaldes indekser. Og et indeks er en måde at fortælle database på forhånd, at jeg mennesket am klogere end dig. Jeg ved, hvad slags forespørgsler, skal du vælge eller indsætte eller slette eller opdatering, at min kode kommer til at ende med at gøre på denne database. Jeg ønsker at læse en masse data. Jeg ønsker at indsætte en masse data. Jeg ønsker at konstant slette en masse data. Hvis jeg ved, at jeg har tænkt mig at være adgang et felt som brugernavn en masse, Jeg kan preemptively fortælle database, jeg ved mere end dig, og jeg ønsker at dekret, der du bør indeksere dette felt. Hvor indeksere et felt eller en søjle betyder, at på forhånd, bør låne nogle ideer fra, ligesom, uge fire og fem og seks fra CS50 og faktisk opbygge noget som en binær søgning træ eller noget generelt kaldes en B-træ at du ville lære i en klasse som CS124 på Harvard, en algoritmer klasse, eller en række andre steder. Databasen og smart mennesker, der gennemførte det vil finde ud af at gemme at skema med oplysninger i hukommelsen, så søgninger og andre operationer er super hurtig. Du behøver ikke at gøre det. Du behøver ikke at gennemføre lineær søgning eller binær søgning eller mergesort eller udvælgelse Sorter, noget af det. Databasen gør det for dig, hvis du fortæller det forebyggende at indeksere dette felt. Og du kan se alt, der er nogle andre karakteristika Vi kan fortælle databasen til at håndhæve. Hvad kan det betyde, hvis jeg vælger Unique fra denne menu, bare intuitivt? Ja? PUBLIKUM: [uhørligt] DAVID MALAN: Yeah, det brugernavn skal være unikt. Er dette en god ting eller en dårlig ting for en database, for et websted med brugerne? Bør brugernavne være unik? Ja, sandsynligvis. Hvis det er, hvad det felt vi bruger til at logge på, du ikke virkelig ønsker at mennesker, der har den samme fornemmelse eller det samme brugernavn. Så kan vi have den database håndhæve, at så at nu i min PHP kode eller ethvert sprog, Jeg behøver ikke at, for eksempel, tjek nødvendigvis gør dette brugernavn eksisterer før jeg lade nogen registrere? Databasen vil ikke lade to personer navngivne David eller Malans registrere i dette tilfælde. Og som en side, selvom det Menuen kun lader dig vælge en, et entydigt indeks er en, der er indekseret til superhurtig ydelse, men det er også gennemtvinger entydighed. Og vi vil komme tilbage til, hvad det to andre betyder på bare et øjeblik. I mellemtiden, hvis jeg går til min anden række, som er brugerens navn, skal jeg angive at navnet skal være unikt? Nej, fordi du kunne sikkert have-- der er ingen to David Malans i dette rum, mest sandsynligt. Men hvis vi vælger et andet navn, vi måske helt sikkert have kollisioner. Tænk tilbage på hash tabeller og lignende. Så vi bestemt ikke ønsker at gøre navnefeltet unikt. Så vi bare kommer til at forlade at som bindestreg, bindestreg, bindestreg, ingenting. Og jeg har tænkt mig at forlade alt andet alene. De fleste af disse områder vi vil ikke have at bekymre sig om. Og når jeg er klar til at gemme det, hvis internettet samarbejder, Jeg klikker på Gem, og meget, meget, meget langsomt gør databasen bliver gemt. Og nu er jeg tilbage til denne interface, som ganske vist er overvældende ved første øjekast. Men alt hvad jeg har tænkt mig at gøre, er at klikke på ordet Brugere på øverst til venstre. Jeg har tænkt mig at gå op her, skal du klikke Brugere, og som standard, det har udført nogle SQL, men mere om det i et øjeblik. Her er bare en oversigt over, hvad jeg gjorde. Og ikke at bekymre dig, at du ser Omtale af latin og svensk her. Det er bare standard indstillinger, fordi MySQL oprindeligt, eller PHP MyAdmin, en af ​​de to sket at være skrevet af nogle svenske folk. Men det er irrelevant i vores tilfælde her. Okay, så hvorfor er alt dette interessant? Det viser sig, kan jeg indsætte data i en database ved at skrive kode. Og jeg gå videre og i min fil her, er jeg kommer til at gå videre og lade som om dette er tilsluttet til denne database, som er det ikke i øjeblikket, men det vil være, når vi kommer til problemet sæt syv. Og jeg har tænkt mig at gå videre og udføre en funktion kaldet forespørgsel, som vi vil give dig i problemer sæt syv distribution kode, der tager mindst ét ​​argument, som er blot en streng. En streng af SQL-kode. Så du er ved at lære at skrive Structured Query Language. Hvis jeg ønsker at indsætte en ny række i min database, fordi nogen har indsendt en formular til min kode, ville jeg bogstaveligt talt skrive INSERT INTO brugere følgende felter: Brugernavn, komma, navn, værdierne, og nu har jeg brug for at indsætte noget som Malan, og tilbud, citat slut 'David Malan. « Og nu selv for dem bekendt med SQL, hvorfor bruger jeg enkelte anførselstegn Indersiden af ​​grønne streng? Hvad kan være årsagen her? Bemærk jeg er sammenblanding to sprog. Query er en PHP funktion, men det tager et argument. Og dette argument har til sig selv være skrevet på et andet sprog kaldet SQL, Structured Query Language. Så alt, hvad jeg har netop fremhævet her er dette sprog kaldes SQL. Så, hvad er der med de enkelte anførselstegn, lige som en hurtig tilregnelighed check? Fortsæt. De er strenge. Så tilbud, citat slut Malan og tilbud, citat slut David Malan er strenge. Og lige tænker intuitivt nu, at vide, hvad du ved om C og PHP, hvorfor gjorde jeg ikke gøre det, som jeg normalt brugte dobbelte anførselstegn for strygere? Hvorfor har jeg ikke lyst til at gøre det? Ja? PUBLIKUM: [uhørligt] DAVID MALAN: Præcis. Fordi jeg allerede bruger dobbelte anførselstegn på vej uden for argumentet til PHP-funktionen, Jeg vil bare forvirre tolk. Det vil ikke vide, behøver disse går sammen? Må disse går sammen? Må disse går sammen? Så jeg skifte i stedet. Eller jeg kunne gøre noget som dette, backslash tilbud eller backslash citat. Helt ærligt, der bare begynder at få meget ulæselig og grimme. Men det ville opnå samme resultat som godt. Så hvis jeg skulle udføre denne forespørgsel nu, lad os se hvad der sker. Jeg har tænkt mig at gå videre nu, og i stedet end udføre PHP-kode, som er hvor du vil spille i problemer sæt syv, Jeg har tænkt mig at i stedet gå til PHP MyAdmin. Og jeg manuelt gå at gå til fanen SQL, og lad mig zoome ind på grænsefladen. Og jeg har tænkt mig at indsætte de ting, jeg lige har skrevet. Og farvekodning har ændret en lille smule nu, bare fordi de programformater tingene lidt anderledes. Men se, at alt jeg har gjort er jeg har sagt, indsætte i Brugere. Jeg har angivet, så i et komma adskilt parentes liste de to felter som jeg ønsker at indsætte, og så har jeg bogstaveligt talt sagt værdier efterfulgt af en anden paren, og derefter de to værdier Jeg ønsker at plug-in, og nu for god foranstaltning, Jeg vil sætte et semikolon i slutningen. Så er det ikke C. Dette er ikke PHP. Dette er nu SQL, og jeg indsætte det ind i denne web-baseret interface, der er bare at lade mig, så snart jeg klikker OK, udføre denne forespørgsel på databasen kører inde i CS50 IDE. Så dette er godt. Bemærk, at den ene række indsat, gik super hurtig, 0,0054 sekunder for at indsætte disse data. Så det lyder temmelig sundt. Det omformateret min forespørgsel for mig her blot for at se det i form af farvekodede version. Men nu, hvis jeg klikker Gennemse, bemærke, at selv selvom der er en masse rod på skærmen, min tabel har nu to rækker. Så lad mig gå videre og gøre en anden. I stedet for dette, så lad mig gå til fanen SQL igen. Og denne gang vil jeg indsætte noget lignende Rob og hans navn vil være røve Bowden. Bowden. Lad os klikke på Gem. Ups, snarere Go. Klik på Gennemse igen, og nu mærke til jeg har to rækker. Så dette er blot en måde mere kompleks måde at åbne Google Regneark og bare skrive en række i en kolonne. Men hvad er centrale er, at vi nu har syntaksen med til at skrive kode, så i sidste ende, kunne vi faktisk gøre nogle og dette. Husk på, at PHP understøtter Super globale variabler. Hvad er inde i dollar logge understregning GET i PHP? Vi tog et kig på en eller to enkle eksempler. Og i PSet6, husker du har hej dot PHP som bruger denne variabel. Hvad sker der? Eller hvad er det? Lidt højere. PUBLIKUM: [uhørligt] DAVID MALAN: Det er en sne frø af array, som er bare en fancy måde at sige en array, der har vigtige værdipar. Og tasterne er ikke numerisk. De er ord eller strenge. Og konkret, hvilke er de centrale værdipar? Hvor kommer de fra? Undskyld? PUBLIKUM: [uhørligt] DAVID MALAN: Nej? Hvor gør dem nøglen værdi par fra? Sig igen? Igen? Er jeg den eneste, hørelse noget? [Latter] Det er rigtigt, ja? PUBLIKUM: [uhørligt] DAVID MALAN: Ja, de kommer fra forespørgselsstrengen. Så hvis du spole tilbage i tide til at når vi har spillet med Google og vi har gået til Google.com skråstreg søgning spørgsmålstegn q lig katte, hvis jeg skulle trykke Enter, og hvis Google blev gennemført i PHP, PHP-kode, som Google skrev ville have adgang til dollartegn understrege GET inde hvoraf er en vigtig kaldes Q og en værdi kaldet katte, at det derefter kan bruge bruges til at gøre et virkeligt søgning med. Så i virkeligheden, hvad jeg har tænkt mig at gøre nu, er at gå tilbage til min PHP kode at du igen vil se mere af i PSet7. Og i stedet for at tilslutte i hårde kodede værdier, som synes ikke som en meget dynamisk hjemmeside, Jeg har tænkt mig at give dig en teaser af hvad din faktiske kode ville gøre. Du ville sætte i to spørgsmål markerer som denne. Jeg ved ikke, hvad brugernavnet er. Jeg ved ikke, hvad det navn vil være, men jeg ved, jeg kan få dem dynamisk. Så hvis koden vi skriver nu, er koden kører på Googles servere, eller hvis dette er hej dot PHP, som kommer med PSet6, Jeg har tænkt mig at passere ind forespørgslen funktion ligesom printf, to andre argumenter. GET, tilbud, citat slut brugernavn, og GET, tilbud, citat slut navn. Og nu, mærke til, hvad det generelle struktur er her. Jeg har fået til venstre side af opkaldet, denne funktion kaldes forespørgsel i PHP. Jeg har stadig som et første argument, bare en tekststreng. Men at tekststreng er skrevet i et sprog, der kaldes SQL. Og helt ærligt, det er ikke et stort sprog. Vi kun vil tale om det formelt i dag, virkelig. Og derefter i problemer sæt syv, der er relativt par funktioner, som vi er kommer til at udnytte. Spørgsmålstegnene, dog mener tilslutte en værdi her og stik i en anden værdi her. Og varsel, jeg har udeladt, hvad fra hele quote-- pokkers det-- omkring citatet markerer denne gang. Jeg har udeladt citatet mærker omkring spørgsmålstegnet, Beklager, denne gang omkring. Så, hvad er nice om dette spørgsmålstegn funktion, som PHP har en tendens til at støtte, Ruby og Python og andre sprog, dette betyder bare plug i nogle værdi her og ved du hvad? Du regne ud, om at bruge enkelte anførselstegn eller dobbelte anførselstegn. Må ikke genere mig med dem, intellektuelt uinteressant detaljer. Men, sørg for at det er korrekt så min kode er i sidste instans operationel og sikker, som vil have en betydning inden længe. Nu, hvordan mange argumenter i alt, bare for at være klar, er forespørgslen funktionen tage? Nogen ønsker at stemme for mere end to? Tre? Sure, hvorfor? Hvorfor tre? PUBLIKUM: [uhørligt] DAVID MALAN: Præcis. Den første del er den streng. Det andet argument er dollartegn understrege GET beslag brugernavn. Og det tredje argument er den samme ting, men bare navnet. Så med andre ord, nu hvis jeg havde en webformular der skulle tekstfelter, en for brugerens brugernavn, en for hans eller hendes navn, bare ligesom du ville se i en hjemmeside når du tilmelder dig nogle hjemmeside, denne magt være koden på bagenden, der faktisk gør indsættelsen nu i databasen. Nu derimod lad os hurtigt frem. Antag at en bruger er nu logge ind og du vil at skrive PHP kode, der kontrollerer, om den person, der er bare logget ind er faktisk en bruger, kan du bruge temmelig simpel syntaks. Du kan sige SELECT, lad os sige stjerne, hvor stjerne betyder alt. Jeg ved ikke, hvad jeg ønsker, så bare giv mig alle kolonner fra tabellen kaldet brugerne, hvor, og det er rart. Vælg understøtter, hvad der er kaldes et prædikat, som er som en måde at kvalificere, hvad du ønsker. Hvor brugernavn er lig tilbud, citat slut Malan. Så også her jeg har indlejret inde argumentet til en PHP-funktion, en linje af SQL-kode. Og at SQL-kode dette tid bogstaveligt talt går at søge efter tilbud, citat slut Malan. Nu det er ikke alt, nyttige, så jeg har tænkt mig at springe, at og jeg har tænkt mig at lægge væk dette tip fra Brady, og gå og plug-in i stedet et spørgsmålstegn her. Så bare for at være klar, hvad skal min andet argument være, hvis nogen har netop logget ind, og jeg vil kontrollere, om han eller hun er faktisk en bruger? PUBLIKUM: [uhørligt] DAVID MALAN: Ja. Jeg hører dollartegn understregning GET tilbud, citat slut brugernavn. Og det bør vende tilbage til mig nogen af ​​rækkerne i min database der har et brugernavn på Malan. Nu forhåbentlig vil jeg komme tilbage nul, hvis Malan har aldrig været her, eller en, hvis han har. Jeg burde ikke komme tilbage to eller tre eller fire. Hvorfor? PUBLIKUM: [uhørligt] DAVID MALAN: Jeg sagde unik, ikke? Simpel grund. Fordi jeg sagde, at det er nødt til at være unikke, lige logisk, du kan kun have nul eller én Malans i dette særlige database tabel. Nu som en sidebemærkning, bare så du har set det, selvom jeg fortsætte med at bruge GET og selvom PSet6 kun anvendes GET, kan du helt sikkert have POST. Og huske, at Post er en anden teknik til at indsende oplysninger fra en formular, men det ikke vises i webadressen. Det er lidt mere sikker i hvert fald for ting som brugernavne og passwords, som PSet7 vil faktisk medføre. Så lad os gøre det i PHP MyAdmin og se hvad der sker. Jeg har tænkt mig at gå til fanen MySQL. Og bemærk, at standardværdien for PHP MyAdmin, bare for at forsøge at være hjælpsom, er at vælge stjerne fra brugerne hvor én. Tja, den ene er altid sandt, så dette har den tåbelige effektive af bare vælge alt. Men jeg har tænkt mig at være lidt mere pedantisk og manuelt skrive ud SELECT stjerne fra brugerne. Nu teknisk, kan du citere navnet på bordene. Det er sjældent, at du er nødt til, men bemærke disse er ikke din normale citater på amerikansk tastatur. Dette er den såkaldte backtick, som er generelt i øverste venstre hjørne af tastaturet. Men det er sjældent, at du vil faktisk nødt til at gider med det, så jeg vil bare udelade dem alligevel. Så nu, lad mig gå videre og ramte gå. Og hvor mange rækker skal jeg få tilbage, når jeg vælger stjerne fra brugere? PUBLIKUM: [uhørligt] DAVID MALAN: Antallet af rækker, sikker. Men hvor mange i denne beton historie lige nu? To, fordi der var mig og der var Rob. Så hvis jeg klikker Go, ser jeg visuelt at Jeg har fået tilbage, ja, to rækker. Der er en masse rod på skærmen, men jeg ser kun to rækker. Derimod hvis jeg gør det igen og gøre SELECT stjerne fra brugere, hvor brugernavn lig tilbud, citat slut Malan, nu, hvis jeg klikker OK, Jeg vil kun komme tilbage en række. Og endelig, hvis jeg gør noget som dette, formoder at jeg er ligeglad få alt, som er form for meningsløs nu, fordi der er kun to kolonner. Det er ikke ligesom jeg vælge en enorm mængde data. Antag jeg gå videre og vælger navn fra brugere, hvor brugernavn lig Malan, hvad der er rart om SQL ærligt, er, at det virkelig bare gør hvad du fortæller det at gøre. Det er temmelig kortfattet, men du bogstaveligt talt bare fortælle det, hvad du vil gøre. Vælg navn fra brugerne, hvor brugernavnet lig Malan. Og det er virkelig, at eksplicit. Så nu, hvis jeg ramte Go, hvor mange rækker er jeg kommer til at få tilbage? En, fordi det er bare Malan, forhåbentlig. Eller nul, hvis han ikke er der, men en maksimalt. Og hvor mange kolonner får jeg tilbage? Hvor mange kolonner? Denne gang, jeg bare at få en, fordi jeg ikke Vælg stjerne, hvilket er alt. Nu er jeg vælge bare navn, så jeg bare komme tilbage en kolonne og en række. Og det ser slags passende latterligt, bare at kigge super lille som denne. Så, hvad der virkelig sker? Når du udfører en SQL forespørgsel ved hjælp vælge, hvad du får tilbage fra databasen er som en midlertidig tabel med rækker og kolonner, måske, men at udelade noget, var faktisk ikke valgt af dig. Så det er ligesom, hvis nogen havde en stor regneark med alle de studerende registreret for nogle studerende gruppe, og du siger, give mig alle de freshman, der har registreret for vores studerende gruppe, hvad din kollega i studerende gruppe kan gøre er de kunne bare hånd dig hele regnearket. Det er ligesom at sige vælge stjerne. Og det er lidt irriterende, hvis du kun ønskede freshman. Og så, hvis du i stedet sagde, Vælg stjerne fra database tabel hvor året er lig med tilbud, citat slut freshman, det er som om din ven i elevgruppen bogstaveligt fremhævet og kopieres kun de freshman rækker, indsat dem i en ny Google Regneark eller en Excel-fil, og rakte dig tilbage kun resulterende fil. Det er alt, der foregår på begrebsmæssigt her. Så i sidste ende, kan vi gøre nogle ret fancy ting ved at lagre ting som brugernavne og passwords og lignende. Men, det viser sig, skal vi gøre lidt anderledes end dette. Det er ikke så smart at kun gemme et brugernavn og en adgangskode. Nogen tidligere, tror jeg hernede, foreslog et ID. Nu et ID kunne være som en Harvard-id eller Yales Net-ID, men det kunne være endnu enklere i vores database sagen. Og ja, den fælles sag er at have en anden kolonne. Og jeg har tænkt mig at gå videre og redigere mit bord. Og hvis du spiller rundt med dette interface til PSet7, vil du se, at du kan kontrollere denne knap her og tilføje et felt i begyndelsen af ​​tabellen. Og nu, hvis jeg klikker OK, går det at give mig en af ​​disse former fra tidligere. Jeg har tænkt mig at tilføje et felt kaldet id. Og jeg har tænkt mig at gøre det til en numerisk type. Jeg har en hel masse af værdier for talværdier. Jeg bare at vælge en INT og ikke bekymre dig om de forskellige størrelser. Jeg behøver ikke at angive en længde eller en værdi, fordi det vil være 32 bit, uanset hvad. Attributter, ser vi ikke før. Nogen interesse i nogen af ​​disse menuindstillinger denne gang? For en INT? Hvad har du foreslå? Nej? Gør nogen af ​​disse giver mening? Ja. Ja, usigneret, ikke? Generelt, hvis vi kommer til at give alle et unikt nummer, som er, hvor denne historie er gå, jeg virkelig kun ønsker en person at have nummeret som nul og en og to og tre og fire. Jeg behøver ikke at beskæftige sig med negative tal. Det bare ser ud som unødig kompleksitet. Jeg vil have fire milliarder mulige værdier, ikke fire milliarder mulige værdier, så jeg bare fordoblet kapacitet min INT. Som en sidebemærkning, hvis du ønsker at forholde dette til noget som Facebook, igen slags min dag, når Facebook først kom ud, Jeg tror, ​​hvad de var ved hjælp af i deres MySQL-database at opbevare en brugers identifikator, var bare en INT. Men selvfølgelig, der er en masse af virkelige mennesker i verden. Der er en masse falske Facebook konti i verden. Og så til sidst, overløb Facebook størrelsen af ​​en INT, en fire mia værdi. Hvilket er grunden til, hvis man ser rundt og der er hjemmesider der kan fortælle dig, hvad dit unikke id er. Og hvis du aldrig har valgt et brugernavn i Facebook, vil du se dit unikke id. Jeg synes det er profil dot PHP spørgsmålstegn id lig noget. Det er nu noget ligesom en stor INT, eller en lang længe, ​​hvis du vil, som er en 64-bit værdi eller noget tilsvarende. Så selv i den virkelige verden at gøre disse spørgsmål i sidste ende nogle gange noget. Og det viser sig her, hvis jeg give alle mine brugere et unikt id, Jeg ønsker at være super eksplicitte og minimalt gør dette område unikt. Men det viser sig der er en stykke nomenklatur i dag også det er en primær nøgle. Hvis du designer en database tabel, og du på forhånd at en af ​​kolonnerne i tabellen bør og vil entydigt at identificere rækker i tabellen, du ønsker at specificere det og fortælle databasen, dette er min primære nøgle. Der kan være dubletter på andre områder, men jeg fortæller den database, dette er min primære, min mest vigtige område, der er garanteret til at være unik. Nu, dette synes overflødig. Jeg foreslår nu, at vi tilføje, ved at klikke på Gem her, et felt called-- og jeg har tænkt mig at gå videre og klik på AI, vi vil vende tilbage til at der i et øjeblik, Gem. Jeg foreslår nu, at mit bord se sådan ud. Jeg har en INT felt kaldet id, en CHAR felt kaldet Brugernavn, en VARCHAR felt kaldet Navn, men id, hvis det er primær og derfor unik, hvorfor jeg bare spilder tid at indføre, hvad effektivt er et andet unikt felt, der kaldes id, der er en INT? Brugernavn, tilbagekaldelse, var allerede enestående, sagde vi. Så bare logisk, behøver du ikke enhver database erfaring til grund gennem denne, hvorfor kunne jeg har indført en INT som min entydig identifikator så godt? Hvad denne-- siger igen? PUBLIKUM: [uhørligt] DAVID MALAN: Tilfældig adgang er nemmere, hvorfor? PUBLIKUM: [uhørligt] DAVID MALAN: Ja, det er lige adgang numre. Så hvis du tænker på denne virkelig er en tabel, som et array, nu har jeg entydige identifikatorer at jeg kan hoppe rundt. Og bedre end der stadig er, at hvor stor er en INT kommer til at være igen? 32 bit eller fire bytes. Hvor stor er mit brugernavn kommer til at være? Maksimalt? 16 bytes. Så hvis du virkelig pleje om udførelsen af ​​din kode, tænker tilbage på PSet5, ville du foretrække at søge efter en fire byte værdi eller en 16 byte værdi, right? Det er virkelig så simpelt er det. Du er nødt til at gøre fire gange så meget arbejde at søge efter brugernavne, fordi disse er 16 bytes. Så er du nødt til bogstaveligt talt sammenligne alle 16 bytes at være sikker ja, det er brugernavn, jeg ønsker. Mens det for en INT, kan du gøre det med blot fire bytes. Og som en sidebemærkning for dem interesseret i computer hardware, det viser sig, du kan passe noget lignende en INT eller en 32-bit værdi i noget kaldes et register i en computer CPU, hvilket betyder, at det er super, super hurtig, selv ved den laveste niveau af computerens hardware. Så der er bare fordele hele vejen rundt. Så hvad betyder det? I virkeligheden, når du designer en database tabel, næsten hele tiden er du nødt til ikke kun de data, du holder af, men også noget en entydig identifikator fordi dette vil Lad os gøre andre ting. Og lad os falde over et problem her. Antag, at brugerne ikke har bare brugernavne og navne, men de har også ting som byer og stater og postnumre, i det mindste her i USA. Så jeg har tænkt mig at gå videre og lige hurtigt sige, give mig flere tre kolonner ved slutningen af ​​tabellen. Og det bliver City, dette vil være staten, og dette vil være Zip. Nu City, hvad datatyper bør dette være, måske? VARCHAR? Jeg ved ikke, hvad det længste bynavnet er. Et eller andet sted i Amerika, er der sandsynligvis nogle latterligt langt ord, så lad os bare gå med 255, noget historisk eller vilkårligt. Stat, hvad du vil gøre? Dom opkald, ikke? Hvad er måske den mest effektive? Hvor mange tegn? Måske bare to, hvis vi kan slippe af sted med at gøre netop, lignende, MA for Massachusetts og så videre. Så jeg har tænkt mig at gå en CHAR værdi på to. Postnummer er interessant. Vi er her i 02138, så foreslår vi skal bruge hvad? Det er en INT, ikke? INT, INT, kort? Korte ville arbejde. Nej? CHAR eller fem, men jeg vil have en INT. Hvorfor skubbe tilbage på en INT? Overtale mig fra dette. Hvad er dumt om en INT, min idé? Ja. PUBLIKUM: Tag op mere hukommelse. DAVID MALAN: Tag op mere hukommelse. Fire bytes, men du er foreslå et postnummer som fem bytes eller nogen var som en CHAR, der føles som eh, det er ikke rigtig sagen. Nå, sjov historie. År siden, da jeg plejede at bruge Microsoft Outlook til min e-mail, Jeg til sidst ønskede at skifte til Gmail. Og så, jeg eksporterede alle mine kontaktpersoner fra Outlook som en CSV-fil. Komma adskilte værdier, som netop betød, at jeg havde alle mine venner navne og sidste navne og telefonnumre og postnumre og alt dette. Og så gjorde jeg det fejltagelse at åbne det op i Excel, hvilket er en regnearksprogram, forstår CSV-filer, som vi har set. Men så må jeg have ramt, ligesom, Kommando eller Kontrol S på et tidspunkt. Og Excel tilsyneladende på tidspunktet havde en funktion, hvor som helst det så et nummer, er det forsøgt at være nyttigt. Og hvis dette antal i gang med nuller, ville det bare slippe af med dem. Hvorfor har du brug for førende nuller på heltal? De er meningsløse, matematisk. De er ikke meningsløs i US Postal-systemet. Så jeg har haft i år, til denne dag, jeg stadig har venner, at når sjældne tilfælde, at jeg har brug for nogen er imødegå disse dage, Jeg vil stadig se, at jeg har en ven i Cambridge, Massachusetts, 2138. Og det er irriterende, hvis du er forsøger at sortere på programmatisk generere kuverter eller bare notere det ned. Og det er på grund af denne grund, Jeg valgte den forkerte datatype. Så jeg elsker din idé. Lad os bruge en CHAR felt. Fem tegn, undtagen Der er et hjørne tilfældet. Hvis du stadig sende mail, sommetider postnumre i disse dage, de er, ligesom, plus fire. Så vi har brug for en bindestreg og derefter vi har brug for fire flere numre. Så for at være ærlig, det kunne gå mange forskellige måder. For nu, vil jeg holde det enkelt og jeg er bare kommer til at sige, at det er en fem CHAR værdi, og vi er kommer til at springe hele Dash plus fire. Men disse er den slags kompromiser. Og du kan tænke på det samme problemer med telefonnumre eller andre områder. Og nu, det er faktisk en tåbelig vej til at gå ned. Antag både Rob og jeg og Hannah og Maria og [? Davon?] Og Andy og andre på personalet alle lever i Cambridge, Massachusetts, 02138. Dette faktisk føler dum, at jeg er tilføje til mine brugere bord, by, stat, og lynlås. Hvorfor? PUBLIKUM: [uhørligt] DAVID MALAN: Sig igen? PUBLIKUM: [uhørligt] DAVID MALAN: De er altid kommer til at gå sammen, ikke? Når det viser sig, vi plejede at tænke dette var tilfældet, indtil vi udtømmende søgte hele USA, og viser sig, at der er nogle uoverensstemmelser hvor flere byer har den samme lynlås, hvilket er underligt. Men, hvis vi fastsætter for nu at 02138 er altid Cambridge, Massachusetts, hvorfor i verden ville du gemmer i din database Cambridge og MA og 02138 for mig og for Hannah og til Rob og for [? Davon?], Og for andre, der bor her i Cambridge, er det perfekt overflødig. Vi bør komme væk med blot at lagre hvad? Bare det postnummer. Men så, hvis vi gemmer bare postnummer, jeg ønsker, sandsynligvis, til min hjemmeside for at vide, hvor 02138 er. Så jeg har brug for en anden tabel. Og det er OK. Og i virkeligheden, det er en af ​​de designprocesser designe tabeller at du vil gøre i PSet7 såvel hvorved du ønsker at faktor ud fælles data. Ligesom vi har været factoring ud fælles kode og factoring ud fælles stilarter fra CSS, her også i databasen, hvis jeg kun har brug for 02138 til entydigt identificere en persons hjemby, må ikke opbevares Cambridge, Mass for hver darn bruger på dit bord. I stedet har en separat tabel kaldet Lynlåse, der bør have, hvad kolonner? Sandsynligvis et ID felt, bare fordi, for de principper, vi taler om nu. Sandsynligvis en zip felt til 02138. Og så sandsynligvis, hvad andre kolonner? By og stat, men kun har én række for 02138, en række for 02139, én række til 90.210. Og det er bogstaveligt talt alle postnumre jeg kender. Så nu, hvad kan du gøre? Dette er problematisk, fordi nu har jeg fået to tabeller. Så mine brugere er for det meste herovre, men deres bystat oplysninger er her ovre. Så viser det sig med SQL, der faktisk en måde at slutte oplysninger, og du vil se dette i pset. Men det viser sig, du kan gøre noget som dette. SELECT stjerne fra brugere, JOIN lynlåse ON brugere dot lynlås lig lynlåse dot lynlås. Hvilket er lidt ordrige, ganske vist, men dette blot betyder at vælge alt fra processen med at tage mine brugere bord og min lynlåse tabel. Deltag dem på den ene felt har de i kolonne. Så bogstaveligt gøre noget som dette, og give mig tilbage en ny midlertidig tabel der er bredere, der er større, der har alle de kolonner fra dem begge. Og det ganske enkelt ville være det syntaks for at gøre noget som dette. Så der er det forude, men der kommer at være andre designbeslutninger, du vil nødt til at gøre, ikke kun med indekser men også at løbe ind i udfordringer. Faktisk er der en udfordring i enhver database design hvorved nogle gange to mennesker måske ønsker adgang til samme rækker af databasen tabel. Så det er noget, som vi vil støde på i PSet7 samt. Men jeg tænkte jeg ville se på en angreb, der er muligt i SQL. Hvad er nogle af de problemer, der kan opstå? Så vil du støde på dette i PSet7. Og vi fortæller dig direkte, hvad det kodende løsning på dette problem er. Men hvis du tager et højere niveau klasse, især i operativsystemer, du kommer til at støde et spørgsmål om Atomicity, problemet med at forsøge at gøre flere ting på én gang uden afbrydelse. Og jeg tænkte jeg ville indføre denne idé til PSet7 med en metafor at jeg lærte mig selv i Margo Seltzer s CS164 operativsystemer klasse ĺr siden. Antag, at du har en af ​​disse kollegieværelse køleskabe i dit kollegieværelse eller hus, og du har en reel forkærlighed for mælk. Og så, du kommer hjem fra klasser en dag, du åbner køleskabet. Åh, for fanden. Der er ingen mælk i køleskabet. Så du lukker køleskabet, låse døren, låse dit kollegieværelse, gå rundt om hjørnet til CVS, komme i linje, og begynde at tjekke ud for nogle mælk. Og det kommer til at tage et stykke tid, fordi dem sgu selv kassen tællere tage for evigt at bruge alligevel. Så i mellemtiden, din værelseskammerat kommer hjem. Han eller hun virkelig kan lide mælk så godt. De kommer ind i kollegieværelse, åbne køleskabet, åh, darn det. Der er ikke mere mælk. Så han eller hun også går rundt om hjørnet. Men nu, da der er ligesom to eller tre eller fire CVSes nærheden, de tilfældigvis til at gå til en af ​​de forskellige dem på pladsen. Og så nu, et par minutter senere, begge af jer komme hjem og UH, værste problem nogensinde. Nu har du for meget mælk fordi det kommer til at gå sur. Og du kan lide mælk, men du kan ikke rigtig lide mælk. Så nu, dette var en dyr fejltagelse, fordi begge du taget en beslutning på grundlag af tilstand nogle variabel, var i færd med at ændres af dig, initiativtager kommer til at få mælk. Så hvad er måske et menneske løsning på dette problem? PUBLIKUM: [uhørligt] DAVID MALAN: Skriv en note, ikke? Sørg altid for en note, hvis du er bekendt med det show. Ja, der er to af os. Så altid forlade en note, eller bogstaveligt låse køleskabet med en vis form for hængelås eller noget over toppen sådan. Men det er faktisk kommer til at være centralt problem med database design, især når du har måske flere browsere, flere bærbare computere, flere brugere forsøger alle at opdatere oplysninger på en gang. Særligt følsomme oplysninger Ligesom finansielle oplysninger, hvorved med en bestand handel hjemmeside som du skal bygge, hvad nu hvis du ønsker at kontrollere, hvor mange penge du har, og derefter, hvis du har nok, købe nogle lager? Men hvad nu hvis en anden, der har en fælles konto med dig er samtidig forsøger at købe nogle lager? Så han eller hun er at kontrollere saldo, begge af jer komme tilbage til samme svar, er der ingen mælk. Eller begge af du får tilbage svaret, du har $ 100 i kontoen. Begge du prøver at gøre beslutningen at købe en andel af nogle selskab lager. Og nu, hvad sker der? Du har to aktier? Du har ingen aktier? Problemer som der kan opstå. Så vil vi støde på det. SQL-injektion angreb, heldigvis, er noget, vi vil hjælpe dig med, men disse er atrociously fælles disse dage stadig. Så dette er blot et eksempel. Jeg gør ingen påstande, Harvard PIN system er sårbare over for denne særlige angreb. Vi har prøvet. Men, du ved, at vi have et felt som dette. Og Yales Net-ID har en lignende ser skærmen i disse dage. Og det viser sig, at måske PIN-systemet er implementeret i PHP. Og hvis det were-- det er not-- de kunne have kode, der ser sådan ud. De har to variabler. Giv mig brugernavn og adgangskode fra posten Super global variabel at vi talte om tidligere. Måske Harvard har en forespørgsel Ligesom SELECT stjerne fra brugere hvor brugernavn lig og kodeord lig. Og bemærk, at jeg bare sætte det i at bruge den krøllede bandage notation fra den anden dag, hvilket betyder blot tilslutte en værdi her. Jeg bruger ikke den spørgsmålstegn teknik. Jeg har ikke nogen anden eller tredjemand argumenter. Jeg er bare bogstaveligt konstruere strengen selv. Problemet er dog, at hvis nogen kan lide en scroob, som er en henvisning til en film, logger ind med noget som dette, og jeg har fjernet prikkerne der normalt dække op adgangskoder, hvad nu hvis han er særligt ondsindet og hans password måske er 12345, pr filmen kaldet "Spaceballs," men han kritisk typer en ét tilbud efter fem, derefter bogstaveligt ordet eller i rummet, og derefter tilbud, citat slut en er lig citerer én, men varsel han udeladt hvad? Han har udeladt citatet til højre og han udeladt citatet til venstre. For hvis denne angriber scroob formodning er, at de mennesker, der skrev dette PHP kode ikke var så lyse, måske de bare har nogle enkelt citerer omkring interpolation af en variabel i krøllede parenteser? Og så måske, han kunne slags af fuldføre deres tanker for dem, men på en måde, der foregår at lade ham hacket ind i PIN-systemet. Med andre ord, formoder at dette er den kode og vi nu tilslutte hvad scroob indtastet. Og det er rødt, fordi det er dårligt. Og den underliggende tekst er, hvad han har skrevet i, scroob kunne narre Harvards server til konstruktion af en SQL-forespørgsel streng, der ser sådan ud. Kodeord lig 12345 eller en er lig én. Resultatet heraf, logisk, er, at dette vil logge scroob i hvis hans password er 12345 eller hvis en ligemænd én, som naturligvis er altid sandt, hvilket betyder scroob altid får i. Og så, til den måde løse dette, som i mange tilfælde, ville være at skrive mere defensivt. At bruge noget som vores faktiske forespørgslen funktion, som vil du se i PSet7, hvor vi tilslutter noget som spørgsmålstegn her. Og skønheden i forespørgsel funktionen vi give dig er det beskytter mod disse såkaldte SQL injektion angreb, hvor nogen er tricking din kode ind injicere sin egen SQL-kode. For hvad forespørgslen funktionen vi giver du rent faktisk vil gøre, hvis du bruger spørgsmålstegnet syntaks og en anden og en tredje argument her, er, hvad der gjorde det føje til input, som brugeren forudsat? De, backslash citater. Så det undslipper enhver potentielt farlige tegn. Det ser mærkeligt nu, men det er ikke sårbare fordi den ikke ændre logikken længere fordi det hele password er nu et enkelt citat, der ikke er, Faktisk scroob adgangskode. Så har der været nogle vittigheder om dette i årenes løb. Så det var et foto taget nogle nørd på en parkeringsplads hvorved du måske vide, at nogle byer og stater forsøger at scanne din licens plade til at fakturere dig eller billet, du hvis du går igennem uden, ligesom, E-Z Pass ting. Så denne person formodes at måske folk skriver E-Z Pass systemet var ikke så lyse, og måske de bare sammenkædet sammen en snor, så han eller hun ikke kunne skadeligt ikke bare færdiggøre deres tanker, men faktisk udføre en dårlig kommando, som vi ikke har nævnt endnu, men du kan sikkert gætte. At udover at slette og indsætte og opdatere og vælg, der er også et nøgleord kaldet slip, som bogstaveligt sletter alt i databasen, som er særligt slemt. Vi kan zoome ind på dette, hvis det er lidt svært at se. Dette, nu er en berømt tegneserie det er vidunderligt klog nu og forståeligt. [Latter] Ja, cool. Slags geeking ud. Så disse, så er SQL-injektion angreb. Og de er så nemme at undgå ved at bruge den rigtige kode eller de rigtige biblioteker. Og du vil se i PSet7, det er Derfor giver vi dig forespørgslen funktionen. Så et par teasere at vi troede, vi havde giver dig her i vores resterende minutter sammen. Så, som du husker fra uge nul, vi introducerede disse to pærer, som er rart, ikke kun på grund de er smuk og er farverige, men fordi de støtter noget kaldet et API, et program Programming Interface og i CS50 hidtil, vi har meste fokuseret på GET og POST, men det viser sig der er andre HTTP verber som PUT. Og i virkeligheden, var dette et dias fra uge nul hvorved hvis du skriver kode, der sender a la PSet6 en HTTP-anmodning, der ser sådan ud med denne luns af tekst nederst, som kaldes JSON, eller JavaScript Object Notation at vi vil tale om i næste uge, du kan tænde eller slukke eller ændre farven af ​​lys som dem. Så hvis CS50 har også foruden nogle af disse pærer her i New Haven Hvis du gerne vil låne dem for de endelige projekter, også nogle Microsoft Bands, som er ligesom ure, at du bærer rundt håndleddet der på samme måde har en API, så du kan skrive din egen software til dem. Vi har en konto med Apples iOS kode, så at hvis du har en Apple Watch eller en iPhone eller en iPad eller en iPod, du kan skrive kode, faktisk kører på dem. Vi har en hel masse af Arduinos, som er bittesmå computere uden sager i det væsentlige, at du kan oprette forbindelse via USB, typisk til din egen Mac eller PC, skrive kode, der kører på disse fysiske enheder, der ofte har sensorer på dem så du kan interagere med den virkelige verden. Vi har en hel masse af Leap Motion enheder, der er USB-enheder til Mac-computere og Pc'er, her og igen, i New Haven. Og hvis du slutter den til din Mac, du rent faktisk kan styre din computer ved at skrive software at via infrarøde stråler, tal ud af, hvor din menneskelige hænder er, selv uden at røre tastaturet. Vi troede, vi ville dele en hurtig glimt på dette, for eksempel. [Musik spiller] Så har vi en hel flok af disse ting, Også kaldet Myo arm bands som du sætter over din underarm og så kan du styre den virkelige verden eller den virtuelle verden som denne. [Musik spiller] Eller har vi også nogle Google Pap, som er bogstaveligt talt, ligesom, en papkasse du kan sætte på din ansigt, men dias i din telefon til det så du sætter glas din telefon virkelig tæt på dine øjne. Og Google Pap er temmelig billige på $ 10 eller $ 20. Og det har små linser at lidt off skift billedet på skærmen i din menneskelige øjne til at give dig en fornemmelse af dybde så du rent faktisk har en 3D- miljø foran dig. Vi har også nogle Samsung Gear, som er dyrere version af denne, men der kan på lignende måde glide i en Android-telefon og give dig en illusion of-- eller give oplevelsen af virtual reality. Og i vore sidste to minutter, Vi troede, vi ville forsøge at gøre dette. Hvis jeg kan projicere hvad Colton har her blot for at skærpe din appetit, lad mig gå videre og smide op på den store skærm her. Lad mig dræbe lys. Colton, vil du gå videre og sætte på din celle et øjeblik og komme på over til midt på scenen? Og vil du project-- dette er hvad Colton ser. Nu Wi-Fi i her er ikke så stærk for denne enhed at dette er super overbevisende, men Colton er bogstaveligt talt i denne magiske futuristiske sted. Han ser kun et billede. Du ser hans venstre og højre øje at hans hjerne er syning sammen i et tredimensionelt miljø på hans ansigt. Han har netop valgt et menupunkt her. Og så igen, han iført dette headset med en Samsung telefon på det, der er trådløst rager til vores overhead. Nu er du på Mars, jeg tror? COLTON: Jeg tror det. Jeg er ikke sikker [uhørligt]. [Latter] DAVID MALAN: Slår ud Mars har disse menuer. COLTON: [uhørligt] nogle cool steder, hvis vi ønsker at gå at-- DAVID MALAN: Hvor vil vi hen? COLTON: [uhørligt] DAVID MALAN: Og lad os se hvor Colton s tager os nu. COLTON: [uhørligt] DAVID MALAN: Så der er så mange forskellige steder, du kan tage dig selv. Der er FAPIs via hvilken du kan skrive spil eller interaktioner, køre i sidste ende på telefonen. Så du virkelig bare skriver en mobiltelefon app. Men takket være softwaren og grafikfunktioner, nu Colton er i denne lille lille hytte. Og risiko for overvældende os selv, Colton og jeg vil holde sig til mens i slutningen af ​​klassen her i dag Hvis du gerne vil komme op og spille. Og vi vil bringe dem tilbage næste uge også. Uden yderligere Ado det er det for i dag. Vi vil se dig i næste uge. [MUSIC - Ragga TWINS, "ond mand"]