[Powered by Google Translate] [Uke 8, Fortsatt]
[David J. Malan] [Harvard University]
[Dette er CS50.] [CS50.TV]
>> Dette er CS50, så dette er slutten av uke 8 her.
Vi selvfølgelig hadde litt av en orkan tidligere denne uken,
så akkurat nå er det egentlig bare deg og meg i denne forelesningssal
men i dag fortsetter vi vår samtale om PHP
og om webprogrammering mer generelt, og vi har også introdusere ideen
av databaser, kalt spesielt en MySQL, som er ganske populær i disse dager,
i stor grad på grunn av sin skalerbarhet samt fordi det blir gratis og åpen kildekode.
>> Men først en titt på hvor vi slapp forrige gang.
Husker at vi var ute på flere Frosh direktemeldinger eksempler,
og dette var det heslig form at jeg kom opp med noen 15 + år siden
for å ha studenter på campus register for freshman egenutført idrett
uten egentlig å måtte trek lenger over tunet til Wigglesworth
å skyve en fysisk stykke papir under noen Proctor dør.
I stedet har vi flyttet alt på nettet, men å gjøre det vi trengte å gjøre bruk
av noen få teknologier, slik at en, vi trengte HTML, HyperText Markup Language,
som er igjen denne markup language som du gjør websider strukturelt.
>> Ved hjelp av en bit av CSS i disse dager, stilark,
der vi bruker stiliseringer av websiden ved hjelp av en litt annen syntaks,
mens HTML var alt om strukturen av disse.
Vi trenger også å innføre en web-programmeringsspråk.
I dette tilfellet vil vi bruke PHP og PHP kommer til å tillate oss
til dynamisk effekt innhold samt gjøre programmatiske ting som
sende e-post, slik tilfellet var på lappen vi forlot forrige uke.
>> Husker at koden for dette var i 2 deler.
En, hadde vi froshims3.php,
og dette var i stor grad markup med et HTML-skjema på innsiden av det,
en liten bit av CSS her oppe i malattributtene
slik at selve skjemaet ville være sentrert på siden, men utover det
Vi hadde noen representative skjema innganger, et tekstfelt, en avmerkingsboks,
noen radio knapper, en utvalgt meny, og en send-knappen.
Og via dette skjemaet, sendte vi til en fil som ble tilsynelatende kalt register3.php,
som selv så litt noe sånt som dette.
Nå var det meste av koden i register3.php, husker, om e-post.
Det gjorde litt av validering av skjemaet som ble sendt for å sikre at
at feltene ble faktisk gitt som ble forventet.
Så vi kalte noen PHP-funksjoner ved hjelp av litt ny syntaks,
selv om det er lånt fra C.
>> Denne pilen operatør tillater oss å gjøre bruk av noe som kalles objektorientert programmering.
Vi vil ikke gå inn på det i detalj her, men vet for nå
det er en måte å ha funksjoner knyttet til objekter,
som er en spesiell type struktur, som vi så i C.
Men for nå, bare ta på tro at dette er riktig syntaks å bruke
når du bruker et bibliotek som dette PHPMailer biblioteket.
Og deretter ved utgangen av denne filen hadde vi dynamisk generert en e-post
som fikk sendt til min jharvard@cs50.net konto
fra min jharvard@cs50.net konto,
og vi informert brukeren derfor at de hadde blitt registrert for denne sporten.
Det er ganske mye hva Frosh direktemeldinger området gjorde alle disse år siden
når jeg implementert det, gitt, på et annet språk,
men det viser deg kanskje den kraften du har
nå som du kan uttrykke deg selv, ikke bare programmatisk
på et lavt nivå på et språk som C, men på et mye høyere nivå
med disse svært virkelige verden programmer som e-post til å faktisk løse
noen reelle problemstillinger.
>> Nå, selvfølgelig, selv om jeg bruker dette skriptet til å generere noen
e-post dynamisk fra jharvard@cs50.net, som faktisk er en konto
at jeg har tilgang til, vær ganske forsiktig med å sende
post bare fra kontoer som er faktisk din egen,
lest ting får du i litt varmt vann i livet.
Med det sagt, la oss nå gjøre overgangen til å løse et annet problem helt,
at av støttemurer stater.
Nå, hva dette egentlig betyr?
HTTP, dette HyperText Transfer Protocol,
er faktisk en statsløs protokoll, og hva dette betyr er at
når du trekker opp noe som Google.com og trykk enter
vanligvis din nettleser har en slags spinne ikonet som da
resulterer i noen nettside lastes ned,
og deretter det lille ikonet slutter å spinne, og som faktisk antyder
at HTTP har gjennomført noen form for tilkobling til serveren og det er det.
HTTP er statsløs i den forstand at det ikke holder
en vedvarende tilkobling til serveren på samme måte Skype gjør
eller Gchat gjør fordi med HTTP
antagelsen er at når du har hentet en nettside som er det.
>> Nå i realiteten i disse dager på nettsteder som Facebook og Google Maps
og Twitter og lignende det er mye mer dynamikk der
selv etter at ikonet slutter å spinne du kan faktisk få flere oppdateringer
fra serveren, flere tweets, flere statusoppdateringer på Facebook og lignende.
Men selv det er ved hjelp av en teknikk som vi skal snakke om i en uke eller to
kjent som Ajax bruker et språk som kalles JavaScript,
men på slutten av dagen, er HTTP fortsatt statsløs.
Og likevel hvis du ønsker å liksom huske ting om en bruker
selv etter at de har koblet fra serveren din
PHP gjør gi deg et redskap til å gjøre dette
fordi, som vi så forrige gang, har PHP en rekke superglobals,
og en superglobal er, igjen, en spesiell global variabel
som er levert til deg av webserveren og PHP selv.
>> Du trenger ikke å gjøre noe for å sette verdier i det,
og blant de superglobals vi har sett så langt er få og legge ut,
som er der skjemafelt settes automatisk for deg,
samt et par andre som vi ikke har sett ennå.
Innsiden av $ _SERVER er noen spesielle variabler knyttet til selve serveren.
Hva er IP-adressen, hvilken protokoll, HTTP eller HTTPS brukte du,
hva forespørsel metode brukte du og lignende, så det er litt interessant,
saftige detaljer om serveren, og faktisk bruker der også.
Det er $ _cookie, som er der disse tingene kalles cookies lagres.
Vi vil ikke bruke tid på cookies selv i dag,
men vet nå at en cookie er bare en liten del av informasjonen
at en web-server kan plante i en nettleser
og i sin tur RAM eller dets datamaskinens harddisk
å lagre informasjon om en bruker, for eksempel, brukernavn
slik at de ikke behøver å skrive det hver gang de logger seg eller noen
unikt nummer eller identifikator for denne brukeren
slik at du ikke trenger å plage dem med de samme typer spørsmål om
preferanser i fremtiden, men de fleste av interesse
akkurat nå er $ _SESSION.
>> Dette superglobal, som i likhet med andre, er levert til deg automatisk av PHP
når du skriver PHP-baserte nettsteder
kan lagre alt du vil, strenger, heltall,
flytende punkter, verdier, matriser, gjenstander,
virkelig noe som du ønsker, og det tillater deg å lagre det på en slik måte
at selv om brukeren besøker du nå og da
kommer tilbake et minutt fra nå eller 5 minutter fra nå fordi
de tar sin tid før du klikker noen annen link
PHP vil sikre at det du putter i den økten superglobal
et minutt eller 5 minutter siden vil fortsatt være der når brukeren er tilbake.
Og under panseret denne superglobal er implementert ved hjelp av
disse tingene kalles cookies, men for nå, det er bare en abstraksjon
der det er liksom den programmatiske tilsvarer en handlevogn.
Uansett hva du, programmerer, satt i at
superglobal assosiativ array vil være der et antall minutter senere
til du sletter den, eller til brukeren avslutter sin nettleser helt.
>> La oss ta en titt på et eksempel på hvordan denne saken er faktisk brukes.
I counter.php blant dagens deler av koden
Vi har følgende linje.
Ved starten av denne filen har vi en haug med blå kommentarer, som uinteressante for nå.
Men i linje 13 har vi en ny linje,
session_start, og som faktisk gjør akkurat det den sier.
Det begynner økter.
Det gjør at du kan bruke den store superglobal $ _SESSION, og det er så enkelt som det.
Nå, hvis vi fortsetter å se på linje 16, la oss prøve å finne ut hva denne nettsiden kommer til å gjøre.
If (isset ($ _SESSION ["counter"]) og deretter gå videre
og butikk i tellervariabelen, små bokstaver teller,
$ _SESSION ["Counter"].
Dette synes å være å erklære en lokal variabel kalt teller
innsiden av som det er å sette en kopi av det som er på innsiden av den superglobal
kalt session på stedet "teller".
Else, tilsynelatende, denne lille lokale variable telleren, er initialisert til 0.
>> Men da noen linjer senere i 26 varsel om at økten kopi av disken,
styringsrenten, har en ny verdi som er tilordnet som er dens nåværende verdi pluss en.
Kort sagt, synes denne filen til å oppdatere
en teller som er lagret inne i økten superglobal
ved å øke den med 1, men beholder det først en kopi av den forrige verdien
ved å oppbevare det i en lokal variabel kalt $ teller,
og deretter ned her la oss se hva som gjenstår.
Det viser seg at det er ganske mye bare HTML.
Nederst på denne siden ser vi på linje 37 som jeg har besøkt dette nettstedet
teller antall ganger, så det er et par interessante funksjoner her.
En, er dette helt klart en variabel, men det er nok ikke å bare sette
$ Teller i kroppen i HTML fordi selvfølgelig
hvis det er bare der blant HTML PHP kommer til å anta det er bare HTML.
Du bokstavelig talt ønsker $ teller skal skrives ut på skjermen.
>> Men i stedet ved å slippe inn PHP-modus
med dette stykke syntaks kan vi dynamisk sette en verdi her
svært lik i ånden til hva vi gjorde sist gang med
sette verdier inn strenger.
Faktisk er dette bare en forkortelse notasjon for å si noe sånt som dette bokstavelig,
print ($ teller) eller noe sånt printf (% s, counter),
eller, som du kanskje har sett på nettet eller i lærebøker,
det er en funksjon i PHP kalles ekko
som gjør det samme, og alle av dem er bare lengre winded måter
for å si <? =.
I dette ene tilfellet trenger du ikke å sette
ordet PHP etter spørsmålstegnet.
Dette er stenografi notasjon for, igjen, det vi nettopp så et øyeblikk siden
som ekko noen verdi.
>> La oss se hva sluttresultatet av dette faktisk er.
La meg gå over i vår counter.php fil,
og vi vil se at David bare gjort en feil ved å spille med koden der.
La oss gå fix hva han skrudd opp,
og feilen ser ut til å være der, borte, på linje 37.
Ifølge toppen av denne siden har jeg besøkt dette nettstedet 0 ganger.
Vel, la oss gå videre nå, og på toppen av nettleseren klikke på
reload ikonet, og jeg klikker laste,
og nå har jeg besøkt nettstedet 1, 2, 3, 4, 5, 6, 7, 8.
Og ja, hvis vi ser på kilden til denne siden selve kildekoden er i endring,
og legge merke til fullstendig fravær av enhver PHP, og det er fordi
PHP-koden er evaluert eller tolkes server side,
og så det betyr at produksjonen av PHP script er hva til slutt sendes til nettleseren,
som i dette tilfellet er noen rå HTML og noen rå tekst.
Hva skjer her?
>> Vel, med relativt få linjer med kode jeg kunne lagre
vedvarende løpet av noen sekunder, eller hvis vi ventet lenge nok,
minutter, selv timer, noen verdi på en måte som gjør HTTP
synes stateful som om vi har beholdt
denne forbindelse til serveren, og det er bare å huske hva jeg sa det forrige gang,
men i virkeligheten er det en hel haug av kompleksitet skjer under panseret
involverer cookies som er slik at PHP til å gi meg denne illusjonen
av denne handlekurven-lignende funksjon.
For nå, en triviell eksempel der vi bare lagre et heltall,
men at funksjonen vil komme tilbake til å være av stor verdi
når vi begynner å snakke om mer komplekse prosjekter,
blant dem problemet satt 7.
Dette er din aller siste problemet satt i CS50.
Jeg vet, det er så trist, men hva du finner er at vi kommer til å konkludere
denne delen av semesteret ved å faktisk overgangen
fra sammenheng med C sikkert til konteksten av PHP
men mens du bruker noen av de samme grunnleggende
vi har snakket om en stund.
>> Målet med pset 7 er å gjennomføre CS50 Finance,
som er din egen versjon av Yahoo Finance eller Google Finance
eller Etrade.com der du har muligheten til å
se opp aksjekurser for gitte symboler, men enda mer enn det
du har muligheten til å "kjøpe" og "selge" aksjer
som handles på ulike børser fordi som denne hjemmesiden
her antyder, som er virkelig i hvilken grad vi har begynt
problemet sett for deg, har du en login form som spør etter brukernavn og et passord.
Den har en send-knappen, men etterpå, som vi vil til slutt se,
det er ingenting egentlig skjer under panseret ennå fordi det
gjenstår for deg å implementere muligheten til å registrere nye brukere,
muligheten til å kjøpe aksjer, selge aksjer,
å faktisk slå opp dagens aksjekurser.
>> Og ja, vil dette være så virkelige verden som mulig fordi vi gjorde
inkludere en kode som lar deg med en enkel funksjon
til å spørre Yahoo Finance, som fantastisk gjør tilgjengelig gratis data
for å se opp aksjekurser basert på aksjesymbolet eller ticker symbol,
og du får tilbake den gjeldende aksjekurs på dagen.
Dataene du faktisk ser i denne pset vil være
omtrent like virkelige verden som det kan få, slik at du faktisk grensesnitt
med virkelige verden aksjer, virkelige verden priser,
og vi skal se hvor mye penger du kan gjøre kanskje
i løpet av de neste dagene med å spille med ditt eget problem sett.
>> Men la oss først stille scenen for hvordan å designe noe som er absolutt mer komplisert
enn counter.php, det er mer komplisert enn noen av de Frosh direktemeldinger eksempler så langt,
og la oss prøve å innføre noen paradigmer her som lar oss
både for 7 pset og kanskje for det endelige prosjektet hvis du gjør noe webbasert
å holde koden godt organisert, for å holde deg tilregnelig,
og til å ta et skritt mot å samarbeide, enten i CS50 avsluttende prosjekt
eller utenfor hvis du fortsetter å programmere noe i fremtiden.
Det er denne generelle design paradigmet
i informatikk og i utvikling av programvare mer generelt
kjent som MVC, Model View Controller,
og dette er en dum akronym som beskriver en veldig fin idé,
som er separasjon av ulike aspekter av et program,
spesielt å holde separate logikk eller forretningslogikk av et nettsted
slik at alt som involverer ting som
samtalefunksjoner og spørring databaser og lignende
skjer ikke blant HTML din
men heller i separate filer, og faktisk, det er dette en fil
typisk at du har ringt kontrolleren
det er virkelig hjernen bak operasjonen, og vi vil se et eksempel
av dette i løpet av et øyeblikk.
>> Det er en modell som programmerer kode
som betyr å snakke til databasene, snakker det til Yahoo Finance og lignende,
og så er det V i MVC, visningene,
alle de ting som er relatert til estetikk, filene som faktisk inneholder
HTML, kanskje din CSS og lignende.
Ideen her, som dette bildet antyder, er at kontrolleren
er filen, som vi snart se, og som du vil spesielt se på pset 7,
at verden snakker til via sine nettlesere.
Det er filen som blir besøkt på offentlige internett,
men kontrolleren snakker til potensielt en modell,
som er en eller flere andre filer som inneholder kode relatert til data,
kode knyttet til databaser og lignende, og da er det snakker til
kontrolleren én eller flere andre filer som kalles visninger,
som er estetikk en nettside, maler av former,
som kan ta noen data som inngang, men på slutten av dagen
den eneste logikk innsiden av en visning skal gjengivelsen av disse dataene,
iterating over en løkke og faktisk spytter ut noen
HTML-basert rendition derav eller noe sånt som en PDF-fil.
>> Hva er fint om MVC er at du kan ha forskjellige visninger
basert på den typen enhet, basert på hvilken type filformat som du faktisk
ønsker å vise for brukeren.
La oss ta en titt på noen få stadig mer komplekse og godt utformet eksempler
ved å starte først med versjon 0 her.
La meg gå videre og åpne opp i vår MVC katalogen i dag
en fil som heter index.php i katalogen 0.
Merke dette er en super enkel og veldig underwhelming nettside
det er liksom versjon 0 av en hjemmeside for CS50,
og legge merke til hvordan vi har en link til Forelesninger, har vi en link til pensum,
og hvis jeg følger linken til Forelesninger merke til at nettadressen
opp toppen kommer til å endre til lectures.php.
Hvis jeg da følge linken til uke 1 merke til at URL endres til week1.php.
Det synes å være en ganske enkel hierarkisk struktur her.
>> La oss ta en rask titt under panseret på hvordan dette er lagt ut,
og ja, hvis jeg ser på index.php det er ganske enkel.
Faktisk, selv om jeg kalte dette en PHP-fil er det ingen faktiske programmeringskode.
Det er en kommentar som jeg skrev her i PHP så brukeren ikke ender opp med å se det.
Selvfølgelig, som før, noe som er i mellom PHP-koder
blir tolket, selv om det er en kommentar, og å tolke en kommentar
betyr bare å kaste den bort på slutten av dagen og ikke faktisk
sende den til nettleseren, slik at alt her er bare estetikk.
Hvis jeg åpner opp tilsvarende lectures.php dette er også bare en hard kodet fil.
Det skjer for å bli kalt noe. Php,
men det er egentlig bare. html, og week1.php, week2.php
Tilsvarende er bare markup, så det er en haug med svakhetene ved denne designen.
Ett, er det en enorm mengde kopier / lim.
Selv om det eneste som forandrer seg blant disse filene er sorterte liste,
Li-koder, jeg likevel har doc type, HTML, hode,
tittel, nær kroppen, tett HTML og mer
i hver eneste fil, noe som betyr at hvis jeg noen gang vil restrukturere
denne nettside eller restylize det jeg har å gå inn og endre
alle disse filene manuelt eller med noen massiv finne og erstatte.
>> La oss ta et skritt mot en smartere, lengre tenker design i versjon 1 her
der som per lese meg som vi har inkludert, slik at du kan spille sammen med
disse mer rolig hjemme varsel som vi har her
et sammendrag av filene i versjon 1 av denne siden,
og det synes at jeg har tatt det på meg å faktor ut
noen felles kode, header.php og footer.php.
Vel, la oss ta en titt på hva som er inni den første av disse.
Header.php ser kjent ut,
men merker hvor kommer det få kuttet av?
Rett etter linje 19, så det er alt som var vanlig
fra filene index.php, lectures.php,
week1 og week2.php fra forrige eksempel.
Det jeg gjorde var kopi og kutt alt som var felles for alle disse filene,
legg den i en separat header-fil, og tilsvarende i footer.php
gjorde jeg bruke samme prinsippet der de eneste interessante linjer
i footer.php er disse to, tett kropp og tett HTML.
>> Men hva dette betyr nå er at i den nye versjonen
av index.php varsel hvor mye enklere det kan få.
Gitt, litt mer kryptisk ser, litt mindre intuitivt
å følge topp til bunn, men min Gud, er alle som redundans nå borte.
Vi krever hjelp av en PHP funksjon bokstavelig kalt krever opp toppen,
som er veldig minner, husker, av Cs # include mekanisme.
Vi krever header.php øverst.
Vi krever footer.php nederst, og det eneste som er annerledes
eller spesielt denne filen er innholdet som er ment å være unike for den.
Hvis jeg da går inn i, sier lectures.php, gjelder det samme prinsippet.
Igjen, noen kommentarer opp toppen, men da jeg krever header, krever bunntekst,
og i mellom er det bare innholdet som er endret.
Og hvis vi sett uke 1 og uke 2 vil vi se
at samme prinsipp hadde vært benyttet der.
Vel, vi er ikke helt ferdig der.
>> La oss ta en titt på versjon 2, som har en lignende struktur,
men merker nå har jeg innført noe annet.
I linje 10 har jeg introdusert helpers.php,
som inneholder tilsynelatende hjelper funksjoner.
En hjelper funksjon er generelt en relativt kort funksjon
at du skriver for å hjelpe deg ut på forskjellige steder,
og la oss se hva som er på innsiden av helpers.php.
I dette tilfellet ser det ut som den har 2 funksjoner.
Husker fra den andre dagen med vår kube eksempel
du kan definere dine egne funksjoner i PHP, og hva jeg har gjort nå er at jeg har
definerte funksjoner kalt gjengi bunntekst og gjengi header,
hvorav den første tar en parameter kalt data,
hvis standardverdi er en tom matrise, som foreslått der,
og vi kan faktisk skrive dette enda mer konsist i den nyeste versjonen av PHP
ved å si åpent hakeparentes, lukket hakeparentes.
Det betyr en tom utvalg av størrelse 0, men likevel en matrise.
>> Dette ekstrakt funksjonen er litt spesiell ved at
hva den gjør er det tar som argument sin en assosiativ array
som har 0 eller flere sentrale verdi-par, og hvis du har en nøkkel av foo
og en verdi på bar ekstrakt funksjonen
skaper en situasjon som nå, som på linje 11,
du har en lokal variabel kalt $ foo hvis verdi er bar.
Og hvis du hadde flere nøkler og verdier i data array,
likeledes ville de bli ekstrahert i den lokale omfanget
eller navn plass slik at footer.php og
den samme ideen her nede slik at header.php
har tilgang til disse variablene.
Faktisk, la meg åpne opp igjen header.php
og trekke oppmerksomhet til nå hva det ser ut som i denne versjonen.
>> Snarere enn hardt koding CS50 som tittelen for hver enkelt side
merke dynamikk som er mulig nå.
I linje 5 Jeg ekko en tittel variabel,
men først skal jeg forbifarten at tittelen variabel til en funksjon som heter htmlspecialchars.
En dum navn for en funksjon, lenge det er, men det gjør egentlig hva den sier.
Det sikrer at eventuelle spesialtegn
i strengen som er blitt vedtatt i er riktig rømt HTML.
Dette er faktisk en måte å unngå noe som kalles et kors site scripting angrep
der noen kan skadelig eller utilsiktet
injisere sin egen HTML på nettstedet ditt
ved å lime i noen form, for eksempel,
noe som du ikke var helt ventet, spesielt JavaScript-kode,
som vi skal snakke om i en uke eller to tid.
>> Dette nå header.php, er det en visning
i den forstand at det tillater deg å se estetisk innholdet i noen datasett.
Men mer spesifikt, er det en mal.
Dette er liksom en blåkopi nå av hva vi ønsker overskriften på hver side for å se ut,
men det er noen dynamikk i at vi vil at tittelen skal være dynamisk inn
basert på tittelen variabelen
som ble hentet da vi ringte igjen,
gjengi header funksjonen.
Nå, hvis vi så på render bunntekst, det er faktisk ikke mye bruk av det akkurat nå
fordi i footer.php det er ingen dynamikk overhodet.
Det kan være, men i øyeblikket er det en hardkodet liste over to koder,
men den samme ideen gjelder, slik at faktisk antyder hvorfor
gjorde vi kaste bort tid på å ha en render header og en render bunntekst funksjon?
La meg gå i stedet nå inn versjon 3,
og i versjon 3 i hjelpere jeg besluttet å forenkle det enda mer.
>> La meg få en render funksjon.
La meg få det ta et annet argument, kalt denne gangen mal,
som er ment å være navnet på en mal,
og da vil jeg sette sammen dristet. php til den variabelen verdi,
og hvis den finnes foo.php, bar.php eller header.php og footer.php,
så jeg kommer til å gå videre og trekke ut de variable data
og deretter kreve at banen.
Med andre ord, for å bruke dette nå, hvis jeg åpner opp index.php
merker at jeg ikke kaller render header lenger.
Jeg bare kaller gjengi, men pass jeg i en sitert verdi av header
å gjøre det klart hvilken mal jeg faktisk ønsker å laste.
>> Så over her legge merke til hva jeg gjør.
Jeg passerer dynamisk en nøkkel av tittel,
en verdi på CS50, og dette også, som vi så tidligere,
kunne gjøres mer konsis i den nyeste versjonen av PHP
hvor jeg kan erstatte matrisen funksjon med hakeparenteser,
som jeg foreslår er enda mer lesbart og sikkert
litt lettere å skrive.
Og selvfølgelig, med rendringen bunntekst samtale på bunnen,
vi ikke bry bestått i et annet argument i det hele tatt, ingen assosiativ array,
fordi det er ingenting dynamisk innsiden av det bunntekst.
Det er bare noen nære koder for HTML.
Bra, vi tar skritt mot virkelig rengjøring ting her oppe,
men la meg åpne opp 2 siste eksempler.
Denne, nummer 4, legg merke til at jeg har gjort et bevisst valg nå
å forbedre forrige eksempel ved endelig bruke noen hierarki filene mine.
>> Legg merke til at i dette sammendraget, i dette leser meg, jeg har introdusert
en inkluderer katalog og en maler katalog
der innholdet kommer til å være de tingene jeg ønsker å inkludere
og hvilke maler som jeg ønsker å gjengi, henholdsvis.
Dette er virkelig meg å være anal og prøver å holde ting ryddig,
holde relaterte filer sammen, men sluttresultatet
er at vi nå har en litt ryddigere oppsett, men vi må huske nå
i, for eksempel, index.php
når vi trenger filen helpers.php
vi må nå kreve det via includes / helpers.php
snarere enn å bare si helpers.php fordi nå er det faktisk i en underkatalog.
Nå, som en side, vil du se i disse eksemplene og noen andre
funksjoner som krever, krever en gang.
Det er faktisk en funksjon i seg selv kalte inkludere, og de har alle litt forskjellige atferd.
Her sier jeg krever én gang for å gjøre super klart at jeg bare vil de
hjelpere inngår i prosjektet mitt en gang.
Men hvis jeg er forsiktig, og hvis jeg faktisk tenke gjennom min logikk riktig
Det burde være nok for bare å si kreve opp toppen
så lenge jeg ikke meg selv ved en feil krever at samme filen et annet sted.
Faktisk er dette en litt mer effektiv måte å gjøre ting deretter bruke
krever en gang, så jeg skal trimme den ned til bare kreve.
>> La oss ta ett skritt videre.
Dette siste eksempelet nå, versjon 5, har en enda renere mappehierarki.
Legg merke til hva jeg har gjort her per lese meg i denne endelige versjonen
er nå har jeg mitt HTML katalogen, som jeg har hatt hele denne tiden,
men innsiden av det er nå bare index.php, lectures.php,
week1.php og week2.php.
Den omfatter katalogen nå bor sammen av HTML-katalogen,
så på samme nivå som søsken, så å si.
Så gjør maler-mappen.
Nøkkelen takeaway her er at jeg har introdusert en litt mer struktur,
men nøkkelen funksjonen er nå at bare de filene
som må være tilgjengelig på Internett, offentlig adresserbare
av en URL på offentlige internett er i min HTML katalogen.
>> Imens andre filer, helpers.php, footer.php,
header.php, som er uten tvil kanskje mer sensitiv,
kanskje hjelpere har faktisk noen brukernavn og passord eller noen intellektuelle
eiendom av meg, fungerer jeg virkelig ikke vil at verden skal se, selv om uhell.
Det er god praksis å holde ut av den offentlige HTML-katalogen
noen filer som ikke trenger seg å være offentlig.
Alt du trenger å gjøre i dette tilfellet når man ser på, for eksempel,
HTML katalogens index.php fil,
ser vi bare nødt til å være litt mer forsiktig når som krever
eller kreve en gang denne filen.
Jeg må først gjøre .. for å gå til den overordnede katalogen,
så gjør / includes / helpers.php
å dykke ned i å få filen som jeg bryr meg om.
>> Eventuelle spørsmål da på MVC
eller denne relativt enkle inkarnasjonen av disse?
Og la meg gjøre det klart at vi fokusert mye på
V her, utsikten og factoring ut av disse malene.
Vi har egentlig ikke skilles M fra C ennå.
Faktisk, det er egentlig ingen M her, og selv vår C,
kontrolleren, er egentlig ikke gjør så mye, men du får mye mer
kjent med begge disse to brevene fra MVC,
eller rettere sagt, vil du få mye mer kjent med C
i MVC for oppgavesettet 7, så det er mer av det i horisonten.
Spørsmål?
Det er faktisk ingen her.
>> Ok, la oss nå gå videre til den andre og siste tema for dag.
Det er innføringen av en database.
Frem til dette punktet har vi hatt noen måter å lagre data.
Vi har brukt variabler.
Tilbake i vår C-fil, I / O diskusjon vi begynte å bruke tekstfiler
og bruke filer som fprintf, og da vi selv startet
snakker om CSV-filer litt, kommadelte verdier,
så alle disse tillot oss å ha data lagret
enten ikke-vedvarende eller vedvarende.
Men selv CSVs er egentlig ikke bidrar til å søke
og sette inn og slette.
Det er egentlig bare en dum tekstfil atskilt med komma
rad etter rad for rad for rad, så hvis du ønsker å
søke denne filen det beste du kan gjøre virkelig er lineær søk.
Du må starte på toppen av filen, lese hele greia i,
og se etter noen verdi av interesse.
Hvis du ønsker å sette inn det du trenger å gjøre det samme,
iterating over det og setter det inn i et bestemt sted,
og faktisk, må du gjøre alle de søker logikk selv.
>> Du kan ikke gjøre smarte mønstergjenkjenning på en CSV-fil med mindre du selv skrive inn koden.
Du kan ikke gjøre filtrering av en CSV-fil
med mindre du selv skrive inn koden.
Ville det ikke vært fint hvis noen andre satt i all den innsats
å faktisk gjøre søk enkelt og innsetting lett
og sletting og oppdatering og så videre?
Det er akkurat hva en database er.
SQL, Structured Query Language, er enda et språk
at vi introduserer her i dag, men også dette er ganske tilgjengelig,
og hva vi egentlig skal gjøre er å plukke bare ut av det noen av de mest fremtredende
egenskaper slik at for pset 7, og hvis du gjør noe webbasert,
det endelige prosjektet, har du muligheten til å uttrykke deg selv
i form av data-spørringer.
Du har muligheten til å lagre litt eller mye data
i en mye mer strukturert måte som vil ved slutten av dagen
gjøre livet ditt enklere fordi med SQL kan du uttrykke deg
mye mer presist, mye mer metodisk for å
få tilbake noen delsett av data fra et større korpus av data.
>> Du kan tenke på en database, i dette tilfellet en SQL-database, virkelig liker Excel
eller Numbers hvor det er et regneark,
eller kanskje flere regneark, og et regneark, selvfølgelig,
har rader og kolonner, og det er fordi
SQL databaser er relasjonell, relasjonelle i den forstand
at de lagrer data i form av disse tabellene,
rader og kolonner.
De er høyere ytelse enn noe sånt som et regneark,
og et regneark er ment å bli brukt av et menneske.
En database er ment å bli brukt av en programmerer
skrive kode mot den, så inkarnasjonen av en database
kommer til å være enten kommandolinjen.
>> En av de mest populære relasjonsdatabaser ute er, igjen, MySQL
som er fantastisk gratis, svært høytytende, og dette er hva
Facebook brukes veldig tidlig og til en viss grad fortsatt i dag
å lagre mye av sine data, og vi vil se i et øyeblikk
at bruk relativt enkle kommandoer
vi kan velge data, legge inn data, oppdatere data,
slette data og lignende, men heldigvis er det en mer brukervennlig grensesnitt
enn bare å skrive på en svart og hvit rask her.
Vi vil bruke for pset 7 og utover et gratis verktøy kalt phpMyAdmin.
Navnet er tilfeldig.
Verktøyet skjer for å bli implementert i PHP,
men det er fundamentalt irrelevant.
Hva er nyttig om phpMyAdmin er at det er en web-basert verktøy.
Vi har pre-installert det i apparatet for deg,
og med den kan du lage tabeller i en database,
du kan sette inn data, slette data, og generelt se
dataene i en ganske brukervennlig miljø.
Brukerne ikke kommer til å bruke phpMyAdmin.
>> Dette er egentlig bare en administrativ eller utviklerens verktøy
som å se og rote rundt dine data og finne ut hvordan å strukturere det,
mye som du kanskje selv bruker Excel eller Numbers,
men det kommer til å være en fin måte å visualisere hva som skjer under panseret
slik at du kan fokusere på det interessante problemløsning og ikke så mye
på uforståelige kommandoer.
La oss ta en titt på et eksempel på data som kan lagres tabularly
i en relasjonsdatabase.
Her er et slikt eksempel.
Nå, dessverre, feilet phpMyAdmin på siden av å kaste altfor mange ord
og grafikk med deg, men hvis du hone bare på
ID-kolonnen, brukernavnet stammen, og hash-kolonnen,
Dette er effektivt et regneark, men det skjer for å være en kodebit
av en tabell inne i apparatet
bruker en fil som vi gi deg i oppgavesettet 7.
>> Spesielt gir vi deg en fil som representerer
en brukers bord, så et regneark som inneholder brukere med 3 kolonner,
hvorav den ene er en unik ID starter på en og blir økes deretter.
Den andre kolonnen er et brukernavn, og de av dere som gjorde Hacker,
Hacker utgaven for pset 2, kan gjenkjenne noen av disse brukernavnene minst.
På høyre side er passord, men de er ikke bokstavelig passord.
De er hashes derav, så det viser seg
at lagring passord i en database er en veldig dårlig idé.
Du har vel alle lest på et tidspunkt av noen nettside
eller noen selskapets database blir kompromittert, og deretter må du
endre passordet, må du få refusjon på ting
fordi noen bad guy faktisk brøt inn på kontoen din som et resultat.
>> Lagring passord i klartekst, ukryptert i en database
er helt asinine, og likevel er det sterkt morsomt
deretter å lese om noen svært kjente selskaper
noen ganger i pressen som databaser er kompromittert,
og at en del er ikke morsomt, men det faktum at databasene inneholder ukryptert
passordene er latterlig fordi bokstavelig talt med en linje med kode
du kan beskytte mot en bestemt trussel, og det er det vi har gjort her.
Selv for våre falske liten CS50 Finance versjon
vi kryptere passord bare for godt mål, og det faktum at
alle disse passordene starter med $ 1 $ er bare en konvensjon.
Det betyr bare at de er kryptert eller virkelig hashed,
som er som en enveis kryptering funksjon
der du ikke kan reversere effektene med noe som kalles MD5.
>> Det faktum at 50 er etter det betyr at et salt verdi
av 50 ble brukt for hashing alle disse passordene unntak av én.
Mine, selvfølgelig, som du kan se det, HA,
var med en annen salt, så de av dere som fikk litt tripped opp
kanskje i Hacker 2, som kan ha vært et resultat av at vi har brukt
en annen hash enn de andre fordi passordet mitt er egentlig det samme
som en annen bruker der oppe.
Faktisk, hvis du har ventet alle disse ukene for å finne ut
hva disse passordene var her var de passordene som du ble utfordret
å knekke i Hacker utgaven av oppgavesettet 2, så ingen for vanskelig.
Faktisk var Malan er det samme som jharvard,
men hvis vi går tilbake de så annerledes.
>> Fokus på jharvard i Crimson fordi de ble saltet annerledes.
Algoritmen var perturbed på en måte at den
hash-verdi, ser den krypterte verdien en litt annerledes
fordi inngangene var litt forskjellig, men passord under panseret
var fortsatt til slutt rød.
Nå, hvem bryr seg om dette?
Vel, vi gir deg prøven brukere, prøven brukernavn
og hashes av passordene sine, slik at du faktisk har noen
kunder for CS50 Finance når du først får av bakken med koden din.
Du må gjennomføre flere tabeller innsiden av MySQL, på innsiden av databasen.
Du må opprette flere regneark, effektivt, men vi bestemte oss for å gi deg dette
å komme i gang, og du vil se at oppgavesettet spesifikasjonen
leder deg gjennom prosessen med å importere denne tabellen
og også forklare hva noen av karakteristikkene er,
og du vil også se at vi gir deg koden
å håndtere hashing eller kryptering av passordene
slik at du ikke trenger å bekymre deg for mye om hva MD5 eller lignende er faktisk handler om.
>> Så, SQL, Structured Query Language.
Dette er ganske enkelt, det språket vi er i ferd med å begynne å bruke i pset 7
og kanskje utover å be data fra noen database.
Dataene igjen, lagres tabularly i disse relasjonstabeller, kolonner og rader,
men ved hjelp av noen relativt enkle syntaks som sletting,
sette inn, oppdatere og velg kan vi gjøre akkurat det.
Vi kan slette fra databasen, sette inn,
oppdatere data, samt utvalgte, som henter, data fra databasen.
Hvordan går vi om dette?
La meg gå videre inn i apparatet.
La meg trekke opp http://localhost,
som igjen, er det lokale selve apparatet.
Det er dens standard kallenavn.
Og la meg gå til / phpmyadmin.
Dette skjer for å være en spesiell URL at apparatet er forhåndskonfigurert til å forstå
som ber meg umiddelbart om et brukernavn og passord.
>> Som vanlig, jeg kommer til å skrive jharvard og skarlagen,
men innser det er administratorkonto på datamaskinen.
Det er bare en tilfeldighet at det er også en jharvard registrert for CS50 Finance.
Jharvard, rød, gir Enter meg brukergrensesnittet som vi så
et glimt av et øyeblikk siden, og det er litt overveldende i starten,
men trygg, du aldri kommer til å klikke de fleste av lenkene i dette verktøyet.
Du vil ende opp med å bruke en liten del som er super nyttig,
hvorav den første er databaser opp her.
Hvis jeg går opp til databaser, legge merke til at jeg er bedt om å opprette en database.
Dette er som å lage en ny Excel-fil, effektivt.
Jeg kommer til å gå videre og kaller dette foredraget, og jeg skal bare ignorere feltet der, sortering.
Det har å gjøre med representasjon av data der,
og jeg kommer til å klikke skape, og nå merker som jeg slipper å lage
på venstre side hvor det står ingen databaser
Jeg skal snart se forelesningen database.
>> Hvis jeg nå klikke på venstre side, forelesningen database,
merke mine faner endre litt.
Jeg har struktur, SQL, eksport, import og noen andre ting.
Strukturen er ganske mye tom.
Ingen tabeller funnet i databasen, som det står her,
så la oss lage en tabell, og la oss gå videre og opprette en tabell
liker elevene, og hvor mange kolonner vi ønsker?
La oss holde dette enkelt, og la rekord for hver student
et ID-nummer, et navn og en e-postadresse.
>> Vi vil holde det enkelt sånn, så 3 kolonner, gå.
Skjemaet som du ser her er nå litt rotete og overveldende,
men vi må bare gå gjennom det rad etter rad, så veldig raskt la oss gi
den første kolonnen i denne databasen et navn ID for den unike identifikator.
Det vil være et heltall. Jeg kan faktisk ignorere lengde og verdier.
En int kommer til å være 32 bits uansett hva du skriver der, så la oss la det stå tomt.
Standardverdi, kan jeg gjøre det null, slik det er definert.
Jeg kommer til å forlate det alene. La oss bekymrer seg ikke standardverdier.
La oss rulle over her til høyre, attributter.
Dette er interessant.
La oss gå videre og noe vilkårlig si at IDer må være usignert.
La oss ikke kaste bort noen negative tall.
>> La oss gå 0-4 milliarder, gi eller ta,
og så la oss ikke berøre noen av disse feltene ennå der borte,
men så la meg skrive inn navn her nede,
og deretter den andre var e-post, slik at fangsten er e-post
og navn, åpenbart ikke heltall, så la oss endre disse til et annet felt.
Det viser seg varchar, variabel lengde røye,
er som en streng i en SQL-database
men en variabel lengde, og du faktisk nødt til å fortelle det på forhånd
Maksimal lengde på strengen, så jeg kommer til noe vilkårlig
av konvensjonen typen 255 tegn.
Jeg kunne helt si 32. Jeg kan si 1000.
Du slags behov for å bestemme selv basert på dine demografi hva er
den lengste studentens navn og gå med det nummeret eller litt større,
men hva er fint om en varchar er det ikke kommer til å kaste bort
255 byte på hver elev navn.
Hvis det er DAVID det ikke kommer til å bruke en hel 255 bytes,
men det er en øvre grense, så jeg skal gå med 255 bare ved konvensjonen,
men vi kunne debattere det å være noen lavere verdi, og for e-postadresse
bare for å være konsekvent 255, men igjen, vi kunne ha den samme debatten.
Men jeg kommer til å gjøre en annen ting over her på høyre side.
>> Hva er kraftig om en database er at den kan gjøre mye tunge løft
eller komplekse arbeidet for deg.
Spesielt jeg virkelig ikke bryr seg hva min student ID-nummer er.
Det er bare ment å være en unik identifikator i en database
så jeg har en 32-bit fyndig representasjon av at studenten
slik at jeg har noen måte å unikt identifisere dem
lest det være to Davids, for eksempel i en klasse.
Faktisk, jeg kommer til å sjekke dette AI boksen, auto tilvekst,
slik at databasen, MySQL, finner ut
hva hver nyinnsatte student ID skal være.
Jeg trenger ikke engang å bry seg om det i min kode,
og jeg også kommer til å velge noe under indeksen menyen.
Indeksen faller ned her har grunnskole, unike,
indeks og fulltekst.
Du kan kanskje gjette hva et par av disse tingene er,
men det viser seg i relasjonsdatabaser
du programmerer eller databaseadministrator komme til preemptively
gi hint til databasen på hva felt
i en tabell er litt spesiell.
>> For eksempel, i dette tilfellet kommer jeg til å si at ID
kommer til å være en primær indeks, ellers kjent som en primærnøkkel.
Hva dette betyr per definisjon er at ID heretter
vil identifisere elever i denne tabellen.
Ingen Studenten skal ha samme ID fordi jeg er imponerende denne begrensningen eller denne indeksen.
Dessuten, hva dette kommer til å gjøre for meg er det kommer til å fortelle
MySQL som ID er spesiell.
Jeg bryr særlig om ID, så gå videre og gjøre din fancy datastruktur magi,
bygge opp en slags tre.
Vanligvis er det noe som kalles B-treet, som vi ikke ser på uker siden,
men det er en annen slik data struktur som ligner i ånden til de binære trær
og prøver som vi så på, men det kommer til å si
til databasen dette feltet er så viktig at jeg sannsynligvis
ønsker å være i stand til å søke på det, gå videre og bygge opp noe fancy
datastruktur i minnet for å fremskynde søkene, slik at ideelt
de er konstant tid eller i det minste så nær som mulig
slik at det ikke tilfaller til lineær søk, som ikke kommer til å være
den mest høytytende tilnærming.
Derimot, kunne e-postadresse er stemt en primærnøkkel.
>> I teorien er alles e-postadresse unik, med mindre du deler noen konto,
men det er generelt ikke bra å bruke noe sånt som en streng
som primærnøkkel fordi hvis formålet i livet er å identifisere
rader i tabellen er det ingen grunn til å bruke 255 bytes maksimalt
å identifisere noen hvis du kan komme unna med bare 4 bytes
eller en 32-biters int.
Generelt bør en primærnøkkel være kort og konsis
og ideelt noe som et heltall eller en stor int, som skjer for å være 64 bits.
Men en e-postadresse skal være unike, og en av funksjonene i en database for
er å håndheve unikhet for meg.
Ved å velge unike her ved siden av e-post, selv om e-post selv
er rullet forbi på skjermen, jeg sier til databasen
ikke stol på meg.
Ikke la meg sette inn i databasen
samme e-postadresse to ganger, selv om jeg er en idiot, og jeg er ikke
veldig bra med mine IFS og annet IFS og faktiske PHP-kode
og jeg tilfeldigvis la brukeren registrere seg med en eksisterende e-postadresse
databasen er enda et nivå av forsvar for korrekthet
for å sikre at at duplisert e-postadresse ikke ender opp i tabellen.
>> Nå, derimot, for navnet du sannsynligvis ikke vil gjøre det unike
fordi da det aldri kunne bli to Davids eller to Mike Smiths, for eksempel,
i databasen, slik at vi får bare la være.
Jeg kommer til å gå videre og klikk lagre nederst til høyre,
og alt ser bra ut, men legg merke opp her
Dette er en del som for nå vil vi ikke bruke for mye tid på
fordi syntaksen er litt komplisert, og vi trenger ikke å opprette tabeller
alle som ofte, men SQL seg selv er et språk,
syntaksen som er akkurat her at jeg har uthevet.
Hva phpMyAdmin egentlig gjør er det skaper en web-basert GUI for deg
som du kan spare tid og ikke trenger å manuelt skrive ut
en ganske lang SQL spørring sånn.
>> Med andre ord, hvis du ønsket å manuelt lage denne tabellen,
enten ved at svart og hvitt rask eller i phpMyAdmin
ved hjelp av denne andre kategorien, denne SQL-kategorien hvor du kan skrive inn noen SQL-spørringer
du vil, ærlig, dette ville ha tatt meg et minutt
å faktisk huske hele syntaks, og selv da jeg sannsynligvis ville ha
gjort noen skrivefeil, så dette verktøyet er nyttig for ting som det, og det er også lærerikt.
Du kan begynne å antyde hva syntaksen er
bare ved fin farge koding som phpMyAdmin er å legge
for vår visuelle bekvemmelighet.
Men la oss nå gjøre dette i stedet.
La meg gå til kategorien Sett på toppen, og la meg gå videre og sette for eksempel
en ID for la oss si-faktisk bryr jeg meg ikke.
Det kommer til å auto tilvekst. Jeg kommer til å la databasen håndtere dette.
Men jeg skal være David, og min e-post bør være malan@harvard.edu.
>> La oss gå videre her og satt i Mike Smith som en annen.
Jeg skal gi meg selv et etternavn også,
og vi vil ha ham være smith@example.com,
og deretter hvor går jeg nå?
Vel, det ser ut som go er knappen til å klikke, og voila.
Legg merke til de beste to rader satt.
Dette er den faktiske SQL spørring.
Det er phpMyAdmin verktøy henrettet for meg,
men sluttresultatet, varsel, hvis jeg nå går til bla kategorien
er å se to rader i denne tabellen, veldig minner estetisk
av tabellen så vi tidligere for våre brukere fra pset 7,
en av dem er David Malan, hvorav nå er Mike Smith.
Men bare for å være klar, jeg trenger ikke å bruke phpMyAdmin,
og ja, du kommer til å snart være å skrive kode for pset 7
som automatiserer prosessen med å legge til rader, slette rader, oppdatering rader og lignende,
så la meg i stedet gå til SQL-kategorien her oppe
og skriv inn select * fra studenter der
email = "malan@harvard.edu."
>> Med andre ord anta nå har du
noen HTML-skjema, og brukeren skriver i sin e-postadresse, blant andre felt,
og målet er nå i PHP på baksiden slutten koden
å faktisk slå opp at brukerens andre detaljer.
Hva er ditt fulle navn? Hva er ditt ID-nummer?
Du kan skrive en SQL-spørring som dette, velger du * fra studenter
der email = "malan@harvard.edu."
Og hvis jeg deretter gå, merker at jeg burde, og faktisk jeg får tilbake bare én rad.
Mike er utelatt fra dette resultatet settet, som samlingen rader
vanligvis kalles, fordi han ikke har den samme e-postadresse som meg.
>> Nå, igjen, her for pset 7 vil du bruke phpMyAdmin som et administrativt verktøy
og et pedagogisk verktøy for å lære din vei
verden rundt av SQL, men på slutten av dagen
du kommer til å skrive disse spørringene innsiden av selve PHP-kode,
og så følg i Zamyla sin walkthrough spesielt
der du får en omvisning på distribusjon koden for dette problemet sett
der vi har gitt deg ikke bare estetikk til påloggingssiden
og hyggelig sexy logo som sier CS50 Finance, men vi har også gitt deg
en haug av funksjoner som vil gjøre livet ditt litt enklere.
Vi har også skrevet en del av pset for deg,
login del av det særlig til å gi deg en følelse av et representativt utforming
som bruker faktisk en kontroller, for eksempel, index.php,
login.php og lignende, og da vil du se pset har også en maler katalog
som har alle dine synspunkter, alle estetikk.
Og så generelle arbeidsflyten i pset 7 kommer til å være at
brukerne besøker en kontroller via en URL i en nettleser.
Som controller inneholder PHP-kode som du skrev, og innsiden av PHP-kode
kan noen linjer av SQL nestet i mellom doble anførselstegn
og sendes til en funksjon vi skrev kalt spørring
som vil hjelpe deg å snakke til databasen uten å bruke noe sånt
et administrativt verktøy som phpMyAdmin.
>> Du vil være i stand til å skrive SQL-setninger i PHP-kode
og få tilbake en PHP rekke resultatsettet,
av radene som faktisk passer dette søket.
Og tilsvarende vil du være i stand til å gjøre innstikk eller sletter
eller oppdateringer eller lignende, syntaks som er ganske lik,
og du vil se fra noen online referanser, fra distribusjon koden
og fra pset pakke seg nøyaktig hvordan du skal gå om du gjør det.
Realiser slutt vi egentlig bare toppen av isfjellet av SQL
og MySQL, men kraften av det er egentlig at det frigjør deg
å fokusere på de problemene du ønsker å løse, brukstilfellene du ønsker å implementere
uten å måtte bekymre ganske så mye, i hvert fall tidlig,
om hvor og hvordan du lagrer og søker databasen,
og dette er ganske bokstavelig talt hvor Facebook selv fikk sin start
bruker MySQL og deretter bruke flere MySQL-servere og deretter mer MySQL-servere
før lenge før de deretter måtte virkelig begynne å tenke hardt om hvordan du
lagre data, hvordan du oppbevarer ting enda mer effektivt,
så selv om vi tar for gitt at indekser og unike begrensninger
og så videre bare jobbe der er en veldig interessant samtale
at dette kan alle føre til, så skjønner at vi bare skrape overflaten
av hva som kan til slutt for deg eller dine prosjekter blir ganske mye av store data.
>> Med det sagt, la oss avslutte her, og vi vil se deg neste uke.
[CS50.TV]