[Powered by Google Translate] [Vecka 8, Fortsättning]
[David J. Malan] [Harvard University]
[Detta är CS50.] [CS50.TV]
>> Detta är CS50, så detta är slutet av vecka 8 här.
Vi hade naturligtvis lite av en orkan tidigare i veckan,
så just nu är det egentligen bara du och jag i denna sal,
men idag fortsätter vi vårt samtal om PHP
och om webbprogrammering mer allmänt, och vi introducerar också idén
av databaser, som kallas särskilt en MySQL, vilket är ganska populär i dessa dagar,
till stor del på grund av dess skalbarhet samt eftersom dess vara fri och öppen källkod.
>> Men först, en titt på där vi slutade förra gången.
Minns att vi tittar på de olika Frosh snabbmeddelanden exempel,
och detta var den ohyggliga form som jag kom med några 15 + år sedan
för att få studenter på campus register för recentior intramural sport
utan att behöva vandra längre över gården till Wigglesworth
att glida en fysisk papper under några proctor dörr.
Istället flyttade vi allt på nätet, men att göra det vi behövde utnyttja
av några tekniker, så en, vi behövde HTML, Hypertext Markup Language,
vilket är igen denna märkningsspråk som du gör webbsidor strukturellt.
>> Med hjälp av en bit av CSS dessa dagar, CSS,
där vi använder stylizations av webbsidan med hjälp av en något annorlunda syntax,
medan HTML handlade om dess struktur.
Vi måste också införa ett språk webbprogrammering.
I det här fallet använder vi PHP och PHP kommer att ge oss
dynamiskt utgång innehåll samt göra programmatiska saker som
skicka e-post, vilket var fallet på sedeln vi lämnade förra veckan.
>> Minns att koden för detta var 2 delar.
En hade vi froshims3.php,
och detta var i stort sett uppmärkning med ett HTML-formulär inuti den,
en liten bit av CSS upp här i stil attribut
så att själva formuläret skulle vara centrerad på sidan, men utöver det
Vi hade några representativa bildar ingångar, ett textfält en kryssruta,
vissa radio-knappar, en utvald meny, och en submit-knapp.
Och via detta formulär, lämnade vi till en fil som tydligen hette register3.php,
som själv såg lite ut så här.
Nu var mest av koden i register3.php, minns, allt om e-post.
Det gjorde lite validering av formulär som lämnades för att se
att fälten faktiskt förutsatt att förväntades.
Då vi kallade några PHP funktioner med något nytt syntax,
även om det är lånat från C.
>> Denna pil operatör tillåter oss att använda något som kallas objektorienterad programmering.
Vi kommer inte att gå in på det i detalj här, men vet nu
det är ett sätt att ha funktioner som är associerade med objekt,
som är en särskild typ av struktur, som vi såg i C.
Men för nu, bara ta på tron ​​att detta är rätt syntax för att använda
när du använder ett bibliotek som denna PHPMailer bibliotek.
Och sedan i slutet av den här filen hade vi dynamiskt ett mail
som fick skickade till min jharvard@cs50.net konto
från mitt jharvard@cs50.net konto,
och vi informerade användaren därför att de hade registrerats för denna sport.
Det är ganska mycket vad Frosh snabbmeddelanden platsen gjorde alla dessa år sedan
När jag genomfört det, beviljas på ett annat språk,
men det visar kanske den makt som du har
nu när du kan uttrycka dig inte bara programmatiskt
på en låg nivå i ett språk som C, men på en mycket högre nivå
med dessa mycket verkliga applikationer som e-post att faktiskt lösa
några verkliga problem.
>> Nu, naturligtvis, även om jag använder detta skript för att generera några
e dynamiskt från jharvard@cs50.net, som verkligen ett konto
att jag har tillgång till, var ganska noga med att skicka
post bara från konton som är faktiskt din egen,
så att det blir du i lite hett vatten i livet.
Med det sagt, låt oss nu övergå till att lösa ett annat problem helt och hållet,
som behåller stater.
Nu, vad betyder egentligen?
HTTP, denna hypertext transfer protocol,
är faktiskt en statslös protokoll, och vad detta innebär är att
när du drar upp något som Google.com och sedan slå in
vanligtvis din webbläsare har någon form av spinning ikon som sedan
resulterar i en viss webbsida som hämtas,
och sedan den lilla ikonen slutar snurra, och som faktiskt tyder
att HTTP har slutfört någon form av koppling till servern och det är det.
HTTP är statslöst i den meningen att den inte upprätthåller
en beständig anslutning till servern på samma sätt Skype
eller Gchat gör eftersom med HTTP
antagandet är att när du har hämtat en webbsida som är det.
>> Nu i verkligheten i dessa dagar på sajter som Facebook och Google Maps
och Twitter och liknande finns det mycket mer dynamik där
även efter att ikonen slutar snurra du kan faktiskt få fler uppdateringar
från servern, fler tweets, fler statusuppdateringar på Facebook och liknande.
Men även som använder en teknik som vi pratar om i en vecka eller två
kallas Ajax med ett språk som kallas JavaScript
men i slutet av dagen, är HTTP fortfarande statslösa.
Och ändå om du vill något ihåg saker om en användare
även efter att de har kopplats från servern
PHP gör ger dig ett sätt att göra detta
eftersom, som vi såg förra gången, har PHP ett antal superglobals,
och ett superglobal är, återigen, en särskild global variabel
som är lämnas till dig av webbservern och PHP själv.
>> Du behöver inte göra något för att sätta värden i det,
och bland superglobals vi sett hittills är få och efter,
som är där formulärfält läggs automatiskt för dig,
liksom ett par andra som vi inte har sett ännu.
Inuti $ _SERVER finns några speciella variabler relaterade till själva servern.
Vad är IP-adressen, vilket protokoll, HTTP eller HTTPS använde du,
Vad begär metod använde du och liknande, så det finns några intressanta,
saftiga detaljer om servern, och i själva verket användaren där.
Det är $ _cookie, som är där dessa saker som kallas cookies lagras.
Vi kommer inte att lägga tid på kakor själva idag,
men vet nu att en cookie är bara en liten bit av information
att en webbserver kan plantera på en webbläsare
och i sin tur dess RAM eller dess datorns hårddisk
att lagra information om en användare, till exempel, deras användarnamn
så att de inte behöver skriva in det varje gång de loggar in eller någon
unikt nummer eller ID för den användare
så att du inte behöver tjata dem med samma slags frågor om
preferenser i framtiden, men de flesta av intresse
just nu är $ _SESSION.
>> Denna superglobal, som liksom de andra, lämnas till dig automatiskt med PHP
När du skriver PHP-baserade webbplatser
kan lagra vad du vill, strängar, heltal,
flytande punkter, värderingar, arrayer, objekt,
verkligen något som du vill, och det tillåter dig att lagra den på ett sådant sätt
att även om användaren besöker dig nu och då
kommer tillbaka en minut från nu eller 5 minuter från nu eftersom
de tar sin tid innan du klickar någon annan länk
PHP kommer att säkerställa att vad du sätter i den sessionen superglobal
en minut eller 5 minuter sedan kommer att finnas kvar när användaren återvänder.
Och under huven här superglobal genomförs genom
dessa saker kallade cookies, men nu är det bara en abstraktion
varigenom det är typ av den programmatiska motsvarigheten till en kundvagn.
Oavsett vad du, programmeraren, lägg i den
superglobal associativ array kommer att vara där ett visst antal minuter senare
tills du raderar den eller tills användaren avslutar sin webbläsare helt och hållet.
>> Låt oss ta en titt på ett exempel på hur denna sak faktiskt används.
I counter.php bland dagens delar av kod
Vi har följande rad.
I början av den här filen har vi ett gäng blå kommentarer som ointressanta för nu.
Men i linje 13 har vi en ny linje,
session_start, och som faktiskt gör exakt vad den säger.
Det börjar sessioner.
Det gör att du kan använda den stora superglobal $ _SESSION, och det är så enkelt är det.
Om vi ​​nu fortsätter att titta på rad 16, låt oss försöka lista ut vad denna webbsida kommer att göra.
Om (isset ($ _SESSION ["räknare"]) sedan gå vidare
och förvara i räknarvariabeln, gemener disk,
$ _SESSION ["Räknare"].
Detta verkar vara att förklara en lokal variabel som heter disk
inuti vilket det sätta en kopia av det som finns inuti superglobal
kallas session på platsen "disk".
Annars tydligen, denna lilla lokal variabel räknare initieras till 0.
>> Men sedan några rader senare 26 Observera att sessionen exemplar av räknare,
sin nyckel, har en ny värde som tilldelats som är dess nuvarande värde plus 1.
Kort sagt, verkar denna fil som ska uppdateras
en räknare som lagras inuti sessionen superglobal
genom inkrementering det med 1, men det behåller först en kopia av det tidigare värdet
genom att lagra den i en lokal variabel som heter $ räknare,
och sedan ner här låt oss se vad som återstår.
Det visar sig att det är ganska mycket bara HTML.
Längst ner på denna sida ser vi i linje 37 som jag har besökt den här webbplatsen
räknare antal gånger, så det finns ett par intressanta funktioner här.
Ett, är detta helt klart en variabel, men det räcker inte att bara sätta
$ Räknare i kroppen av HTML grund naturligtvis
om det bara finns bland HTML PHP kommer att anta att det bara HTML.
Du vill bokstavligen $ mot att skrivas ut på skärmen.
>> Men istället genom att släppa in PHP-läge
med denna del av syntaxen kan vi dynamiskt infoga ett värde här
mycket lik i anden vad vi gjorde förra gången med
sätta värden till strängar.
I själva verket är detta bara en förkortning notation för att säga något sådant bokstavligen,
print ($ räknare) eller något liknande printf (% s, disk),
eller ens, som ni kanske har sett på nätet eller i läroböcker,
Det finns en funktion i PHP som kallas eko
som gör samma sak, och alla de är bara längre lindade sätt
att säga <? =.
I detta ett fall behöver du inte lägga
Ordet PHP efter frågetecknet.
Detta är en förkortning notation för, återigen, vad vi bara såg en stund sedan
som ekar något värde.
>> Låt oss se vad slutresultatet av denna faktiskt är.
Låt mig gå över till vår counter.php fil,
och vi ser att David bara gjort ett misstag genom att spela med koden där.
Låt oss gå fix vad han klantade,
och felet verkar vara där, borta, på linje 37.
Enligt till toppen av sidan Jag har besökt denna webbplats 0 gånger.
Nåväl, låt oss gå vidare nu och på toppen av webbläsaren klickar du på
ladda ikon och jag klickar ladda,
och nu har jag besökt webbplatsen 1 gång, 2, 3, 4, 5, 6, 7, 8.
Och faktiskt, om vi tittar på källan till denna sida själva källkoden förändras,
och märker den fullständiga avsaknaden av PHP, och det beror på
PHP-kod utvärderas eller tolkas serversidan,
och så det betyder att utsignalen från PHP-skript är vad som i slutändan är skickas till webbläsaren,
vilket i detta fall är en del rå HTML och lite rå text.
Vad händer här?
>> Tja, med relativt få rader kod jag kan lagra
ihärdigt under loppet av några sekunder, eller om vi väntat länge nog,
minuter, även timmar, visst värde på ett sätt som gör att HTTP
verkar stateful som om vi har kvar
detta sammanhang till servern, och det är bara komma ihåg vad jag sa det förra gången,
men i verkligheten finns det en hel del komplexitet pågår under huven
där kakor som är gör det möjligt PHP att ge mig denna illusion
detta kundvagn-liknande funktion.
För nu, en trivial exempel där vi bara lagrar ett heltal,
men den funktionen kommer tillbaka att vara av stort värde
När vi börjar prata om mer komplexa projekt,
bland dem problem som 7.
Det här är din sista problem som i CS50.
Jag vet, det är så sorgligt, men vad du hittar är att vi kommer att sluta
denna del av terminen genom att faktiskt övergå
av sammanhanget C säkerligen inom ramen för PHP
men när du använder några av de mycket samma grundläggande
Vi har pratat om ett tag.
>> Målet med pset 7 är att genomföra CS50 Finans,
vilken är din egen version av Yahoo Finance eller Google Finance
eller ens Etrade.com där du har möjlighet att
leta upp aktiekurserna för givna symboler, men mer än så
du har förmågan att "köpa" och "sälja" aktier
som handlas på olika börser för som denna hemsida
Här antyder, som verkligen är i vilken utsträckning vi har börjat
problemet uppsättning för dig, har du ett inloggningsformulär som ber om ett användarnamn och ett lösenord.
Den har en submit-knapp, men därefter, som vi kommer så småningom se,
det finns inget händer egentligen på under huven ännu eftersom det
återstår för dig att genomföra möjligheten att registrera nya användare,
möjligheten att köpa aktier, att sälja aktier,
att faktiskt leta upp aktuella aktiekurser.
>> Och faktiskt, kommer detta att vara så verkliga världen som möjligt eftersom vi gjorde
omfatta en bit av kod som gör att du med en enda funktion
att söka Yahoo Finance, som underbart gör tillgängliga gratis uppgifter
för att leta upp aktiekurserna baserade på aktiesymbol eller kortnamn,
och du får tillbaka det aktuella aktiekursen på dagen.
De data du faktiskt ser i detta pset blir
ungefär lika verkliga världen som det kan bli så att du faktiskt gränssnitt
med verkliga lager, verkliga priser,
och vi får se hur mycket pengar du kan göra kanske
under de kommande dagarna att spela med din egen problembild.
>> Men låt oss först ange scenen för hur man designar något som är säkert mer komplicerat
än counter.php, det är mer komplicerat än någon av de Frosh snabbmeddelanden exemplen hittills,
och låt oss försöka införa några paradigm här som gör att vi
både för pset 7 och kanske för din slutliga projekt om du gör något webbaserat
att hålla din kod välorganiserad, att hålla dig frisk,
och ta ett steg mot samarbete, vare sig i CS50 slutliga projekt
eller längre om du fortsätter att programmera något i framtiden.
Det är denna allmänna konstruktion paradigm
i datavetenskap och programvaruutveckling mer allmänt
känd som MVC, Model View Controller,
och detta är en dum förkortning som beskriver en mycket trevlig idé,
vilket är separation av olika aspekter av ett program,
specifikt hålla separata logiken eller affärslogik för en webbplats
så att allt som innebär saker som
ringer funktioner och sökfunktionen databaser och liknande
händer inte bland HTML
utan snarare i separata filer, och faktiskt, det finns här en fil
oftast att du har ringt regulatorn
det är verkligen hjärnan bakom operationen, och vi kommer se ett exempel
detta på bara ett ögonblick.
>> Det finns en modell som programmerar kod
som gör att prata med dina databaser, talar det till Yahoo Finance och liknande,
och sedan finns det V i MVC, åsikter,
alla saker som är relaterade till estetik, de filer som faktiskt innehåller
HTML, kanske din CSS och liknande.
Tanken här, eftersom denna bild antyder, är att styrenheten
är filen, som vi snart se och när du framför ser i pset 7,
att världen talar till via sina webbläsare.
Det är den fil som får besökas på det publika Internet,
men regulatorn pratar med potentiellt en modell,
vilket är en eller flera andra filer som innehåller kod relaterat till data,
kod relaterad till databaser och liknande, och sedan talar till
styrenheten en eller flera andra filer kända som vyer,
vilka är estetik en webbsida, mallar för slag,
som kan ta vissa uppgifter som indata, men i slutet av dagen
den enda logik inuti en vy ska vara rendering av dessa uppgifter,
iteration över en slinga och faktiskt spotta ut några
HTML-baserade återgivning därav eller ens något som en PDF-fil.
>> Vad är trevligt om MVC är att du kan ha olika åsikter
baserat på den typ av enhet, baserat på vilken typ av filformat som du faktiskt
vill visa för användaren.
Låt oss ta en titt på några progressivt mer komplexa och väl utformade exempel
genom att starta först med version 0 här.
Låt mig gå vidare och öppna upp i vår MVC katalog idag
en fil som heter index.php i katalogen 0.
Notera att detta är en super enkel och mycket underwhelming webbplats
Det är typ av version 0 av en hemsida för CS50,
och märker hur vi har en länk till Föreläsningar, har vi en länk till Kursplan,
och om jag följer länken till Föreläsningar meddelande att webbadressen
uppe kommer att förändras till lectures.php.
Om jag följer sedan länken till vecka 1 meddelande att webbadressen ändras till week1.php.
Det verkar vara en ganska enkel hierarkisk struktur här.
>> Låt oss ta en snabb titt under huven på hur detta läggs ut,
och faktiskt, om jag tittar på index.php det är ganska enkelt.
Faktum är att även om jag kallade detta en PHP-fil finns det ingen verklig programmeringskod.
Det finns en kommentar som jag skrev här i PHP bara så att användaren inte sluta se den.
Naturligtvis, som tidigare, något som är i mellan PHP-taggar
blir tolkas även om det är en kommentar till och tolka en kommentar
betyder bara att kasta bort i slutet av dagen och egentligen inte
skicka den till webbläsaren, så allt här är bara estetik.
Om jag öppnar liknande lectures.php detta är för bara en hård kodad fil.
Det händer att kallas något. Php,
men det är egentligen bara. HTML och week1.php, week2.php
liknande är bara uppmärkning, så det finns en massa brister denna design.
Ett, det är en enorm mängd kopiera / klistra in.
Även om det enda som är byte bland dessa filer är oordnad lista,
Li-taggar har jag ändå doc typ, HTML, huvud,
titel, nära kroppen, nära HTML och mer
i varje enskild fil, vilket innebär att om jag någonsin vill omstrukturera
denna webbsida eller restylize det måste jag gå in och ändra
alla dessa filer manuellt eller med några massiva söka och ersätta.
>> Låt oss ta ett steg mot en smartare, mer tänkande konstruktion i version 1 här
varigenom enligt den läser mig att vi har inkluderat så att du kan spela med
Dessa mer avslappnad hemma märker att vi har här
en sammanfattning av de filerna i version 1 av denna webbplats,
och det verkar som jag har tagit på mig att räkna ut
vissa gemensamma kod header.php och footer.php.
Nåväl, låt oss ta en titt på vad som finns inuti den första av dessa.
Header.php ser bekant,
men märker var kommer det bli avskuren?
Direkt efter linjen 19, så det är allt som var vanlig
från filerna index.php, lectures.php,
week1 och week2.php från föregående exempel.
Vad jag gjorde var Kopiera och klipp allt som var gemensam för alla dessa filer,
lägga den i en separat rubrik fil och likaså i footer.php
har jag tillämpa samma princip som innebär att endast intressanta linjer
i footer.php är dessa två, nära kroppen och stäng HTML.
>> Men vad detta innebär nu är att i den nya versionen
av index.php meddelande hur mycket enklare det kan bli.
Visst, lite mer kryptisk ut, lite mindre intuitivt
att följa upp och ned, men min Gud, allt detta redundans nu borta.
Vi kräver hjälp av en PHP-funktion bokstavligen kallas kräva upp överst,
som är mycket påminner, minns, av C: s # include mekanism.
Vi kräver header.php överst.
Vi kräver footer.php i botten, och det enda som skiljer
eller speciellt med den här filen är innehållet som är tänkt att vara unik för det.
Om jag då gå in, säg, lectures.php gäller samma princip.
Återigen några kommentarer upp toppen, men då jag behöver sidhuvud, kräver sidfot,
och mellan det är bara innehållet som faktiskt har förändrats.
Och om vi tittat på vecka 1 och vecka 2 skulle vi se
att samma princip hade tillämpats där.
Tja, vi är inte riktigt gjort det.
>> Låt oss ta en titt på version 2, som har en liknande struktur,
men märker nu har jag infört något annat.
I linje 10 har jag infört helpers.php,
vilken innehåller tydligen hjälpfunktioner.
En hjälparfunktion är vanligen en relativt kort funktion
att du skriver för att hjälpa dig på olika platser,
och låt oss se vad som finns inuti helpers.php.
I det här fallet ser det ut som det har 2 funktioner.
Minns från den andra dagen med vår kub exempel
kan du definiera egna funktioner i PHP, och vad jag har gjort nu är jag har
definierade funktioner kallas göra sidfot och gör sidhuvud,
av vilka den första tar en parameter som kallas uppgifter,
vars standardvärde är en tom array, som föreslås där,
och vi kan faktiskt skriva det ännu mer koncist i den senaste versionen av PHP
genom att säga öppna hakparentes, stängt hakparentes.
Det innebär en tom array av storlek 0 men ändå en matris.
>> Detta extrakt funktionen är lite speciell genom att
vad den gör är det tar som argument en associativ array
som har 0 eller flera nyckelord värdepar, och om du har en nyckel foo
och ett värde på bar extraktet funktionen
skapar en situation som nu, såsom i ledning 11,
du har en lokal variabel som heter $ foo vars värde är bar.
Och om du hade fler nycklar och värden i datauppställningen,
liknande sätt skulle de extraheras i den lokala omfattningen
eller namn utrymme så att footer.php och
samma idé här nere så att header.php
har tillgång till dessa variabler.
I själva verket, låt mig öppna upp igen header.php
och uppmärksamma nu hur det ser ut i denna version.
>> Snarare än hårt kodning CS50 som rubrik för varje enskild sida
märker den dynamik som är möjligt nu.
I linje 5 Jag ekande en titel variabel,
men först jag passerar denna titel variabel till en funktion som kallas htmlspecialchars.
En dum namn för en funktion, länge som det är, men det gör verkligen vad den säger.
Det säkerställer att alla specialtecken
i strängen som har gått i korrekt flydde HTML.
Detta är faktiskt ett sätt att undvika något som kallas en cross site scripting attack
där någon kan uppsåtligt eller oavsiktligt
injicera sin egen HTML på din hemsida
genom att klistra in någon form, till exempel,
något som du inte riktigt väntade, särskilt JavaScript-kod,
som vi pratar om i en vecka eller två tid.
>> Detta är nu header.php, det är en vy
i den meningen att den låter dig se estetiskt innehållet i några datamängd.
Men mer specifikt, är det en mall.
Detta är en slags blåkopia nu av vad vi vill sidhuvudet på varje sida ska se ut,
men det finns en viss dynamik i att vi vill att titeln ska dynamiskt in
baserat på titeln variabeln
som extraherades när vi ringde, igen,
den render header-funktionen.
Om vi ​​nu tittat på render sidfoten, det finns faktiskt inte mycket användning av det just nu
eftersom footer.php finns det ingen dynamik alls.
Det skulle kunna vara, men just nu är det en hård kodad lista på 2 taggar,
men samma idé tillämpas, så som faktiskt antyder varför
har vi slösar tid med en render sidhuvud och en render sidfot funktion?
Låt mig gå i stället nu i version 3,
och i version 3 i hjälpare jag beslutat att förenkla det ännu mer.
>> Låt mig få en render funktion.
Låt mig få det ta ett annat argument, som kallas den här gången mall,
vilket är tänkt att vara namnet på en mall,
och då kommer jag att sammanlänka förmätenhet. php till den variabelns värde,
och sedan om det finns foo.php, bar.php eller header.php och footer.php,
då jag ska gå vidare och extrahera variabeldata
och sedan kräver den vägen.
Med andra ord, för att använda detta nu, om jag öppnar index.php
märker att jag inte ringer render huvudet längre.
Jag kallar bara göra, men jag passera i ett noterat värde på huvudet
att klargöra vilken mall jag vill verkligen att ladda.
>> Sedan hit märker vad jag gör.
Jag passerar i dynamiskt en nyckel titel,
ett värde av CS50 och även detta, som vi såg tidigare,
skulle kunna göras mer kortfattad i den senaste versionen av PHP
där jag kan byta arrayen funktion med hakparenteser,
som jag föreslår är ännu mer lättläst och säkert
lite lättare att skriva.
Och naturligtvis, med render sidfoten samtalet i botten,
Vi behöver inte fundera passerar i ett andra argument alls, utan associativ array,
för det finns inget dynamiskt inuti den sidfot.
Det är bara några nära taggar för HTML.
Bra, vi tar steg mot riktigt städa upp saker här,
men låt mig öppna upp 2 slutlig exempel.
Den här, nummer 4, märker att jag har gjort ett medvetet beslut nu
att förbättra det föregående exemplet genom att slutligen använda en del hierarki med filerna.
>> Observera att i denna sammanfattning, i detta läsa mig, jag har infört
en inkluderar katalog och en mallar katalog
vars innehåll kommer att vara de saker jag vill ha med
och de mallar som jag vill göra, respektive.
Detta är verkligen mig att anal och försöker hålla ordning,
hålla relaterade filer tillsammans, men slutresultatet
är att vi nu har en något snyggare installation, men vi måste komma ihåg nu
i, till exempel, index.php
när vi kräver filen helpers.php
vi nu kräver det via includes / helpers.php
snarare än att bara säga helpers.php för nu är det faktiskt i en underkatalog.
Nu, som en undan, ser du i dessa exempel och några andra
funktioner som kräver kräver en gång.
Det finns faktiskt en funktion i sig heter omfattar och de har alla lite olika beteenden.
Här säger jag behöver en gång för att göra super klart att jag bara vill att de
medhjälpare som ingår i mitt projekt en gång.
Men om jag är försiktig och om jag verkligen tänka igenom min logik ordentligt
Det bör räcka för bara säga kräva upp topp
så länge jag själv inte oavsiktligt kräver att samma fil någon annanstans.
I själva verket är detta en något mer effektivt sätt att göra saker och sedan använda
kräver en gång, så jag trimma ner det till bara kräva.
>> Låt oss ta ett steg längre.
Det sista exemplet nu version 5, har en ännu renare mapphierarki.
Lägg märke till vad jag har gjort här per läs mig i denna slutliga version
Nu har jag min HTML katalog, som jag har haft hela tiden,
men inuti finns det nu bara index.php, lectures.php,
week1.php och week2.php.
De inkluderar katalogen nu bor tillsammans med HTML katalogen,
så på samma nivå som ett syskon, så att säga.
Det gör mappen Mallar.
Det viktigaste takeaway här är jag infört lite mer struktur,
men det viktigaste inslaget är nu att bara de filer
som behöver vara tillgängligt via nätet, allmänt adresserbara
av en webbadress på det publika Internet är i min HTML-katalog.
>> Samtidigt andra filer, helpers.php, footer.php,
header.php, som är utan tvekan kanske mer känsliga,
kanske hjälpare har faktiskt några användarnamn och lösenord eller någon intellektuell
egendom till mig, fungerar jag verkligen inte vill att världen ska se, även om det av misstag.
Det är god praxis att hålla sig borta från den offentliga HTML katalogen
alla filer som inte behöver sig vara offentliga.
Allt du behöver göra i detta fall när man tittar på, till exempel,
HTML katalogens index.php fil,
märker vi måste bara vara lite mer försiktig när det krävs
eller kräva gång den här filen.
Jag måste först göra .. för att gå till den överordnade katalogen,
gör sedan / includes / helpers.php
att dyka tillbaka in för att hämta filen som jag bryr mig om.
>> Har du frågor så på MVC
eller denna relativt enkla inkarnation detta?
Och låt mig göra klart att vi fokuserade ganska lite på
V här, åsikter och factoring av dessa mallar.
Vi har inte riktigt skiljas M från C ännu.
I själva verket finns det egentligen inget M här, och även vår C
styrenhet, är inte riktigt gör så mycket, men du får mycket mer
bekant med båda dessa 2 brev från MVC,
eller snarare, du får mycket mer bekant med C
i MVC för problembild 7, så det finns mer av den vid horisonten.
Frågor?
Det finns faktiskt ingen här.
>> Okej, låt oss nu gå vidare till den andra och sista frågan för idag.
Det är införandet av en databas.
Fram till denna punkt har vi haft ett par olika sätt att lagra data.
Vi har använt variabler.
Tillbaka i vår C-fil, I / O-diskussion vi började använda textfiler
och använda filer som fprintf, och sedan började vi även
talar om CSV-filer lite, kommaseparerade värden,
så alla dessa tillät oss att ha data som lagras
antingen icke-ihållande eller ständigt.
Men även CSVs är inte riktigt främjar sökning
och infoga och ta bort.
Det är egentligen bara en dum textfil åtskilda med kommatecken
rad för rad för rad för rad, så om du vill
söka den filen det bästa du kan göra är verkligen linjär sökning.
Du måste börja längst upp i filen, läs hela i,
och leta efter ett visst värde av intresse.
Om du vill infoga i det du måste göra samma sak,
iteration över det och sätter på en viss plats,
och i själva verket måste du göra allt för att söka logik själv.
>> Du kan inte göra smart mönstermatchning på en CSV-fil om du själv skriver koden.
Du kan inte göra filtrering av en CSV-fil
om du själv skriver koden.
Skulle det inte vara trevligt om någon annan lägger i alla de ansträngningar
att faktiskt göra sökningen enkel och insättning lätt
och radering och uppdatering och så vidare?
Det är precis vad en databas är.
SQL, Structured Query Language, är ännu ett annat språk
att vi inför här i dag, men det är också ganska tillgänglig,
och vad vi egentligen ska göra är att plocka bara av det några av de mest framträdande
egenskaper så att för pset 7, och om du gör något webbaserat,
din slutliga projekt, har du möjlighet att uttrycka dig
i termer av data frågor.
Du har förmågan att lagra lite eller mycket data
på ett mycket mer strukturerat sätt som kommer i slutet av dagen
göra ditt liv enklare eftersom med SQL kan du uttrycka dig
mycket mer exakt, mycket mer metodiskt för att
få tillbaka lite delmängd av data från en större samling av data.
>> Du kan tänka på en databas, i detta fall, en SQL-databas, verkligen som Excel
eller nummer, om det är ett kalkylblad,
eller kanske flera kalkylprogram, och ett kalkylblad, naturligtvis,
har rader och kolumner, och det beror på
SQL-databaser är relationella, relationella i den meningen
att de lagrar data i form av dessa tabeller,
rader och kolumner.
De är högre prestanda än något som ett kalkylblad,
och en tabell är avsedd att användas av en människa.
En databas är tänkt att användas av en programmerare
skriva kod mot den, så inkarnationen av en databas
kommer att vara antingen kommandoraden.
>> En av de mest populära relationsdatabaser ute är, återigen, MySQL,
vilket är underbart fri, mycket höga prestanda, och detta är vad
Facebook används mycket tidigt och i viss mån än idag
att lagra mycket av sina uppgifter, och vi ser i ett ögonblick
att använda relativt enkla kommandon
Vi kan välja data, infoga data, uppdatera data,
ta bort data och liknande, men tack och lov finns det en mer användarvänligt gränssnitt
än att bara skriva på en svartvit prompt här.
Vi kommer att använda för pset 7 och därefter ett gratis verktyg som heter phpMyAdmin.
Namnet är en tillfällighet.
Verktyget råkar genomföras i PHP,
men det är i grunden irrelevant.
Vad är bra om phpMyAdmin är att det är en webbaserad verktyg.
Vi har redan installerat det i apparaten för dig,
och med det kan du skapa tabeller i en databas,
Du kan infoga data, radera data, och i allmänhet se
dina data i en ganska användarvänlig miljö.
Användarna kommer inte att använda phpMyAdmin.
>> Detta är egentligen bara en administrativ eller utvecklarens verktyg
som att se och rota runt dina data och räkna ut hur man kan strukturera den,
mycket som du själv kan använda Excel eller Numbers,
men det kommer att vara ett bra sätt att visualisera vad som händer under huven
så att du kan fokusera på det intressanta problemlösning och inte så mycket
på svårbegripliga kommandon.
Låt oss ta en titt på ett exempel på data som kan lagras tabularly
i en relationsdatabas.
Här är ett sådant exempel.
Nu tyvärr felaktigt phpMyAdmin på sidan av att kasta alldeles för många ord
och grafik på dig, men om du finslipa in bara på
ID-kolumn, användarnamn kolumnen, och hash kolumnen,
Detta är i praktiken ett kalkylblad, men det råkar vara en sträng
av en tabell inuti apparaten
med hjälp av en fil som vi ger dig i problembild 7.
>> I synnerhet ger vi dig en fil som representerar
en användares bord, så ett kalkylblad som innehåller användare med 3 kolumner,
varav en är ett unikt ID börjar vid 1 och som ökas därefter.
Den andra kolumnen är ett användarnamn och de av er som gjorde Hacker,
det Hacker utgåva för pset 2, kanske känner igen några av dessa användarnamn minst.
På höger sida är lösenord, men de är inte bokstavliga lösenord.
De är hashes därav, så visar det sig
att lagra lösenord i en databas är en riktigt dålig idé.
Du har alla förmodligen läst någon gång av någon webbplats
eller någon företagets databas äventyras och då måste man
ändra ditt lösenord, måste du få bidrag för saker
eftersom vissa onde bröt faktiskt in på ditt konto som följd.
>> Lagra lösenord i klartext, okrypterat i en databas
är helt åsnor, och ändå är det mycket underhållande
sedan läsa om några mycket välkända företag
ibland i pressen vars databaser äventyras,
och att en del är inte roligt, men det faktum att databaserna innehåller okrypterad
lösenord är löjligt eftersom bokstavligen med en rad kod
Du kan skydda mot just hot, och det är vad vi har gjort här.
Även för vår falska lilla CS50 Finans version
Vi krypterar lösenord bara för bra åtgärd, och det faktum att
alla dessa lösenord börjar med $ 1 $ är bara en konvention.
Det betyder bara att de är krypterade eller verkligen hashas,
som är som en enkelriktad kryptering funktion
där du inte kan backa dess effekter med något som kallas MD5.
>> Det faktum att 50 är efter det innebär att ett salt värde
av 50 användes för hashing alla dessa lösenord utom ett.
Mine, naturligtvis, som ni ser det, HA,
var med ett annat salt, så de av er som blev något löst upp
kanske i Hacker 2, kan det ha varit ett resultat av att vi har använt
en annan hash än de andra eftersom mitt lösenord är faktiskt samma
som någon annan användare uppe.
Faktum är att om du har väntat alla dessa veckor för att ta reda
vad dessa lösenord var här var de lösenord som du utmanas
spricka i Hacker upplagan av problembild 2, så inget alltför svårt.
I själva verket var Malan är samma som jharvard,
men om vi går tillbaka de såg annorlunda ut.
>> Fokus på jharvard i purpur eftersom de saltade annorlunda.
Algoritmen var störd på ett sätt som
hashvärde ser den krypterade värdet lite annorlunda
eftersom ingångar var något annorlunda, men lösenordet under huven
var fortfarande ytterst crimson.
Nu, vem bryr sig om det här?
Tja, vi ger dig provet användarna, prov användarnamn
och hashar av sina lösenord så att du faktiskt har en del
kunder för CS50 Finans när du först igång med din kod.
Du måste genomföra fler bord inne i MySQL, inuti databasen.
Du måste skapa fler kalkylblad, effektivt, men vi beslutade att ge dig det här en
för att komma igång, och du kommer att se att problemet inställda specifikationen
leder dig genom processen att importera denna tabell
och även förklara vad några av de egenskaper är,
och du kommer också se till att vi ger dig koden
att hantera hashning eller kryptering av dessa lösenord
så du behöver inte oroa sig alltför mycket om vad MD5 eller liknande är faktiskt handlar om.
>> Så, SQL, Structured Query Language.
Detta är helt enkelt det språk vi är på väg att börja använda i pset 7
och kanske bortom att begära uppgifter från vissa databasen.
Uppgifterna återigen lagras tabularly i dessa relationella tabeller, kolumner och rader,
men med hjälp av några relativt enkla syntax som delete,
infoga, uppdatera och välj kan vi göra just det.
Vi kan ta bort från databasen, infoga,
uppdatera data samt utvalda, dvs hämta data från databasen.
Hur går vi om det här?
Låt mig gå vidare i apparaten.
Låt mig dra upp http://localhost,
vilket, återigen, är den lokala apparaten.
Det är dess standard smeknamn.
Och låt mig gå till / phpmyadmin.
Det råkar vara en speciell webbadress att apparaten är förinställd att förstå
som frågar mig genast för en användare och lösenord.
>> Som vanligt kommer jag att skriva jharvard och karmosinrött,
men inser att det är administratör på datorn.
Det är bara en tillfällighet att det finns också en jharvard registrerad för CS50 Finans.
Jharvard, crimson ger enter mig användargränssnittet som vi såg
en glimt av en stund sedan, och det är lite överväldigande i början,
men lugn, du kommer aldrig att behöva klicka flesta av länkarna i detta verktyg.
Du kommer att sluta med en liten delmängd som är super bra,
den första är databaser här uppe.
Om jag går upp till databaser, märker att jag ombedd att skapa en databas.
Detta är som att skapa en ny Excel-fil, effektivt.
Jag ska gå vidare och kalla denna föreläsning, och jag ska bara ignorera fältet där sortering.
Det har att göra med representation av data däri,
och jag ska klicka skapa, och nu märker när jag släpper skapa
på vänster sida där det står några databaser
Jag skulle snart se föreläsningen databasen.
>> Om jag klickar nu på den vänstra sidan, föreläsningen databasen,
märker mina flikar ändra lite.
Jag har struktur, SQL, export, import och vissa andra saker.
Struktur är ganska mycket tomt.
Inga tabeller finns i databasen, som det står här,
så låt oss skapa en tabell, och låt oss gå vidare och skapa en tabell
liknande eleverna och hur många kolumner vill vi ha?
Låt oss hålla det enkelt och låt rekord för varje elev
ett ID-nummer, ett namn och en e-postadress.
>> Vi ska hålla det enkelt så, så 3 kolumner gå.
Den form som ni ser här är nu lite rörigt och överväldigande,
men vi måste bara gå igenom det rad för rad, så riktigt snabbt låt oss ge
den första kolumnen i databasen ett namn ID för den unika identifierare.
Det kommer att bli ett heltal. Jag kan faktiskt ignorera längd och värderingar.
En int kommer att bli 32 bitar oavsett vad du skriver in det, så låt oss lämna det tomt.
Standardvärde, kunde jag göra det noll, enligt definitionen.
Jag ska lämna det ifred. Låt oss inte oroa standardvärden.
Låt oss rulla över här till höger, attribut.
Detta är intressant.
Låt oss gå vidare och något godtyckligt säga att ID måste vara osignerad.
Låt oss inte slösa några negativa tal.
>> Låt oss gå från 0 till 4000000000, ge eller ta,
och sedan ska vi inte röra något av dessa områden bara ännu borta,
men låt mig skriva namn här nere,
och sedan den andra var e-post, så fångsten är e-post
och namn, uppenbarligen inte heltal, så låt oss ändra dessa till ett annat fält.
Det visar sig varchar, variabel längd röding,
är som en sträng i en SQL-databas
men en variabel längd, och du har faktiskt berätta det i förväg
maximal längd av strängen, så jag ska något godtyckligt
av konvention typ 255 tecken.
Jag kunde helt säga 32. Jag skulle kunna säga 1.000.
Du typ av behov av att bestämma själv utifrån dina demografi vad är
den längsta studentens namn och gå med det numret eller lite större,
men vad är trevligt om ett varchar är det inte kommer att slösa
255 byte på varje elevs namn.
Om det är DAVID det inte kommer att använda en hel 255 byte,
men det är en övre gräns, så jag ska gå med 255 bara genom konventionen,
men vi kunde diskutera det vara något lägre värde, och för e-postadress
bara för att vara konsekvent 255, men återigen, vi kunde ha samma debatt.
Men jag ska göra en annan sak än här på höger sida.
>> Vad är kraftfull om en databas är att det kan göra en hel del tunga lyft
eller komplexa arbete för dig.
I synnerhet jag verkligen bryr mig inte vad min elevs ID-nummer är.
Det är bara tänkt att vara en unik identifierare i en databas
så jag har en 32-bitars kortfattad presentation av den studerandes
så att jag har en bit av unikt identifiera dem
så att det finns 2 Davids, exempelvis, i en klass.
I själva verket kommer jag att kontrollera detta AI-rutan, automatisk ökning,
så att databasen, MySQL, räknar ut
vad varje nyinförda elevs ID kommer att bli.
Jag behöver inte ens bry sig om det i min kod,
och jag kommer också att välja något under index-menyn.
Indexet faller ner här har primära, unika,
index och fulltext.
Du kan kanske gissa vad ett par av dessa saker är,
men det visar sig i relationsdatabaser
Du programmeraren eller databasadministratör få förebyggande syfte
ge tips till databasen om vilka fält
i en tabell är lite speciell.
>> Till exempel, i detta fall ska jag säga att ID-
kommer att vara en primär index, annars känd som en primär nyckel.
Vad detta innebär per definition att ID-hädanefter
kommer identifiera elever i denna tabell.
Ingen student kommer att ha samma ID eftersom jag införa denna begränsning eller detta index.
Dessutom, vad detta kommer att göra för mig är att det kommer att berätta
MySQL som ID är speciell.
Jag bryr särskilt om ID, så gå vidare och göra din fantasi datastruktur magi,
bygga upp någon form av träd.
Vanligtvis är det något som kallas B-trädet, som vi inte titta på veckor sedan,
men det är en annan sådan datastruktur likadana i andemening som de binära träd
och försöker att vi tittat på, men det kommer att säga
till databasen detta område är så viktig att jag förmodligen
vill kunna söka på det, gå vidare och bygga upp några fancy
datastruktur i minnet att påskynda sökningar så att helst
de är konstant tid eller åtminstone så nära det som möjligt
så att den inte överlåta till linjär sökning, vilket kommer inte att vara
den mest högpresterande tillvägagångssätt.
Däremot kunde e-postadress ha varit en primär nyckel.
>> I teorin är allas e-postadress unik, såvida du delar viss hänsyn,
men det är i allmänhet inte bra att använda något som en sträng
som primärnyckel för om dess syfte i livet är att identifiera
rader i tabellen finns det ingen anledning att använda 255 byte maximalt
att identifiera någon om man kan komma undan med bara 4 byte
eller en 32-bitars int.
I allmänhet bör en primärnyckel vara kort och koncis
och helst något liknande ett heltal eller en stor int, som råkar vara 64 bitar.
Men en e-postadress ska vara unik, och en av funktionerna i en databas för
är att upprätthålla unika för mig.
Genom att välja en unik här bredvid e-post, trots att e-posta sig
rullas utanför skärmen, jag säger till databasen
litar inte mig.
Låt mig inte in i databasen
samma e-postadress två gånger, även om jag är en idiot och är inte
mycket bra med mina om och annars IFS och faktisk PHP-kod
och jag lät misstag användaren registrera sig hos en befintlig e-postadress
databasen är ännu en nivå av försvar för korrekthet
att se till att denna kopia e-postadressen inte hamnar i tabellen.
>> Nu däremot, för namn du förmodligen inte vill göra det unika
för då det aldrig kan vara 2 Davids eller 2 Mike Smiths, till exempel,
i din databas, så att en vi ska bara lämna ensam.
Jag ska gå vidare och klicka på Spara längst ned till höger,
och allt ser bra ut, men märker upp här
Detta är en del som för nu kommer vi inte att spendera alltför mycket tid på
eftersom syntaxen är lite komplicerat, och vi behöver inte skapa tabeller
så ofta, men SQL sig är ett språk,
syntaxen som är här som jag har markerat.
Vilka phpMyAdmin verkligen är det skapar en webbaserad GUI för dig
som du kan spara tid och inte behöva manuellt skriva ut
en ganska lång SQL-fråga så.
>> Med andra ord, om du ville manuellt skapa denna tabell,
antingen vid den svarta och vita snabb eller ens i phpMyAdmin
genom att använda denna andra fliken, detta SQL-fliken där du kan skriva in alla SQL-frågor
du vill, uppriktigt sagt, det skulle ha tagit mig en minut
att faktiskt komma ihåg hela syntaxen, och även då jag förmodligen skulle ha
gjort några stavfel, så detta verktyg är användbart för saker, och det är också lärorikt.
Du kan börja att sluta vad syntaxen är
bara genom den fina färgkodning som phpMyAdmin är att lägga
för vår visuella bekvämlighet.
Men nu ska vi göra det här i stället.
Låt mig gå till fliken Infoga uppe, och låt mig gå vidare och sätta till exempel
en ID låt oss säga, egentligen bryr jag mig inte.
Det kommer att automatiskt påslag. Jag ska låta databasen hantera detta.
Men jag ska David och min e-post ska vara malan@harvard.edu.
>> Låt oss gå vidare här och sätta i Mike Smith som en annan.
Jag ska ge mig själv ett efternamn också,
och vi kommer ha honom vara smith@example.com,
och sedan var går jag nu?
Tja, det verkar som gå är för att klicka, och voila.
Kallelse till de bästa insatta 2 rader.
Detta är den faktiska SQL-fråga.
Det är phpMyAdmin verktyget körs för mig,
men slutresultatet, varsel, om jag nu gå till fliken Bläddra,
är att se 2 rader i den här tabellen, mycket påminner estetiskt
i tabellen vi såg tidigare för våra användare från pset 7,
en av dem är David Malan, varav nu är Mike Smith.
Men bara för att vara tydlig, jag behöver inte använda phpMyAdmin,
och faktiskt, du kommer att snart skriva kod för pset 7
som automatiserar processen att lägga rader, ta bort rader, uppdatera rader och liknande,
så låt mig i stället gå till SQL-fliken här uppe
och skriv in SELECT * FROM studenter där
e = "malan@harvard.edu."
>> Med andra ord antar nu har du
någon HTML-formulär, och de typer användaren i sin e-postadress, bland andra områden,
och målet är nu i PHP på bakändan koden
att faktiskt leta upp den användarens övriga detaljer.
Vad är ditt fullständiga namn? Vilket är ditt ID-nummer?
Du kan skriva en SQL-fråga som denna, välj * från studenter
där e = "malan@harvard.edu."
Och om jag klickar på gå, märker att jag skulle, och faktiskt jag, få tillbaka bara en rad.
Mike utelämnas från denna resultat, eftersom insamling av rader
brukar kallas, eftersom han inte har samma e-postadress som jag.
>> Nu, igen, här pset 7 du använder phpMyAdmin som ett administrativt verktyg
och ett pedagogiskt verktyg för att lära dig
runt om i världen av SQL, men i slutet av dagen
du kommer att skriva dessa frågor inom den faktiska PHP-kod,
och så håll ögonen öppna i Zamyla s genomgång i synnerhet
där du får en rundtur i distributionen koden för det här problemet set
där vi har gett dig inte bara estetik för inloggningssidan
och trevlig sexig logotyp som säger CS50 Finans, men vi har också gett dig
ett gäng funktioner som kommer att göra ditt liv lite lättare.
Vi har också skrivit en del av pset för dig,
inloggningen del av den i synnerhet för att ge dig en känsla av en representativ utformning
som använder faktiskt en styrenhet, t.ex. index.php,
login.php och liknande, och sedan ser du pset också en mallar katalog
som har alla dina åsikter, alla estetik.
Och så den totala arbetsflödet i pset 7 kommer att vara att
användarna besöker en regulator via en URL i en webbläsare.
Det Regulatorn innehåller PHP-kod som du skrev, och insidan av din PHP-kod
kan några rader av SQL kapslade i mellan citationstecken
och skickas till en funktion vi skrev kallas fråga
som hjälper dig att prata med databasen utan att använda något som
ett administrativt verktyg som phpMyAdmin.
>> Du kommer att kunna skriva SQL-satser i PHP-kod
och få tillbaka en PHP-array av resultat,
av raderna som faktiskt matchar den frågan.
Och på samma sätt kommer du att kunna göra inlägg eller raderar
eller uppdateringar eller liknande, Syntaxen för som är ganska lika,
och du kommer se från vissa online referenser, från distributionen koden
och från pset packa sig exakt hur man ska göra det.
Inse slutändan vi egentligen bara är skrapat på ytan av SQL
och av MySQL, men kraften i det är verkligen att det befriar dig
att fokusera på de problem du vill lösa de användningsfall som du vill genomföra
utan att behöva oroa lika mycket, åtminstone tidigt,
om var och hur att lagra och söka i databasen,
och det är bokstavligen där Facebook självt fick sin början
använder MySQL och sedan använda fler MySQL-servrar och sedan mer MySQL servrar
snart tills de sedan fick verkligen börja tänka hårt om hur man
lagra data, hur man förvarar saker ännu effektivare,
så även om vi tar för givet att index och unika begränsningar
och så vidare bara arbeta där är en väldigt intressant konversation
att detta kan alla så småningom leda till, så inse att vi bara är att skrapa på ytan
vad kan så småningom för dig eller dina projekt blir en hel del stora uppgifter.
>> Med det sagt, låt oss sluta här, och vi får se nästa vecka.
[CS50.TV]