>> R.J. AQUINO: Låt oss bara komma igång.
Så det här är Quiz 1.
Här är lite information på hög nivå.
Om-sida för frågesporten är vid denna URL, inte längre CS50.net, även om det
kommer fortfarande att fungera.
Det är CS50.harvard.edu/quizzes/2013/1.
Det är den stora Om sidan, berättar var och när, det vill säga nästa onsdag
i en massa rum.
Och med nästa onsdag, jag betyda två dagar från nu.
All denna information är där.
Men det är kumulativ.
>> Så allt från den första halvan av år är potentiellt på frågesport,
eftersom du inte riktigt kan göra avancerade saker i C utan om förhållanden och
för loopar och liknande.
Men det kommer att finnas en betoning på material som omfattas sedan Quiz 0,
börjar med structs och Arkiv I / O. Det är oftast mer
utmanande än Quiz 0.
Den genomsnittliga poängen är normalt lägre.
Studera hårt.
>> Medan du studerar, se till att använda CS50/discuss att posta dina frågor
och läsa andras frågor.
Så om du inte har några frågor, Logga in och läs
dina vänners frågor.
De är nog bra frågor.
Och ta de praktiska frågor.
Vi har varit att ge frågesporter för sju eller åtta år nu.
De är alla på nätet.
Framtida frågor är liknande på gamla frågor.
Det är så vi gör dem.
>> Testet finns inte ännu.
Ingen av oss har sett det.
Men det kommer att se ut tidigare frågesporter.
För denna översyn session, är det inte en uttömmande lista över ämnen.
Du kan inte bara gå här och sedan vara helt redo för frågesport.
Annars skulle det inte vara att mycket av en frågesport.
Och det är inte heller nödvändigtvis allt du behöver veta om alla
givet ämne.
Det är tänkt att utsätta dig för de saker vi har täckt, påminna om vad vi
täckt, och det sätt på som vi täckte det.
Men du måste gå längre och djupare när du studerar till dubbelkolla
att du vet allt om en viss ämne och att du har fyllt i
alla hörn som var täckt av föreläsning.
>> De frågesport anteckningar berätta för dig att gå till Scribe anteckningar, klocka föreläsning videor.
Det är ett bra sätt att se till att du har omfattade alla dina baser.
Så komma igång, när jag gjorde dessa diabilder, försökte jag att sätta där jag hittade
information.
Så för File I / O, till exempel, vecka 7, Måndagens föreläsning, och den utstationerade
6 § och Problem Set har alla information om File I / O. Jag har gjort
detta för varje ämne.
Så de rubrikbilder kan vara till hjälp för dig.
>> Så här har vi File I / O. Kom ihåg, i Problem Set 5, använde vi fopen, fclose,
fwrite, fread och fseek.
Efter att ha återhämtat sig 30ish JPEG-filer och ha ändra storlek och trasslat med
bitmappar, bör du vara ganska bekant med dessa funktioner
och hur de fungerar.
Om du inte längre är bekanta, definitivt se över dem.
Och se till att du förstår vad de olika argumenten är,
när de används.
>> Men de gemensamma filrelaterade buggar du kan bli tillfrågad om -
Tja, om du har glömt att kontrollera om fopen faktiskt arbetade innan du går till
ändra en fil.
Det kan vara dåligt.
Om du har glömt att fclose en fil att du har fopened, det liknar
en minnesläcka.
Det är ganska illa.
Och glömma att kontrollera om du har nått slutet av filen innan du
börja skriva på det.
>> Så om du säger, hej, jag är på i slutet av filen.
Ge mig ytterligare 5 byte.
Tja, det är nog inte kommer att träna som du förväntar dig.
Det är verkligen det för File I / O, eftersom vi gjorde så mycket av det
med problemet inställd.
Så om du förstod vad som pågick i Problem Set 5, minns bitmats
och JPEG, då är du förmodligen alla inställd för File I / O. Om det är lite
fuzzy, definitivt se över problemet set och det associerade materialet.
>> Structs var det ämne som fanns på linje mellan Quiz 0 och Quiz 1.
Visste inte riktigt göra snittet för Quiz 0.
Så de kommer definitivt att vara på Quiz 1, vecka 7, måndag.
Vad är en struct?
Här visar vi en struct.
Det är som en ny typ.
Det är som en container för flera fält.
>> I det här fallet har vi deklarerat en struct elev som har två områden -
en sträng som vi kallar namn och en int som vi kallar ålder.
Så när jag passerar runt eleverna eller jag modifiera studenter, kommer jag att kunna
tillgång till deras namn och deras ålder.
Låt oss titta på lite kod för det.
Här ser vi att jag har förklarat en student s, precis som
Jag förklarar varje variabel -
int x, int y, et cetera.
>> Här är student.
Han börjar med ingenting i sina områden.
Så låt oss sätta dem.
Du anger områden en struct med prick.
Så jag har sagt här att s.name = RJ.
Och s.age = 21.
Du kan också uppdatera fält på samma sätt som du skulle uppdatera
värdet av en variabel.
Så jag vill ändra mitt namn från RJ med inga perioder till R.J. stavat
korrekt sätt.
Det skulle s.name = RJ, samma som sagt det från början.
Och då kan du komma åt dem.
>> Så vi har satt dem.
Vi har uppdaterat dem.
Du kan också komma åt dem på precis samma sätt.
Så här, jag skriver ut R.J. Är 21 år gammal.
Och jag komma åt dessa värden med s.name och s.age.
Så det är att komma åt structs med punktnotation.
Japp, ifrågasätter?
>> PUBLIK: Finns det en anledning för föregående bild som du inte har lagt
student på översta raden, som typedef struct student och sedan
elev i slutet?
>> R.J. AQUINO: Så frågan var, om denna bild har vi normalt sett
typedef struct nod och sedan fälten i struct och
då ordet nod.
Och hur kommer det här att jag inte säga, typedef struct elev och sedan
fälten i struct och sedan elev?
Anledningen är att jag inte behöver komma åt det inre av strukt.
Så det är OK att lämna den utan ett namn.
Jag kan bara lämna det som en anonym strukt.
>> Anledningen till att vi gör det för länkade listor och saker är därför inne att du behöver
för att referera till en struct noder stjärna.
Så struct måste ha ett namn, så att du kan komma åt den senare.
Det är en liten detalj.
Men du kommer vanligtvis ser typedef struct klammerparenteserna om du inte behöver
namn och typedef struct några namn följt av klammerparentes om du kommer
behöver namnet.
Så det är en bra fråga.
>> Och på den punkten har vi en tendens att ändra structs och skicka runt structs genom
referens, inte av värde.
Så vi ska bara skicka runt pekare till structs stället för att passera runt
structs själva.
Så du väldigt ofta att vara med hjälp av, i det här fallet, student * eller
struct node * eller nod * istället ut studenter eller noder.
Så här har jag sagt, OK, den rörliga ptr kommer att vara adressen till er.
Det kommer att bli pekaren till studenten R.J.
>> Så vi kan få på dessa områden på samma sätt som vi får någonting.
Först ID referens pekaren att få struct.
Det är * ptr och sedan en punkt och sedan ålder.
Så för att få tillgång till området, och jag har uppdaterat det nu till 22, eftersom, låt oss
säga, det var min födelsedag.
Det finns en genväg syntax med hjälp av pilen här.
Så ptr pil ålder är bara samma som * ptr.age.
Nu, det är något du behöver memorera och minnas.
>> Du använde det mycket i pset6, det stavnings pset.
Men detta är faktiskt vad som händer på under huven.
Det dereferencing pekaren och sedan komma åt den.
Fråga?
>> PUBLIK: [OHÖRBAR].
>> R.J. AQUINO: Så varför använder vi pekare som structs stället för
structs sig själva?
Orsaken skulle vara om du passerar en struct till en funktion, du förmodligen
vill skicka runt bara 4 eller så byte som representerar pekaren, som
motsats till den potentiellt 30 eller 40 byte som är den struct.
Så går något till en funktion är lättare när saken
är mindre i korta.
Fråga?
>> PUBLIK: Du kanske har nämnt detta i början, men är där
andra glider upp på [OHÖRBAR]?
>> R.J. AQUINO: Dessa bilder kommer att finnas upp efter översynen sessionen.
Vi kommer att lägga upp dem på hemsidan.
Så gå vidare och flytta på något snabbare, vi ska prata om uppgifter
strukturer.
Det finns en hel del.
Vi täckte ett gäng av dem.
Här är vad du bör förstå om datastruktur.
>> Du borde verkligen förstå på en hög nivå vad varje struktur är.
Kan du förklara på engelska till vän som inte har tagit CS50 hur
vi organiserar våra data och varför vi skulle använda något på det här sättet?
Det är sak man.
Sak två, förstår genomförandet.
Så förstå hur man använder dessa saker i C. Och kommer vi att gå över detta.
>> Och sedan sak tre skulle känna till driftstider och begränsningarna hos
olika strukturer som du använder.
Så förstår varför du skulle använda en hash-tabell i stället för en matris.
Förstå hur snabbt, i genomsnitt, tillgång till en hash-tabell är.
Förstå vad verksamheten är snabba på länkad lista men långsamt på matriser och
omvänt.
Så för att förstå det, måste du förstå Big-O notation bara veta
hur man talar om dessa möjliga saker.
Och vi kommer att prata om det.
>> Så första, länkade listor.
Här är en hög-nivåbild av en länkad lista.
Vi visar detta i klassen.
Vi har vanligtvis 10 personer står på scenen.
Men vi har en serie av noder, där varje nod har ett visst värde och en pekare
till sitt nästa värde.
Så för att komma från en nod till nästa, du bara säga, ge mig nästa nod.
Du har den noden.
Ge mig nästa nod.
Du har den noden.
Ge mig nästa nod och så vidare tills det inte finns någon nod vänster.
>> Så fortsätta att prata om det på en hög nivå.
Det är väldigt lätt att sätta saker och ting in i en länkad lista.
Om du inte bryr dig om den ordning, du kan bara släppa den
alldeles i början.
Det är konstant tid.
Men det är svårt att hitta ett värde.
Om du försöker att fråga, är sju i min lista?
Du måste gå igenom varje enskilt värde.
Är det sju?
Om och om igen.
Och det är O (n).
Så när man studerar för testet, Jämför detta med arrayer.
>> Är det OK?
Lamporna gick dim.
OK.
När är en länkad lista bättre?
När är en matris bättre?
Så låt oss titta på lite kod.
Här är en potentiell nod.
Det är en struct.
Den har en int n, som kommer att vara vårt värde.
Och det har en struct node * nästa, vilket är vår pekare till nästa nod.
Så här kan vi se att vi har hänt att ha lagt en int i vår nod.
Men om detta var en länkad lista med röding stjärnor eller en länkad lista av flottar, vi
helt skulle kunna göra det också.
>> Tänk på pset6, hade du förmodligen en länkad lista av röding stjärnor eller bara
statiska char arrayer.
Låt oss titta här på en operation.
Så vi vill infoga ett nytt n in i vår länkad lista.
Vi börjar med ett huvud pekare som är en pekare till denna nod som har den
Värdet på n och en nästa av en pekare som pekar på denna nod är ett värde på
n och en närmast noll, eftersom det är den sista noden.
Så i intresset av tiden, kommer jag lägga all kod på skärmen.
Och vi kommer att gå igenom den ett fåtal rader åt gången.
>> Så här är koden.
Jag hoppas att det är läsbart.
Det första vi gör är vi malloc en ny nod.
Så det är en pekare till en ny nod som inte riktigt har något set
upp i det ännu.
Vi kontrollerar att se till att den nya noden inte är null.
Annars måste vi ge upp.
Så efter att ha kontrollerat att vi nu ställa in värdena i noden.
Så vi satte den nya n till vår n fält.
Och vi satt nästa pekare att peka på den ursprungliga huvudet, så att vi kan
nu har satt detta nod i vår lista.
>> Slutligen har vi den globala huvudpunkten till vår nya noden, så att om vi skulle
börja på huvudet, skulle vi vara på detta ny första noden i stället för
den gamla första noden.
Och när denna funktion kommer ut, den variabel ny nod inte längre existerar,
eftersom det var lokala till funktionen.
Så här är läget i världen.
Vår globala chef pekar på vår nya första noden, vilket pekar på vår
ursprungliga första noden, vilket pekar till noden efter att.
>> Det var införing.
Jag hoppas att det var relativt enkel att följa.
När du är osäker, rita en bild.
Så jag tycker att prata om länkade listor och titta på
koden är mycket inte bra.
Av följande skäl att titta på en bild av en länkad Listan gör att jag kan tänka, åh, så
Jag har den här noden här.
Men om jag uppdaterar den pekare, den slutar kopplad.
Och jag har glömt var noden går.
Och koden matas ut.
Och du har flera noder som är bortkopplade.
Och du behöver inte sluta med den lista du vill ha.
>> Så om du drar bilden och göra det steg för steg, förhoppningsvis, kommer du att se
rätt ordning på saker och ting när det gäller uppdatera pekarna för att se till
att listan kommer tillsammans.
Insert är relativt rättfram.
Ett mer komplicerat ett skulle vara införande i en sorterad lista.
En mer komplicerad funktion är att ta bort och hitta, så titta igenom en lista på
se om något är det.
Kanske du gjorde detta i pset6 när du kom in i din hashtabell och du sa,
väl, är ordet Apple i min länkad lista?
>> Så du kanske redan har gjort detta.
Men definitivt, friska upp minnet och försöka reimplement hitta och
reimplement bort för en länkad lista.
Kul sida noterar det också dubbelt bunden listor, där du har
pekare som pekar både framåt och bakåt, så att du kan gå till
nästa nod och att den föregående noden.
Och det var en fråga om förra årets frågesport för den typen, talar
ungefär dubbelt länkade listor.
>> Nu, det är en struktur som du är relativt bekant med, eftersom de flesta
om du använt dem förmodligen på pset6.
Här är en som är lite mindre bekanta.
Som en liten not, jag tror att Quiz 1 är främst hårdare än Quiz 0, eftersom
de saker du gör, du har inte gjort så mycket.
För att uttrycka det på ett annat sätt, för Quiz 0, du hade skrivit en hel del C. Och vi
frågade dig om C.
>> För Quiz 1, vi kommer att fråga dig om PHP och JavaScript, som du
har inte skrivit så mycket om.
Vi kommer att fråga dig om C-kod som du har inte skrivit så mycket om,
denna avancerade C grejer.
Så definitivt, öva saker vi talade om i föredrag som du
inte nödvändigtvis göra på problemet inställd.
>> På tal om det, har du inte skrivit en bunt på ett problem set.
Men det var på föreläsning.
Här är det på hög nivå bild av staplar som vi visar varje år.
Det är den bunt av brickor i den Mather matsalen.
På en hög nivå, buntar är en sista in, först ut-datastruktur.
Det innebär att du ska att sätta saker i -
1, 3, 7, 12, 14, negativ 0.
Det enda jag kunde inte ha sade - negativ 3, 0.
Du lägga alla dessa saker i.
Och den sista du sätter in är det första en som kommer att komma ut.
>> Så du har två verksamheter -
skjuta och pop.
Alla de sätter in att jag var gestikulerade så här är push.
Och sedan när jag når in till grab något eller nå på toppen för att ta
något, det är pop.
Så vi kommer att genomföra stackar.
Och vi visade dem på föreläsning med hjälp av matriser.
Men du kan göra dem med hjälp av länkade listor.
En stack är en konceptuell uppgifter struktur, inte som en
implementeringsspecifik ett.
>> Så vad skulle det se ut?
Det skulle se ut ungefär som det här.
Du skulle ha ett heltal storlek.
Och du skulle ha en matris med värden som Vi ringer brickor, eftersom det är
vad bilden var för oss - int brickor -
och lite till maximal kapacitet.
Så vad skulle driva ut?
Tja, om vi har en stack s, sedan att skjuta något på s, skulle vi få
storleken på talet.
Och det skulle bli nästa öppen plats i vår samling.
Så om vi har tre saker i vår stack, då brickor 3 skulle bli nästa
öppen plats, eftersom 0, 1, och 2 är redan fylld.
>> Så vi sätter värde i s.trays [s.size], den tredje platsen.
Och sedan öka vi s.size att säga, hej, hade vi tre saker innan.
Nu har vi fyra.
Så nästa gång du trycker, du kommer att sätta något i 4.
Eller nästa gång du pop, du kommer att titta på 3 istället för 4 eller vad som helst.
Och då kommer vi tillbaka trogna säga, hej, lyckades vi.
Det fungerade.
Som en tumregel, om en funktion som är tänkt att returnera sant eller
falska alltid returnerar true, du kan har gjort något fel.
Så fungerar det här?
>> Tja, det funkar bra för 1, och 2 och 3, och 4, och fem.
Men låt oss säga att jag når min kapacitet.
Jag har sedan stött på ett problem, eftersom om storleken är samma som kapacitet, jag är
försöker nu att sätta något i en matris där jag inte har utrymme.
Så en kort kontroll för att åtgärda detta.
Om s.size == KAPACITET, returnera false.
Annars går och gör vad vi gjorde.
Så vad mer kan vi be om för stackar?
Vad ska du studera?
Vad mer bör du öva?
>> Tja, om genomförande av pop.
Vi gjorde redan push.
Jag ska fixa det.
En implementering icke-array, där du använder en länkad lista, kanske.
En implementering icke-int.
Vi gjorde ints här.
Men det kunde ha varit flyter.
Jag kunde ha varit strängar.
Det kunde ha varit röding stjärnor.
Titta på tidigare frågesporter för den typ av frågor som vi har frågat om stackar.
>> Jag ska säga att vi täckte travar runt på samma sätt som vi har täckt dem i
år tidigare.
Så de testfrågor bör vara en bra indikation.
Framåt ännu snabbare, köer.
De är som staplar.
Men de är först in, först ut.
Om du är brittisk, ordet kön förmodligen gjort mycket vettigt för dig.
Annars kan du få hört talas om det som en linje.
De fungerar som linjen på Apple Store.
Den första personen att visa upp vid 03:00 på morgonen är den första
person att köpa sin iPad.
>> Så vi har två verksamheter -
enqueue och avköa.
Enqueue sätter någon i ledningen.
Dequeue drar den första personen utanför linjen.
Återigen kan vi genomföra detta med en array.
Så vad är det struct vi visade på föreläsningen?
Det var den här.
Igen, siffror.
Återigen, storlek och denna nya sak front.
Varför finns det något som kallas front?
Det är indexet för den nästa elementet avköa.
Det är bara internt hålla reda på den första killen att visa upp, så att vi
kan dra ut den när vi behöver.
>> Definitivt titta på föreläsningsanteckningar och försök att genomföra enqueue och avköa
när man studerar för testet.
Viktiga saker att tänka på.
Omslag runt om fronten plus storlek hamnar större än kapaciteten.
Återigen, om din struktur är full, du kommer att ha ett problem.
Hashtabeller du har sett tidigare.
De flesta av er förmodligen genomfört dessa på pset6.
Det är en struktur som syftar till O (1) konstant tid införing och O (1)
konstant tids lookup.
>> I CS50, vi genomfört detta som en uppsättning av länkade listor.
Den viktigaste komponenten i en hashtabell är hashfunktionen.
Så det omvandlar din input, låt oss säga, ett ord i ordlistan, i ett antal,
som kommer att vara vårt index.
Och vi kommer att använda som index i vår samling.
Så här är en söt liten bild från study.50.net.
Vi kastar alla ord i vår hashfunktion.
Och hashfunktionen berättar var att sätta dessa ord.
>> Det här är allt bra i landet där Det finns bara ett ord för varje kortplats.
Men som ni minns från pset6, det finns fler ord än slots.
Så vad händer när du få en kollision?
Istället för att lagra ett värde i, låt oss säga, hash tabell 3, du
lagra en länkad lista.
Och så i stället för att ha cantaloupemelon här, skulle du ha en länkad lista,
där den första noden är cantaloupmelon.
Och nästa nod är katt.
Och den tredje noden är kollision, låt oss säga, eftersom alla dessa ord börjar
med C.
>> Så de flesta av er gjorde detta för pset6.
Om du inte gjorde en hashtabell på pset6 och du försökte något liknande
en trie, definitivt se över hashtabeller.
Om du gjorde det på pset6, definitivt granska hashtabeller.
Och om du gjorde det på pset6 och det gjorde inte träna helt rätt och du
hade en hel del problem med det, definitivt granska hashtabeller.
Så lektionen verkligen är definitivt granska hashtabeller.
>> Den stora minoritet av er provat ut försöker på pset6.
Högnivå bild.
Det är ungefär så här, där varje nod har en uppsättning av barn, där varje
barn motsvarar en bokstav.
Och varje nod säger också, hej, jag är ett ord.
Så i detta fall, ordet Maxwell, om du följer M till A till
X-W-E-L-L och sedan följa det en till.
Och du får denna symbol, delta, vilket Vi betyda att betyda att detta är ett ord.
Så Maxwell är ett ord.
Dessa deltan hela betecknar vilka saker är ord och som
saker är inte.
>> Så i pset6, de data vi lagrat vid sidan av någon av våra noder var "Jag är en
ord. "Och det häftiga med försök är de visar insättning och
slå upp i O (längd av ett ord).
Så bara för att få igenom Maxwell, är det M-A-X-W-E-L-L. Så sju eller åtta -
Jag kan inte räkna -
steg för att komma till slutet och kolla saker.
Så snabb implementering här.
Rob gick igenom en länkad lista i hans obduktion.
Så kolla det ut.
Ursäkta.
Gick igenom en trie i hans obduktion.
Så kolla det ut.
>> Men du i princip har varje nod har 27 pekare till nästa noder och en
Boolean för jag ett ord.
Kolla in Robs obduktion för hur detta faktiskt genomförs.
Vår sista struktur, våra träd och binära sökträd.
Så titta på dessa, dessa var täckta senast Vecka 8, måndag.
Ett träd liknar en trie, förutom att du behöver inte nödvändigtvis 27 noder vid
varje punkt.
Och du inte har denna information vid varje steg som innebär huruvida -
vägen spelar ingen roll.
Ett trie, vägen från toppen till botten, Maxwell, var viktigt för oss.
>> Men varje nod har flera barn, kanske.
Vi har några mer ordförråd.
Roten av trädet är högst upp.
Och vi säger att det allra nedersta noder som inte har någon
barn är bladen.
Så som en trie, är ett träd en struktur av noder.
En vanlig typ av träd som vi ska att tala om är ett binärt träd, där
Varje nod har inga barn eller ett barn eller två barn.
Så denna bild här är inte ett binärt träd, eftersom
nod 3 har tre barn.
>> Men om vi skulle ignorera dem, resten om det är ett binärt träd, eftersom det
uppvisar den egenskapen att varje nod har noll, ett eller två barn.
Så hur kan vi uttrycka detta i kod?
Vi skulle kunna ha en nod där varje nod har ett heltal inne i det, liksom
som en pekare till trädet till vänster och en pekare till träd på
höger, så de två barnen.
Hur är detta bra?
Tja, om vi gör regler om var vi sätta noder, kan vi göra sökningen snabbare.
>> Så det finns ett koncept av en binär sökning träd, där alla noder på
vänster delträd har ett mindre värde än den nod vi tittar på.
Och alla noder på höger delträd har ett större värde
än rotnoden.
Nu ser det ut som en massa ord.
Jag kommer att sätta den inne i dubbel citat och visa en bild.
Så här är ett exempel på ett binärt sökträd.
Se till att vi börjar med 10.
Allt till vänster om 10 är mindre än det.
Och allt till höger är större än det.
>> Men mer än så, varje nod i trädet uttrycker den här egenskapen.
Så noden 7 har en 3 till vänster och en 9 till höger.
Så alla som är mindre än 10.
Men titta på bara de, har 7 3 till vänster och 9 till sin rätt.
Och på samma sätt på höger, 15 har 14 till vänster och 50 till höger.
Så de tre noderna där borta, 15, 14, och 50, är ​​också ett giltigt binärt träd
eller ett giltigt binärt sökträd.
Och de är alla större än 10.
Så de får vara till höger där.
Finns det en fråga?
>> PUBLIK: Hur hanterar du när du har två sjuor?
>> R.J. AQUINO: Ja.
Hur hanterar du två värden som är samma?
Vissa binära sökträd säger att du ignorera dubbletter, eftersom målet är
bara säga, jag har sett dessa saker så långt.
Vissa binära sökträd som du kan säga har ett antal som insidan av noden.
Andra kan säga att allt till vänster är mindre än eller lika med.
Och allt till höger är större än.
>> Det beror bara på vad det Problemet är att du lösa.
Så i en ordbok, till exempel, du skulle inte bry sig om dubbletter.
Du skulle kasta ut dem.
Men något annat problem som du kan ta hand.
>> PUBLIK: Är det möjligt att ha en en till vänster om 15, som
är mindre än 10?
>> R.J. AQUINO: Nej.
Om 14 här var en 1, skulle detta inte vara ett giltigt binärt sökträd,
eftersom allt till höger om 10 måste vara större än det.
Och vi får se varför.
Om i landet av sökandet mitt mål är att hitta 14, börjar jag vid roten.
Så jag ser.
OK.
Vi kommer att börja vid roten.
Titta på 10.
>> Tja, 14, vårt mål, är större än 10.
Så det måste vara till höger.
Detta är mycket likt hela telefonen bok som vi gjorde, det binära
söka där.
Men istället för binär sökning i en matris, vi är binära
söka i det här trädet.
Så vi letar fortfarande efter 14.
Tja, är 14 mindre än 15.
Så om det är i vårt träd, måste det vara på detta område här.
Det måste vara till höger om 10 och till vänster om 15.
>> Och så kollar vi denna nod.
Och yay, vi har hittat 14.
Jag tänker inte gå igenom det.
Men här är koden.
Det är faktiskt relativt okomplicerad,
eftersom detta är rekursiv.
Vad kan vi be dig att göra en frågesport?
Vi kan be dig att skriva den här koden.
Vi kan be dig att titta på den här koden och ändra den här koden och förklara vad
den gör.
Yeah.
Fråga?
>> PUBLIK: Är dessa bilder kommer att bli görs tillgänglig som de var förra gången?
>> R.J. AQUINO: Ja.
Så dessa bilder kommer definitivt postas.
>> PUBLIK: De är faktiskt postat just nu på hemsidan.
David just gjorde det.
>> R.J. AQUINO: Bilderna är just nu på hemsidan.
Jag kommer förmodligen lappa ihop ett par stavfel jag noterade och rätta till dem.
Men det är en aktuell version på webbplatsen.
Andra saker som vi kan fråga dig att göra -
skriva insats.
Skriv en iterativ version av rekursiv funktion vi bara visade dig
eller prata om dessa saker, liksom i stycken, i ord, i meningar.
Jämföra körtider och förklara vad du skulle vilja använda en binär
sökträd för i stället för en hash tabellen, till exempel.
>> Så förstå dessa strukturer på en ganska djup nivå.
Förstå hur man skriver dem, hur man använda dem, hur man talar om dem.
Och du ska vara redo.
Fråga?
>> PUBLIK: När du skriver på binärt sökträd, hur gör du
avgöra vilket värde till göra det som rot?
>> R.J. AQUINO: Så frågan var, vad värde gör du som root?
Beroende på din kod, du kan ha en global rot.
Så du kanske har förmodligen haft i pset6 global hashtabell.
Eller du kanske passera roten i som ett argument.
Så här sökfunktionen här tar ett argument en nod *.
Och så vad nod du råkar vara tittar på är den du behandlar
som din root när du passerar den i.
Och jag är redo.
De är mina bilder.
Nästa person kan komma swap i en bärbar dator och mikrofon.
>> ROB BOWDEN: Jag tror att jag kanske har tolkat den frågan på olika sätt.
Men jag tolkade det som om du har siffrorna 1, 2, och 3, hur gör vi
vet att 2 roten i motsats till ett eller 3?
Om vi ​​gör 2 roten, då är det fint 1 och 3 till vänster och höger.
Men om en är roten, då är det en till toppen, 2 till höger, tre till höger.
Så som standard, du vet inte vad göra roten.
Och för någon algoritm som vi väntar på ge dig, bara det första du
insatsen skulle vara roten.
Eller vi skulle ge dig ett binärt träd som redan finns som har en rot.
Men andra algoritmer existerar sådana att roten kommer att uppdatera, så att om man
hamna i en situation där det är en, två, 3, skulle det automatiskt uppdateras till
göra 2 den nya roten, så att det är fortfarande fint balanserad.
>> ANGELA LI: Cool.
Hej, grabbar.
Jag är Angela.
Och jag kommer att avsluta vår C och sedan gå in i en del av vår
tekniker -
HTTP, HTML och CSS.
Så det första är buffert overflow attacker.
Så låt oss ta en titt på denna kod.
Det är ganska enkelt.
Det finns en funktion foo.
Och det inte tillbaka någonting.
Men det tar på en pekare till en sträng som heter bar.
>> Och det kommer att förklara detta buffert, som är ett tecken
matris som har 12 platser.
Och den använder memcpy, vilket är bara en funktion som kopierar från en adress
till en annan.
Så detta är att försöka kopiera in vår buffert oavsett
bar pekar på.
Så någon aning om vad som är fel med denna kod?
>> PUBLIK: Om bar är längre än C, kommer de att skriva över.
>> ANGELA LI: Ja, exakt.
Vi har inga garantier för att bar kommer att vara mindre än 12.
Vi gjorde bara några godtyckligt antal 12.
Och vi var som, låt oss hoppas att vår användarens input är mindre än
12 tecken långt.
Så i den bästa av världar, om vår insats är alltid som förväntat, då vi kommer att få
något liknande, hej.
Det är mindre än 12 tecken.
Det blir läst in röding c..
Och så gör vi något med det.
Det spelar egentligen ingen roll.
>> Men en illvillig person kunde göra något mer om detta, där de
ge oss vad bar pekar på, det kommer att peka på denna enorma samling
om bara A-talet.
Och det är långt längre än 12.
Så det kommer att gå hela vägen nere till där avkastningen
adress brukade vara.
Så låt oss säga denna funktion heter foo.
Kanske foo kallades av någon annan funktion, som kallades av huvud.
Så när foo är igång, behöver den att veta var man ska gå tillbaka till.
>> Om foo kallades av någon funktion som heter Baz, har den att veta att det är
fick gå tillbaka till baz.
Och det är vad denna returadress här nere säger till oss.
Men om vi skriver över den med något annat adress, i det här fallet, är detta en
representation av den adress på början av denna buffert, sedan
vad som egentligen kommer att hända är att stället för att återvända tillbaka till baz,
som kallas vår funktion, det är bara kommer att gå till framsidan av denna kod.
>> Och om det var där eftersom en illvillig hacker snubbe kom och
injicerade detta, då kanske detta belopp av A: s är faktiskt inte A: s.
Och det är faktiskt bara koda att raster datorn eller något.
Så för att vara defensiv om den här sortens sak, måste du aldrig anta att
användarinmatning finns en viss antal tecken.
Till exempel när du gjorde stava, du fick höra att ord var
bara kommer att vara 40 tecken lång maximum.
Och det var bra.
>> Men om inte, så skulle du behöva se till att endast läsa in 45
tecken åt gången.
Annars kan du skriva över din buffert.
Har du frågor om det.
Yeah.
>> PUBLIK: Kan du prata lite mer om dessa?
>> ANGELA LI: Förlåt.
Ja.
>> PUBLIK: Det mic är bara för video.
Jag ska försöka och projekt.
Hej, killar.
Sup?
Så låt oss gå igenom några saker i CS50 bibliotek, som du har använt
hela terminen, mestadels att få indata från användaren.
Som ni vet, inkludera dig i CS50 bibliotek genom att bara göra CS50.h, vilket
innehåller alla prototyper av funktioner som du kan använda, som
GetString och getInt och GetFloat, et cetera.
Och det är det här en rad i CS50 bibliotek, som avgränsar en sträng, vilken
ni alla vet vid det här laget är bara en char *.
>> Men låt oss ta en titt på hur GetString fungerar.
Detta är en mycket förkortad version.
Du kan dra upp CS50 biblioteksfiler från, tror jag, manuals.CS50.net.
Och du kan läsa igenom den verkliga funktionen.
Men detta täcker en del av de viktiga delarna.
Så vi har skapat en buffert med en viss kapacitet.
Och det vi gör är får vi ett tecken i taget från standard n.
Det är där användaren ingångar text i konsolen.
>> Och så ska vi läsa i en karaktär så länge det inte är en ny
linje och det är inte slutet av filen, som är slutet på standard in.
Och för varje tecken som vi läser in, Om tecknet hamnar lägga
till det antal tecken som vi har läst in och det är mer än vår förmåga,
vad vi gör är att vi bara ändra storlek på våra buffert så att det är dubbelt så lång.
Så återigen, detta skyddar mot buffert overflow attacker, eftersom du läser in
ett tecken i taget.
Och om du vid något tillfälle läsa in alltför många, du bara utöka din buffert.
Du multiplicera det med två.
Och då har du mer utrymme.
>> Annars du bara lägga ett tecken till buffert.
Och när du har läst in alla de tecken, kommer det att krympa bufferten
tillbaka ner till normal storlek, lägga till en null terminator, och sedan återvända.
Nu, låt oss titta på getInt.
Kan ni läsa det här?
Jag kan zooma in lite.
Jag vet inte hur datorer fungerar.
Aldrig sinne.
Jag kan inte zooma in ordentligt.
>> Det är verkligen svårt.
Jag är ledsen.
Låt oss bara titta på det här.
Så vad getInt gör är det först läser i en sträng från GetString, som
Vi har genomfört tidigare.
Och den viktigaste delen att notera här är om denna delning att den hamnar
läsning är som faktiskt inte en sträng, då vi bara tillbaka INT_MAX till
representerar misslyckande.
Varför vi tillbaka INT_MAX istället av negativa 1 eller 1?
Några idéer?
>> PUBLIK: [OHÖRBAR] -1 på en.
>> ANGELA LI: Ja, exakt.
Så du är mycket mer benägna att bara vill till ingång 1 eller negativ 1 när du uppmanas
för en n: te och vad n: te maxar.
Den är enorm.
Du är antagligen inte kommer att använda den.
Så det här är som ett beslut design till se till att du inte av misstag
returnera ett fel eller om du inte tillbaka 1, vilket kan tolkas
som ett korrekt svar.
Så om inte finns en linje, vi återvänder INT-MAX.
Annars använder vi sscanf, som är som scanf.
Men det läser från en sträng.
>> Och vi har denna formaterade sträng, vilket är% i.% c.
Och vi försöka matcha det med vad användaren gav oss.
Vi vill att antalet matchade saker för att vara ett, vilket innebär att vi endast
verkligen vill matcha ett heltal omgiven av kanske vita
utrymme, kanske inte.
I detta fall, om du sätter in något som bar, inte bar inte stämmer alls,
eftersom det måste finnas ett heltal från början.
Så sscan aldrig vände 0.
Så du behöver inte returnera det.
>> Alternativt, om du sätter in något som 1, 2, 3, A, B, C, som matchar
både heltal utan även tecknet efter det.
Så sscanf återgår 2, vilket också är inte idealisk.
Du vill inte ha 1, 2, 3, A, B, C vara en giltig int.
Så som också fungerar inte.
Men säger att du sätter in något liknande 50.
Det kommer att matcha% i, vilket innebär det kommer att få läsa i n.
Och nu kommer n innehålla antalet 50.
Och sedan kan du lämna tillbaka den.
>> Annars slår dig på Försök igen.
Och då är det bara går om igen tills du får en ordentlig input från användaren.
Har du frågor om det?
>> PUBLIK: Så om du skulle skriva ut värdet på getInt på [OHÖRBAR]
skulle det vara bara heltal och max?
>> ANGELA LI: Ja.
Så om du använder getInt, bör du ta att du inte vill att n: te max till
vara en giltig inmatning, eftersom du kommer att anta att det var dåligt.
>> PUBLIK: Om vi ​​inte hade char c och någon som satte in 1, 2, 3, Sam, skulle det
fortfarande fungera för en, två, tre?
>> ANGELA LI: Jag tror att det skulle fungera.
Men du vill inte 123Sam till vara en giltig inmatning av en användare.
Det är inte riktigt en int.
Så det verkar inte rättvist att tolka det som en int.
OK.
I så fall, låt oss flytta på internet.
Så HTTP är inte ett språk.
HTTP är bara den uppsättning standarder för hur du skickar saker från kunder,
det är du, till servrar.
Det är andra människor på webben.
>> Så HTTP står för Hypertext Transfer Protocol.
Det är hjärtat och själen av hela banan.
Den hyper delen bara hänvisar till HTML.
Överföringen är kunder som du kommer att skicka förfrågningar till
servrar, som ger svar.
Och protokollet är bara, hur gör du räkna med en server för att bete sig?
Och hur ska man bete sig så att du kan effektivisera detta
kommunikationsprocessen?
>> Så HTTP-förfrågningar ser mycket ut som det här.
GET är den typ av förfrågan.
Ni har sett GET förfrågningar och POST-begäran.
Den andra saken där, / mig, det är bara URI eller webbadressen där du
vill gå i värden.
Så denna begäran är att be om det sida, liksom www.facebook.com / mig.
Och det är en begäran GET.
Och sedan denna HTTP/1.1, det är bara den version av HTTP som du använder.
Det är nästan alltid 1.1.
>> Och så finns det ett gäng av andra saker också.
Du kan faktiskt se dessa om du öppna upp din konsol när du är
surfar på webben.
Svaren ser något mer om detta.
Den övre delen är, återigen, den typ av HTTP du använder
följt av en statuskod.
Så 200 OK är allt fungerat.
Här är ditt innehåll.
Ditt innehåll kommer att följa.
Och så kommer det att berätta vilken typ av innehåll och andra saker också.
>> De statuskoder, finns det några viktigaste som du bör veta.
200 OK är som allt är gyllene.
Allt fungerar.
403 Forbidden.
Det har du säkert sett om du glömt att chmod något ordentligt.
Det betyder att du inte har rätt behörigheter till
komma att på servern.
Det är som att, nej, du kan inte se det.
404 betyder att saken finns inte.
Hittades inte.
Du har säkert sett att en hel del.
>> 500 Internal Server Error är oftast som något gick fel på sidan
av servern.
Så när du genomförde pset7, om du hade PHP fel, du kunde
faktiskt gå till sidan och se en massa PHP fel grejer.
Men det betyder inte normalt händer, eftersom webbplatser som egentligen inte vill
berätta varför deras webbplats är trasig.
De kommer antagligen bara tillbaka en 500 Internal Server Error.
>> Och så finns det 418 Jag är en tekanna.
Det finns en hel historia om varför det är en sak.
Men du kan läsa om det på din egen tid.
Det finns en hel massa andra statuskoder också.
Men dessa är de du borde veta.
Så låt oss tala om HTML.
HTML, kom ihåg, är inte en programmeringsspråk.
Det är ett märkspråk.
Det betyder att den beskriver innehåll.
Den talar om vad ett HTML-dokument ser ut gillar eller inte hur det ser ut
men hur det är strukturerat.
>> Så det definierar en struktur och semantik för webbsidor.
Det är som att, det här är ett stycke.
Detta är en ordnad lista.
Det är som en del av min sida.
Här är titeln.
Det gör sånt.
Det behöver inte styla något av detta, eftersom det är vad du gör i CSS.
Och det ser ut som en serie av kapslade taggar.
Så för att använda ett exempel på en riktigt grundläggande HTML-sida, har du DOCTYPE
deklaration där uppe.
>> Detta DOCTYPE-deklaration är säga, vi använder HTML5.
Då har du stora HTML-taggen.
Den innefattar ett huvud och en kropp.
Inne i huvudet, har du titeln.
Det är det som går i titeln fältet i webbläsaren.
Vi har en länk tagg som länkar i en extern formatmall.
Och sedan har vi ett manus som drar från en extern JavaScript samt.
>> Och sedan inne i vår kropp är faktiskt vad som får visas på sidan.
Vi har en punkt och sedan en bild i den punkten.
Den här är en bild av kattungar.
Lägg märke till att den bild som tag sluter sig.
Så istället för att öppnas med en bild och sedan göra en annan / bild, du
bara ha den här lilla snedstreck Här, som stänger den.
Och bildtaggen har också denna knapp värde attribut kallas alt.
Det är det alternativ text som händer när du för muspekaren över den.
>> De flesta HTML-element har någon nyckelvärde saker som du kan ge det, olika
anpassning.
Yeah.
>> PUBLIK: [OHÖRBAR].
>> ANGELA LI: Jo, det är så en attributet för taggen.
Så om du använder jQuery, du kunde göra väljer image.getAttribute.
Och sedan kan du söka efter få alt-attributet.
Och det kommer att ge dig kattungar.
Om du kommer ihåg formulär i HTML, ingång element kommer att ha namnattribut.
Och det är vad PHP använder för att skicka förfrågningar när ett formulär skickas.
>> PUBLIK: Visste du nämna något om hur om du använder kittens.jpg eller
något som har den felande mappar eller andra filer?
>> ANGELA LI: Ja.
Så detta är vad som kallas en släkting väg, eftersom jag inte ger
du hela sökvägen.
Det är som när man i C om du gör fopen viss fil, om du fopen hi.txt, att
hi.txt väntas vara i samma katalog, om du inte ger det ett mer
komplex bana.
>> PUBLIK: Så du kan ange vilken mapp [OHÖRBAR]?
>> ANGELA LI: Ja.
Och du kan slå upp hur man gör det.
Men om jag ville få kittens.jpg ut av moderkatalogen, skulle jag göra
.. / Kittens.jpg.
Yeah.
Ursäkta.
Yeah.
Oh man, jag glömde fråga.
Vad var frågan?
Åh, var frågan är, kittens.jpg förväntas vara i samma katalog?
Och i det här fallet är det.
Men du kan också ge det en viss väg så att det inte behöver vara.
Bra?
>> CSS.
Så CSS, som HTML, är inte ett programmeringsspråk.
CSS är bara en serie stylingregler.
Det står för Cascading Style Sheets.
Och du använda det tillsammans med HTML till stilsidor.
Så det finns tre sätt du kan inkludera det.
Ett sätt du kan göra det är i huvudet del av din HTML, kan du bara
öppna en stil tagg och sedan hålla några CSS regler där.
Det är ganska OK.
Yeah.
>> PUBLIK: Kan du sätta dem stil taggar i mellan, låt oss
säg, kropp och / kropp.
Och då skulle du vara styling bara i kroppen.
>> ANGELA LI: Du kunde.
Det kommer att fungera.
Men du bör inte, eftersom styling är typ av metadata som ska gå i
huvudet på dokumentet.
Body borde egentligen bara innehålla vad som faktiskt kommer att
dyker upp på din sida.
>> PUBLIK: Så skulle du sätta stil i huvudet för att styla
hela webbsidan, eller hur?
>> ANGELA LI: Ja.
Så sätter stil här, dessa CSS-regler kommer att gälla för hela sidan bygger på
sina väljare.
Så det bättre sätt att göra det är istället av att ha en stil tagg i huvudet,
du har denna länk till en extern format ark som jag visade i
föregående exempel.
Vad detta innebär är det försöker och finner filen style.css och sedan drar den
i och använder detta som stilar för sidan.
Och din style.css skulle bara se ut så här.
Det skulle bara vara en massa CSS.
>> Och slutligen, det finns ett annat sätt att kan inkludera CSS, som du verkligen
ska aldrig göra.
Det är samtals inline styling.
Och så alla HTML-element kan också ta en stilattribut.
Och sedan i den stilen attribut, du kan ge den CSS-regler.
Så i detta fall, oavsett div jag är definiera just här, det kommer att
har en svart bakgrund och en vit textfärg.
Men du bör inte göra detta, eftersom det det betyder är det sätter din styling
i din HTML.
>> Och jag vet att vi har pratat om HTML är struktur och CSS är stil.
Om du gör detta, blandar det ihop dem.
Och det är inte mycket ren.
Så gör inte det.
Med hjälp av ett exempel på CSS, där uppe, vi välj bara kroppen av HTML
dokumentärfilm.
Och vi är som, allt är kommer att bli Comic Sans.
Jag också inte rekommenderar det.
Men du kunde göra det.
>> Den andra regeln just här, det kommer att välja element på
sida med ID viktigaste.
Så vad HTML-element, sade jag ID = Viktigaste, jag ska ge det en
20-pixel marginal och rikta allt, all text, till mitten.
Det sista väljer genom CSS-klass.
Så alla element på sidan som jag gav ett avsnitt klass, jag kommer att göra det
en bakgrundsfärg ljusblå.
Yep.
Det är allt jag har.
Fråga?
>> PUBLIK: Vad gör hashtag innan huvud göra?
>> ANGELA LI: Frågan är, vad gör hashtaggen innan huvud göra?
I detta fall är det hash i CSS innebär välj med ID.
Så om jag hade någon HTML-element, som Divid = viktigaste, den här CSS-regel väljer
saken med ID viktigaste.
Och på samma sätt, den tid framför avsnitt är att välja med CSS-klass eller
Välj med HTML klass.
>> PUBLIK: Varför finns det en har före 6 i bakgrundsfärg?
>> ANGELA LI: Ja.
Så frågan är, varför finns det en hash innan 6?
Detta är annorlunda än den hash.
Det innebär att du ger en hexadecimal färg.
Så hex färger, detta bara representerar en färg.
Och du kommer ihåg RGB-tripplar när du gjorde det kriminal pset?
Detta är liknande.
De två första siffrorna representerar hur mycket röd i färgen.
De andra två representerar hur mycket grönt.
Och den tredje representerar hur mycket blått.
Och hash är detta kommer för att representera en färg.
>> Så allt från 0, 0, 0, 0, 0, 0 upp till F, F, F, F, F, F är giltigt.
Det är någon giltig färg som kan visas av webbläsaren.
Fråga?
>> PUBLIK: Vad är skillnaden mellan med hjälp av ID och klass?
>> ANGELA LI: Frågan är vad som är skillnaden mellan
med hjälp av ID och klass?
Du kan bara ha en del i en HTML-dokument som har en given ID.
Så bara en sak på min sida är tillåtet att ha ID-huvud.
Så du använder det för detta är rubriken.
Detta är navigering.
Detta är sidfoten.
Klasserna är annorlunda, eftersom du kan tillämpa klasser till så många HTML-element
som du vill.
>> Så till exempel, jag gjorde klass avsnitt, för det finns nog mer än en
avsnitt på min sida.
Du är bara tillåtet att ha så många element på sidan med samma
klass, men endast en med en viss ID.
>> PUBLIK: Så pricken representerar klassen?
>> ANGELA LI: Ja.
En prick representerar en klass.
Cool.
Det är allt jag har, killar.
Tack.
>> [Applåder]
>> ZAMYLA CHAN: Hej, alla.
Jag är Zamyla.
Jag kommer att täcka PHP, MVC, och SQL idag.
Mycket av det material som jag kommer att beläggning kommer att bli ganska mycket
direkt ur pset7.
Okej.
Vad är PHP?
PHP står för PHP Hypertext Preprocessor.
Så är det i och för sig är en rekursiv namn, vilket är ganska coolt.
PHP är ett server-side skriptspråk, och det ger backend
och de logiska grunderna på vår hemsida.
>> Så Angela pratade mycket om HTML och CSS som kommer att göra strukturen
av webbplatsen.
Men om du vill ändra på det innehåll dynamiskt eller om det varierar
baserat på användarens eller vissa villkor?
Det är där PHP kommer in
Nu, typiskt, kanske PHP ta några mindre linjer för att genomföra samma sak
i C. Det beror på att PHP hanterar minnet ledning för programmeraren,
i motsats till oss med att malloc gratis, sådana saker.
>> Men eftersom PHP är en tolkande språk, oftast kan det exekvera
lite långsammare än C, vilket är en kompilerad språk.
Eftersom vi rör programmering språk, låt oss titta på hur
syntaxen kommer att skilja sig.
Låt oss vara mycket noga med att inte få förväxlas med denna.
Så med PHP syntax, oavsett om du är bädda din PHP inne i en HTML
fil eller inom en. php-fil själv, du behöver bifoga koden i det öppna
PHP och de slutna PHP taggar som följer, som på skärmen.
>> Variabler i PHP.
Varje enskild variabel kommer att börja med $-tecknet följt av namnet på
din variabel.
Nu är variabler i PHP löst skrivit, vilket innebär att du inte behöver
för att ange vilken typ av data som är när du förklara det.
Men detta betyder inte att de har inte några typer alls.
Så om jag deklarerar en variabel och bara ställa det lika med 1, och sedan förklarar jag
annan variabel, ställ den lika med "1" och sedan en till 1,0, ja,
beroende på vilken typ av jämställdhet operatörerna använder jag, om jag vill jämföra
för alla typer, då de ska vara lika.
Men om jag vill vara säker på att typer är lika, kan PHP fortfarande göra
att, även om vi inte anger vilken typ det är när vi
först göra filen.
>> Nu, i PHP, även om vi är omkoppling från programmering
språk från C, vi har fortfarande vår trovärdig om villkor, precis som denna.
Vi har fortfarande våra medan slingor, bara så här, där du lägger i din
tillstånd och därefter kropp av slingan.
Och sedan har vi också vår för loop, som normalt ser ut så här.
Så om jag ville att iterera över alla nio psets och skicka och ringa ett
Funktionen submitPset, då jag kan göra det här, som ni har alla
görs av denna punkt.
Grattis, förresten.
>> För att kameran, människor sade, tack.
Nu, om du inte vill bara använda den här för slinga, sedan PHP faktiskt också
har saker som kallas foreach loopar.
Så om jag hade en matris med heltal, 0 genom 8, lagras i arrayen psets,
då skulle jag ha en foreach loop som itererar över varje nummer i psets.
Och då kunde jag ringa samma fungera åtta gånger,
precis som jag gjorde innan.
Så det här för varje slinga är trevligt, eftersom du behöver inte om du inte vet
den exakta längden av arrayen som du har, sedan använda denna foreach loop
tar hand om det åt dig.
>> Så jag gjorde psets som en matris.
Låt oss titta på det.
Arrayer i PHP är vanligtvis densamma som de som vi har haft i C, där
Du kan deklarera en array.
Och här, kan jag förklara en tom array och sedan bygga upp dynamiskt genom att använda
index som heltal.
Så index 0, kommer jag att förvara ett heltal som heter 1.
Vid index 1 på min lista, jag ska att lagra värdet 2.
Och på den tredje index, men det andra nummer, kommer jag att
lagra numret 12.
>> Nu är det fina i det fungerar det fungerar bra.
Men säger att det är viktigt för mig vad varje index innehar.
För mig, index 0 betyder hur många katter jag har.
Och index 1 innebär hur många ugglor jag har.
Och nästa betyder hur många hundar.
Tja, då är det att ange att, istället för att behöva komma ihåg 0 avser
katter och 1 till ugglor, kan jag använda associativa arrayer, vilket innebär att
istället för heltal som mina index, Jag kan faktiskt använda strängar.
>> Så det här är ganska bra.
Och du har i princip bara ersatt heltalen med strängar.
Och där har du en associativ array.
Yeah.
>> PUBLIK: Finns det en anledning till varför det finns ett understrykningstecken för den andra
del, eftersom min lista har arrayen.
>> ZAMYLA CHAN: Frågan var, är finns en anledning till varför det finns en
streck mellan min och lista?
Nej.
Det är bara hur jag namnge min variabel.
>> Publik: På den första linje, det är ett ord.
>> ZAMYLA CHAN: Jag ber om ursäkt.
Jag ska fixa det.
Yeah.
De bör vara samma variabelnamn.
God fångst.
OK.
Så låt oss gå vidare till sträng sammanfogning.
Om jag ville ta två strängar, då kan jag slå samman dem
med punktoperatorn.
Så om jag har Milo som förnamn och bananer som ett efternamn, sedan
sammanfoga med punktoperatorn och sedan sätta ett utrymme mellan
kommer att göra en sträng som innehåller Milo Banan, som jag sedan kan upprepa eller,
snarare, skriva ut.
>> På tal om eko, låt oss tala om några användbara -
oops.
Jag är ledsen.
Några användbara PHP funktioner.
Så vi har det -
tekniska svårigheter.
En sekund.
Jag skickade det.
PowerPoint problem.
Och vi är tillbaka med PHP funktioner.
>> Så vi har det kräver funktion, där Om du passerar i en fil, här är bara
ett exempel på en fil som Jag skulle kunna gå i.
Då det kommer att innehålla PHP-koden från den filen som jag anger.
Och det kommer att utvärdera det i.
Sen har vi också eko, som är en parallell till printf.
Utträde sker en parallell att bryta, som lämnar blocket av
kod som du befinner dig i.
Och då tomma kontrollerar om en given variabel är som null eller noll eller
vad likställs med att vara tom.
Yeah.
>> PUBLIK: För strängsammanfogning dot operatören en, i PHP är att det
samma som i JavaScript där det med hjälp av punkten för sammanslagning innebär plus?
Så för fullständigt namn, kan du ha dollar underteckna först + och sedan + pågå?
>> ZAMYLA CHAN: Ja.
Så frågan var om i PHP vi kan använda samma strängsammanfogning
som i JavaScript med på plussidan.
Josef kommer att få in det senare.
Jag tror att han har en bild på det.
Egentligen är det annorlunda.
Så i JavaScript, måste du använda plus att sammanfoga strängar.
Och i PHP, måste du Använd punktoperatorn.
Så de är olika.
>> OK.
Så nu när vi har täckt alla denna PHP, var kommer det
verkligen komma till hands?
Tja, den kommer väl till pass när vi kan kombinera det med vår HTML.
Så vår PHP ger oss kraft att ändra en sidas HTML-innehåll innan
dess belastning.
Så utifrån olika förutsättningar, oftast den specifika användare som är
loggat in, kan vi visa olika information.
Linda, hade du en fråga?
>> PUBLIK: Kan du sammanfoga ett heltal också?
>> ZAMYLA CHAN: Ja, det kan du.
Så frågan var om du kan sammanfogar heltal eller annan
variable.s nu, vi går vidare till MVC, som är ett paradigm som vi använde i
pset7 och en hel del webbdesigners använder för organisera koden i filerna
på deras hemsida.
M står för Model.
Och i grund och botten, kommer modellfiler hantera med interaktioner med databasen.
Visa filer, de hänför sig till estetik av webbplatsen.
Och Controller handtagen användarnas önskemål, tolkar
uppgifter, gör andra logik.
>> I pset7, vi kombinerade modellen och kontrollenheten.
Och vi bara kallade dem styrenheter och sätta dem i den offentliga katalogen.
Och visa filer, använder vi dem som mallar i mallar katalogen.
Så här diagrammet här representerar också att samma typ av uppdelning med
modellen och regulatorn i lila här till vänster och
vyn till höger.
Så det här är en schematisk att en del av er kan ha sett på kontorstid eller
diagram som vi drar du skulle räkna ut din pset.
>> Så här är det i en viss styrenhet, en modell controller, har vi funktioner
som hänför sig till att fråga SQL databas, köra PHP-logik.
Kanske du skulle se upp ett lager i Yahoo!
Finans.
Eller kanske vill du bara kolla på se om en användare hade lämnat in en
utgör redan innan de har besökt din sida.
Och då skulle du göra en bilda hit.
Efter denna form hade lämnats in av användaren, den åtgärd som var
anges i form HTML-tagg skulle indikera den sida som det
tillbaka dessa data till.
>> Så all denna information skulle vara skickas tillbaka till handkontrollen.
Då skulle du förmodligen göra lite mer logik på att och kanske utföra några
fler frågor i SQL-databasen och sedan slutligen komma med ett fint
packad mängd information som du skulle gå in i en annan mall
som visade den informationen.
Nu, hur ska vi egentligen paketera informationen upp?
Jo, vi har en funktion som heter Render som var i functions.php fil i
pset7, där du passerar i namn av en fil, namnet på en mall.
>> Och då du även skicka in en associativ array.
Och så att associativ array representerar de olika informations
som du vill passera i.
Nu, vad som kommer att vara konstant i dessa exempel är att knapparna eller,
snarare, nycklar associativa arrayer, de är vad som kommer att bli
förväntas vara konstant genom att använda mallen eftersom den vet den behöver
något som kallas meddelande eller kallas namn.
Och sedan det som är på höger, faktiska värden, så i detta fall, som är
en bra pojke och Milo, är de som kommer vara de värden som förändras
att regulatorn ändras varje gång eller baserat på ett visst villkor och
kommer att passera det i.
>> Så här i mallar, ser vi att vi använder HTML specialtecken,
vilket bara i princip innebär att vi vill att få den inbördes sträng som den
användaren lagt ned
Och vi vill ersätta meddelande där.
Så då när vi faktiskt se filen, den specifika
information skickas i.
Observera att nyckeln hur återge verk är att nycklarna till associativa
arrayer, de blir rörliga namn här.
Och så värdena för att nyckeln i associativ array blir då den
värdet på variabeln.
>> Nu ska vi gå vidare till SQL.
Den står för Structured Query Language.
Och så detta är bara ett programmerings språk avsett
för hantering av databaser.
Och det kom till pass för oss i vår pset7 finans webbplats.
I huvudsak är det bara ett enkelt sätt att spåra och hantera föremål och tabeller
och koppla dem till varandra.
Nu, tänk på din SQL-databas i grund och botten som en Excel-fil, kanske,
med flera flikar ark.
>> Så du kan ha flera tabeller, kanske, som länkade till varandra.
Och ungefär som Excel, har vi en hel del den funktionalitet som vi vill ha.
Till exempel kan vi välja vissa rader.
Vi kan sätta in informationen.
Vi kan uppdatera rader.
Och vi kan också ta bort saker.
>> SQL välja verk genom att välja rader eller en rad specificerade kolumner från en
databas som matchar en viss kriterier som du anger.
Så här borta när jag ser select * från guider där hus = Ravenclaw, då
Jag väljer *, vilket betyder att jag är väljer varje kolumn i det
raden från guiderna tabellen men bara om huset kolumnen lika Ravenclaw.
Nu är detta rent eller SQL.
Så om jag gick in i phpMyAdmin, som är det specifika sätt som vi använder för att hantera
våra SQL-databaser, så jag kunde sätta in som i phpMyAdmin hemsida.
Och det skulle köras.
>> Men vi egentligen vill göra som på PHP-sidan.
Så hur gör vi det?
Tja, vi använder frågefunktionen, som i princip utför den SQL-fråga.
Använda?
som platshållare, kan vi passerar i vissa värden till våra sträng som vi
vill ersätta.
Så kanske jag lagra olika värden i curr_house, vilka
representerar den aktuella huset att jag går igenom.
Så jag kan skicka det i en platshållare med frågetecknet.
Och sen ska jag i princip köra samma sak som jag gjorde förut, utom
Nu är jag i PHP.
>> Och frågan kommer tillbaka en associativ array.
Och jag ska förvara den i rader.
Nu kan frågan alltid misslyckas.
Kanske SQL-fråga inte kunde utföra eftersom tabellen inte existerar.
Eller kanske gjorde kolumnen inte.
Något gick fel.
Tja, i så fall kommer du vill göra Se till att du kontrollera om
fråga återvände falskt.
Och det är med hjälp av trippel lika operation där.
>> Och så jag ber om ursäkt, vilket är en annan CS50-funktion, som går i ett meddelande.
Och om man tittar in om ursäkt, allt det verkligen är rendera apology.php.
Yeah.
>> PUBLIK: Kan du förklara vad det stjärnan gör mellan att välja och från?
>> ZAMYLA CHAN: Ja, absolut.
Så stjärnan i mellan select och från betyder att jag vill välja hela
Hela raden från mitt bord.
Jag kunde ha indikerat väljer namn, år, hus.
Och jag skulle bara få dessa tre kolumnerna i min tabell.
Men om jag säger select *, så kommer jag få allt i den kolumnen.
Då kommer jag att gå dig i ryggen först.
>> PUBLIK: Så detta är fortfarande i SQL, eller hur?
Är det fråga eller är det PHP?
>> ZAMYLA CHAN: Vi är i en fråga.
Så det här är i PHP.
Så med hjälp av PHP-funktionen frågan, vi utför en SQL-fråga.
>> PUBLIK: Är något i SQL små bokstäver, som väljer
eller trollkarlar eller hus?
>> ZAMYLA CHAN: Är något i SQL och små bokstäver?
Jag tror det, ja.
Jag tror att SELECT och FROM och VAR är skiftlägeskänsliga.
Nej?
>> ROB BOWDEN: Så, det är tvärtom.
Kolumnnamnen och bordsmedel, alla dessa är skiftlägeskänsliga.
Men någon av MySQL nyckelord, liknande SELECT, FROM och WHERE, de är inte
skiftlägeskänsliga.
OK.
Så motsatsen till vad jag sa.
Så alla MySQL nyckelord -
välja, från, där - de som är inte skiftlägeskänsliga.
Men allt annat är.
OK.
Du i fronten.
>> PUBLIK: Om jag har $ rader i termer av mer än en rad, betyder det är
bara blir en associativ array?
>> ZAMYLA CHAN: Så frågan var om rader har mer än en rad i den, gör
det blivit en associativ array?
Så det är en samling av associativ arrayer redan.
Så även om det bara finns en rad tillbaka, då skulle du behöva gå till
index 0 i detta resultat.
Och då skulle du ha den första raden.
Ja, Belinda?
>> PUBLIK: När du använder ===, Detta är den enda instans?
Eller finns det andra?
>> ZAMYLA CHAN: Så i detta fall, === är en jämförelse mellan olika typer.
Ursäkta. === Är en jämförelse som jämför de typer.
Och sedan == jämför för alla typer.
>> PUBLIK: Kan du förklara vad raderna är i denna situation?
Är det dataraden?
>> ZAMYLA CHAN: På nästa bild, jag är kommer att förklara vilka rader är.
Så om du inte har något emot att hålla rabatt på det.
Och sedan i ryggen?
>> PUBLIK: För funktioner som sökning, rendera och ber om ursäkt [OHÖRBAR]?
>> ZAMYLA CHAN: Frågan var om dessa funktioner - query, be om ursäkt,
och göra -
är vanliga i PHP.
Dessa är de som CS50 skrev för pset7.
Och Jay?
>> PUBLIK: När du behöver säga $ _SESSION, Är det bara för ID?
Eller skulle du ha sagt det här?
>> ZAMYLA CHAN: Så frågan var, när Vi använder $ _SESSION, det var en viss
global variabel som vi använder.
Här denna variabel kommer att vara lokal för vår funktion.
Så vi bara förklara en ny variabel.
>> PUBLIK: Hur be om ursäkt förs?
>> ZAMYLA CHAN: Frågan var, hur är ursäkt förs?
Och jag tror att detta är faktiskt en ganska god praxis för er att gå in i
den functions.php sektionen och titta på be om ursäkt och se hur du kan få
gjort det själv.
Så jag kan lämna det till dig men bara säga att om man tittar på be om ursäkt,
då tar det meddelandet som du lämnats att be om ursäkt, och då är det
gör det budskapet.
Fler frågor?
Jag älskar frågor.
Så att de kommer.
>> PUBLIK: [OHÖRBAR]
echo eller skriva ut det?
>> ZAMYLA CHAN: Frågan var, kunde vi inte bara har lagt
echo eller skriva ut det.
Så det skulle ha gjort något något annorlunda.
Det skulle ha tryckt fråga misslyckades i det -
ja, just nu är vi faktiskt I vår controller.
Så vi behöver faktiskt inte HTML inställd här.
Apologize genom rendering apologize.php faktiskt omdirigerar dig till apology.php.
OK.
>> Så nu ska vi gå vidare för att ta itu med fråga från tidigare om vad
verkligen är rader.
Tja, fråga kommer tillbaka en matris av rader.
Och varje v representeras med en associativ array.
Så om jag har verk någon SQL-fråga och Jag har lagrat resultat i rader, då
med användning av en foreach loop, då matrisen namn är den första där - rader.
Och då kommer jag att ringa varje rad i det $ rad.
>> Så iterera över det, jag kan då komma åt den givna raden namn kolumnen
år kolonn, och hus kolumnen.
Observera att jag inte skulle ha kunnat gör det med rader, eftersom rader index
existerar inte känt.
Rader är bara en uppsättning av associativa arrayer.
Så du har två nivåer där.
När du har matrisen med raderna, du måste komma in i det.
Och då kan du komma åt kolumnerna.
Gjorde att göra klart?
Ja, i fronten?
>> PUBLIK: [OHÖRBAR] öppna fästen för [OHÖRBAR]?
>> ZAMYLA CHAN: Ursäkta mig?
>> PUBLIK: De öppna parentes.
>> ZAMYLA CHAN: Dessa här?
Det är att tillåta mig att inkludera denna variabel.
Yeah.
>> PUBLIK: När du skriver ut, är du skriva ut till HTML-koden?
>> ZAMYLA CHAN: Ja.
När jag skriver ut, det är här inne min mall nu, så
min syn på MVC-metoden.
Så jag skriver in i HTML.
>> PUBLIK: Så om vi gick in utvecklare verktyg efter att ha kört det här, vi kunde
som faktiskt i kod?
>> ZAMYLA CHAN: Det är en stor fråga, ja.
Så om du gick in i utvecklarverktyg i Firefox använder Firebug eller
Chrome, så ja, du kan se den specifika HTML.
Så det skulle inte visa $ rad ["Namn"].
Det skulle visa vilket som heter i den raden.
>> PUBLIK: Bara en allmän fråga, vad är tr och td definieras som?
Varför skulle vi [OHÖRBAR]?
>> ZAMYLA CHAN: tabellrad tr, tabell td sedan kolonnen.
OK.
>> PUBLIK: Ja, det är tabelldata.
>> ZAMYLA CHAN: Tabell uppgifter.
Yeah.
>> PUBLIK: Det är en rad som raden behandlas som en kolumn?
>> ZAMYLA CHAN: Förlåt.
Kan du upprepa det?
>> PUBLIK: Hur skulle du visualisera rader?
>> ZAMYLA CHAN: Hur skulle du visualisera rader i vilken typ av väg?
Talar du om dessa rader här eller tr raderna?
>> PUBLIK: Raderna.
>> ZAMYLA CHAN: Dessa rader här?
Jag skulle visualisera detta som Jag kör min fråga.
Och den säger, OK, jag har antingen 0 till n mängd rader som matchar kriterierna
att du hade frågat.
Så jag har en viss antal rader.
Så rader, de $ rader, butiker vardera en av dessa rader i en array.
Så även om det är bara en av dem, det är fortfarande en mängd rader som matchar det.
>> Så då, till exempel, är det som när du hämtade
cachen från användarna.
Och de kriterier som fanns där ID är lika med sessions-ID.
Det finns egentligen bara är en rad som kan matcha det.
Men fortfarande rader just återvänt en rad.
Så du skulle behöva gå till rader, index 0, index cache för att
faktiskt få till cacheminnet.
>> PUBLIK: Är utskriftsfunktionen i echo samma sak?
>> ZAMYLA CHAN: Ja.
Ja.
Skriv ett eko av samma.
>> PUBLIK: Är foreach loop enda sättet att index i rader?
>> ZAMYLA CHAN: Är en foreach loop det enda sättet som du kan
iterera genom raderna?
Nej.
Du kan också använda en for-loop, förutsatt att du vet längden
av radens array.
>> PUBLIK: Kan du komma åt den med hjälp av en rad som [OHÖRBAR]?
>> ZAMYLA CHAN: Så du kan inte få tillgång till det bara med hjälp av raden om du inte har en
foreach loop förutsatt att du inte har deklarerat rad.
Ja.
Ja, i vitt.
>> PUBLIK: Så vad gör tr och td göra?
>> ZAMYLA CHAN: Så tr och td är HTML-taggar.
tr anger början av en tabellrad.
Och varje td anger en ny tabell datakolumnen.
>> PUBLIK: För en visuell av vad en rad är liknande, tänk SQL, hur
de har en rad.
[OHÖRBAR].
>> ZAMYLA CHAN: Ja.
Det är en stor punkt.
Du kan visualisera rader som bara som i en Excel-tabell, bara
listan över raderna.
OK.
Okej.
Så nu när vi har gått över väljer, om det inte finns några fler frågor, vi ska
gå över på insats.
Så om jag ville sätta in några tabell och infoga vissa kolumn
värderingar, jag kunde sätta mig själv i Ravenclaw i år 7.
Men ibland kan det finnas dubbletter värderingar, som vi såg i pset7 när vi
var att uppdatera vår portfölj.
>> Så i det här fallet vill vi använda ON Dubblettnyckel UPPDATERING, så att vi inte
lagra flera rader med samma värdera utan snarare uppdatera den.
Då vi faktiskt har uppdatering, vilket inte är ett insert.
Det är bara en uppdatering när du uppdaterar i en viss tabell med ett givet
kriterier och, slutligen, ta bort, vilket gör ett mycket liknande sak.
>> PUBLIK: Kan du kort gå över den dubbla nyckel?
>> ZAMYLA CHAN: Ja.
I huvudsak här, jag har INSERT INTO gringotts är, galeoner, dessa värden.
Men ID, förmodligen, är en unik nyckel värde inrättas i MySQL tabellen.
Så om jag redan har detta ID inrättat, då kan jag inte sätta in en ny rad.
Så om det inte redan finns, då måste jag uppdatera den.
I mitten på den vita.
>> PUBLIK: Så infoga, uppdatera, ta bort, och väljer, är de alla tillgängliga
lokalt [OHÖRBAR]?
>> ZAMYLA CHAN: Så sätter, uppdatera, ta bort och
välja är alla SQL-frågor.
Så när du använder SQL, du har dem tillgängliga.
>> PUBLIK: Tillbaka till de senaste frågesporter -
Det var en fråga som behandlas om du hade ett bord och ville
sätt in provresultat i ett och du sätter ditt namn så det kommer inte att låta dig
[OHÖRBAR] din väns testresultat.
Hur skulle du göra det med insats?
>> ZAMYLA CHAN: Så frågan var om en tidigare halvtids fråga.
Jag är inte medveten om vilka en det är just nu.
Så kanske efteråt, om du vill komma och visa mig, då kan jag
säkert ge dig tips.
Men på tal om att sätta in saker, som ta någons poäng när du
bör inte, låt oss tala om SQL injection attacker.
Så en SQL-injektion attack är i huvudsak där någon tar
fördel av den låga säkerheten för sätt som du tar in data.
>> Så här, precis som i CS50 finans, När vi loggat in, kan vi gå in i en
användarnamn i inloggningsformulär, den första textrutan och
sedan in i ett lösenord.
Kanske vår PHP-kod kan se ut ungefär så här, där $ username
är den post-data som användarnamn och lösenord är post-data som lösenord.
Och då kommer vi bara köra vår fråga, säg, OK, bra, är vår fråga kommer att
Välj från våra användare, där användarnamnet är
en som de lämnat.
Och lösenordet är lösenordet, vilket innebär att lösenorden matchar.
>> Nu, tänk om istället för att faktiskt lämna in en verklig lösenord, som
12345 och gissa på stiftet som säger lösenord och försöker hacka deras
konto, tänk om istället de lämnat det.
De kunde skriva in kanske en gissning på ett lösenord.
Och då skulle de avsluta quote skriv sedan in eller 1 = 1.
Det skulle tempo direkt i SQL fråga att se ut så här.
Välj från användare där användarnamn = utsprång och lösenord
lika lilja eller en = 1.
>> Så antingen lösenordet har vara korrekta eller 1 = 1,
som alltid är sant.
Så i detta fall, i princip, en användare kan dra nytta av detta och bara log
sig in och hacka någons konto.
Så det är därför vi vill undvika någon som har att göra detta.
Men lyckligtvis, frågefunktionen genom passerar i platshållarna kommer att ta
hand om det åt dig.
Dessutom kommer du vanligtvis aldrig vill att faktiskt lämna in lösenord
själva.
Det är därför vi hashas eller krypterad dem i CS50 finans.
>> PUBLIK: Det gångna quiz talade ca MySQL utrymningssträngar.
Måste vi oroa dig för det?
>> ZAMYLA CHAN: Det är en bra fråga.
MySQL flykt strängar är definitivt en funktion som användes i vår fråga.
Men definitivt undersöka det.
Jag skulle säga att det är rättvist spel att veta att du skulle behöva ringa det
fungera på ett snöre.
Ja, Belinda?
>> PUBLIK: Hur vet du när det är apostrof eller dubbla citationstecken?
Och också, jag känner mig som i föreläsning du nämnde något om att inte ha
den [OHÖRBAR] eller något eller andra enda anbud i slutet.
Jag tror att han påpekade i föreläsning som du ska ha apostrof 1
och sedan inte ha apostrofer eller något.
>> PUBLIK: [OHÖRBAR].
>> PUBLIK: Saken är den sista singeln citat där inne i den andra rutan
borde inte vara där.
[OHÖRBAR]
För när du tar den sista singeln citera ut och matcha dessa för innehåll
där lösenordet är, om du har det fråga, det finns ett enda anbud på
slut redan.
Du vill använda det enda anbud som den som är vänd mot en
[OHÖRBAR].
Så vad är egentligen i den texten box borde inte ha det.
>> ZAMYLA CHAN: Jag ska ändra på det.
OK.
Om det inte finns några frågor, så kommer jag vidarebefordra den till Josef för att prata
om JavaScript, et cetera.
>> [Applåder]
>> JOSEPH ONG: Så vi kör en liten bit bakom.
Så om du måste lämna, det är OK.
Men vi ber att du håller dina huvuden om du är i mitten, så att du
blockera inte kameran och du använder ryggen exit om du måste.
Jag är Josef förresten.
Hej.
Test-, test.
Dan, är det bra?
Cool.
>> Så videon kommer också att publiceras på nätet för dem som
måste gå nu.
Besvärliga.
OK.
Så frågesport översyn.
Detta är en katt.
Nu, JavaScript, vilket är kanske inte som aww för vissa av er.
OK.
Så det är först, minns från Zamyla.
Kom ihåg att PHP är körs på servern.
Och massor av gånger, skrev ni slingor i PHP för att skriva ut HTML, eller hur?
Så när den koden körs, att HTML-utgång som du skriver ut
får skickas till användaren.
Och när det händer, inte mer PHP kan köras, om du inte ladda om sidan, om
kurs, som reexecutes PHP.
Men när du skriver ut det HTML, du kan inte gå någonstans.
>> Så att HTML skickas över till användaren, vilket är webbläsaren hit, där
Milo använder datorn.
Och så bra, finns det flera saker när vi skickar HTML till användaren.
Ibland vill vi göra något liknande när du klickar på något, vi vill ha
alert lådor för att dyka upp, dessa sorters interaktioner, som när du trycker på
tangenten när du klickar på något på sida, jag vill att något ska hända.
Tja, du kan inte reexecute PHP kod en gång att HTML är inställd.
Så hur gör man detta?
>> Vi introducerar ett nytt språk som kallas JavaScript, som körs i webbläsaren
som tillåter dig att göra saker till HTML när du får
dem från servern.
Och det är därför vi kallar det en klientsidan programmeringsspråk.
Det fungerar på din dator -
klienten.
Eventuella frågor om det hittills?
Detta paradigm är vettigt att människor?
OK.
Bra.
Okej.
Så det första att notera är JavaScript är inte PHP.
>> De har några olika syntax, som vi ska gå in.
Och de har mycket olika användningsområden.
JavaScript, återigen, för din browser, för kunden.
Server körs någonstans på någon annans dator som skickar information
till dig, korrigera?
Så om vi ber dig att skriva PHP-kod på en tenta fråga, inte skriva
JavaScript och vice versa.
Du kommer bara att förlora poäng, och det kommer inte vara rätt.
>> Så låt oss komma in i några syntaxskillnader -
JavaScript på vänster och PHP till höger.
Det första du kommer att märka med JavaScript, vi deklarerar variabler med
nyckelordet var -
V-A-R. PHP används dollartecken, som Zamyla diskuterats tidigare.
Om du vill deklarera en associativ array, ser vi den välbekanta syntax på
höger sida med PHP.
På vänster sida, i stället du använder klammerparenteser.
Och sedan dina nycklar är till vänster.
Då har du ett kolon.
Och sedan har du de värden som du vill.
>> Så detta är hur du skulle göra det i PHP på höger sida med det andra
linje som börjar på Milo.
Och det är hur du skulle göra det på vänster sida i JavaScript om du vill
vad vi kallar ett objekt.
Och objekt i JavaScript är bara associativa arrayer.
Så om du vill komma åt områden, i PHP du använder detta fäste syntax.
Och på detta sätt, kan du tilldela detta ägare fältet till Lauren.
>> Tja, i JavaScript, om man vill åt ett fält och ändra det, du kan
använda punktsyntax.
Du kan också använda konsolen syntax.
Men du kan inte använda punktsyntax i PHP.
Det kommer inte att fungera.
Det fungerar bara i PHP.
Och slutligen, för att skriva ut saker till konsol, använder du console.log, vilket
ni använder mycket i pset8.
Du kan console.log det.
>> Om du vill skriva ut en rad i PHP, måste du använda utskrifts r..
Och till höger, ser du jag hash strängsammanfogning där borta.
Någon frågade tidigare.
Jag använder ett plus i JavaScript.
Om jag vill sammanfoga något i PHP, använder jag pricken.
Dessa är olika.
Om du skriver PHP-kod, använd inte ett plus.
Om du skriver JavaScript kod, skriv inte en prick.
Det kommer att bli fel.
Och du kommer att bli ledsen.
>> Så syntax skillnader.
Känn din syntax, för om du måste skriva en fråga och du använder syntax
från fel språk, det kommer inte att fungera.
Och det kommer att vara fel.
Så låt oss tala om viss kontroll flödesskillnader, hur du använder
slingor i var och en av dem.
Zamyla gick över den högra sidan.
Saker på höger sida bör vara bekant.
Låt oss titta på på vänster sida.
>> När du använder för n loop i JavaScript, din loop variabel, var jag borta,
slinga över nycklarna i uppsättningen.
Så du ser namn, hus, och roll.
Om jag console.log jag, får jag namn, hus, och roll.
De är nycklarna.
I JavaScript, går en foreach loop över värdena hos denna matris.
Så du märker att de är både i..
Men här på PHP-sida, skriver den ut Milo, CS50 och Mascot.
Det är de värdena i PHP.
>> Så dessa är hur dessa två är olika på de olika språken.
Så om du använder en foreach slinga, inte anta att det
ger dig nycklarna.
Och om du använder en för n slinga, inte antar att det ger dig värden.
Är detta vettigt hittills?
Nästa bild kommer att visa dig hur du kan komma åt det motsatta i
var och en av dem.
>> Tja, om du har nyckeln i JavaScript och du vill att värdet ut,
man bara index i array med det.
Så Milo om jag kommer att få dig vad du vill - värdena.
Det är det här annorlunda syntax i PHP.
Om du verkligen vill veta det, det gör jag inte tror att vi visade det för dig ännu.
Men om du är intresserad, kan du använda detta ytterligare syntax till höger
sida som faktiskt låter dig få den nycklar i PHP när du använder en
foreach loop.
Så bara en liten bit av trivia om du är intresserad.
>> Så det är bara för att visa att Skillnaderna mellan dessa två bågar.
Förväxla inte dem när du är programmera en fråga.
Några frågor om det.
Cool.
Okej.
JavaScript-objekt.
Jag pratade om dem.
De är som associativa arrayer.
En sak som jag skulle vilja att ni notera här är det ett värde i en associativ
array kan vara vad som helst i JavaScript.
>> Det kan även vara en funktion, liksom borta.
Jag har en funktion som är ett värde på en nyckel.
Och om jag vill kalla den funktionen, Jag bara åt bark.
Och sedan satte jag parentes efter det.
Och det fungerar.
Så några frågor?
Nej?
OK.
Bra.
JavaScript, som PHP, är löst skrivit.
Vad innebär det?
>> Det har typer.
Men när du deklarerar en JavaScript variabel, säger du var jag.
Du behöver inte säga det.
Det är inte en sak.
Du kan bara säga att det är en variabel.
Och sedan JavaScript kommer att hantera typer under huven för dig.
Vi kan fritt konvertera mellan typer på grund av detta.
Så jag börjar som ett antal i det här fallet.
Och då har jag en sträng.
Och jag lägger jag till det.
Och jag tilldela den tillbaka till mig.
>> Så på den första raden, i är numret.
På den andra raden, blir jag nu en strängen efter jag gör omplacering.
Och här, jag bara sammanfoga det numret på strängen.
Så du ser att även om jag var en heltal i den första delen, det är sorterar
som att omvandlas till en sträng och sedan läggs
på det hej sträng.
Och så det är vad jag menar av den lösa typning.
Det är att du konverterar mellan typer mycket lätt.
Och det inte kasta varningar på dig som C gör.
>> Så finns jag nu hej 123 till strängen.
Nästa.
Vi kan också fritt jämföra mellan typerna.
Så om du bara använder ==, väldigt mycket som i PHP, JavaScript
gör en liknande sak.
Strängen 123 är samma som antalet 123 när du använder dubbla jämlikar.
När det används tredubbla jämlikar, det också vill se till att
typ är densamma.
Så eftersom det är en sträng och det är ett nummer, även om de är både
123, när du använder trippel är lika, du får falskt.
I dubbel är lika fallet får du sant, eftersom dubbla jämlikar inte
bryr sig om typ.
Triple jämlikar bryr sig om typ.
Frågor?
OK.
>> Och en annan sak om JavaScript är omfattning är typ av global om du inte är
i en funktion.
Och det fungerar på samma sätt i PHP faktiskt.
Så låt oss gå igenom det här exemplet.
Jag satt i till 999.
Och då jag går in i detta för slinga.
Så om jag skriver jag i denna för slinga, jag räknar med 0, 1, 2, 3, 4.
Jag får i = 4.
Det steg om jag nu till 5 på I slutet av den för slingan.
Och då bryter ut på slingan, eftersom det inte uppfyller de
skick längre.
>> Vad tror du att nästa console.log skriver ut?
Så det är vad det skulle göra i C. C, för om du har som var jag utanför
och du har var jag inne i en slinga, som en för loop, då det gör det så att
det scoped att de två i: s är olika.
I JavaScript kommer det bara behandla det som samma jag.
Jag får 5, eftersom det var värdet efter att den lämnat utanför systemet.
Så de jag har är samma jag.
Låter det vettigt?
>> Tja, är det vettigt från ett JavaScript synpunkt.
Men samma paradigm inte föra över till C. De har
olika överslags regler.
Ja.
>> PUBLIK: [OHÖRBAR]
utanför funktionen [OHÖRBAR]?
>> JOSEPH ONG: Så utanför vilken funktion?
Så jag ska få till det på bara en sekund.
Så vi kallar foo (i).
Detta går jag in foo, steg den och sedan loggas.
Så det var 5.
Så det blir 6.
Men vad jag talar om är som jag i denna funktion.
Eftersom det är en parameter, är det scoped till denna funktion.
Så när jag faktiskt får ut av det funktion, det kommer nu att gå
tillbaka till den gamla jag.
Att jag är bara scoped eftersom det är i en funktion.
Och vi har utrymme och funktioner.
Men vi har inte utrymme utanför av funktioner i JavaScript.
Låter det vettigt?
Ja.
Fråga.
>> PUBLIK: Samma [OHÖRBAR]?
>> JOSEPH ONG: Så ja.
I PHP, det är samma typ av sak.
Det finns en liten finess faktiskt.
Men du kan fråga mig om att efter översynen.
Du behöver egentligen inte veta att subtilitet för frågesport.
För alla avseenden, som variabler, global och PHP, om inte
de är i en funktion, samma sak i JavaScript.
Ja.
>> PUBLIK: Varför är detta tillåtet i JavaScript och ingen annanstans?
>> JOSEPH ONG: Så varför är det tillåtet i JavaScript och inte i C?
Det är bara den som kom med JavaScript bestämde att det var OK i
JavaScript.
Så det är precis som ett programmeringsspråk konvention som vi skulle säga.
Ja.
>> PUBLIK: Så varför gjorde det gå 6-5?
>> JOSEPH ONG: Så det gick 6-5, för när jag gick jag in i foo, att
i insidan av foo är nu med omfattningen foo, eftersom omfattningen finns i funktioner i
JavaScript.
Men när jag kommer ut härifrån, eftersom det var scoped till funktionen, jag är bara
med de vanliga jag som var inne resten av flödeskontroll.
Vettigt?
Kan jag gå vidare?
Okej.
Cool.
>> Godkännandet av detta är föremål passerar genom hänvisning.
Du vet hur när du passerar en array i C du kunde
faktiskt ändra arrayen?
Det är samma sak i JavaScript.
Om jag passerar ett objekt, i det här fallet, jag passerade Milo i denna catify funktion.
Milo börjar.
Han heter Milo Banana.
Jag passerar det objektet i en funktion eftersom det är ett föremål, en associativ
array i JavaScript.
>> När jag utför en åtgärd i denna funktion, kommer det
faktiskt ändra objektet.
Så detta kommer endast att ske efter objekt i JavaScript, precis som det händer
för matriser insidan av C. So Milo namn kommer faktiskt bli katt nu.
Låter det vettigt?
Så här fungerar bara för objekt.
Objekt skickas som referens.
Ja.
>> PUBLIK: Så du säger att i motsats till variabeln i.
>> JOSEPH ONG: Ja.
Vilken variabel jag var bara ett nummer, eller hur?
Det är som i C när du passerar en heltal a, gör det till en kopia.
Och när du passerar en array, det faktiskt förändrar den färdiga matrisen i
C. Samma sak händer med JavaScript i detta fall.
Okej.
Och nästa, är Milo tråkigt eftersom Han är nu en katt.
Det var faktiskt Milo efter någon resa till veterinären.
>> Så hur ska vi använda JavaScript på en webbsida?
Vi kan ta med den.
Detta är HTML-kod med de band etiketter.
Så jag har band taggar där.
Och då jag lägger lite JavaScript kod i skripttaggarna.
Och då den utför detta.
När jag gör det bara så här, är det kallad inline JavaScript.
Det är lite rörigt, eftersom JavaScript är faktiskt i HTML.
>> Ett bättre sätt att göra detta, mycket trevligare, är att skriva din JavaScript en
extern fil och sedan ge skripttagg med en källa.
Och detta kommer att gå till att JavaScript-fil och läsa den JavaScript-kod från
att lämna stället.
Och på detta sätt, behöver du inte en massa JavaScript i början av din
HTML-fil, vilket gör det riktigt rörigt.
Du sätter bara den någon annanstans.
Och så kommer det att öppna den där.
Gjorde det vettigt?
>> Placerings frågor.
I detta fall, de skript är innan kroppen.
Så när jag kör det, det finns ingenting i kroppen ännu.
Kanske detta kommer att göra lite mer känna av när jag visar denna nästa del.
I detta fall skriptet kommer efter div.
Så div faktiskt verkar på sidan först.
Just här i denna lilla röda cirkeln, du ser texten visas.
Och då varningen dyker upp.
>> I det första fallet, eftersom skriptet var innan div, den
varning dyker upp först.
Och sedan div dyker upp efter du avfärda lådan.
Så utförandet spelar roll.
Så vi ska ha detta i åtanke.
Detta kommer att vara viktigt i en liten bit.
OK.
Så bra, hur gör du vänta tills hela sidan laddas sedan innan du
köra lite kod?
Vi kommer att komma in i detta lite lite senare också.
Men bara hålla denna placering frågor i åtanke för när vi
komma till en annan bild.
>> Så vi får till DOM nu.
Och vad är DOM?
Så om du tittar på HTML-kod, det är bara en massa text på skärmen.
Så hur JavaScript vet att detta är ett HTML-element?
Så vi måste ha lite minne representation av denna
struktur som vi har.
Och när vi har detta i minnet representation i JavaScript, kallar vi
att DOM.
Och det är bara ett sätt att människor bestämde att vi ska representera detta
HTML struktur.
>> Och vad innebär det DOM ut?
Tja, till minne representation, Vi tar den här texten.
Och vi förvandla det till minnet representation.
Så det här är HTML.
Så vi först reda på att varje DOM-trädet har ett dokument.
Det ser ut som ett träd.
Och dokumentet innehåller HTML tag, faktiskt allt
inne i det här nu.
HTML-taggen har två barn.
Den har ett huvud.
Att huvudet, om man tittar på indrag där borta på hur det är strukturerat
mellan de nära taggarna, huvudet har ett barn.
Barnet är titeln.
Exakt.
>> Nu har vi en kropps barn.
Och sedan att kroppen har en barnet kallas familj.
Och den familjen har tre barn -
äldst, mitten, och yngsta.
Så du bör veta hur man drar ett diagram så här när vi frågar hur
att rita ett diagram när vi ger du HTML till vänster.
Vet hur man producerar DOM-trädet.
Och inne i dessa saker, det är bara lite text, som jag har representerat
så små lådor.
>> Innebär detta DOM trädstruktur gör mening och vad DOM är?
Så vad betyder det p står för?
Här borta, p borta i den taggen representerar en
punkt tagg i HTML.
Så du kan slå upp det.
Men det betyder bara att det är en del utrymme för lite text.
Och det har en viss standard CSS-styling, eftersom det är ett stycke tagg.
Men var verkligen inte oroa dig att en del för mycket.
Bara vet att det är en platshållare för lite text.
Ja.
Fråga?
Ja.
>> PUBLIK: Du nämnde bara CSS.
Hash-familjen och hash allt det där är i grunden
representerar ID i CSS?
>> JOSEPH ONG: Ja, exakt.
Jag kommer till vad dessa hashar innebär i en sekund.
När Angela gick över CSS, hon talade om CSS-väljare.
Dessa är de CSS-selektorer som hon talade om.
Ja, Rob?
>> ROB BOWDEN: Jag vill också kommentera att DOM insidan av titeltaggen
finns också en text nod.
>> JOSEPH ONG: Höger.
Så inne i rubriktaggen, Jag har en del text DOM.
Så egentligen borde denna titel har som en liten låda som kommer ut av det också.
Men det spelar egentligen ingen roll för mycket i det här fallet.
Vi vet inte riktigt bryr sig om textnoder, som vi kallar dem, för mycket.
OK, det gör vi.
Tydligen gör vi.
Och jag kommer att fixa det när Jag ladda upp den igen.
Låter det vettigt?
>> Så hur ska vi arbeta med DOM?
När du handskas med DOM i JavaScript, det finns två steg.
Du väljer ett DOM-element.
Och då du gör saker på det.
Så i detta fall, abstrakt, jag har valt mitt element.
Och sedan ett exempel på att göra saker att det skulle vara att ändra texten.
Det brukade vara Bob.
Nu, vad jag gjorde för att det var jag ändrade Bob till Milo i detta fall.
>> Så hur ska vi egentligen göra det?
Hur gör vi för val?
Och hur gör vi det gör saker till saken när vi har tagit det?
Tja, det sätt ni har lärt sig det i denna klass är att använda något som vi
heter jQuery.
Så vad är jQuery?
jQuery är ett bibliotek som gör JavaScript lättare att skriva.
Så någon tog sig tid och skrev jQuery.
>> jQuery är faktiskt skriven i JavaScript.
Och sedan för att de gjorde det, vi nu har en hel massa funktioner som
vi kan använda att göra vår lever verkligen lätt.
Så vad är några av de saker som den gör?
Det gör att välja element lättare.
Det gör att ändra HTML, lägga klasser lättare.
Det gör Ajax enklare.
Vi kommer till det på en sekund.
>> Och det är analog med C-bibliotek.
Så du inkludera string.h, du får strlen.
Man får strcpy, alla dessa saker.
När du inkluderar jQuery, får fin du sätt att välja element till förändring
saker, et cetera.
Du får extra funktionalitet som JavaScript ger dig inte.
Så jQuery är inte JavaScript.
jQuery är ett bibliotek som är skriven i JavaScript som gör JavaScript
lättare att skriva.
>> Så jQuery är inte en programmerings språk.
Men JavaScript är.
göra.
Till att du får din terminologi rätt.
Några frågor?
Ja.
Är det en fråga?
Okej.
Så hur du använder jQuery?
Jo, när du skriver något JavaScript-kod och du har en
jQuery på toppen av din fil som en skriptfil använder du dollartecken
nu att få tillgång till jQuery.
Och det skiljer sig från dollartecken i PHP.
>> Det är samma symbol som du skriver på tangentbordet.
Men de betyder väldigt olika saker.
Dollartecken i PHP innebär det är hur jag deklarera en variabel.
I JavaScript, när du har inkluderat jQuery, det står för jQuery.
Så ha det i åtanke.
Så hur kan vi väljer DOM-element?
Jo, när du gör det på fula JavaScript sätt får du tillgång till
dokumentera global variabel.
Och sedan får du del av ID-familjen.
Detta är verkligen lång och ordrik och inte mycket trevligt.
>> Eller du kan få alla element som är en p-tagg.
Det fungerar också i JavaScript.
Men vi egentligen aldrig visade du syntaxen för mycket.
Vad vi visade dig var jQuery.
Så att hela väljar uppe att uttrycktes i JavaScript bara blir
kondenseras till denna mycket trevliga dollar underteckna hashtag familj.
Och $ p, precis där det är så.
Om du vill markera alla p-taggar i en familj, satte vi ett utrymme
mellan de två.
Och nu, vi får alla p taggar inuti en familj.
>> Och ser bekant?
Tja, Angela talade om CSS-selektorer.
Ge mig en sekund.
Och så för att välja ett element, använder du bara samma sak som du
skulle göra med en CSS-väljare.
Om du lägger en hash framför av den, väljer ut den genom-ID.
En punkt väljs av klasserna.
Om du bara har saken utan hashar eller punkter, väljer det dessa taggar.
Frågor.
Ja?
>> PUBLIK: När vi använder punkt i vår HTML, är det inte jQuery?
>> JOSEPH ONG: Dot i vår HTML är en JavaScript sak.
Det är inte en jQuery sak.
Det sätt ni lärt den med jQuery är att använda. html.
Och sedan gick det allt HTML kommer att bli.
Så jag ska få till det på bara en sekund faktiskt.
Så hur gör vi saker att elementet när vi har valt det?
Så det är ett exempel på att välja ett element.
Så nu, vi vill göra saker på det.
>> Så i det här fallet, låt mig gå tillbaka till föregående bild.
Det var Bob innan.
Och jag vill ändra på det inuti HTML till Milo.
Så jag kallar HTML-funktionen från elementet.
Den HTML-funktionen är ett förfarande för elementet.
Och så jag ger det vad Jag vill att HTML ska vara.
Och det bara ersätter vad som finns inuti den taggen med vad jag ger den.
Ja.
Fråga?
>> PUBLIK: Det hashtag används för endast jQuery.
[OHÖRBAR]
Vi skulle inte använda det.
>> JOSEPH ONG: Ja, exakt.
Men oroa dig inte för mycket om ren Javascript.
Jag vill bara att ni ska fokusera på hur du skulle göra det med jQuery, eftersom
som kommer att bli den viktigaste del på frågesporten.
Rätt.
Exakt.
Så du ser att hashtag, så att motsvarar markera elementet med
ID mitten på grund av detta hashtag.
Hashtag betyder ID.
Och detta element har ett ID på mitten.
Så det är det element som vi väljer.
>> PUBLIK: [OHÖRBAR].
dollartecken hashtag [OHÖRBAR]?
>> JOSEPH ONG: Så nej.
Frågan är kan du använda. Värde.
Och. Värde fungerar bara på element som är ingångar.
I jQuery, skulle det vara . Val, inte. Värde.
Så jag ska få till ett litet exempel som visar allt detta i kombination
i en sekund.
Men jag tror att det tjänar en liten snutt vettigt att människor så långt.
Vill du ändra HTML, ring HTML-metoden.
Ja.
>> PUBLIK: Kan du förklara metoden igen?
>> JOSEPH ONG: Så en metod är bara en funktion som hör till en, i detta
fall en av dessa DOM-element, eftersom du ser jag
valda elementet först.
Faktiskt, låt mig använda musen.
Jag valde elementet först.
Sen ringde jag denna HTML fungera som den hade.
Och eftersom denna funktion hör till denna sak, vi kallar det en metod.
Det är bara ett fantasinamn för det.
Säg det igen.
Så kom ihåg, vi valt elementet nu.
Och vi har lagt det inuti elementet variabel.
Rätta?
>> Så när vi vill ändra HTML på inne, eftersom det var Bob innan, du
vill ändra den texten till Milo.
Så vi kallar HTML.
Och vi tala om vad HTML inne det elementet bör vara nu.
Och så ändras den till Milo, eftersom jag gav det Milo.
>> PUBLIK: Så de arbetar tillsammans.
[OHÖRBAR]
>> JOSEPH ONG: Ja, ja.
De arbetar tillsammans.
Så en av dem väljer elementet först.
Och den andra gör något till den.
Ja.
>> PUBLIK: [OHÖRBAR].
Om den här metoden skiljer sig från i HTML du har den metoden lika verklig.
>> JOSEPH ONG: Ja.
Det är en annan metod.
Och vi kan täcka det på bara en sekund när vi kommer till ett exempel.
Jag vill se till att vi snabbare eftersom vi har ont om tid.
Men vi har kört långt över tiden nu.
OK.
Cool.
Så om du vill lägga till en klass, det finns också ett tillägg klassmetod.
Detta är bara ett exempel på vad du kan göra med jQuery.
Som lägger bara en klass.
>> Om du vill ta bort det, du kan ringa remove.
Det är bara en annan sak du kan göra.
Så fler exempel på saker du kan göra.
Så kan jag bara lägga den på toppen så här?
Yngsta remove.
Om jag kör just det JavaScript på högst upp på min fil, som kommer att fungera?
Rätt.
Eftersom mitten inte finns ännu.
Så det här kommer inte att fungera.
Orderutförande.
Den går till toppen först.
Vad?
>> PUBLIK: Yngsta finns inte ännu?
>> JOSEPH ONG: Ja.
Yngsta finns inte ännu.
Exakt.
>> PUBLIK: Du sa mitt.
>> JOSEPH ONG: Förlåt.
Yngsta finns inte ännu.
Och den andra saken är att jag har inte inkluderade jQuery
fil frågar script src.
Så det kommer inte att fungera.
Egentligen gjorde jag inte det i nästa bild, som är
tänkt att fixa det heller.
Men vårt sätt att göra detta är JavaScript är händelsestyrd.
Så vad vi gör är att vi använder en händelse handler för att göra detta.
Och så jag väljer det dokument in först.
Jag säger, OK, när dokumentet är färdig, låt mig köra en funktion.
Så det är allt som syntax medel.
>> Jag valde dokumentet.
Nu, när dokumentet är klar, kör funktionen.
Och så här borta när dokumentet är klar, vilket innebär att all HTML har
laddad, då jag kör funktionen som tar bort det elementet.
Och så nu, när jag kör den här funktionen att jag gick in i färdig, jag är
garanterad att all HTML på sidan kommer att existera först.
Ja.
Fråga?
>> PUBLIK: Vad är händelsen nyckelordet inom funktionen?
>> JOSEPH ONG: Så att händelsen nyckelord i funktion är bara en parameter som
får skickas till funktionen för alla evenemang.
Det är bara något som du får gratis.
När du använder viktiga handlers i pset8, att händelsen kunde berätta, för
exempel vilken tangent du tryckte på.
I detta fall, för en färdig händelse, det är faktiskt inte super bra.
Men för en nyckel ner händelse, det är mer användbar, eftersom du får veta vilka
tangent du tryckte på genom att gå nyckel kod från det händelseobjekt.
Rätta?
Låter det vettigt?
OK.
Ja.
Fråga?
>> PUBLIK: Så kan du sätta skripttagg lägre ner?
>> JOSEPH ONG: Så ja.
Du kan sätta skriptet tagga lägre ner.
Men då blir det bara riktigt rörigt.
Och vi gillar att centralisera alla av vår kod på ett ställe.
Och detta gör det möjligt för oss att göra det.
Kom ihåg tidigare Jag sa att det är en trevligare sätt att se till att elementen är
på sidan innan du köra kod?
Och detta är bara ett trevligt sätt skulle du åstadkomma det.
>> PUBLIK: [OHÖRBAR].
>> JOSEPH ONG: Ja.
Du skulle fortfarande behöva, eller hur?
Därför att komma ihåg, inkluderat dig fil överst på sidan.
Så det kommer att köra först innan du kommer till botten av sidan.
OK.
Så kan du också lägga till en annan typ av händelsehanterare.
Detta bearbetar bara klick.
När jag klickar på yngste, då det kommer att dyka upp med en varning.
Detta är bara en annan typ av händelse.
Till skillnad från ready-händelsen, som du nu Använd klick händelse när du får
klickar på ett element.
>> Och så i det här fallet, minns, klicka handler är ansluten till yngsta.
Så det händer bara när Jag klickar på yngsta.
Och i den andra, ready-händelsen fästes till dokumentet.
Så den väntar på dokument att vara redo.
Vettigt?
Jag tror att jag kan gå vidare.
Ja.
Fråga?
>> PUBLIK: [OHÖRBAR].
i detta fall du använder [OHÖRBAR].
>> JOSEPH ONG: Oh, ja, eftersom i detta fall, jag måste vänta för de yngsta
element för att visas på skärmen först innan jag kan bifoga ett klick hanterare till
det, det är därför jag satte den på insidan av ett dokument redo.
OK.
Och nästa, så det här är ett stort exempel på hur du skulle kombinera allting.
Detta är bara en form validering exempel du har sett på föreläsning.
Så ta det steg för steg som du går igenom detta.
Och det kommer att vara helt OK.
Bara läsa den från topp till botten.
>> Jag har ett formulär längst ner.
När dokumentet är färdigt, jag bifogar en skicka handler till formuläret, så att
när jag skickar formuläret, jag får värdena inuti var och en av dessa ingångar.
Och jag kolla om den är tom.
Om det är tomt, återvänder jag falskt, eftersom Jag vill inte att skicka formuläret,
eftersom formen är fel.
Om lösenordet är tomt eller det är mindre än åtta tecken, kan jag inte skicka in
formen, för det är också fel.
Och retur falska bara förhindrar formuläret från att lämna och
att gå till en ny sida.
>> Och förhoppningsvis gör denna mening.
Jag tycker att ni ska gå igenom denna kod steg för steg på egen hand.
Och när du förstår vad den valda element och göra saker till det
egentligen innebär, detta kommer att göra mycket vettigt för dig.
Ja?
>> PUBLIK: Vad gör name = användarnamn detta?
>> JOSEPH ONG: Så namnet = användarnamn och name = lösenord betyder bara titta på
attribut av vad du väljer.
Och då måste matcha.
Så vi går in i registreringen.
Och så tittar vi på alla ingångar och registrering.
Och sedan plocka vi den där namnet attribut är lika med användarnamn.
Så det första väljar bara väljer användarnamnet ingång.
Och den andra väljaren väljer endast lösenordet en, därför att de har
sina namnattribut satt som vad de ska vara.
Fråga?
>> PUBLIK: Vid inlämning, hur fungerar det nedre delen lösa den övre delen?
>> JOSEPH ONG: Så det är därför av händelsehanteraren.
Så vi väntar på en in evenemang som får sparken från formuläret.
Och det är allt som är in.
Varför kallar jag in där uppe?
Den säger, när formuläret skickas, Jag får skicka händelse.
Så låt mig bara fånga det och sedan köra den här koden i stället.
Ja?
>> PUBLIK: Varför har du att ha funktions evenemang?
Varför kan du inte bara [OHÖRBAR]?
>> JOSEPH ONG: För i JavaScript, du måste förklara funktionerna.
Det är bara hur det fungerar i JavaScript.
Man måste säga att det kommer att köra en funktion.
Så du säger det att du är förväntar sig en funktion här i stället för
bara klammerparenteser.
>> PUBLIK: Och funktionen är allt vad följer?
>> JOSEPH ONG: Ja.
Funktionen är det som är inne klammerparenteserna efter
funktionen nyckelordet.
Ja?
>> PUBLIK: [OHÖRBAR].
>> JOSEPH ONG: För in?
>> PUBLIK: Nej, för funktion utan händelsen.
>> JOSEPH ONG: Ja.
Så utan händelsen, du kan ha det.
Om du inte behöver händelsen, då kan du bara utelämna det.
Men om du gör, då du bara lägga den där.
Ja.
Snabb fråga?
>> PUBLIK: [OHÖRBAR].
>> JOSEPH ONG: Ja.
För vad du behöver göra, det document.ready bara säga vänta på alla
HTML på sidan att ladda först.
Och oftast, vill du ditt element på plats innan du kör någon kod.
Okej.
Vi måste komma till Ajax.
Vi har inte mycket tid.
Så för-och nackdelar.
JavaScript är enklare försök skriva med jQuery.
Men jQuery är typ av långsam.
>> Det är som PHP är långsammare än C, eftersom det har tolkats.
Och jQuery är lite långsammare än JavaScript, eftersom det gör en hel del
saker under huven.
Och så om du använder jQuery, det är bara lite långsammare än
JavaScript, även om den ger dig fin elegans.
Och slutligen, Ajax.
Hittills med Ajax, har du inte sett Ajax i termer av pset7 ännu, eftersom
när du gör, du skickar ett formulär för offert.
Den laddar en ny sida.
Så du får detta stor vit blixt på sidan samtidigt som
andra sidan laddas, eller hur?
>> Det skulle vara väldigt trevligt om du hade inte denna blixt.
Som Facebook, om du bara bläddra till botten, lägger till nytt innehåll
utan att uppdatera hela sidan.
Så något sådant här skulle vara trevligt.
Detta är JavaScript-kod på vänster sida.
Du får vad som finns i den ingången.
Du får aktie information från Yahoo!
Och sedan göra en stor sträng som säger: OK, det här är det budskap jag vill
för att visa på skärmen.
Och då sätter det budskapet inne av vissa HTML-element som får
som visas på skärmen.
>> Så det är allt som händer här.
Så i princip, eftersom det är allt JavaScript och du behöver inte köra
längre PHP, detta kommer att se till att sidan inte uppdateras.
Så det här är bara en abstrakt idé att jag säger här nu.
Den abstrakt idé är att om du gör det allt i JavaScript, har du inte en
sidan uppdateras.
Men hur gör man egentligen göra det?
>> Jo, faktiskt, låt oss tala om ett problem med den här första.
Ett problem är i JavaScript, utförande är synkron.
Så du måste vänta på en linje till slut innan du
exekvera nästa rad.
Och vad händer om jag kommer över till Yahoo!, och deras servrar är väldigt långsam, och
det tar dem tre sekunder ge mig tillbaka det beståndet information?
När jag slog det priset linje, om det utförande är synkron, eftersom det är genom
standard, vad det bara kommer att göra är webbläsaren kommer att stanna för
tre sekunder.
Och du kommer inte att kunna göra något när det blir dessa data.
Det kommer att frysas.
>> Och det är illa.
Du vill inte att en användare ha en frusen webbsida.
Rätta?
Det är bara dåligt.
Alla är överens?
Om du surfar facebook och det fryser och du kan inte göra någonting, du
blir riktigt frustrerad.
Så lösningen är att vi gör något asynkron stället.
Så allt detta asynkrona sak säger är, kommer jag att ställa denna
URL för vissa uppgifter.
Och sedan kommer jag att fortsätta.
Jag ska bara fortsätta köra vilken kod som var efter det.
>> Och sedan när dessa data är klar, då jag kommer att bearbeta det.
Det är allt det säger.
>> PUBLIK: Ajax gör just kod asynkron?
>> JOSEPH ONG: Det är en asynkron sätt att Fetching data.
Så det första om Ajax är det låter mig få uppgifter
från en extern webbplats.
Och det andra är det ser att min sida inte stanna när jag är
hämta dessa data.
Det är den asynkrona delen av det.
Därför att det går ut någon annanstans, för att jag säger att jag håller på gång samtidigt
det hämtar dessa data, som gör det asynkrona.
Jag håller utföra.
>> Så ha det asynkrona idé i åtanke.
Och jag ska visa dig vad skillnaden är.
Den synkrona versionen ligger på vänster sida.
Den asynkrona versionen ligger på höger sida.
Titta på siffrorna för att se vilka steg motsvarar vad
körs på varje rad.
Där borta, visar varningen upp först.
Därför att få aktie information från Yahoo!
tar tre sekunder, stannar den efter tre sekunder.
Och då varnar priset Efter dessa tre sek.
>> Så nu visar att varnings upp vid denna tidpunkt -
tre sekunder i.
Och då den varnar med efter det.
Så det bara går steg för steg.
Det är som vad ni skulle acceptera, eller hur?
Med asynkron körning, uppmärksamma dig först.
Då du går iväg till denna URL.
Och du säger, jag ska bara be om uppgifterna.
Och sedan ska jag bearbeta den senare.
Så det omedelbart utför nästa rad efter att jag gör det
asynkron begäran.
>> Så en 0.001 sekunder, ser du alert hej.
Utför denna funktion, alert bye.
Och eftersom jag gjorde ett löfte som jag skulle behandla uppgifterna senare, vad
händer är då att data kommer tillbaka tre sekunder senare, då kör jag som
funktion som jag har där borta.
Ja?
>> PUBLIK: Kan du ange eller klargöra vad Ajax betyder?
>> JOSEPH ONG: Så Ajax är ett sätt att om jag behöver uppgifterna när jag är på en hemsida och jag
vill inte att uppdatera sidan, sedan Jag använder denna teknik som kallas Ajax.
Det i grunden betyder bara, gå och hämta data från en annan webbplats.
Och gör det på ett sätt som bara inte stall min webbsida.
>> PUBLIK: Så är det en inneboende del av JavaScript eller jQuery?
>> JOSEPH ONG: Så någon skrev ett sätt att göra detta i JavaScript för länge sedan.
Vid ett tillfälle gjorde det inte.
Och så någon uppfunnit denna teknik för att ge människor möjlighet att begära denna information
på detta sätt.
Och de skrev lite saker att göra det åt dig.
Och jQuery ger just dig här mycket trevligt sätt att göra det
med denna $. få funktion.
frågor?
Jag kan svara på frågor om Ajax efteråt också.
Jag kommer att vara här.
>> Så det låt oss hämta data utan uppdatera sidan.
Och det ska vi oss att göra detta i ett asynkront sätt som
inte frysa sidan.
För lång, inte läst om det Förklaringen var för lång för dig.
Så till sist, cross-site skriptangrepp.
Vi såg detta med Zamyla.
Om det är detta namn i min databas någon, som är här script-taggen, och jag
har lite kod på min sida som skrivs ut ut folks namn i en rad, eller jag har
vissa JavaScript-kod som infogar detta namn in i sidan,
vad HTML blir produceras?
Jo, jag skriver ut HTML-taggen.
Jag skriver ut alla dessa taggar.
>> Jag får till den delen där jag är utskrift ut med mina vänner.
Jag skriver ut Lauren ut.
Den skriver ut Milo ut.
Och sedan mitt namn i databasen är script inlägget
unflattering Facebook status.
Eftersom jag insatt här i sidan eftersom det ser ut som JavaScript, när
denna sida får skickas till användaren, det blir verk som JavaScript.
Och så det här är vad vi kallar en cross-site scripting-attack.
Någon sätter skadlig information din databas som skulle kunna motsvara
viss ytterligare sträng eller vissa JavaScript-sträng.
>> Och när den trycks ut till den sidan på detta sätt, vad
händer är att dålig kod får exekveras att jag inte hade för avsikt
för att den skall få exekveras.
Och det är allt en cross-site scripting attack är.
Och ditt sätt att komma runt detta är som Zamyla sagt.
Du svepa bara saker i HTML-specialtecken.
Och här HTML specialtecken är ett PHP funktion som kommer att förhindra detta slags
saker händer dig om du har en skadlig
sträng i din databas.
Det undgår bara den, så att den inte får tolkas som HTML.
Den ersätter de små fästena med det vi kallar enheter.
Och vi gick över detta i föreläsning också.
Så jag tycker att ni borde ha ett bra grepp om det.
Frågor?
Ja.
>> PUBLIK: Så hur skulle den [OHÖRBAR]?
>> JOSEPH ONG: Säg det igen.
>> PUBLIK: Hur skulle skärmen -
>> JOSEPH ONG: Höger.
Så du har något att säga, när Registrerar jag skriver i mitt namn.
Jag skriver bara på det området, är mitt namn stript inlägget unflattering Facebook
status nära skripttagg.
Och det blir bara tas i databas, eftersom jag inte kan säga att någon
i världen har inget namn med en vänsterpil i den eller de
Ordet skript i det.
Som inte riktigt vettigt.
Så jag måste bara se till att jag sanera grejer innan jag skriver ut det
ut till sidan.
>> PUBLIK: Så HTML speciella kort förhindrar skripttaggarna?
>> JOSEPH ONG: Ja.
Så det hindrar inte de script-taggar.
Det gör bara till att script-taggar inte får
tolkas som HTML eller -
ja.
Det kommer bara upp som vad det faktiskt är.
Okej.
Så det var det frågesport översyn.
Cool.
>> [Applåder]