[MUSIK SPELA] DAVID MALAN: Okej, är detta CS50. Detta är slutet av veckan åtta. Och idag, vi börjar att fylla i vissa bitar när det gäller att bygga saker på webben. Så minns att på måndag Vi tillbringar mycket mer tid på PHP, vilket är denna dynamiska programmeringsspråk som låter oss utgång, bland annat saker, HTML och andra sådana innehåll att vi kommer att vilja se. Men vi har inte riktigt tittat på hur vi kommer att lagra någon information. I själva verket, nästan alla av att super intressanta webbplatser du besöker idag har någon form av databas på baksidan slutet, eller hur? Facebook lagrar säkert massor av uppgifter om oss alla och Gmail lagrar alla dina e-postmeddelanden. Och så många andra platser är inte bara statiskt innehåll som är informativt. Det är faktiskt dynamiskt på något sätt. Du ger input, uppdaterar den sidorna för andra människor. Du får meddelanden du skickar meddelanden, och så vidare. Så idag, tittar vi närmare på de grunderna för ett projekt att du kommer att dyka in i nästa vecka, CS50 Finance, som faktiskt kommer att få dig att bygga något som inte i C, men i PHP. En hemsida som ser lite ungefär så här som gör det möjligt att köpa och sälja bestånd som faktiskt kommer att utnyttja realtid stockuppgifter från Yahoo Finance. Och så i slutändan, kommer du att ha illusion för dig själv och för användare att du faktiskt ska köpa och sälja aktier och få nästan i realtid uppdateringar, hantera en portfölj, vilka alla kommer att kräva att ha, i slutändan, en databas med användare. Så, med egna ord, speciellt om du inte super förtrogenhet med data vetenskap eller databaser, vad vet du en databas för att vara just nu, i icke-tekniska termer? Vad är det? Hur skulle du beskriva det en rumskompis eller en vän? PUBLIK: [OHÖRBAR] Information [OHÖRBAR] DAVID MALAN: Så, en förteckning över uppgifter eller en store-- en lista med information som du kanske vill spara om något, som en användare. Och vad gör användarna har förknippade med dem? Om du är en användare på Facebook eller Gmail, vilka är de egenskaper att vi alla användare har? Liksom, vad som kan vara en del av kolumner i tabellen som vi hänvisade förra gången? Eftersom igen, kan du tänka på en databas verkligen som en fancy Excel-fil eller Google Kalkylblad eller Apple Numbers fil. Så, vad tycker du om när du tänker på en användare? Vad har de? Vad är det? PUBLIK: Ett namn. DAVID MALAN: Ett namn. Så om namnet, liksom David Malan skulle vara namnet på en viss användare. Vad gör en användare har? Publik: Ett ID. DAVID MALAN: Ett ID. Så, som en ID-nummer, som din Harvard ID eller din Yale Net ID eller liknande. Vad kan en användare ha? PUBLIK: Lösenord. DAVID MALAN: Ett lösenord, kanske en adress, kanske ett telefonnummer, kanske en e-postadress. Så det finns knippen av fält och detta kunde sorts tappa kontrollen snabbt så fort du börjar förverkliga, åh, låt oss lagra detta och låt oss lagra detta och det. Men hur ska vi egentligen göra det? Så återigen, den mentala modell att ha för i dag som vi dyka in i den faktiska SQL, Structured Query Language, är en databas som ser ut så här. Det är bara rader och kolumner. Och ni kan föreställa Google Spreadsheets eller valfritt antal andra program. Men vad är nyckeln om MySQL, som är den databasprogram vi kommer att använda, det fritt öppet available-- Facebook användningar det och valfritt antal andra websites-- databas lagrar saker relationellt. Och en relationsdatabas betyder bara en som bokstavligen lagrar data i rader och kolumner. Det är så enkelt är det. Så även något som Oracle som du kanske har generellt hört talas om är en relationsdatabas. Och under huven, det lagrar data i rader och kolumner. Och Oracle avgifter du en massa pengar att göra det, medan MySQL avgifter du ingenting för densamma. Så är SQL kommer att ge oss minst fyra operationer. Förmågan att välja data, som läs- uppgifter, infoga, ta bort och uppdatera data. Med andra ord, de är verkligen de fyra knapptryckningar som kommer att tillåta oss att ändra saker i dessa rader och kolumner. Verktyget som vi använder i dag, särskilt att lära SQL och att spela med det återigen kallas PHP MyAdmin. Det är webbaserat verktyg. Total tillfällighet att det är skrivet i PHP. Men det kommer att ge oss en grafisk användargränssnitt så att vi kan faktiskt skapa dessa rader och kolumner och sedan prata med dem via kod. Så, låt oss nu börja vad jag tror är uppriktigt sagt typ av roligt processen för bygga den bakre änden av webbplatser, de delar som användarna gör inte se, men säkert bryr sig om, eftersom det är ganska datas går. Så, som liknar C och en lite mindre som PHP, SQL, eller en databas som stöder SQL, har åtminstone dessa datatyper och klasar av andra. CHAR, VARCHAR, INT, bigint, DECIMAL och DATETIME. Och det finns en hel massa andra funktioner, men låt oss göra detta genom att sätt att faktiska exempel. Jag kommer att gå in i CS50 IDE där, i förväg, har jag loggade in och jag har också besökt en URL för detta verktyg som kallas PHP MyAdmin. Och problemet satt sju, kommer vi att berätta exakt hur att komma till detta gränssnitt också. På det övre vänstra hörnet, märker det säger föreläsa. Och det betyder bara att i förväg, skapade jag en tom databas som kallas föreläsning som inte har några kalkylark i det än. Det finns inga rader och kolumner. Eftersom den första som vi ska göra är att börja skapa en tabell som kommer att lagra våra användare. Så, bokstavligen över här till höger, jag kommer att berätta databasen Jag vill ha en tabell som kallas användare. Så, är detta som fil som jag vill lagra alla mina data. Och hur många kolumner? Nåväl, låt oss hålla det enkelt för nu. Jag vill bara att lagra som en användarnamn och ett namn på en användare. Vi kommer att börja i liten skala. Så, jag vill ha två kolumner totalt. Och jag kommer att gå vidare och klicka på Gå. Och sedan, för dessa kolumner, vad jag ska att do-- om denna Internet cooperates-- okej, så vi ska försöka det igen. Jag ska skapa en tabell som kallas Användare med två kolumner, klicka på Gå, OK. Nu har vi fått det riktigt snabbt. Tack, mycket bra gjort. Okej, så vad vill vi dessa kolumner att kallas? Så, är en kommer att kallas Användarnamn. Så allt jag ser här-- och gränssnittet uppriktigt sagt blir lite fult så småningom, när du börjar skriva i alla dessa data. Men vad är trevligt är den sortens paradoxalt nog, jag skapar kolumner, men verktyget har dåraktigt lade ut dem i rader så att jag kan konfigurera dessa kolumner. Så det finns två ämnen där under namn. Och en av dessa områden I vill kallas användarnamn, och annat område jag vill ringa namn. Och nu måste jag välja datatyper för dessa saker. Så, medan i Excel och Google Spreadsheets, Om du vill ha en kolumn, du bokstavligen bara skriva namn eller användarnamn, tryck Enter. Kanske du gör det fetstil bara för tydlighetens skull, men det är det. Du behöver inte ange typer av kolumnerna. Nu i Google Spreadsheets eller Excel, du kan ange hur uppgifterna återges. Du kan gå till Format-menyn, och du kan ange visa detta som dollartecken, visa detta som en flyttalsvärde. Så det är i samma anda som att det vi håller på att göra, men detta faktiskt kommer att tvinga data för att vara en viss typ. Nu, även om en stund sedan jag sade att det finns bara ett fåtal datatyper, det finns faktiskt en hel del, och de är i varierande grad av specificitet. Och som en sidoreplik, du kan även göra snygga saker liknande lagrings geometrier insidan av en databas. Du kan lagra saker som GPS-koordinater och faktiskt hitta, matematiskt, punkter som är nära varandra. Men vi kommer att hålla detta super enkelt och gå upp till här, alla de så kallade strängtyper. Så, här är en lista över en massa alternativ. CHAR, VARCHAR TINYTEXT, MEDIUMTEXT, LONGTEXT. Och det är ganska överväldigande. Och tyvärr, något paradoxalt nog till C, en CHAR är egentligen inte en CHAR. Om du anger i en databas att din datatyp är CHAR, det betyder att ja, det är en CHAR, men det är en eller flera bokst. Och du måste ange hur många TECKEN du vill. Så, vad är en typisk längd för ett användarnamn? Finns det en gräns normalt? PUBLIK: [OHÖRBAR] DAVID MALAN: 16 kanske? Något sådant. Ni vet, tillbaka i dag, det brukade vara åtta. Ibland är det 16, ibland det är ännu mer än så. Och så gör det inte menar ge mig en CHAR. Detta betyder att jag måste ange längden av fältet, och nu kan jag säga något i stil med 16. Och det finns en avvägning här. Så vi får se i ett ögonblick att detta innebär en, varje användarnamn måste vara 16 tecken. Men vänta en minut, M-A-L-A-N. Om det är mitt användarnamn och jag använder bara fem, vad skulle du föreslå att databasen att göra för de andra 11 tecken som Jag har reserverat plats för? Vad skulle du göra? PUBLIK: [OHÖRBAR] DAVID MALAN: Ja, precis göra dem alla null. Gör dem utrymmen. Men förmodligen noll, så en massa omvända snedstreck nollor. Så, å ena sidan, vi har Nu såg till att mitt användarnamn kan vara mer än 16 tecken. Och den andra sidan av det är att om jag hade en riktigt långt namn eller ville ha en riktigt lång användarnamn som vissa av er killar kan ha i att högskolan eller på Yale.edu, kan du inte ha en. Och så i själva verket, om du har någonsin registrerats för en webbplats och du får skrek på att säga ditt lösenord är för lång eller ditt användarnamn är för lång, det är bara för att en programmerare, när konfigurera sin databas, beslutat att detta område kommer att vara längre än denna längd. Okej, så vad händer om Vi fortsätter att nämna? Hur länge ska en typisk människas namn vara? Hur många tecken, 16? Jag gissar att vi kunde hitta någon i det här rummet där av hans eller hennes första plus sista namn är längre än 16 tecken. Så, vad är bättre än att 17? 18? 25? Större? 30? PUBLIK: [OHÖRBAR] DAVID MALAN: 5000, herregud. Så, det är förmodligen en anständig övre gräns, skall vi säga. Och här har vi typ av har att göra en bedömning. Precis, det finns inget rätt svar här. Oändlig är inte fullt möjligt, eftersom vi är så småningom kommer att have-- vi är kommer att köra slut på minne. Så måste vi göra en dom samtal vid något tillfälle. Mycket vanliga skulle vara, till exempel, att use-- och låt mig ange CHAR här som before-- 255 var bokstavligen övre gräns för denna databasprogram för flera år sedan. Och så en massa människor vill bara säga, bra. 255 är gränsen. Låt oss bara använda max. Och det är ganska löjligt. Liksom, om du skriver någons namn för 200 plus tecken, det lite löjligt. Men, kom ihåg att ASCII inte det enda systemet för tecken. Och så, i synnerhet i en Många asiatiska språk där det finns tecken som vi kan inte uttrycka på tangentbord som min USA tangentbord, vissa tecken faktiskt ta upp 16 bitar i stället för åtta bitar. Och så, denna faktiskt är inte så orimligt att vi behöver mer utrymme om vi vill passa större tecken än själva USA centrerad som vi har tenderat att diskutera. Så behöver vi några övre gräns. Jag vet inte vad det bästa är, men 255 är i allmänhet en vanlig en. 25 känns lite. 16, 32 känner sig låg. Jag skulle missta sig på sidan något högre. Men det finns en avvägning, som alltid. Vad är kanske självklart avvägning att reservera 255 bokst för allas namn i min databas? PUBLIK: [OHÖRBAR] DAVID MALAN: Vad är det? PUBLIK: [OHÖRBAR] DAVID MALAN: Det är en mycket minne, eller hur? M-A-L-A-N. Jag har bara slösat bort 250 tecken bara för att lagra mitt namn defensivt, bara i fall någon i klassen har en riktigt långt namn. Det känns som en onödig kompromiss. Så visar det sig att SQL, denna databasspråket, faktiskt stöder något kallas VARCHAR eller variabel TECKEN. Och detta är typ av trevligt att detta kan du ange inte en fast bredd, utan snarare en variabel bredd. Och mer specifikt, en maximal bredd av fältet. Så, innebär detta att ett namn kan vara mer än 250 tecken, men det kan säkert bli färre. Och databasen kommer att vara smart. Om du sätter i M-A-L-A-N, Det kommer bara att använda fem, kanske sex byte för liknande en bakre tomtecken, och inte spendera en extra 249 eller 250 bytes i onödan. Så verkar det som om jag borde har börjat med den här historien. Men det finns alltid en avvägning. Så, å ena sidan, ett användarnamn jag har specificerade för att vara svårt kodas vid 16, och kanske det var inte rätt samtalet, kanske det är, men varför inte använda VARCHARs för allt? Det finns en anledning. Varför inte använda VARCHARs för varje område vars längd du inte vet i förväg om det verkar vara en stor sak, eller hur? Använd bara så mycket utrymme som du behöver upp till denna gräns? PUBLIK: Långsammare. DAVID MALAN: Speller? PUBLIK: Gör det långsammare? DAVID MALAN: Åh, det är långsammare. Bra, det är nästan alltid svaret, uppriktigt sagt. Liksom, vad är avvägning? Det antingen kostar mer utrymme eller det kostar mer tid. Så i det här fallet, kan det vara långsammare. Varför? PUBLIK: [OHÖRBAR] bestämning [OHÖRBAR]. DAVID MALAN: Good. Så, du kanske minns från och med PSED5, leka med din inställning i ordlistan, om du måste allokera minne dynamiskt eller behålla odla en buffert, som kan faktiskt vara långsam. Om du måste ringa malloc under huven och kanske det är vad MySQL gör, så säkert som skulle kunna vara fallet. Och om du tror att vägen tillbaka till PSet-- eller till och med veckor två, när vi gjorde saker som binär sökning eller ens linjär sökning, en av de fina sakerna med varje ord i en databas eller varje ord i en kolonn är exakt samma längd, även om en hel massa av dessa tecken är tomma, är att du kan använda random access på dina data, eller hur? Om du vet att varje Ordet är 16 tecken bort, du kan använda pekare aritmetik, så att tala och gå till oss 16, 32, 48, 64, och du kan bara hoppa direkt med aritmetisk något av orden i din databas. Medan om det är en VARCHAR vad gör du i stället måste göra? [Telefonen ringer] Om det är en VARCHAR, du kan inte använda random access. Vad du måste leta efter eller göra? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: Titta genom whole-- spår genom hela listan letar efter vad, mest troligt? Vilken typ av speciellt värde? PUBLIK: [OHÖRBAR] DAVID MALAN: Söker för nolltermine att avgränsa separationen av ord. Så återigen, en avvägning, och det finns inget rätt svar. Men det är här, i synnerhet när dina användare får vara många och din last på dina servrar, den antalet personer som använder den blir hög, dessa är faktiskt icke-triviala beslut. Så, kan vi lämna dessa som detta, men Låt oss bläddra ner över till höger här. Nu finns det ett par kolumner där vi måste göra en bedömning. Är det vettigt att låta en användares namn, en användares användarnamn eller en användares Namn, vara null? Det vill säga, bara tom. Känns lite meningslöst, så jag är kommer inte att kontrollera dessa lådor. Men det visar sig i en databas, kan man säga, någon kan valfritt ha detta värde. Den här kolumnen har inte att faktiskt vara där. Nu finns det här rullgardinsmenyn. Och märker jag är fortfarande i första raden där, så jag talar om användarnamn nu. Och det visar sig att en databas, till skillnad från en enkel ren kalkylblad, har kraftfulla funktioner som kallas index. Och ett index är ett sätt att tala om databas i förväg att jag den humana är smartare än du. Jag vet vilka typer av frågor, väljer eller infoga eller radera eller uppdatera, att min kod kommer att sluta upp gör på denna databas. Jag vill läsa en hel del data. Jag vill infoga en hel del data. Jag vill hela tiden radera en hel del data. Om jag vet att jag kommer att vara åtkomst till ett fält som användarnamn en hel del, Jag kan förebyggande syfte berätta databas, jag vet mer än du, och jag vill dekret som Du bör index här fältet. När indexera ett fält eller en kolumn innebär att databasen i förväg ska låna några idéer från, liksom, vecka fyra och fem och sex från CS50 och faktiskt bygga upp något som en binär sökning träd eller något allmänt kallas en B träd att du skulle lära i en klass som CS124 vid Harvard, en algoritmer klass, eller valfritt antal andra platser. Databasen och det smarta människor som genomfört det kommer att räkna ut hur man lagrar denna tabell av information i minnet så att sökningar och övrig verksamhet är supersnabb. Du behöver inte göra det. Du behöver inte genomföra linjär sökning eller binär sökning eller merge sort eller val sort, något av detta. Databasen gör det åt dig om du berättar det förebyggande syfte att indexera detta område. Och du kan se också, det finns vissa andra egenskaper Vi kan tala om databasen för att genomdriva. Vad kan det betyda om jag väljer Unik från denna meny, bara intuitivt? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: Ja, användarnamn måste vara unikt. Är detta en bra sak eller en dålig sak för en databas för en webbplats med användare? Om användarnamn vara unik? Ja, antagligen. Om det är vad fält vi använder för att logga in, du egentligen inte vill människor som har samma känsla eller samma användarnamn. Så kan vi ha databas genomdriva det så som nu i min PHP-kod eller något annat språk, Jag behöver inte, till exempel, kontrollera nödvändigtvis gör detta användarnamn existerar innan jag låta någon registrera? Databasen kommer inte att låta två personer som heter David eller Malans registrera sig i det här fallet. Och som en sidoreplik, även om detta menyn kan du bara välja en, ett unikt index är ett som är indexeras för supersnabb prestanda, men det upprätthåller också unika. Och vi ska återkomma till vad andra två betyda på bara ett ögonblick. Under tiden, om jag går till min andra raden, som är användarens namn, ska jag ange att namnet ska vara unikt? Nej, eftersom du kan säkert have-- det finns ingen två David Malans i det här rummet, troligen. Men om vi väljer ett annat namn, Vi kan säkert ha kollisioner. Tänk tillbaka på hash tabeller och liknande. Så vi verkligen inte vill ha att göra namnfältet unika. Så vi ska bara lämna det såsom streck, streck, streck, ingenting. Och jag kommer att lämna allt annat ensam. I själva verket, de flesta av dessa områden Vi kommer inte att bry sig om. Och när jag är redo att spara, Om internet samarbetar, Jag klickar på Spara, och mycket, mycket, mycket långsamt gör databasen bli frälst. Och nu är jag tillbaka till denna gränssnitt, som visserligen, är överväldigande vid första anblicken. Men allt jag ska göra är att klicka på ordet Användare på övre vänstra. Jag kommer att gå upp här, klicka Användare och som standard, det har utfört en del SQL, men mer om detta i ett ögonblick. Här är bara en sammanfattning av vad jag gjorde. Och inte oroa dig att du ser nämna i latin och svenska här. De är bara standard inställningar, eftersom MySQL ursprungligen, eller PHP MyAdmin, en av de två som hände som ska skrivas av några svenska folket. Men det är irrelevant i vårt fall här. Okej, så varför är allt detta intressant? Det visar sig, kan jag infoga data i en databas genom att skriva kod. Och jag gå vidare och i min fil här, jag är kommer att gå vidare och låtsas som detta är kopplad till databasen, som är det inte just nu, men det kommer vara när vi kommer till problem ställa sju. Och jag kommer att gå vidare och utföra en funktion som kallas fråga, som vi kommer att ge dig problem set sju distributions kod, att tar minst en argument som ligger bara en sträng. En sträng av SQL-kod. Så du är på väg att lära sig skriva Structured Query Language. Om jag vill infoga en ny rad i min databas för att någon har lämnat ett formulär för att min kod, jag skulle bokstavligen skriva INSERT INTO användare följande fält: användarnamn, kommatecken, namn, värden, och nu behöver jag för att infoga något som Malan, och citationstecken, unquote David Malan. " Och nu även för dem obekanta med SQL, Varför använder jag apostrof insidan av denna gröna sträng? Vad kan vara orsaken här? Märker jag är co-mingel två språk. Query är en PHP-funktionen, men det tar ett argument. Och detta argument måste själv vara skrivet på ett annat språk som kallas SQL, Structured Query Language. Så, allt som jag har just belyst här är detta språk kallas SQL. Så, vad är det med enkla citattecken, precis som en snabb kontroll förstånd? Varsegod. De är strängar. Så, citationstecken, unquote Malan och citationstecken, unquote David Malan är strängar. Och bara tänker intuitivt nu, att veta vad du vet om C och PHP, varför gjorde jag inte göra det här, som jag brukar begagnade citationstecken för strängar? Varför ville jag inte göra det? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: Exakt. Eftersom jag redan använder citattecken på vägen utanför av argumentet till PHP-funktionen, Jag skulle bara förvirra tolken. Det kommer inte vet, dessa går ihop? Gör dessa går ihop? Gör dessa går ihop? Så jag växlar i stället. Eller jag kunde göra något sånt här, bakstreck citat eller backslash citat. Ärligt talat, det bara börjar få mycket oläslig och ful. Men det skulle uppnå samma resultat samt. Så om jag skulle köra detta frågan nu, låt oss se vad som händer. Jag kommer att gå vidare nu och ganska än köra PHP-koden, som är där du kommer att spela i problembild sju, Jag ska i stället gå till PHP MyAdmin. Och jag manuellt gå gå till fliken SQL, och låt mig zooma in på gränssnittet. Och jag kommer att klistra in det jag just skrev. Och färgkodningen har förändrats lite nu, bara för att programformaten saker lite annorlunda. Men märker att allt jag har gjort är jag har sagt, sätt in användare. Jag har angett, då, i en komma separerade parentes listan två fält som jag vill infoga, och då jag har bokstavligen nämnda värden följt av en annan Paren, och sedan de två värdena Jag vill plug-in, och nu för bra åtgärd, Jag ska sätta ett semikolon i slutet. Så detta är inte C. Detta är inte PHP. Detta är nu SQL, och jag klistrar in det i denna webbaserade gränssnitt som är bara att låta mig, så fort jag klickar Go, verkställa denna fråga på databasen kör inne i CS50 IDE. Så det här är bra. Observera att nämnda en rad införas, gick supersnabb, 0,0054 sekunder för att sätta dessa uppgifter. Så, det låter ganska frisk. Det omformaterad min förfrågan för mig här bara för att se det i form av färgkodade version. Men nu om jag klickar Bläddra, märker att även även om det finns en hel del skräp på skärmen har mitt bord nu två rader. Så, låt mig gå vidare och göra en annan. I stället för detta, låt mig gå till fliken SQL igen. Och den här gången ska jag sätta något liknande Rob och hans namn kommer att vara Rob Bowden. Bowden. Låt oss klicka på Spara. Oops, snarare gå. Klicka på Bläddra igen, och Nu märker jag har två rader. Så detta är bara ett sätt mer komplex sätt att öppna upp Google kalkylark och bara skriva en rad i en kolonn. Men vad är nyckeln är att vi nu har syntaxen som att skriva kod så att i slutändan, vi kunde faktiskt göra en del och detta. Minns att PHP stöder super globala variabler. Vad är inne i dollar logga streck FÅ i PHP? Vi tog en titt på en eller två enkla exempel. Och i PSet6, minns du hello dot PHP som använder denna variabel. Vad går in där? Eller vad är det? Lite högre. PUBLIK: [OHÖRBAR] DAVID MALAN: Det är en snö utsäde av array, som är bara ett fint sätt att säga en matris som har nyckelpar värde. Och nycklarna är inte numeriskt. De är ord eller strängar. Och särskilt vad är de nyckelpar värde? Var kommer de ifrån? Förlåt? PUBLIK: [OHÖRBAR] DAVID MALAN: Nej? Var gör de nyckel värdepar ifrån? Säg det igen? Igen? Är jag den enda hörsel något? [LAUGHTER] Det är rätt, ja? PUBLIK: [OHÖRBAR] DAVID MALAN: Ja, de kommer från frågesträngen. Så, om du spola tillbaka i tid för att när vi har spelat med Google och vi har gått till Google.com snedstreck Sök frågetecken q lika katter, om jag skulle trycka Enter och om Google genomfördes i PHP, PHP-kod som Google skrev skulle ha tillgång till dollartecken streck GET inuti vilket är en viktig kallas Q och ett värde kallas katter som det då kan använda används för att göra en verklig sökning med. Så i själva verket, vad jag ska gör nu är att gå tillbaka till min PHP-kod att du återigen kommer att se mer av i PSet7. Och istället för att plugga i hårt kodade värden som verkar inte som en mycket dynamisk webbplats, Jag ska ge dig en teaser av vad din faktiska kod skulle göra. Du skulle sätta in två frågetecken så här. Jag vet inte vad användarnamnet är. Jag vet inte vad Namnet kommer att bli, men jag vet att jag kan få dem dynamiskt. Så, om koden vi skriver nu är koden som körs på Googles servrar, eller om detta är hello prick PHP, som levereras med PSet6, Jag kommer att passera in frågefunktionen precis som printf, två andra argument. GET, citationstecken, unquote användarnamn, och GET, citationstecken, unquote namn. Och nu märker vad allmänna strukturen är här. Jag har till vänster sidan av samtalet, denna funktion kallas frågan i PHP. Jag har fortfarande som en första argument, bara en textsträng. Men att textsträng är skriven på ett språk som kallas SQL. Och ärligt talat, det är inte en stor språk. Vi kommer bara att tala om det formellt idag, verkligen. Och sedan i problem set sju, det finns relativt några funktioner som vi är kommer att utnyttja. De frågetecken, men menar ansluta ett värde här och koppla in ett annat värde här. Och varsel, har jag utelämnat vad från hela quote-- jävla det-- runt citatet markerar den här gången. Jag har utelämnat citatet märken runt frågetecken, ledsen, den här gången. Så, vad är trevligt om det här frågetecken funktion som PHP tenderar att stödja, Ruby och Python och andra språk, Detta betyder bara plugg i vissa värdera här och vet du vad? Du räkna ut om du vill använda apostrof eller citationstecken. Bry dig inte om mig med dem intellektuellt ointressant detaljer. Men, se till att det är rätt så att min kod är ytterst operativ och säker, vilket kommer att ha en mening innan länge. Nu, hur många argument totalt, bara för att vara tydlig, är sökfunktion tagande? Någon som vill rösta för mer än två? Tre? Visst, varför? Varför tre? PUBLIK: [OHÖRBAR] DAVID MALAN: Exakt. Den första delen är den sträng. Det andra argumentet är dollartecken streck GET fäste användarnamn. Och det tredje argumentet är Samma sak, men bara namnet. Så med andra ord, nu om jag hade ett webbformulär som hade till textfält, en för användarens användarnamn, en för hans eller hennes namn, bara som du skulle se på en webbplats när du registrerar dig för någon hemsida, denna styrka vara koden på bakändan som faktiskt gör insättningen nu i databasen. Nu däremot, låt oss snabbspola framåt. Antag att en användare är nu logga in och du vill att skriva PHP-kod som kontrollerar om den person som just loggat in är faktiskt en användare, kan du Använd ganska enkel syntax. Man kan säga SELECT, låt oss säga stjärna, där stjärnan betyder allt. Jag vet inte vad jag vill, så bara ge mig alla kolumner från bordet kallas användare där, och det är trevligt. Välj stöder vad kallas ett predikat, vilket är som ett sätt att kvalificera vad du vill. Där användarnamn är lika citationstecken, unquote Malan. Så även här, har jag inbäddade inuti argumentet till en PHP-funktionen, en linje av SQL-kod. Och det SQL-kod här tiden bokstavligen gå för att söka efter offert, unquote Malan. Nu är inte så bra, så jag kommer att hoppa över den och jag kommer att lägga undan detta tips från Brady, och gå och plug-in istället ett frågetecken här. Så, bara för att vara tydlig, vad bör min andra argument att om någon har just loggat in och jag vill kontrollera om han eller hon är faktiskt en användare? PUBLIK: [OHÖRBAR] DAVID MALAN: Ja. Jag hör dollartecken streck FÅ citationstecken, unquote användarnamn. Och det skulle återvända till mig någon av raderna i min databas som har ett användarnamn av Malan. Nu förhoppningsvis kommer jag att komma tillbaka noll om Malan har aldrig varit här, eller en om han har. Jag borde inte få tillbaka två eller tre eller fyra. Varför? PUBLIK: [OHÖRBAR] DAVID MALAN: Jag sade unikt, rätt? Enkla anledningen. Eftersom jag sa att det har fått till vara unik, precis logiskt, du kan bara ha noll eller ett Malans i detta speciella databastabell. Nu som en sidoreplik, bara så du har sett det, även om jag fortsätta använda GET och även om PSet6 används endast GET, kan du säkert ha POST. Och minns att Post är en annan teknik för att lämna information från ett formulär, men det inte dyker upp i webbadressen. Det är lite säkrare säkert för saker som användarnamn och lösenord, som PSet7 kommer i själva verket innebära. Så, låt oss göra detta i PHP MyAdmin och se vad som händer. Jag kommer att gå till fliken MySQL. Och lägg märke till att standardvärdet för PHP MyAdmin, bara att försöka vara till hjälp, är att välja stjärnan från användare där en. Tja, är man alltid sant, så Detta har fåniga effektiva för att bara markera allt. Men jag kommer att vara lite mer pedantisk och manuellt Skriv ut SELECT stjärna från användarna. Nu tekniskt, kan du citera namnet i tabellerna. Det är ovanligt att du måste, men märker dessa inte dina vanliga offerter på amerikanskt tangentbord. Detta är den så kallade baklängescitationstecken, som är i allmänhet på det övre vänstra hörnet av tangentbordet. Men det är ovanligt att du kommer faktiskt behöver bry med det, så jag ska bara utelämna dem ändå. Så nu, låt mig gå vidare och träffa gå. Och hur många rader ska jag få tillbaka när jag väljer stjärnan från användare? PUBLIK: [OHÖRBAR] DAVID MALAN: Antalet rader, säker. Men hur många i detta konkret historia just nu? Två, eftersom det inte fanns mig och det fanns Rob. Så, om jag klickar Go, ser jag visuellt att Jag har fått tillbaka, ja, två rader. Det finns en hel del skräp på skärm, men jag ser bara två rader. Däremot om jag gör det igen och göra SELECT stjärnan från användare, där användarnamn lika citationstecken, unquote Malan, nu om jag klickar Go, Jag kommer bara att få tillbaka en rad. Och slutligen, om jag gör ungefär så här, antar att jag inte bryr sig om få allt, som är typ av meningslöst nu, eftersom det finns bara två kolumner. Det är inte som jag väljer en enorm mängd data. Anta att jag gå vidare och markerar namn FRÅN användare, där användarnamn är lika Malan, vad är trevligt om SQL ärligt, är att det egentligen bara gör vad du säger den att göra. Det är ganska kortfattad, men du bokstavligen bara tala om vad du vill göra. Välj namn från användare där användarnamnet lika Malan. Och det är verkligen så explicit. Så nu om jag slog Go, hur många rader jag kommer att komma tillbaka? En, eftersom det är bara Malan, förhoppningsvis. Eller noll om han inte där, men ett maximalt. Och hur många kolumner får jag tillbaka? Hur många kolumner? Den här gången, jag ska bara att få en eftersom jag inte välj stjärna, vilket är allt. Nu ska jag välja bara namn, så jag bara få tillbaka en kolumn och en rad. Och det ser slags lämpligt löjligt, bara titta super liten så här. Så, vad som verkligen händer? När du kör en SQL fråga med select, vad du får tillbaka från databasen är som en temporär tabell med rader och kolumner, kanske, men att utelämna allt som faktiskt inte som du väljer. Så, det är som om någon hade en stor kalkylblad med alla elever registrerats för vissa studentgrupp, och du säger, ge mig alla nybörjare som har registrerats för vår studentgrupp, vad din kollega i studentgruppen kan göra är de bara kunde lämna du hela kalkylbladet. Det är som att säga att välja stjärna. Och det är lite irriterande om du bara ville nybörjare. Och så, om du istället sagt, välj stjärna från databastabell där år lika med citationstecken, unquote förstaårselev, det är som om din vän i studentgruppen bokstavligen fram och kopieras endast gröngölingar rader, klistras in dem i ett nytt Google Kalkylblad eller en Excel-fil, och överlämnade du tillbaka endast resulterande filen. Det är allt som händer på begrepps här. Så i slutändan kan vi göra några ganska snygga saker genom att lagra saker som användarnamn och lösenord och liknande. Men, visar det sig, ska vi göra lite annorlunda än här. Det är inte så smart att bara lagra ett användarnamn och ett lösenord. Någon tidigare, tror jag här nere, föreslog ett ID. Nu ett ID kan vara som en Harvard-ID eller Yales Net ID, men det kan vara ännu enklare i vår databas fall. Och faktiskt, det vanligaste fallet är att ha en annan kolumn. Och jag kommer att gå framåt och redigera mitt bord. Och om du leka med detta gränssnitt för PSet7, ser du att du kan kontrollera denna knapp här och lägg ett fält i början av tabellen. Och nu om jag klickar Go, det kommer att ge mig en av dessa former från tidigare. Jag kommer att lägga till ett fält som kallas ID. Och jag kommer att göra det en numerisk typ. Jag har en hel drös värden för mätvärden. Jag kommer bara att välja en INT och inte oroa sig för skilda storlekar. Jag behöver inte ange en längd eller ett värde, eftersom det kommer att bli 32 bitar oavsett vad. Attribut, vi inte se innan. Något intresse i något av dessa menyalternativ här gången? För en INT? Vad gjorde ni föreslår? Nej? Gör något av dessa vettigt? Yeah. Ja, osignerad, eller hur? I allmänhet att om vi ska ge alla ett unikt nummer, som är där den här historien är gå, jag verkligen bara är intresserad av en person att ha numret som noll och en och två och tre och fyra. Jag behöver inte ta itu med negativa tal. Det verkar precis som onödig komplexitet. Jag vill fyra miljarder möjliga värden, inte fyra miljarder möjliga värden, så jag bara fördubblat kapacitet min INT. Som en sidoreplik, om du vill relatera detta till något som Facebook, tillbaka i form av min dag när Facebook först kom ut, Jag tror vad de var använder i sin MySQL-databas att lagra en användares identifierare, var bara en INT. Men naturligtvis finns det en hel del av verkliga människor i världen. Det finns en hel del falska Facebook konton i världen. Och så småningom, Facebook svämmade storleken på en INT, en 4 miljarder värde. Vilket är varför, om du tittar runt och det finns webbplatser som kan berätta vad ditt unika ID är. Och om du aldrig valt ett användarnamn i Facebook kommer du att se din unika ID. Jag tycker det är profil dot PHP frågetecken ID är lika med något. Det är nu något som en stor INT, eller en lång lång om du vill, som är en 64-bitars värde eller något liknande. Så även i den verkliga världen gör dessa frågor i slutändan ibland roll. Och det visar sig här, om jag ge alla mina användare ett unikt ID, Jag vill vara super tydlig och minimalt gör detta område unikt. Men det visar sig att det finns en bit nomenklatur idag också det är en primärnyckel. Om du skapar en databas bord och du vet i förväg att en av kolumnerna i tabellen bör och kommer identifiera rader i tabellen, vill du ange den och berätta databasen, detta är min primärnyckel. Det kan finnas dubbletter i andra områden, men jag säger databasen som detta är min primära, min viktigaste område, som garanterat att vara unik. Nu verkar det överflödigt. Jag föreslår nu att vi lägga till genom att klicka på Spara här, ett fält called-- och jag kommer att gå vidare och klicka på AI, Vi ska återkomma till att i ett ögonblick, Spara. Jag föreslår nu att mitt bord se ut så här. Jag har en INT område som kallas ID, en CHAR fält med namnet användarnamn, en VARCHAR fält som heter namn, men ID, om det är primär och därför unik, varför jag slösar bara tid att införa vad effektivt sätt är en andra unik område som kallas ID som är en INT? Användarnamn, minns, var redan unikt, sade vi. Så bara logiskt, behöver du inte någon databas erfarenhet att resonera genom detta, varför jag kanske har infört en INT som min unik identifierare som också? Vad this-- säger det igen? PUBLIK: [OHÖRBAR] DAVID MALAN: Random tillgång är lättare, varför? PUBLIK: [OHÖRBAR] DAVID MALAN: Ja, det är bara åtkomst nummer. Så, om du tänker på denna verkligt är en tabell, som en matris, nu har jag unika identifierare att jag kan hoppa runt. Och bättre än som fortfarande är att hur stor är en INT kommer att bli igen? 32 bitar eller fyra byte. Hur stort är mitt användarnamn kommer att bli? Maximalt? 16 bytes. Så, om du verkligen bry sig om resultatet av din kod, tänker tillbaka på PSet5, skulle du föredrar att söka efter ett fyra byte värde eller en 16 byte värde, eller hur? Det är verkligen så enkelt är det. Du måste göra fyra gånger så mycket arbete för att söka efter användarnamn eftersom dessa är 16 bytes. Så, har du bokstavligen jämföra alla 16 byte för att vara säkert ja, det här användarnamnet jag vill. Medan för en INT kan du gör det med bara fyra byte. Och som en sidoreplik för dem intresserad av hårdvara, det visar sig att du kan passa något liknande en INT eller en 32-bitars värde i något kallas ett register i en dator CPU, vilket betyder att det är super, supersnabb, även vid lägsta nivå av datorns hårdvara. Så det är bara fördelar runt. Så, vad innebär det? Faktum är att när du designar en databastabell, nästan hela tiden kommer ni att ha inte bara de data du bryr dig om, men också något som en unik identifierare eftersom detta kommer att Låt oss göra andra saker. Och låt oss resa över ett problem här. Antag att användarna har inte bara användarnamn och namn, men de har också saker som städer och stater och postnummer, åtminstone här i USA. Så jag kommer att gå vidare och bara snabbt säga, ge mig tre fler kolumner i slutet av tabellen. Och detta kommer att bli City, detta kommer att vara staten, och detta kommer att bli Zip. Nu City, vilken datatyper bör detta vara, kanske? VARCHAR? Jag vet inte vad längsta ortsnamn är. Någonstans i USA, det finns förmodligen några löjligt långt ord, så låt oss bara gå med 255, något historiskt eller godtyckligt. Staten, vad du vill göra? Dom samtal, eller hur? Vad är kanske den mest effektiva? Hur många tecken? Kanske bara två, om vi kan komma undan med att göra just, liknande, MA för Massachusetts och så vidare. Så jag kommer att gå en CHAR värde av två. Postnummer är intressant. Vi är här i 02138, så att föreslår vi bör använda vad? Det är en INT, eller hur? INT, INT, kort? Kort skulle fungera. Nej? TECKEN eller fem, men jag vill ha en INT. Varför trycka tillbaka på en INT? Övertyga mig från detta. Vad är dum om en INT, min idé? Yeah. PUBLIK: Ta upp mer minne. DAVID MALAN: Ta upp mer minne. Fyra byte, men du är föreslå ett postnummer som fem bytes eller någon var som en CHAR, som känns som eh, det är inte riktigt fallet. Tja, rolig historia. År sedan, när jag brukade använda Microsoft Outlook för min e-post, Jag ville så småningom att byta till Gmail. Och så, exporterade jag alla mina kontakter från Outlook som en CSV-fil. Kommaseparerade värden, som just innebar att jag hade alla mina vänner namn och sista namn och telefonnummer och postnummer och allt detta. Och sedan gjorde jag misstaget att öppna upp i Excel, vilket är en kalkylprogram som förstår CSV-filer som vi har sett. Men då måste jag ha hit, liksom, Kommando eller kontroll S vid ett tillfälle. Och Excel tydligen vid tidpunkten hade en funktion där helst det såg ett antal, det försökte vara till hjälp. Och om det numret började med nollor, det skulle bara bli av med dem. Varför tror du behöver ledande nollor på heltal? De är meningslösa, matematiskt. De är inte menings i US Postal systemet. Så har jag haft i år, till denna dag, jag fortfarande har vänner som när sällsynta fall som jag behöver någons itu med dessa dagar, Jag kommer fortfarande se att jag har en vän i Cambridge, Massachusetts, 2138. Och det är irriterande om du är försöka sortera av programmatiskt generera kuvert eller bara krafsa ner det. Och det är på grund av detta skäl, Jag valde fel datatyp. Så, jag älskar din idé. Låt oss använda en CHAR fält. Fem tecken, med undantag Det finns ett hörn fallet. Om du fortfarande skicka e-post ibland postnummer dessa dagar, de är, liksom, plus fyra. Så behöver vi ett bindestreck och sedan Vi behöver fyra fler nummer. Så för att vara ärlig, skulle det gå många olika sätt. För nu, jag kommer att hålla det enkelt och jag är bara kommer att säga att det är en fem CHAR värde och vi är kommer att hoppa över hela streck plus fyra. Men det är dessa typer av kompromisser. Och du kan tänka på Samma problem uppstår med telefonnummer eller andra områden. Och nu, detta är faktiskt en dåraktig väg att gå ner. Antag både Rob och jag och Hannah och Maria och [? Davon?] Och Andy och andra på personalen alla lever i Cambridge, Massachusetts, 02138. Detta känner faktiskt dum att jag lägga till min användare bord, stad, stat, och zip. Varför? PUBLIK: [OHÖRBAR] DAVID MALAN: Säg igen? PUBLIK: [OHÖRBAR] DAVID MALAN: De är alltid kommer att gå ihop, eller hur? När det visar sig, vi brukade tänka detta var fallet tills vi uttömmande sökt hela USA, och visar sig att det är några inkonsekvenser där flera städer har samma zip, vilket är konstigt. Men, om vi stipulerar nu att 02138 är alltid Cambridge, Massachusetts, varför i hela världen skulle du lagrar i databasen Cambridge och MA och 02138 för mig och Hannah och Rob och för [? Davon?] Och för andra som lever här i Cambridge, är det helt överflödig. Vi borde komma undan med bara lagra vad? Bara den postnummer. Men sedan, om vi lagrar bara postnummer, jag vill, förmodligen, till min hemsida att veta var 02138 är. Så jag behöver en annan tabell. Och det är OK. Och i själva verket är detta ett av de konstruktionsprocesser utforma tabeller att du kommer att göra i PSet7 samt vari du vill faktor gemensamma data. Precis som vi har factoring ut gemensam kod och factoring ut gemensamt stilar från CSS, här även i databasen, om jag behöver bara 02138 för att unikt identifiera någons hemstad, lagrar inte Cambridge, Mass för varje darn användare i tabellen. I stället har en separat tabell som kallas Dragkedjor som ska ha vad kolumner? Förmodligen en ID-fält, därför att precis, för de principer som vi pratar om nu. Förmodligen en zip fält för 02.138. Och då förmodligen vad andra kolumner? Stad och stat, men har bara en raden för 02138, en rad för 02139, en rad för 90210-. Och det är bokstavligen alla postnummer jag vet. Så nu, vad kan man göra? Detta är problematiskt, eftersom nu har jag två tabeller. Så, mina användare är mestadels hit, men deras stad statusinformation är här. Så visar det sig med SQL, det finns faktiskt ett sätt att koppla ihop information, och du kommer att se detta i Pset. Men det visar sig att du kan göra något sånt här. SELECT stjärnan från användarna, GÅ blixtlås PÅ användare dot zip lika blixtlås dot zip. Vilket är lite ordrik, visserligen, men detta bara innebär att välja allt från processen för att ta min användare bord och min blixtlås tabell. Gå med dem på ett område de har i kolumn. Så, bokstavligen göra något så här, och ge mig tillbaka en ny temporär tabell det är bredare, som är större, som har alla de kolumner från båda. Och det helt enkelt skulle vara syntax för att göra något sådant. Så det finns detta i förväg, men det kommer att finnas andra designbeslut du kommer måste göra, inte bara med index men också kör i utmaningar. I själva verket finns det en utmaning i alla databasdesign varigenom ibland två personer kanske vill att komma åt samma raderna i databasen tabell. Så detta är något som vi ska stöta på i PSet7 också. Men jag tänkte att jag skulle titta på en attack som är möjligt i SQL. Vad är några av de problem som kan uppstå? Så kommer du stöter på detta i PSet7. Och vi berätta direkt vad kodning lösning på detta problem är. Men om du tar en högre nivå klass, speciellt i operativsystem, du kommer att stöta på en fråga om atomicity, problemet att försöka göra flera saker på en gång utan avbrott. Och jag trodde att jag skulle införa detta idé för PSet7 med en metafor att jag lärde mig i Margo Seltzer operativsystem CS164 klass år sedan. Anta att du har en av dessa sovsal kylskåp i ditt studentrum eller hus, och du har en verklig förkärlek för mjölk. Och så, du kommer hem från klasser en dag, du öppnar kylskåpet. Åh, fan det. Det finns ingen mjölk i kylskåpet. Så nära du kylskåpet, låsa dörren, låsa sovsal, gå runt hörnet CVS, få i rad, och börja kolla in för lite mjölk. Och det kommer att ta ett tag, eftersom de jävla själv kassan räknare tar evigheter att använda ändå. Så under tiden, kommer din rumskompis hem. Han eller hon verkligen gillar mjölk också. De kommer in i studentrummet, öppna kylskåpet, åh, darn det. Det finns inget mer mjölk. Så, han eller hon också går runt hörnet. Men nu, eftersom det är som två eller tre eller fyra CVSes närheten, de råkar gå till en av de olika listor på torget. Och så nu, ett par minuter senare, ni båda komma hem och ugh, värsta problemet någonsin. Nu har du för mycket mjölk eftersom det kommer att gå sura. Och du gillar mjölk, men du inte riktigt gillar mjölk. Så nu, det här var en dyr misstag eftersom ni båda fattat beslut grundar sig på tillstånd av något variabel som var i färd med att ändras av dig, initiativtagare kommer att få mjölk. Så, vad är kanske en människa lösning på detta problem? PUBLIK: [OHÖRBAR] DAVID MALAN: Lämna ett meddelande, eller hur? Lämna alltid en anteckning, om du är bekant med den show. Ja, det finns två av oss. Så, alltid lämna ett meddelande, eller bokstavligen låsa kylskåpet med någon typ av hänglås eller något over the top sånt. Men det är faktiskt kommer att bli nyckel problem med databasdesign, särskilt när du kan ha flera webbläsare, flera bärbara datorer, flera användare alla försöker uppdatera information på en gång. Särskilt känslig information som finansiell information, varigenom, med en aktiehandel webbplats som du kommer att bygga, vad händer om du vill kontrollera hur mycket pengar du har och sedan om du har tillräckligt, köpa några lager? Men vad händer om någon annan som har ett gemensamt konto med dig är samtidigt försöker att köpa några lager? Så, är han eller hon kontrollerar saldo, både av er få tillbaka samma svar, det finns ingen mjölk. Eller båda du får tillbaka svaret, Du har $ 100 på kontot. Båda du försöker att fatta beslut att köpa en aktie i något företag lager. Och nu, vad händer? Du har två aktier? Du har inga aktier? Problem som som kan uppstå. Så kommer vi möter det. SQL injection attacker, tack och lov, är något vi kommer att hjälpa dig med, men dessa är atrociously vanliga dessa dagar fortfarande. Så detta är bara ett exempel. Jag gör inga anspråk som Harvard-PIN-system är sårbara för denna attack. Vi har provat. Men, du vet att vi har ett område som detta. Och Yales Net ID har en liknande ser skärmen i dessa dagar. Och det visar sig, att kanske PIN-systemet genomförs i PHP. Och om det were-- det är inte-- de kan ha kod som ser ut så här. De har två variabler. Ge mig användarnamn och lösenord från posten super globala variabeln som vi talat om tidigare. Kanske Harvard har en fråga som SELECT stjärna från användare där användarnamn är lika stor som och lösenord är lika stor som. Och märker att jag är bara ansluta den använda lockigt stag notation från andra dag, vilket betyder bara att koppla in ett värde här. Jag är inte använder frågetecken teknik. Jag har inte någon sekund eller tredje argument. Jag är bara bokstavligen konstruera strängen själv. Problemet är dock att Om någon vill ha en scroob, som är en referens till en film, loggar in med något sånt här, och jag har tagit bort prickarna som brukar täcka upp lösenord, tänk om han är särskilt skadlig och hans lösenord kanske är 12345, per filmen kallas "våras för rymden," men han kritiskt typer ett enda anbud efter fem, sedan bokstavligen ord eller i utrymmet, och sedan citationstecken, unquote en lika citat en, men märker att han har utelämnats vad? Han har utelämnats citatet till höger och han utelämnade citatet till vänster. För om detta angripare scroob s antagande är att de personer som skrev Detta PHP-kod var inte så ljusa, kanske de bara har några enstaka citerar runt interpole av en variabel i klammerparenteser? Och så kanske han kunde slag av slutföra sina tankar för dem, men på ett sätt som kommer att låta honom hackat sig in PIN-systemet. Med andra ord, antag att den är koden och vi nu koppla in vad scroob skrivit. Och det är rött, eftersom det är illa. Och den underliggande text är vad han skrev in, scroob kunde lura Harvard server till att bygga en SQL-fråga sträng som ser ut så här. Lösenord motsvarar 12345 eller en lika med ett. Vars resultat, logiskt, är att detta kommer att logga scroob i om hans lösenord är 12345 eller om en likar en, vilket naturligtvis alltid sant, vilket innebär scroob alltid får i. Och så, det sätt att fixa detta, liksom i många fall, skulle vara att skriva mer på defensiven. Om du vill använda något som vår faktiska sökfunktion, som du ser i PSet7, där vi koppla in något som frågetecken här. Och skönheten i fråge funktion som vi ge dig är det försvarar mot dessa så kallade SQL injection attacker, där någon lura din kod i injicera sin egen SQL-kod. Eftersom vad sökfunktion Vi ger dig faktiskt kommer att göra, om du använder frågetecken syntax och en andra och en tredje argument här, är vad gjorde det lägga till ingång som användaren tillhandahålls? De backslash citerar. Så, undgår det potentiellt farliga tecken. Detta verkar konstigt nu, men det är inte sårbar eftersom den inte ändra logiken längre eftersom det hela lösenord är nu ett enda anbud som inte är, i själva verket, scroob lösenord. Så det har varit några skämt om detta under årens lopp. Så detta var ett foto som tagits vissa nörd på en parkeringsplats där du kanske vet att vissa städer och stater försöker skanna din licens platta att fakturera dig eller biljett du om du går igenom utan, liksom, E-Z Pass sak. Så, denna person förutsätts att kanske folk skriver E-Z Pass-systemet var inte så ljusa, och kanske de bara sammanlänkas ihop en sträng, så att han eller hon inte kunde uppsåt inte bara fylla sina tankar, men faktiskt utföra en dålig kommando, som vi inte har nämnt ännu, men du kan nog gissa. Att dessutom ta bort och infoga och uppdatera och välj, det finns också ett nyckelord som kallas droppe, som bokstavligen tar bort allt i databasen, vilket är särskilt dålig. Vi kan zooma in på detta om det är lite svårt att se. Detta, nu, är en berömd film det är härligt smart nu och förståeligt. [LAUGHTER] Ja, cool. Typ av geeking ut. Så dessa är alltså SQL injection attacker. Och de är så lätt att undvika genom att använda rätt kod eller rätt biblioteken. Och du ser i PSet7, det är varför ger vi dig sökfunktion. Så, ett par teasers att vi trodde att vi skulle ge dig här i vår återstående minuter tillsammans. Så, som ni minns från vecka noll, vi infört dessa två lampor som är trevliga, inte bara på grund de är ganska och är färgstarka, men eftersom de stöder något kallas en API, ett program Programming Interface Och i CS50 hittills, vi har mestadels fokuserat på GET och POST, men det visar sig det finns andra HTTP-verb som PUT. Och faktiskt, var detta en bild från vecka noll där om du skriver kod som skickar a la PSet6 en HTTP-förfrågan som ser ut så här med denna bit av text vid botten, som kallas JSON, eller JavaScript Object Notation att vi ska prata om nästa vecka, Du kan slå på eller stänga av eller ändra färgen av ljus som de. Så om CS50 har också förutom några av dessa glödlampor här i New Haven Om du vill låna dem för examensarbeten, också några Microsoft Band, som är som klockor som du bär runt handleden som på liknande sätt har ett API så att du kan skriva din egen programvara för dem. Vi har ett konto med Apples iOS-kod så att om du har en Apple Watch eller en iPhone eller en iPad eller en iPod, Du kan skriva kod som faktiskt körs på dem. Vi har en hel drös av Arduinos, som är pyttesmå datorer utan fall, i huvudsak, att du kan ansluta via USB, typiskt till din egen Mac eller PC, skriva kod som körs på dessa fysiska enheter som ofta har sensorer på dem så att du kan interagera med den verkliga världen. Vi har en hel drös av Leap Motion enheter, som är USB-enheter för Mac och Datorer, här och igen, i New Haven. Och om du ansluter den till din Mac, du kan faktiskt styra din dator genom att skriva programvara att via infraröda strålar, siffror på var dina mänskliga händer, även utan att röra tangentbordet. Vi trodde att vi skulle dela en snabb inblick i denna, till exempel. [MUSIK SPELA] Så har vi en hel gäng av dessa saker, Även kallad Myo arm band som du lägger över din underarm och sedan kan du styra den verkliga värld eller den virtuella världen som den här. [MUSIK SPELA] Eller, har vi också några Google Kartong, som är bokstavligen, liksom, en kartong som du kan sätta på din ansikte, men glida i telefonen i det så att du sätter glaset i din telefon riktigt nära dina ögon. Och Google Kartong är ganska billigt på $ 10 eller $ 20. Och det har små linser som är något av skift bilden på skärmen för mänskliga ögon för att ge dig en känsla av djup så att du faktiskt har en 3D miljö framför dig. Vi har också några Samsung Gear, som är den dyrare version av denna, men som kan på liknande sätt glida i en Android-telefon och ger dig illusionen of-- eller ge upplevelsen virtuell verklighet. Och i våra två sista minuter, vi trodde att vi skulle försöka göra detta. Om jag kan projicera vad Colton har här bara för att fundera, Låt mig gå vidare och kasta upp på den stora skärmen här. Låt mig döda lampor. Colton, vill du gå vidare och sätta på din cell för ett ögonblick och kom över till mitt på scenen? Och vill du project-- detta är vad Colton ser. Nu är Wi-Fi här inte så stark för denna enhet att detta är super övertygande, men Colton är bokstavligen i denna magiska futuristiska plats. Han ser bara en bild. Du ser hans vänster och höger öga att hans hjärna är sy ihop i ett tredimensionellt miljö på hans ansikte. Han har bara valt ett menyalternativ här. Och så igen, han bär headsetet med en Samsung telefon på det som är trådlöst skjuter till vår overhead. Nu är du på Mars, tror jag? COLTON: Jag tror det. Jag är inte säker [OHÖRBAR]. [LAUGHTER] DAVID MALAN: Slår ut Mars har dessa menyer. COLTON: [OHÖRBAR] några häftiga platser om vi vill gå att-- DAVID MALAN: Var vill vi gå? COLTON: [OHÖRBAR] DAVID MALAN: Och låt oss se där Coltons tar oss nu. COLTON: [OHÖRBAR] DAVID MALAN: Så, det finns så många olika ställen du kan ta dig. Det finns FAPIs via vilken du kan skriva spel eller interaktioner som springa, i sista hand, på telefonen. Så, du verkligen bara skriver en mobiltelefon app. Men tack vare programvaran och grafikfunktioner, nu Colton är i detta liten liten stuga. Och med risk för överväldigande oss, Colton och jag ska hålla sig för medan i slutet av klassen här i dag Om du vill komma upp och spela. Och vi ska föra dem tillbaka nästa vecka också. Utan vidare det är det för dag. Vi ses nästa vecka. [MUSIK - Ragga Twins "BAD MAN"]