[Muziek] DAVID MALAN: Oké, dit is CS50. Dit is het einde van week acht. En vandaag, we beginnen in sommige stukken in te vullen als het gaat om de bouw dingen op het Web. Dus, herinneren eraan dat op maandag We besteden veel meer tijd PHP, die deze dynamische programmeertaal die laat ons output, onder andere dingen, HTML en andere dergelijke inhoud dat we willen zien. Maar we hebben niet echt gekeken naar hoe we gaan om alle informatie op te slaan. Inderdaad, bijna alle van de super interessante websites die u vandaag bezoekt een soort database op de back-end, toch? Facebook slaat zeker veel data over ons allen en Gmail slaat alle van uw e-mails. En ja, vele andere sites zijn niet alleen statische content dat is informatief. Het is eigenlijk dynamisch op een bepaalde manier. U levert input, het bijwerken de pagina's voor andere mensen. Krijg je berichten, je stuur berichten, enzovoort. Dus vandaag, kijken we dichter bij de onderbouwing van een project dat je een duik nemen in de volgende week, CS50 Financiën, die er werkelijk gaande is om u te hebben op te bouwen iets wat niet in C, maar in PHP. Een website die een uitziet beetje iets als dit die het mogelijk maakt om te kopen en te verkopen voorraden die eigenlijk gaan putten uit real-time voorraadgegevens van Yahoo Finance. En zo uiteindelijk heb je de illusie voor jezelf en voor gebruikers dat je eigenlijk kopen en verkopen voorraden en het krijgen van bijna real-time updates, het beheren van een portfolio, allemaal gaat om te eisen dat, Uiteindelijk, een database van de gebruikers. Dus, in je eigen woorden, vooral als je niet super kennen computer wetenschap of databases, wat heb je een database weten te zijn nu, in niet-technische termen? Wat is het? Hoe zou je het te beschrijven een huisgenoot of een vriend? PUBLIEK: [onverstaanbaar] informatie [onverstaanbaar] DAVID MALAN: Dus, een lijst van de informatie, of een store-- een lijst met informatie die je zou willen op te slaan over iets, als een gebruiker. En wat doen de gebruikers in verband met hen? Als je een gebruiker op Facebook of bent Gmail, wat zijn de kenmerken dat ieder van ons gebruikers? Zoals, wat zou kunnen zijn een aantal van de kolommen in de spreadsheet waarnaar we zinspeelde vorige keer? Want nogmaals, je kunt denk aan een database echt als een fancy Excel-bestand of Google Spreadsheet of Apple Numbers-bestand. Dus, wat denk je van als je denkt aan een gebruiker? Wat hebben ze? Wat is dat? Publiek: Een naam. DAVID MALAN: Een naam. Dus als naam, zoals David Malan zou de naam van een gebruiker. Wat heeft een gebruiker? Publiek: Een ID. DAVID MALAN: Een ID. Dus, zoals een ID-nummer, zoals je Harvard ID of uw Yale Net ID of iets dergelijks. Wat kan een gebruiker? PUBLIEK: Wachtwoord. DAVID MALAN: Een wachtwoord, misschien een adres, misschien een telefoonnummer, misschien een e-mailadres. Dus, is er trossen van de velden en dit kan soort uit de hand snel zodra je begint realiseren, oh, laten we dit op te slaan en laten we dit en dat op te slaan. Maar hoe doen we dat eigenlijk doen? Dus nogmaals, het mentale model hebben we voor vandaag duiken in daadwerkelijke SQL, Structured Query Language, is een database die er zo uitziet. Het is gewoon rijen en kolommen. En je kunt je voorstellen Google Spreadsheets of een aantal andere programma's. Maar wat is de belangrijkste over MySQL, dat is de databasesoftware we gaan gebruiken, de vrij openlijk available-- Facebook toepassingen het en elk aantal andere websites-- databank slaat dingen relationeel. En een relationele database betekent gewoon een die letterlijk slaat gegevens op in rijen en kolommen. Het is zo simpel als dat. Dus, zelfs iets als Oracle dat je zou het algemeen hebben gehoord van is een relationele database. En onder de motorkap, is slaat gegevens in rijen en kolommen. En Oracle rekent u een veel geld om dat te doen, terwijl MySQL kosten u niets voor hetzelfde. Dus, SQL gaat ons ten minste vier bewerkingen. De mogelijkheid om data te selecteren, zoals read data, invoegen, verwijderen en updaten van gegevens. Met andere woorden, deze zijn echt de vier belangrijkste activiteiten die zullen ons in staat stellen om te veranderen spullen in die rijen en kolommen. Het instrument dat we zeker zullen gebruiken vandaag SQL te leren en te spelen met het wordt opnieuw genoemd PHP MyAdmin. Het is web-based tool. Totaal toeval dat het is geschreven in PHP. Maar het gaat om ons een grafische geven gebruikersinterface, zodat we kunnen eigenlijk maken deze rijen en kolommen en dan met ze praten via code. Dus, laten we nu beginnen aan wat ik denk eerlijk gezegd soort van het plezier proces van building de achterkant van websites, de onderdelen die gebruikers niet te zien, maar zeker niet de zorg over, want dat is nogal gegevens van gaan. Dus, vergelijkbaar met C en een beetje minder zoals PHP, SQL, of een database die ondersteuning SQL, ten minste deze gegevenstypen en trossen van anderen. CHAR, VARCHAR, INT, BIGINT, DECIMALE en DATETIME. En er is een hele heleboel andere functies, maar laten we dit doen door manier concreet voorbeeld. Ik ga in CS50 IDE te gaan waar van tevoren, ik heb ingelogd en ik heb ook een bezoek aan een URL Deze tool genaamd PHP MyAdmin. En in probleem stelde zeven, zullen we vertellen u precies hoe u deze interface krijgen ook. Op de linker bovenhoek, merkt het zegt lezing. En dat betekent dat op voorhand, die ik heb gemaakt een lege database genaamd lezing dat heeft geen spreadsheets in. Er is geen rijen en kolommen. Omdat de eerste wat we gaan doen is beginnen met een tabel dat gaat om onze gebruikers op te slaan. Dus, letterlijk dan hier naar rechts, ik ben gaan naar de database te vertellen Ik wil een tabel met de naam gebruikers. Dus, dit is als het bestand dat ik wil al mijn gegevens op te slaan in. En hoeveel kolommen? Nou, laten we het simpel houden voor nu. Ik wil alleen maar op te slaan als een gebruikersnaam en een naam voor een gebruiker. We beginnen klein. Dus, ik wil twee kolommen totaal. En ik ga om verder te gaan en klik op Go. En dan, deze kolommen, wat ik ga om doen-- als dit internet cooperates-- goed, dus we gaan weer proberen. Ik ga een tabel met de naam te maken Gebruikers met twee kolommen, klik op Start, OK. Nu hebben we het echt snel. Dank u, heel goed gedaan. Oké, dus wat willen we deze kolommen worden genoemd? Dus, een gaat heten Gebruikersnaam. Dus, alles wat ik zie hier-- en de interface eerlijk gezegd krijgt een beetje lelijk uiteindelijk, als je eenmaal begint te typen in al deze gegevens. Maar wat leuk is dat soort paradoxaal genoeg, ik ben het creëren van kolommen, maar de tool heeft dwaas legde ze uit in rijen zodat ik deze kolommen kunt configureren. Dus, is er twee blanks er onder Naam. En één van deze velden I willen Gebruikersnaam genoemd, en het andere veld wil ik Naam noemen. En nu moet ik kiezen soorten gegevens voor deze dingen. Dus, terwijl in Excel en Google Spreadsheets, Als u een kolom wilt, je letterlijk typ Naam of gebruikersnaam, drukt u op Enter. Misschien heb je er vetgedrukt maken gewoon voor de duidelijkheid, maar dat is het. Je niet opgeeft de types van de kolommen. Nu in Google Spreadsheets of Excel, u zou opgeven hoe de gegevens worden weergegeven. Je zou kunnen gaan naar het menu Opmaak en u kunt opgeven zien dit als dollarteken, zien dit als een floating point waarde. Dus, het is vergelijkbaar in de geest dat wat we gaan doen, maar dit is eigenlijk gaat dwingen de data voor een bepaald type. Nu, ook al even geleden I zei dat er maar een paar soorten data, er is eigenlijk een heel veel, en ze zijn in verschillende mate van specificiteit. En als een terzijde, u zelfs mooie dingen te doen zoals opslag geometrieën binnenkant van een database. Je kunt dingen op te slaan zoals GPS-coördinaten en eigenlijk vinden, wiskundig, punten die dicht bij elkaar zijn. Maar we gaan Houd dit super eenvoudig en gaan tot hier, al de zogenaamde reekstypen. Dus, hier is een lijst van een heleboel opties. CHAR, VARCHAR, TinyText, MEDIUMTEXT, longtext. En het is een soort van overweldigend. En helaas enigszins paradoxaal C, een char is niet echt een char. Als u opgeeft in een database dat uw gegevens type CHAR, dat betekent dat ja, het is een CHAR, maar het is een of meer tekens. En je moet opgeven hoeveel tekens je wilt. Dus, wat is een typische lengte voor een gebruikersnaam? Is er een limiet typisch? PUBLIEK: [onverstaanbaar] DAVID MALAN: 16 misschien? Zoiets. Je weet wel, terug in de dag, het vroeger acht. Soms is het 16 soms het is zelfs meer dan dat. En dus, dit niet bedoel geef me één CHAR. Dit betekent dat ik moet opgeven de lengte van het veld, en nu zou ik zoiets 16 zeggen. En er is een afweging hier. Dus, we zullen zien in een moment Dit betekent dat men, elke gebruikersnaam moet 16 tekens. Maar wacht eens even, M-A-L-A-N. Als dat mijn gebruikersnaam en ik ben alleen met behulp van vijf, wat zou u voorstellen dat de database te doen voor de andere 11 karakters die Ik heb gereserveerde ruimte voor? Wat zou jij doen? PUBLIEK: [onverstaanbaar] DAVID MALAN: Ja, net maken ze allemaal null. Maak ze ruimtes. Maar waarschijnlijk nul, dus een Veel backslash nullen. Dus aan de ene kant, we hebben nu ervoor gezorgd dat mijn gebruikersnaam kan niet meer dan 16 tekens. En de keerzijde van die dat als ik had echt een lange naam of wilde een hele lange gebruikersnaam zoals sommige van jullie jongens zou kunnen hebben in dat college of bij Yale.edu, kun je niet hebt. En zo in feite, als je hebt ooit geregistreerd voor een website en je krijgt geschreeuwd zeggen Uw wachtwoord is te lang of uw gebruikersnaam is te lang, het is omdat een programmeur bij configureren van diens database besloten dat dit gebied zal niet langer zijn dan deze lengte. Oké, dus wat als we overgaan tot een naam? Hoe lang moet een Naam typisch menselijk zijn? Hoeveel personages, 16? Ik gok dat we konden iemand vinden in deze kamer waar de door zijn of haar eerste plus de laatste naam langer is dan 16 tekens. Dus, wat is beter dan dat, 17? 18? 25? Groter? 30? PUBLIEK: [onverstaanbaar] DAVID MALAN: 5000, oh mijn God. Dus, dat is waarschijnlijk een fatsoenlijke bovengrens, zullen we maar zeggen. En hier hebben we soort hebben om een ​​oordeel te bellen. Zoals, er is geen juiste antwoord hier. Oneindige is niet heel goed mogelijk, omdat we uiteindelijk gaat have-- we uit te gaan van het geheugen te lopen. Dus, we hebben een te maken beslissing te nemen op een bepaald punt. Zeer vaak zou zijn, bijvoorbeeld, om use-- en laat me CHAR hier opgeven als before-- 255 was letterlijk de bovengrens op deze database software jaren geleden. En zo, veel mensen zou gewoon zeggen, prima. 255 is de limiet. Laten we gewoon het maximum te gebruiken. En dit is vrij belachelijk. Zoals, als u typt iemands naam voor 200 plus tekens, dat een beetje belachelijk. Maar, vergeet niet dat ASCII niet het enige systeem voor tekens. Dus, in het bijzonder een Veel Aziatische talen waar er personages die we niet kunnen uiten op keyboards zoals mijn Amerikaanse toetsenbord, een aantal personages eigenlijk het nemen van 16 bits in plaats van acht bits. En ja, dit ook daadwerkelijk is niet zo onredelijk dat we meer nodig hebben ruimte als we willen passen groter tekens dan de VS centric die we hebben de neiging om te bespreken. Dus moeten we een aantal bovengrens. Ik weet niet wat het beste is, 255 maar is over het algemeen een voorkomende. 25 voelt laag. 16, 32 voelen laag. Ik zou het zekere voor het iets hoger. Maar er is een afweging, zoals altijd. Wat is het misschien vanzelfsprekend afweging van het reserveren van 255 tekens voor iedereen de naam in mijn database? PUBLIEK: [onverstaanbaar] DAVID MALAN: Wat is dat? PUBLIEK: [onverstaanbaar] DAVID MALAN: Het is een veel geheugen, toch? M-A-L-A-N. Ik heb net verspilde 250 karakters gewoon mijn naam op te slaan defensief, voor het geval iemand in de klasse heeft een heel lange naam. Dat lijkt een onnodige afweging. Dus, het blijkt dat SQL, Deze databank taal, eigenlijk iets ondersteunt genaamd VARCHAR of Variable CHAR. En dit is een soort van mooi in dat deze hiermee kunt u geen vaste opgeven breedte, maar een variabele breedte. En meer in het bijzonder een maximale breedte van het veld. Dit betekent dus dat een naam niet meer dan 250 tekens, maar het kan zeker minder zijn. En de database gaat slim te zijn. Als je zet in M-A-L-A-N, het is alleen maar te gebruiken vijf, misschien zes bytes voor als een achterstand null karakter, en niet uitgeven een extra 249 of 250 bytes onnodig. Dus, dit lijkt alsof ik moet zijn begonnen met dit verhaal. Maar er is altijd een afweging. Dus, enerzijds, een gebruikersnaam Ik heb gespecificeerd hard gecodeerd op 16, en misschien was dat niet de juiste beslissing, misschien is, maar waarom niet gebruiken VARCHARs voor alles? Het bestaat voor een reden. Waarom VARCHARs niet gebruiken voor elk veld waarvan de lengte je niet weet van tevoren als het lijkt een goede zaak zijn, toch? Gebruik alleen zoveel ruimte als je nodig hebt tot deze limiet? Publiek: Langzamer. DAVID MALAN: Speller? Publiek: Maakt het langzamer? DAVID MALAN: Oh, het is trager. Goed, dat is bijna altijd het antwoord, eerlijk gezegd. Zoals, wat is de afweging? Het ofwel kost meer ruimte of het kost meer tijd. Dus, in dit geval langzamer verlopen. Waarom? PUBLIEK: [onverstaanbaar] het bepalen van [onverstaanbaar]. DAVID MALAN: Goed. Dus, zou je herinneren van zelfs PSED5, spelen met uw aanpak aan het woordenboek, als je moet geheugen toewijzen dynamisch of houden kweken van een buffer, die kan eigenlijk traag. Als je moet bellen malloc onder de motorkap en misschien dat is wat MySQL doet, dus dat toch het geval zou zijn. En als je denkt weg terug naar PSet-- of zelfs twee weken, toen we dingen als binary search of zelfs lineair zoeken, een van de leuke dingen over elk woord in een gegevensbestand of elk woord in een kolom waarbij exact dezelfde lengte, zelfs als er een hele hoop van die tekens zijn leeg, is dat je kunt gebruiken random access op uw gegevens, toch? Als u weet dat elke Het woord is 16 tekens weg, u kunt pointer rekenkunde gebruiken, om zo te spreken, en ga naar ons 16, 32, 48, 64, en je kunt gewoon springen direct met behulp van rekenkundige een van de woorden in uw database. Overwegende dat als het een VARCHAR, wat heb je in plaats daarvan moeten doen? [Telefoon rinkelen] Als het een VARCHAR, u kan geen willekeurige toegang te gebruiken. Wat je moet kijken naar of doen? Ja? PUBLIEK: [onverstaanbaar] DAVID MALAN: Kijk door de whole-- trace door de hele lijst zoekt wat waarschijnlijk? Wat voor bijzondere waarde? PUBLIEK: [onverstaanbaar] DAVID MALAN: zoek voor de null terminators afbakenen dat de scheiding van woorden. Dus nogmaals, een afweging, en er is geen juist antwoord. Maar dit is waar met name wanneer uw gebruikers krijgen voor velen en uw lading op uw servers, de aantal mensen die het gebruiken krijgt hoog, Deze zijn eigenlijk triviale beslissingen. Dus, kunnen we deze laten zoals deze, maar Laten we naar beneden scrollen naar rechts here. Nu, er is een aantal kolommen waar we een oordeel te bellen. Heeft het zin om een ​​gebruiker te noemen, de gebruikersnaam van een gebruiker of een gebruiker Naam, tot nul zijn? Dat is gewoon leeg. Voelt een beetje onzinnig, dus ik ben niet van plan om die dozen te controleren. Maar het blijkt in een database, kunt u zeggen: iemand kan optioneel hebben deze waarde. Deze kolom heeft geen er eigenlijk. Nu, er is deze drop down menu. En merk ik ben nog steeds daar de eerste rij, dus ik heb het over gebruikersnaam nu. En het blijkt dat een database, in tegenstelling tot een eenvoudige louter spreadsheet, heeft krachtige functies genaamd indexen. En een index is een manier van het vertellen van de databank op voorhand dat ik de mens ben slimmer dan jij. Ik weet wat voor soort vragen, selecteert of invoegen of verwijderen of bij te werken, dat mijn code gaat eindigen up te doen op deze databank. Ik wil een veel data te lezen. Ik wil een veel gegevens in te voegen. Ik wil constant verwijderen van een veel gegevens. Als ik weet dat ik ga worden toegang tot een veld als Gebruikersnaam veel, Ik kan preventief vertellen databank, ik meer dan je weet, en ik wil dat besluit je moet index dit gebied. Waar het indexeren van een veld of een kolom betekent dat de database vooraf moet een aantal ideeën lenen van, als, week vier en vijf en zes van CS50 en eigenlijk opbouwen zoiets als een binaire zoekopdracht boom of iets algemeen genoemd een B tree dat je zou leren in een klasse als CS124 aan Harvard, een algoritmen klasse, of elk aantal andere plaatsen. De database en de slimme mensen die het geïmplementeerd zal erachter te komen hoe om te slaan die tafel van informatie in het geheugen zodat zoekopdrachten andere operaties zijn super snel. Je hoeft niet te doen. Je hoeft niet te implementeren lineair zoeken of binaire zoekopdracht of samenvoegen sort of selectie sorteren, een van die. De database doet het voor je als je te vertellen Het preventief te indexeren dit gebied. En ook u kunt zien, is er andere karakteristieken wij kunnen vertellen de database af te dwingen. Wat zou het betekenen als ik ervoor kies Unique vanuit dit menu, gewoon intuïtief? Ja? PUBLIEK: [onverstaanbaar] DAVID MALAN: Ja, de gebruikersnaam moet uniek zijn. Is dit een goede zaak of een slechte zaak voor een database voor een website met gebruikers? Moeten gebruikersnamen zijn uniek? Ja, waarschijnlijk. Als dat is wat de gebied die we gebruiken om in te loggen je niet echt willen mensen die hetzelfde gevoel of dezelfde gebruikersnaam. Dus, kunnen we het hebben databank afdwingen dat zo die nu in mijn PHP code of een andere taal, Ik hoef niet naar, bijvoorbeeld, check noodzakelijkerwijs doet deze gebruikersnaam Er bestaan ​​voordat ik iemand laten registreren? De database zal niet toestaan ​​dat twee mensen met de naam David of Malans registreren in dit geval. En als een terzijde, ook al menu kunt u alleen een te selecteren, een unieke index is er een die is geïndexeerd voor supersnelle prestaties, maar het dwingt ook uniciteit. En we zullen terug te komen wat de andere twee betekenen in slechts een moment. Ondertussen, als ik naar mijn tweede rij, die is de naam van de gebruiker, moet ik opgeven dat de naam moet uniek zijn? Nee, want je kon zeker have-- er geen twee David Malans in deze kamer, het meest waarschijnlijk. Maar als we kiezen voor een andere naam, we zouden zeker hebben botsingen. Denk terug aan tafels en dergelijke hash. Dus, we zeker niet willen om het veld naam uniek te maken. Dus, we gewoon te vertrekken dat als dash, dash, dash, niets. En ik ga om te vertrekken alles alleen. Immers, de meeste van deze gebieden zullen we niet zorgen te maken over. En als ik klaar ben om dit te redden, Als internet samenwerkt, Ik klik op Opslaan, en zeer, zeer, zeer langzaam komt de database gered. En nu ben ik terug naar deze interface, die weliswaar, is overweldigend op het eerste gezicht. Maar alles wat ik ga doen is klik op het woord Gebruikers linksboven. Ik ga om hier te gaan, klikt u op Gebruikers en standaard is heeft uitgevoerd een aantal SQL, maar meer op dat in een moment. Hier is slechts een samenvatting van wat ik deed. En niet bang te zijn dat je te zien noemen Latijn en Zweedse hier. Dat zijn slechts de standaard instellingen omdat MySQL oorspronkelijk of PHP MyAdmin, één van de twee gebeurde worden geschreven door een Zweedse volk. Maar het is niet relevant in ons geval hier. Oké, dus waarom is dit alles interessant? Het blijkt, kan ik de gegevens in te voegen in een database door het schrijven van code. En ik ga je gang en in mijn dossier hier, ik ben gaat te gaan en doen alsof deze is aangesloten op dat de database, die is het niet op het moment, maar het zal toen we om probleem stelde zeven. En ik ga om verder te gaan en uitvoeren van een functie genaamd query, die wij u geven in problemen stelde zeven van de verdeelsleutel, die duurt minstens één argument, dat is gewoon een string. Een reeks van SQL-code. Dus, je gaat leren hoe je bent schrijf Structured Query Language. Als ik wil een nieuwe rij in te voegen in mijn databank omdat iemand heeft ingediend een formulier om mijn code, zou ik letterlijk schrijf INSERT INTO gebruikers de volgende velden: gebruikersnaam, komma, naam, de waarden, en nu moet ik invoegen zoiets als Malan en citaat, unquote 'David Malan.' En nu zelfs voor degenen die niet bekend met SQL, waarom ben ik met behulp van enkele aanhalingstekens binnenkant van deze groene draad? Wat zou de reden hier te zijn? Let op, ik ben co-mingling twee talen. Query is een PHP-functie, maar het duurt een argument. En dat argument heeft om zichzelf te zijn geschreven in een andere taal genaamd SQL, Structured Query Language. Dus, alles wat ik hebben net hier uitgelicht Hierdoor taal genaamd SQL. Dus, wat is er met de enkele aanhalingstekens, net zo snel sanity check? Doe Maar. Ze zijn strings. Dus, citaat, unquote Malan en citaat, unquote David Malan zijn strings. En net te denken nu intuïtief, weten wat je weet over C en PHP, waarom heb ik dit niet wat ik meestal doe, gebruikte dubbele aanhalingstekens voor strings? Daarom wilde ik dat niet te doen? Ja? PUBLIEK: [onverstaanbaar] DAVID MALAN: Precies. Omdat ik al gebruik dubbele aanhalingstekens op de weg buitenkant van het argument aan de PHP-functie, Ik zou gewoon verwarren de tolk. Het zal niet weten, deze samen te gaan? Hebben deze samen te gaan? Hebben deze samen te gaan? Dus, ik afwisselend plaats. Of ik zou zoiets als dit te doen, backslash offerte of backslash offerte. Eerlijk gezegd, die net begint te erg onleesbare en lelijk. Maar dat zou bereiken hetzelfde resultaat ook. Dus, als ik dit uit te voeren vraag nu, laten we zien wat er gebeurt. Ik ga nu en vrij gaan dan voert u de PHP-code, die is waar je spelen in probleem stelde zeven, Ik ga in plaats daarvan naar PHP MyAdmin. En ik handmatig gaan te gaan naar het tabblad SQL, en laat me in te zoomen op de interface. En ik ga om te plakken in het ding ik typte. En de kleurcodering heeft een beetje veranderd nu, gewoon omdat het programma formaten dingen een beetje anders. Maar merken dat alles wat ik heb gedaan is dat ik heb gezegd, invoegen in gebruikers. Ik heb opgegeven, vervolgens in een komma gescheiden haakjes lijst de twee velden die ik wil invoegen en dan heb ik letterlijk gezegd waarden gevolgd door een andere paren, en vervolgens de twee waarden Ik wil plug-in, en nu voor een goede maatregel, Ik zal een puntkomma te zetten aan het einde. Dit is dus niet C. Dit is niet PHP. Dit is nu SQL, en ik ben te plakken in deze web-gebaseerde interface die gewoon om mij te laten, zodra ik klik op Start, voeren deze query op de database running binnenkant van CS50 IDE. Dus dit is goed. Merk op dat zei een rij geplaatst, ging super snel, 0,0054 seconden om die gegevens in te voegen. Zo, dat klinkt behoorlijk gezond. Het geformatteerd mijn vraag voor mij hier alleen maar om het te zien in een soort van kleurgecodeerde versie. Maar nu als ik klik Bladeren, merken dat, zelfs maar er is een hoop rommel op het scherm, mijn tafel heeft nu twee rijen. Dus, laat me gaan en een ander te doen. In plaats van dit, laat me ga naar het tabblad SQL opnieuw. En deze keer zal ik iets dergelijks plaatst Rob en zijn naam zal Rob Bowden. Bowden. Laten we klikt u op Opslaan. Oeps, in plaats van Go. Klik op Bladeren opnieuw, en Nu merk ik heb twee rijen. Dus, dit is gewoon een manier complexer weg van de openstelling van Google Spreadsheets en net typen van een rij in een kolom. Maar wat is de belangrijkste is dat hebben we nu de syntax waarmee om code te schrijven, zodat Uiteindelijk konden we eigenlijk doe wat en dit. Bedenk dat PHP ondersteunt super globale variabelen. Wat is de binnenkant van de dollar ondertekenen underscore GET in PHP? We namen een kijkje bij één of twee eenvoudige voorbeelden. En in PSet6, herinner je hello dot PHP die deze variabele gebruikt. Wat gaat er daar? Of wat is het? Een beetje luider. PUBLIEK: [onverstaanbaar] DAVID MALAN: Het is een sneeuw zaad array, waarvan is gewoon een mooie manier om te zeggen een array die belangrijke waarde paren heeft. En de toetsen zijn niet numeriek. Ze zijn woorden of strings. En bijzonder wat zijn die belangrijke waarde paren? Waar komen ze vandaan? Sorry? PUBLIEK: [onverstaanbaar] DAVID MALAN: Nee? Waar komen die sleutel waarde paren vandaan? Weer zeggen? Weer? Ben ik de enige die gehoor iets? [Lachen] Dat klopt, ja? PUBLIEK: [onverstaanbaar] DAVID MALAN: Ja, ze komen uit de query string. Dus, als je terugspoelen in de tijd om toen we hebben gespeeld met Google en we hebben naar Google.com slash gegaan zoeken vraagteken q gelijk aan katten, als ik druk op Enter en indien Google werd geïmplementeerd in PHP, PHP-code die Google schreef zou de toegang tot dollarteken hebben onderstrepen GET de binnenkant van die is een belangrijke zogenaamde Q en een waarde noemde katten die het dan kan gebruiken gebruikt om een ​​daadwerkelijke zoek met doen. Dus, in feite, wat ik ga nu doen is teruggaan naar mijn PHP-code dat je weer zult zien meer in PSet7. En in plaats van te sluiten in hard gecodeerde waarden lijkt niet als een zeer dynamische website, Ik ga u een teaser van geven wat uw eigenlijke code zou doen. Je zou in twee zetten vraagtekens als deze. Ik weet niet wat de gebruikersnaam is. Ik weet niet wat de naam gaat worden, maar ik weet dat ik kan krijgen ze dynamisch. Dus, als de code die we nu schrijven is de code die op de servers van Google, of als dit is hello dot PHP, die wordt geleverd met PSet6, Ik ga om te gaan in de query functie net als printf, twee andere argumenten. GET, citaat, unquote gebruikersnaam, en GET, citaat, unquote naam. En nu, let op wat de algemene structuur is hier. Ik heb op de linkerzijde kant van het gesprek, deze functie genaamd query in PHP. Ik heb nog steeds als een eerste argument, maar een reeks van tekst. Maar dat tekenreeks is geschreven in een taal genaamd SQL. En eerlijk gezegd, het is geen grote taal. We zijn alleen maar om te praten over het formeel vandaag, echt. En vervolgens in probleem stellen zeven, er is relatief enkele functies die we gaan benutten. De vraagtekens echter betekenen sluit een waarde hier en plug in een andere waarde here. En bericht, ik heb weggelaten wat van rond de quote-- verdomde het-- rond de offerte markeert deze tijd. Ik heb het citaat weggelaten markeringen rond het vraagteken, sorry, dit keer rond. Dus, wat is leuk over dit vraagteken functie die PHP heeft de neiging om te ondersteunen, Ruby en Python en andere talen, Dit betekent gewoon plug in sommige waardeert hier en weet je wat? Je erachter te komen of om te gebruiken enkele aanhalingstekens of dubbele aanhalingstekens. Val me niet lastig met die intellectueel oninteressant details. Maar zorg ervoor dat het juiste zodat mijn code is uiteindelijk operationele en veilig, die zal een betekenis hebben voor lang. Nu, hoeveel argumenten totaal, gewoon om duidelijk zijn, is de query functie nemen? Iedereen wil om te stemmen voor meer dan twee? Drie? Tuurlijk, waarom? Waarom drie? PUBLIEK: [onverstaanbaar] DAVID MALAN: Precies. Het eerste deel is de string. Het tweede argument is dollarteken onderstrepen GET gebruikersnaam beugel. En het derde argument is de hetzelfde, maar alleen de naam. Met andere woorden, nu als ik een webformulier die moest tekstvelden, een voor de gebruikersnaam van de gebruiker, een voor zijn of haar naam, maar zoals je zou in een website te zien wanneer u zich registreert voor sommige website, deze macht wees de code op de rug opdat eigenlijk doet het inbrengen nu in de database. Nu daarentegen, laten we snel vooruit. Stel dat een gebruiker nu inloggen en je wilt PHP-code die controleert of schrijven de persoon die net ingelogd is eigenlijk een gebruiker, kunt u Gebruik vrij eenvoudige syntax. Je kunt zeggen SELECT, laten we zeggen ster, waar de ster betekent alles. Ik weet niet wat ik willen, dus geef me alle kolommen van de tabel genaamd, waar gebruikers, en dat is mooi. Selecteer ondersteunt wat is genoemd een predikaat dat als een manier om de kwalificatie wat je wilt. Waar gebruikersnaam gelijk citaat, unquote Malan. Dus ook hier, heb ik besloten binnen het argument een PHP-functie, een lijn van SQL-code. En dat SQL-code dit tijd letterlijk gaat om te zoeken naar citaat, unquote Malan. Nu is dat niet zo handig, dus ik ga om te slaan dat en ik ga weg te zetten Deze tip van Brady, en ga en plug-in in plaats een vraagteken hier. Dus, gewoon om duidelijk te zijn, wat moet mijn tweede argument worden als iemand heeft net ingelogd en ik wil om te controleren of hij of zij is eigenlijk een gebruiker? PUBLIEK: [onverstaanbaar] DAVID MALAN: Ja. Ik hoor dollarteken underscore Offerte, unquote gebruikersnaam. En die moeten terugkeren naar mij een van de rijen in de database die moeten een gebruikersnaam van Malan. Nu hopelijk, ik ga terug te krijgen nul als Malan's hier nooit geweest, of een als hij heeft. Ik zou niet terug twee of drie of vier. Waarom? PUBLIEK: [onverstaanbaar] DAVID MALAN: Ik zei uniek, toch? Eenvoudige reden. Omdat ik zei dat het moet uniek, enkel logisch, je kunt slechts nul of één Malans in dit specifieke database tabel. Nu als een terzijde, maar dat je hebt gezien het, hoewel ik blijven gebruiken GET en hoewel PSet6 alleen gebruikt Krijgen, kunt u zeker POST. En herinneren dat Post is een andere techniek voor het indienen van informatie een vorm, maar niet opdagen in de URL. Het is een beetje veiliger zeker voor dingen zoals gebruikersnamen en wachtwoorden, die PSet7 zal in feite betrekken. Dus, laten we dit doen in PHP MyAdmin en zie wat er gebeurt. Ik ga naar het tabblad MySQL. En merk op dat de standaardwaarde voor PHP MyAdmin, gewoon om te proberen om behulpzaam te zijn, is om sterren te selecteren van gebruikers waar men. Nou, een is altijd waar, dus Dit heeft de domme effectieve van selecteer gewoon alles. Maar ik ga een beetje te zijn meer pedant en handmatig uittypen SELECT ster van gebruikers. Nu technisch, kunt u citeren de naam van de tafels. Het is zeldzaam dat je moet, maar merken deze zijn niet uw normale koersen op de Amerikaanse toetsenbord. Dit is de zogenaamde backtick die is over het algemeen op de linker kant hoek van uw toetsenbord. Maar het is zeldzaam dat je eigenlijk moeten moeite met dat, dus zal ik ze gewoon weglaten toch. Dus nu, laat me gaan en raakte gaan. En hoeveel rijen moet ik krijgen toen ik ster van gebruikers te selecteren? PUBLIEK: [onverstaanbaar] DAVID MALAN: Het aantal rijen, zeker. Maar hoeveel van deze concreet verhaal nu? Twee, want er was mij en er was Rob. Dus, als ik klik op Start, zie ik dat visueel Ik ben terug gekregen, inderdaad, twee rijen. Er is een hoop rommel op het scherm, maar ik zie slechts twee rijen. Daarentegen, als ik dit opnieuw doen en doen SELECT ster van gebruikers, waar de gebruikersnaam evenaart citaat, unquote Malan, nu als ik klik op Start, Ik ga alleen naar een rij terug te krijgen. En tot slot, als ik dat doe zoiets als dit, veronderstel dat ik niet schelen het krijgen van alles, dat is een soort van zinloos nu, omdat er slechts twee kolommen. Het is niet alsof ik selecteren een enorme hoeveelheid data. Stel dat ik ga je gang en do SELECT naam FROM gebruikers, waar de gebruikersnaam gelijk Malan, Wat er leuk is aan SQL eerlijk, is dat het eigenlijk gewoon doet wat je hem vertelt wat te doen. Het is vrij beknopt, maar je letterlijk gewoon vertellen wat je wilt doen. Selecteer de naam van de gebruikers, waar de gebruikersnaam gelijk Malan. En het is echt zo expliciet. Zo, nu als ik raakte Go, hoeveel rijen ben ik van plan om terug te krijgen? Eén, want het is gewoon Malan, hopelijk. Of nul als hij niet daar, maar een maximaal. En hoeveel columns zal ik terug ben? Hoeveel kolommen? Deze keer, ik ben gewoon gaan een te krijgen omdat ik niet selecteer ster, dat is alles. Nu ben ik het selecteren van alleen de naam, dus ik gewoon weer één kolom en één rij. En het ziet er soort van adequaat belachelijk, gewoon op zoek super kleine als deze. Dus, wat er echt gebeurt? Wanneer u een SQL uitvoeren query met behulp van selecteren, wat je krijgt terug uit de database is als een tijdelijke tabel met rijen en kolommen, misschien, maar dat alles wat weglaat werd niet daadwerkelijk door u gekozen. Dus, het is alsof iemand had een grote spreadsheet van alle studenten geregistreerd voor sommige studentengroep, en je zegt, geef mij alle eerstejaars die hebben ingeschreven voor onze groep studenten, wat uw collega in de groep studenten zou kunnen doen is ze konden gewoon hand je de hele spreadsheet. Dat is hetzelfde als zeggen select ster. En het is een beetje vervelend als u alleen wilde de eerstejaars. En dus, als je in plaats daarvan zei, selecteer ster uit de database tabel waarbij jaar gelijk citaat, unquote eerstejaars, het is alsof je vriend in de studentengroep letterlijk gemarkeerd en gekopieerd alleen de eerstejaars rijen, plakte ze in een nieuwe Google Spreadsheet of een Excel-bestand, en gaf je terug de alleen resulterende bestand. Dat is alles wat er aan de hand op conceptueel here. Dus in het einde, we kunnen doen sommige vrij mooie dingen door dingen op te slaan, zoals gebruikersnamen en wachtwoorden en dergelijke. Maar, zo blijkt, moeten we doen een beetje anders dan dit. Het is niet zo slim om alleen slaan een gebruikersnaam en een wachtwoord. Iemand eerder, denk ik hier beneden, stelde een ID. Nu een ID kan worden als een Harvard-ID of Yale's Net ID, maar het kan nog eenvoudiger in onze database geval. En inderdaad, het voorkomende geval is een andere kolom hebben. En ik ga om te gaan vooruit en mijn tafel te bewerken. En als je spelen met Deze interface voor PSet7, je zult zien dat je kunt controleren deze knop hier en voeg een gebied bij het begin van de tabel. En nu als ik klik op Go, het gaat voor mij een van die vormen geven uit eerder. Ik ga naar een gebied genaamd ID toe te voegen. En ik ga het een numeriek type te maken. Ik heb een hele hoop waarden voor numerieke. Ik ga gewoon een INT te kiezen en geen zorgen over de uiteenlopende maten. Ik heb niet aan te geven een lengte of een waarde, omdat het gaat worden 32 bits maakt niet uit wat. Attributen, hebben we nog niet eerder te zien. Een belang in een van deze menuopties deze tijd? Voor een INT? Wat heb je voor te stellen? Nee? Heeft een van deze zin? Ja. Ja, unsigned, toch? Over het algemeen, als we gaan geven iedereen een uniek nummer, die is waar dit verhaal is gaan, ik wil alleen een persoon het getal als nul en één en twee en drie en vier. Ik hoef niet te gaan met negatieve getallen. Het lijkt net als onnodige complexiteit. Ik wil 4000000000 mogelijke waarden, niet 4 miljard mogelijke waarden, dus ik verdubbelde de capaciteit van mijn INT. Even terzijde, als je wilt vertellen dit om iets als Facebook, terug in de vorm van mijn dag wanneer Facebook kwam voor het eerst uit, Ik denk dat wat ze waren met behulp van in hun MySQL database voor het opslaan van een gebruiker identifier, was gewoon een INT. Maar natuurlijk, er is veel van echte mensen in de wereld. Er is een hoop nep Facebook rekeningen ter wereld. En zo uiteindelijk, Facebook overstroomde de grootte van een INT, een 4000000000 waarde. Dat is waarom, als je kijkt rond en er zijn websites dat kan je vertellen wat uw unieke ID is. En als je nooit gekozen voor een gebruikersnaam Facebook, zie je een unieke ID. Ik denk dat het profiel dot PHP vraagteken ID is gelijk aan iets. Dat is nu iets als een grote INT, of een lange lange als je wil, die een 64-bits waarde of iets vergelijkbaars. Dus zelfs in de echte wereld doen deze kwesties uiteindelijk soms toe. En het blijkt hier, als ik het geven van elk van mijn gebruikers een unieke ID, Ik wil super expliciet te zijn en minimaal maken dit gebied uniek. Maar het blijkt er één stuk van de nomenclatuur ook vandaag dat is een primaire sleutel. Als u een database bent ontwerpen tafel en je weet van te voren dat een van de kolommen in die tabel moet en zal een unieke rijen te identificeren in de tabel, je wilt geef het en vertel de database, dit is mijn primaire sleutel. Er kunnen duplicaten in andere gebieden, maar ik vertel de database die deze is mijn eerste, mijn meest belangrijke gebied, dat is gegarandeerd uniek te zijn. Nu, lijkt overbodig. Ik ben nu te stellen dat we toe te voegen, door te klikken op Opslaan hier een veld called-- en ik ga om door te gaan en klik op AI, we zullen terug te komen dat in een moment, opslaan. Ik ben nu dat voorstelt mijn tafel uitzien. Ik heb een INT veld genaamd ID, een char veld genaamd Gebruikersnaam, een VARCHAR veld genaamd Naam, maar ID, als het primaire en dus uniek, waarom heb ik gewoon afval tijd de invoering van wat effectief is een tweede unieke veld genaamd ID dat is een int? Gebruikersnaam, herinneren, was al uniek, zeiden we. Dus gewoon logisch, heb je niet nodig een database ervaring om reden door middel van deze, waarom zou ik hebben ingevoerd een int als mijn unieke identifier ook? Wat dit-- weer zeggen? PUBLIEK: [onverstaanbaar] DAVID MALAN: Random de toegang is makkelijker, waarom? PUBLIEK: [onverstaanbaar] DAVID MALAN: Ja, het is slechts toegang tot nummers. Dus, als je denkt van deze werkelijk een tafel, zoals een array, nu heb ik unieke identifiers dat ik kan rond springen. En beter dan dat nog is dat hoe groot is een INT gaat weer? 32 bits of vier bytes. Hoe groot is mijn gebruikersnaam gaat worden? Maximaal? 16 bytes. Dus, als je echt zorgen te maken over de prestaties van uw code, denk terug aan PSet5, wilt u liever zoeken naar een vier byte waarde of 16 byte waarde, toch? Het is echt zo simpel als dat. Je moet vier keer zo veel werk te doen zoeken naar gebruikersnamen omdat deze zijn 16 bytes. Dus, heb je letterlijk vergelijken alle 16 bytes zijn zeker ja, dit is de gebruikersnaam die ik wil. Overwegende dat voor een int, kunt u doe het met slechts vier bytes. En als een opzij voor degenen geïnteresseerd in computer hardware, het blijkt dat je kunt zoiets past INT of een 32-bits waarde iets genoemd register in een computer CPU, wat betekent dat het super, super snel, zelfs bij de laagste het niveau van de hardware van de computer. Dus, er is gewoon voordelen rondom. Ja, wat betekent dit? In feite, als je het ontwerpen van een database tabel, bijna alle van de tijd ga je niet alleen de gegevens die u belangrijk vindt, maar ook iets als een unieke identificatie want dit gaat laten wij andere dingen doen. En laten we struikelen over één probleem. Stel dat gebruikers niet alleen gebruikersnamen en namen, maar ze hebben ook dingen zoals steden en staten en postcodes, ten minste hier in de VS. Dus, ik ga om verder te gaan en gewoon snel zeggen, geef me nog drie kolommen Aan het einde van de tabel. En dit zal de stad zijn, dit gaat Staat, en dit gaat Zip zijn. Nu types City, welke gegevens moet dit misschien? VARCHAR? Ik weet niet wat de langste naam van de stad is. Ergens in Amerika, is er waarschijnlijk een belachelijk lang woord, dus laten we gewoon gaan met 255, ietwat historisch of willekeurig. Staat, wat je wilt doen? Beslissing te nemen, toch? Wat is misschien wel het meest efficiënt? Hoeveel tekens? Misschien gewoon twee, als we kunnen wegkomen met het doen van enkel, zoals, MA voor Massachusetts enzovoort. Dus, ik ga naar een char waarde van twee te gaan. Postcode is een interessante. We zijn hier in 02.138, zodat suggereert dat we wat moeten gebruiken? Het is een INT, toch? INT, INT, kort? Korte zou werken. Nee? CHAR of vijf, maar ik wil een INT. Waarom terug te duwen op INT? Overtuig me van dit. Wat is dom over een INT, mijn idee? Ja. PUBLIEK: Neem meer geheugen. DAVID MALAN: nemen meer geheugen. Vier bytes, maar je bent het voorstellen van een postcode vijf bytes of iemand was als een char, die aanvoelt als eh, dat is niet echt de zaak. Nou, leuk verhaal. Jaren geleden, toen ik gebruikt om het gebruik Microsoft Outlook voor mijn e-mail, Ik wilde uiteindelijk over te schakelen naar Gmail. En dus, geëxporteerd ik al mijn contactpersonen uit Outlook als een CSV-bestand. Comma separated values, die net betekende dat ik had al mijn vrienden namen en de laatste namen en telefoonnummers en postcodes en dat alles. En dan heb ik het fout van het open te stellen in Excel, die een spreadsheet-programma dat begrijpt CSV-bestanden zoals we hebben gezien. Maar dan moet ik heb geraakt, zoals, Commando of controle S op een punt. En Excel blijkbaar op het moment had een functie waarbij elke keer dat het zag een aantal, zij probeerden behulpzaam te zijn. En als dat nummer begon met nullen, zou het gewoon te ontdoen van hen. Waarom heb je nodig leidende nullen op de gehele getallen? Ze zijn zinloos, mathematisch. Ze zijn niet zinloos in de US Postal-systeem. Dus, heb ik al jaren, aan deze dag, ik nog steeds heb vrienden dat wanneer de zeldzame geval dat ik heb iemand nodig is aanpakken van deze dagen, Ik zal nog steeds zien dat ik heb een vriend in Cambridge, Massachusetts, 2138. En het is vervelend als je proberen om programmatisch soort genereren enveloppen of gewoon noteer deze. En dat is vanwege deze reden, Ik koos voor de verkeerde data. Dus, ik hou van je idee. Laten we gebruik maken van een char veld. Vijf tekens, behalve Er is een hoek case. Als u nog steeds e-mail te sturen, Soms postcodes deze dagen, zij zijn, zoals, plus vier. Dus, een koppelteken en dan moeten we moeten we nog vier nummers. Dus om eerlijk te zijn, het kon gaan veel verschillende manieren. Voor nu, ik ga om te blijven het eenvoudig en ik ben gewoon gaan om te zeggen dat het een vijf CHAR waarde en we zijn gaat het hele dashboard plus vier overslaan. Maar dit zijn de soorten afwegingen. En je kunt denken aan de Dezelfde problemen met telefoonnummers of andere gebieden. En nu, dit is eigenlijk een dwaze weg naar beneden te gaan. Stel dat zowel Rob en ik en Hannah en Maria en [? Davon?] En Andy en anderen op het personeel van alle leven in Cambridge, Massachusetts, 02.138. Dit ook daadwerkelijk het gevoel dom dat ik ben toevoegen aan mijn gebruikers tafel, stad, staat, en zip. Waarom? PUBLIEK: [onverstaanbaar] DAVID MALAN: weer zeggen? PUBLIEK: [onverstaanbaar] DAVID MALAN: Ze zijn altijd gaan om samen te gaan, toch? Als blijkt, we gebruikt om te denken dit was het geval totdat we uitputtend doorzocht de hele VS, en er blijkt dat zijn enkele tegenstrijdigheden waar meerdere steden hebben hetzelfde zip, dat is raar. Maar als wij bepalen nu dat 02.138 is altijd Cambridge, Massachusetts, waarom in de wereld zou u opslaat in uw database Cambridge en MA en 02.138 voor mij en voor Hannah en Rob en voor [? Davon?] En voor anderen die leven Hier in Cambridge, is het perfect overbodig. We moeten weg met alleen het opslaan van wat? Alleen de postcode. Maar dan, als we slaan alleen de postcode, wil ik, waarschijnlijk, voor mijn website om te weten waar 02.138 is. Dus, ik heb een andere tafel. En dat is OK. En in feite is dit één van de ontwerpprocessen van het ontwerpen van tabellen dat je in PSet7 evenals waarbij je wilt factor gemeenschappelijke data. Net zoals we al factoring uit gemeenschappelijke code en factoring gemeenschappelijke stijlen van CSS, hier Ook in de database als ik alleen maar 02.138 tot unieke identificeren van iemand's geboorteplaats, niet bewaren Cambridge, Mass voor iedere darn gebruiker in uw tafel. In plaats daarvan, hebben een aparte tabel met de naam Ritsen die moet hebben wat kolommen? Waarschijnlijk een ID-veld, alleen maar omdat voor de principes we praten over nu. Waarschijnlijk een zip-veld voor de 02.138. En dan waarschijnlijk wat andere kolommen? Stad en staat, maar slechts één rij voor 02.138, een rij voor 02.139, één rij voor 90.210. En dat is letterlijk alle postcodes die ik ken. Dus nu, wat kan je doen? Dit is problematisch, omdat nu heb ik twee tabellen. Dus, mijn gebruikers zijn meestal hier, maar hun stadstaat informatie is hier. Dus, zo blijkt met SQL, is er eigenlijk een manier om informatie sluiten, en je zult dit zien in de Pset. Maar het blijkt dat je kunt zoiets als dit te doen. SELECT ster van gebruikers, JOIN ritsen ON gebruikers dot zip gelijk ritsen dot rits. Dat is een beetje langdradig, Toegegeven, maar dit gewoon betekent selecteer alles van de proces van het nemen van mijn gebruikers table en mijn ritsen tafel. Ga met ze mee aan de ene veld zij in kolom. Dus, letterlijk iets te doen als dit, en geef me terug een nieuwe tijdelijke tabel dat is breder, dat is groter, dat alle van de kolommen van beide. En dat, heel eenvoudig, zou de syntaxis voor iets als dit te doen. Dus, er is dit vooruit, maar er gaat andere ontwerpbeslissingen zijn je zult moeten maken, niet alleen met indexen maar lopen in uitdagingen. In feite is er een uitdaging in een database-ontwerp waarbij soms twee personen zou willen toegang tot dezelfde rijen van de database tafel. Dus, dit is iets dat we zullen tegenkomen in PSet7 ook. Maar ik dacht dat ik zou kijken naar een aanval die mogelijk in SQL. Wat zijn enkele van de problemen die kunnen ontstaan? Zo, zult u dit tegenkomen in PSet7. En wij vertellen u wat de regelrechte coderende oplossing voor dit probleem. Maar als je een hoger niveau les te nemen, vooral in besturingssystemen, je gaat tegenkomen een kwestie van atomiciteit, het probleem van het proberen te doen meerdere dingen tegelijk zonder onderbreking. En ik dacht dat ik dit te introduceren idee voor PSet7 met een metafoor dat heb ik geleerd mezelf in Margo Seltzer's CS164 besturingssystemen klasse jaar geleden. Stel dat u een van deze dorm koelkasten in uw dorm kamer of huis, en je hebt een echte voorliefde voor melk. En ja, je thuis komt uit de klassen een dag, je de koelkast te openen. Oh, verdomme. Er is geen melk in de koelkast. Dus, je de koelkast te sluiten, de deur op slot, sluit uw dorm, lopen om de hoek CVS, in de rij, en beginnen met het controleren van voor wat melk. En het zal een tijdje duren, omdat die verdomde zelf checkout tellers nemen altijd toch te gebruiken. Dus ondertussen, je kamergenoot komt thuis. Hij of zij houdt echt van melk ook. Ze komen in de slaapzaal, Open de koelkast, oh, verdorie. Er is geen melk meer. Dus, hij of zij ook gaat om de hoek. Maar nu, omdat er als twee of drie of vier CVSes buurt, ze toevallig naar een van de verschillende degenen op het plein. En nu, een paar minuten later, jullie beiden kom thuis en ugh, het ergste probleem ooit. Nu heb je te veel melk omdat het gaat om zure gaan. En je wilt melk, maar u hou niet echt melk. Dus nu, dit was een dure fout omdat jullie beiden een besluit genomen op basis van de staat van enkele variabele die werd in het proces van veranderd door u, de initiatiefnemer van het gaan om melk te krijgen. Dus, wat is misschien een mens oplossing voor dat probleem? PUBLIEK: [onverstaanbaar] DAVID MALAN: Laat een briefje, toch? Laat altijd een briefje, als je vertrouwd met die show. Ja, er zijn twee van ons. Dus, altijd een briefje achterlaten, of letterlijk lock de koelkast met een soort van hangslot of iets over de top als dat. Maar dat is eigenlijk gaat worden kernprobleem met database-ontwerp, vooral wanneer u zou kunnen hebben meerdere browsers, meerdere laptops, meerdere gebruikers allemaal proberen te update-informatie in een keer. Bijzonder gevoelige informatie zoals financiële informatie, waarbij met een aandelenhandel website zoals u zult bouwen, wat als u wilt controleren hoeveel geld je hebt en dan als je genoeg hebt, kopen wat voorraad? Maar wat als iemand anders die heeft een gezamenlijke rekening met u tegelijkertijd proberen om wat aandelen te kopen? Dus hij controleert de rekeningsaldo, jullie beiden weer het zelfde antwoord, er is geen melk. Of beide van je terug het antwoord, heb je $ 100 op de rekening. Jullie beiden proberen om de beslissing te nemen op één aandeel van een aantal aandelen van het bedrijf te kopen. En nu, wat gebeurt er? Je hebt twee aandelen? Je hebt geen aandelen? Problemen zoals die zich kunnen voordoen. Dus, zullen we tegenkomen dat. SQL injectie aanvallen, gelukkig, zijn iets wat we zullen u helpen met, maar deze zijn atrociously vaak deze dagen nog. Dus, dit is slechts een voorbeeld. Ik maak geen claims die Harvard PIN-systeem is kwetsbaar voor dit vallen. We hebben geprobeerd. Maar, weet je dat we een gebied als dit. En Yale's Net ID heeft een soortgelijk op zoek scherm deze dagen. En het blijkt, dat misschien de PIN-systeem is geïmplementeerd in PHP. En als het were-- het niet-- ze zou de code die eruit ziet als deze. Ze hebben twee variabelen. Geef mij de gebruikersnaam en wachtwoord uit de post super globale variabele dat we het eerder over had. Misschien Harvard heeft een query zoals SELECT ster van gebruikers waarbij gebruikersnaam evenaart en het wachtwoord is gelijk aan dat. En merk dat ik ben gewoon stekker in het gebruik de accolade notatie van de andere dag, wat betekent gewoon de stekker in een waarde here. Ik ben niet met behulp van de vraagteken techniek. Ik heb geen seconde of derde argumenten. Ik ben gewoon letterlijk de aanleg van de string zelf. Het probleem is echter dat als iemand graag een scroob, die een verwijzing naar een film, logt in met iets als dit, en ik heb de puntjes verwijderd die meestal bedekken wachtwoorden, wat als hij is in het bijzonder kwaadaardige en zijn wachtwoord is misschien 12.345, per de film genaamd "Spaceballs" maar hij kritisch types een enkele aanhalingstekens na de vijf, dan letterlijk het woord of in de ruimte, en dan citaat, unquote één gelijk een citaat, maar merkt dat hij is weggelaten wat? Hij is weggelaten het citaat op de juiste en hij heeft nagelaten het citaat aan de linkerkant. Want als dit aanvaller scroob's vermoeden is dat de mensen die schreef Deze PHP code waren niet zo helder, misschien hebben ze slechts enkele enkelvoudige citeert rond de interpolatie van een variabele in accolades? En dus misschien, kon hij soort voltooien van hun gedachten voor hen, maar op een manier dat gaat om hem te laten gehackt de PIN-systeem. Met andere woorden, veronderstel dat dit de code en we nu de stekker in wat scroob getypt. En het is rood, omdat het slecht. En de onderliggende tekst is wat hij getypt, scroob kon server Harvard truc in de bouw van een SQL-query string die er zo uitziet. Wachtwoord gelijk aan 12.345 of één gelijk is aan één. Het waardoor logischerwijze is dat dit scroob zal aanmelden in als zijn wachtwoord is 12345 of als men gelijken een, die natuurlijk altijd waar, wat betekent scroob krijgt altijd in. En ja, de weg op te lossen Dit, zoals in vele gevallen, zou zijn om te verdedigen schrijven. Iets als het gebruik van onze werkelijke vraag functie die zie je in PSet7, waar we aansluiten iets als vraagtekens hier. En de schoonheid van de vraag functie die we geven is hij verdedigt tegen deze zogenaamde SQL injectie aanvallen, waarbij iemand tricking uw code in injecteren van zijn of haar eigen SQL-code. Want wat de query functie wij geven u ook daadwerkelijk doen, Als u het vraagteken syntaxis en een tweede en een derde argument hier, is wat heeft deze toe te voegen aan de input die de gebruiker verstrekt? Die backslash citeert. Dus, het ontsnapt aan alle potentieel gevaarlijke karakters. Dit ziet er raar nu, maar het is niet kwetsbaar omdat het niet de logische meer aanpassen want dat hele wachtwoord nu één citaat dat niet, in feite, wachtwoord scroob's. Dus, er is al een aantal grappen over de jaren. Dus, dit was een foto genomen van sommige geek op een parkeerplaats waarbij u wellicht weet dat sommige steden en staten proberen om je rijbewijs te scannen plaat aan u of aan ticket factureren als u door te gaan zonder, als, de E-Z Pass ding. Dus, deze persoon vermoed dat misschien de mensen die het schrijven van de E-Z-Pass-systeem waren niet zo helder, en misschien zijn ze gewoon samen aaneengeschakelde een string, zodat hij of zij kon niet kwaadwillig niet alleen hun gedachten te voltooien, maar eigenlijk een slechte opdracht uit te voeren, die we nog niet hebben genoemd, maar je kunt wel raden. Dat naast schrappen en invoegen en bijwerken en selecteer, Er is ook een sleutelwoord genaamd drop, die letterlijk alles verwijdert in de database, welke is bijzonder slecht. We kunnen inzoomen op deze als het is een beetje moeilijk om te zien. Dit nu, is een beroemde cartoon dat is heerlijk slim nu en begrijpelijk. [Lachen] Ja, cool. Soort geeking uit. Dus deze zijn dus SQL injectie aanvallen. En ze zijn zo makkelijk te voorkomen door het gebruik van de juiste code of rechts bibliotheken. En je zult zien in PSet7, dat is Daarom geven wij u de query functie. Dus, een paar teasers dat we dachten dat we zouden geef u hier in onze resterende minuten samen. Dus, zoals u zich herinneren van week nul, we introduceerde deze twee lampen die zijn mooi, niet alleen omdat ze zijn vrij en zijn kleurrijk, maar omdat ze iets ondersteunen riep een API, een Application Programming Interface En in CS50 tot nu toe, we hebben vooral gericht op GET en POST, maar het blijkt er andere HTTP werkwoorden zoals PUT. En in feite was een dia van week nul waarbij als je schrijft code die verzendt a la PSet6 een HTTP-verzoek ziet er zo met dit stuk tekst onderaan, genaamd JSON, of JavaScript Object Notation dat we praten over volgende week, u kunt in- of uitschakelen of wijzigen de kleur van de verlichting zoals die. Als CS50 ook naast enkele van die gloeilampen hier in New Haven als je wilt om te lenen ze voor de laatste projecten, ook een aantal Microsoft Bands, die als horloges die je draagt ​​om je pols dat op dezelfde wijze een API zodat u kunt uw eigen software te schrijven voor hen. We hebben een rekening bij Apple's iOS-code, zodat dat als je een Apple Watch of een iPhone of een iPad of een iPod, U kunt code schrijven dat eigenlijk draait op geven. We hebben een hele hoop van Arduinos, die zijn piepkleine computers zonder gevallen, in wezen, dat je kunt aansluiten via USB, meestal om uw eigen Mac of pc, code schrijven die op deze fysieke loopt inrichtingen die vaak sensors erop zodat u kunt communiceren met de echte wereld. We hebben een hele hoop van Leap Motion apparaten, welke USB-apparaten voor Macs zijn en PC's, hier en opnieuw, in New Haven. En als je het aansluiten op je Mac, kun je eigenlijk uw computer te bedienen door het schrijven van software dat via infrarood stralen, cijfers waar je menselijke handen, zelfs zonder het aanraken van je toetsenbord. We dachten dat we zouden delen een snelle blik op deze, bijvoorbeeld. [Muziek] Dus, we hebben een hele bos van deze dingen, Ook riep Myo wapenbanden die je over je onderarm en dan kun je de controle van de echte wereld of de virtuele wereld als deze. [Muziek] Of, hebben we ook een aantal Google Karton, die letterlijk, als, een kartonnen doos kon je op zet je gezicht, maar dia in uw telefoon in te zodat je het glas van uw telefoon echt dicht bij uw ogen. En Google Karton is vrij goedkoop op $ 10 of $ 20. En het heeft weinig lenzen dat iets uit shift het beeld op het scherm voor uw human ogen om u een gevoel van diepte te geven zodat je eigenlijk een 3D- omgeving voor je. We hebben ook een aantal Samsung Gear, die de duurdere versie hiervan, maar kunnen eveneens glijden in een Android-telefoon en geven u de illusie van-- of de ervaring van virtual reality. En in onze laatste twee minuten, we dachten dat we zouden proberen om dit te doen. Als ik kan projecteren wat Colton heeft hier gewoon om uw eetlust op te wekken, laat me gaan en gooien up op het grote scherm hier. Laat me de lichten vermoorden. Colton, wilt u doorgaan en zet op uw mobiele voor een moment en kom op over aan de midden van het podium? En wilt u project-- dit is wat Colton ziet. Nu, de Wi-Fi in hier niet zo sterk voor dit apparaat dat dit super dwingend, maar Colton is letterlijk in deze futuristische magische plek. Hij ziet maar één afbeelding. Je ziet zijn linker en rechter oog dat zijn hersenen aan elkaar stikken in een driedimensionale milieu op zijn gezicht. Hij is gewoon een menu-optie geselecteerd hier. En dus nogmaals, hij is het dragen van deze headset met een Samsung telefoon op dat draadloos projecteert overheadkosten. Nu ben je op Mars, denk ik? COLTON: Ik denk het wel. Ik ben niet zeker [onverstaanbaar]. [Lachen] DAVID MALAN: Blijkt Mars heeft deze menu's. COLTON: [onverstaanbaar] een aantal coole plaatsen als we willen to-- gaan DAVID MALAN: Waar willen we heen? COLTON: [onverstaanbaar] DAVID MALAN: En laten we zien Colton, waar nu het nemen van ons. COLTON: [onverstaanbaar] DAVID MALAN: Dus, er is zo veel verschillende plaatsen kunt u zelf nemen. Er is FAPIs via welke u kunt schrijf games of interacties die werking uiteindelijk op de telefoon. Dus, je echt gewoon het schrijven van een mobiele telefoon app. Maar dankzij de software en grafische mogelijkheden, nu Colton is in dit piepkleine huisje. En risico van onszelf overweldigend, Colton en ik zal rond stick voor terwijl aan het einde van de les vandaag als je wilt om te komen en te spelen. En we zullen ze brengen volgende week terug ook. Zonder verdere ADO dat is het voor vandaag. We zien je volgende week. [MUZIEK - RAGGA TWINS, "slechte man"]