R. J. AQUINO: Să abia începem. Deci, aceasta este Quiz 1. Iată câteva informații de nivel înalt. Pagina Despre pentru testul este în acest URL, nu mai CS50.net, deși va funcționa în continuare. Este CS50.harvard.edu/quizzes/2013/1. Este mari despre pagina, vă spun unde și când, și anume miercurea viitoare într-o grămadă de camere. Și de miercurea viitoare, am înseamnă două zile de acum. Toate aceste informații sunt acolo. Dar este cumulativ. Deci totul din prima jumătate a an este potențial pe testul, pentru că nu se poate face într-adevăr avansate lucruri în C, fara dacă condițiile și pentru bucle și altele asemenea. Dar nu va fi un accent pe Materialul acoperit din Quiz 0, începând cu structs și fișiere I / O. Este de obicei mai mult provocatoare decât Quiz 0. Scorul mediu este de obicei mai mic. Studia greu. În timp ce studia, asigurați-vă că pentru a utiliza CS50/discuss pentru a posta întrebările dumneavoastră și să citească întrebările altor oameni. Deci, dacă nu aveți orice întrebări, conectați și citit întrebările prietenilor. Probabil sunt întrebări bune. Și să ia chestionare de practică. Am fost avertizat de teste pentru șapte sau opt ani. Sunt toate on-line. Întrebări viitoare sunt similare la întrebări vechi. Acesta este modul în care le face. Testul nu există încă. Nici unul dintre noi nu l-au văzut. Dar se va arata teste anterioare. Pentru aceasta sesiune de revizuire, acest lucru nu este o listă exhaustivă de subiecte. Nu poți participa la acest lucru și apoi fi perfect pregătit pentru testul. Altfel, nu ar fi că mai mult de un test. Și acest lucru este, de asemenea, nu neapărat tot ce trebuie să știți despre orice subiect dat. Este menit să vă expuneți la lucrurile ne-am acoperit, vă reamintesc ceea ce am acoperite, precum și modul în pe care l-am acoperit. Dar va trebui să mergem mai departe și mai profundă atunci când studia la o dublă verificare ca stii totul despre orice dat subiect și pe care le-ați completat în toate colțurile care erau acoperite în curs. Notele test vă spun pentru a merge la note logofătul, ceas video de curs. Asta e un mod bun de a vă asigura că ați acoperit toate bazele. Deci a începe, atunci când am făcut aceste slide-uri, am încercat să pun acolo unde am găsit informații. Deci, pentru fișiere I / O, de exemplu, Săptămâna 7, Luni de curs, și postat Secțiunea 6 și Problemă Set au toate Informații despre File I / O. I-am făcut aceasta pentru fiecare subiect. Deci, aceste diapozitive titlu poate fi de ajutor pentru tine. Deci, aici avem de fișiere I / O. Amintiți-vă, în Problema Set 5, am folosit fopen, fclose, fwrite, fread, fseek și. După ce a recuperat 30ish JPEG și au redimensionat și incurcat cu bitmap-uri, ar trebui să fie destul de familiar cu aceste funcții și modul în care acestea funcționează. Dacă nu mai sunt familiare, le revizui siguranta. Și asigurați-vă că ați înțeles ce diferite argumente sunt, atunci când acestea sunt utilizate. Dar comune bug-uri legate de fișiere vi se poate cere despre - bine, dacă ați uitat să verifice dacă fopen de fapt a lucrat înainte de a merge la modifica un fișier. Care ar putea fi rău. Dacă ați uitat să fclose un fișier pe care le-ați fopened, care este similar cu o scurgere de memorie. Asta e destul de rău. Și uitând pentru a verifica dacă ați a ajuns la sfârșitul fișierului înainte de a începe să scrie pentru el. Deci, dacă spui, hei, eu sunt la sfârșitul fișierului. Dă-mi 5 mai multe bytes. Ei bine, asta nu e, probabil, va lucra așa cum vă așteptați. Asta este într-adevăr de fișier I / O, pentru că am făcut atât de mult de ea cu set problema. Deci, dacă ați înțeles ce se întâmplă pe în Problema Set 5, amintiți-vă de bitmats și JPEG, atunci esti, probabil, toate set de fișiere I / O. Daca asta e un pic neclare, revizuirea cu siguranta ca problema stabilite și materiale asociate. Structs au fost subiectul care a fost pe linie între 0 și Quiz Quiz 1. Nu a făcut destul de tăiat pentru Quiz 0. Astfel încât acestea vor fi cu siguranta pe Quiz 1, Săptămâna 7, luni. Ce este un struct? Aici ne arată un struct. E ca un nou tip. E ca un container pentru mai multe domenii. În acest caz, ne-am declarat un struct elev care are două domenii - un șir care suntem de asteptare nume și un int care suntem de asteptare vârstă. Așa că atunci când trec în jurul studenți sau I modifica studenți, voi fi în stare să acces la numele lor și vârsta lor. Să ne uităm la unele cod pentru asta. Aici vedem că le-am declarat un student s, la fel ca Declar orice variabilă - int x, int y, etc. Iată elev s. El începe cu nimic în domeniile sale. Deci, haideți să le setați. Ai stabilit domenii de o struct cu punct. Așa că am spus aici că s.name = RJ. Și s.age = 21. Puteți actualiza, de asemenea, domenii în același mod în care ar actualiza valoarea unei variabile. Deci, vreau să-mi schimb numele de la RJ cu nici perioadele de la R. J. alac mod corect. Ar fi s.name = RJ, la fel așa cum am spus-o inițial. Și apoi le puteți accesa. Așa că le-am stabilit. Noi le-am actualizat. De asemenea, puteți să le accesați în același mod. Deci, aici, eu sunt imprimarea R. J. Este de 21 de ani. Și eu accesare a acestor valori cu s.name și s.age. Astfel că accesează structs cu notația punct. Da, întrebarea? Audiența: Exista un motiv pe diapozitiv anterior că nu ai pus elev pe linia de sus, cum ar fi typedef elev struct și apoi student la sfârșitul? R. J. AQUINO: Deci, întrebarea a fost, pe acest diapozitiv, ne-am văzut de obicei, typedef struct nod și apoi domenii ale struct și apoi nodul cuvânt. Și cum vin aici nu am spus, typedef elev struct și apoi domenii ale struct și apoi student? Motivul este că nu am nevoie să accesa în interiorul a struct. Deci, este bine să-l lase fără un nume. Am să-l lăsa ca un struct anonim. Motivul pentru care o face pentru liste legate și lucrurilor este că în interiorul aveți nevoie pentru a face referire o stea noduri struct. Astfel struct trebuie să aibă un nume, astfel încât să puteți accesa mai târziu. Este un detaliu minor. Dar veți vedea de obicei typedef struct acolade, dacă nu aveți nevoie de numele și typedef struct unele nume urmată de acolade, dacă va fi nevoie de nume. Deci asta-i o întrebare bună. Și cu privire la acest punct, avem tendința de a modifica structs și trece în jurul structs de de referință, nu de valoare. Deci, vom trece doar în jurul valorii de indicii pentru a structs loc de a trece în jurul structs ei înșiși. Deci te foarte frecvent vor fi folosind, în acest caz, de student sau * struct nod * sau nod * loc de studenți sau noduri. Deci, aici, am spus, OK, ptr variabil va fi adresa de e. O să fie indicatorul pentru student R. J. Deci, putem ajunge la acele domenii la fel ca ne-am luat nimic. În primul rând, ID-ul de referință indicatorul pentru a obține struct. Asta e * ptr și apoi un punct și apoi de vârstă. Deci, pentru a avea acces la teren, iar eu am actualizat se acum la 22, pentru că, să să zicem, a fost ziua mea. Există o sintaxă scurtătură folosind săgeata aici. Deci ptr vârstă săgeată este doar la fel ca * ptr.age. Acum, asta e ceva ce va avea pentru a memora și amintiți-vă. Ai folosit-o foarte mult în pset6, PSET abecedar. Dar aceasta este de fapt ceea ce se întâmplă pe sub capota. Este dereferencing indicatorul și apoi accesarea. Întrebare? Audiența: [inaudibil]. R. J. AQUINO: Deci, de ce suntem folosind indicii ca structs în loc de structs ei înșiși? Motivul ar fi, dacă sunteți în trecere un struct la o funcție, probabil Vreau să treacă în jurul doar 4 sau așa bytes care reprezintă indicatorul, ca spre deosebire de potențial 30 sau 40 bytes care sunt struct. Deci, trece ceva pentru o funcție este mai ușor atunci când lucru este mai mică în scurt. Întrebare? Audiența: Este posibil să fi menționat acest lucru la început, dar există alte slide-uri de până la [inaudibil]? R. J. AQUINO: Aceste slide-uri vor fi după sesiunea de reexaminare. Le vom posta pe site-ul web. Deci, se deplasează pe și se deplasează pe puțin mai repede, vom vorbi despre date structuri. Există o mulțime. Am acoperit o grămadă de ei. Aici e ceea ce ar trebui să înțeleagă cu privire la structura de date. Ar trebui să înțeleagă într-adevăr la un nivel ridicat nivel ce fiecare structură este. Puteți explica în limba engleză pentru dvs. prieten care nu a luat CS50 cum ne organizare datele noastre și de ce ne-am folosi ceva în acest fel? Asta e un lucru. Lucru două, să înțeleagă punerii în aplicare. Deci, să înțeleagă cum să folosească aceste lucruri în C. Și vom merge pe această. Și apoi lucru trei ar fi cunoaște ori a alerga și limitările diverse structuri pe care le utilizați. Deci, să înțeleagă de ce ar trebui să utilizați un hash masă în loc de o matrice. Înțelege cât de repede, în medie, accesarea unui tabel hash este. Înțelege ce operațiunile sunt rapide pe Lista legate dar lent pe tablouri și vice-versa. Deci, pentru a înțelege că, va trebui să înțelege Big-O notație doar să știi cum sa vorbeasca despre aceste felul de lucruri. Și vom vorbi despre asta. Deci, primul lucru, liste de legat. Aici este o imagine la nivel înalt a unei liste legate. Ne arată acest lucru în clasă. Avem de obicei, 10 de persoane picioare pe scena. Dar avem o serie de noduri în care fiecare nod are o anumită valoare și un pointer la valoarea sa viitoare. Deci, pentru a obține de la un nod la altul, ai doar spun, da-mi nodul următor. Ai acel nod. Dă-mi nodul următor. Ai acel nod. Dă-mi nodul următor și așa mai departe până când nu există nici un stânga nod. Deci, continuăm să vorbim despre la un nivel ridicat. Este foarte usor pentru a insera lucrurile într-o listă de legat. Dacă nu vă pasă de ordine, puteți să-l picătură chiar de la început. Asta este constantă de timp. Dar este greu de a găsi o valoare. Dacă sunteți încercarea de a cere, este de șapte în lista mea? Trebuie să treacă prin fiecare valoare. Este aceasta șapte? Este aceasta șapte? Este aceasta șapte? Este aceasta șapte? Peste si peste din nou. Și asta este O (n). Deci, atunci când studia pentru testul, compara acest lucru cu matrici. Este că OK? Au stins luminile dim. OK. Când este o listă legată mai bine? Când este un tablou mai bine? Așa că haideți să ne uităm la unele cod. Aici este un potențial nod. Este un struct. Acesta are o int n, care va fi valoarea noastră. Și are un nod struct * viitor, care este indicatorul nostru la nodul următor. Deci, aici, putem vedea că ne-am sa întâmplat a pus un nod în int nostru. Dar, în cazul în care acest lucru ar fi o listă legată de char stele sau o listă legată de flotoare, ne-am total ar putea face asta. Amintiți-vă în pset6, ai avut, probabil, un Lista legate de stele char sau doar matrice char statice. Să ne uităm aici, la o operație. Așa că vrem să introducă un nou n în lista noastră legată. Vom începe cu un pointer cap, care este un pointer la acest nod care are Valoarea lui n și o următoare a unui indicator care puncte de la acest nod este o valoare de n și un viitor de nul, deoarece e ultimul nod. Deci, în interesul de timp, voi pune tot codul de pe ecran. Și ne vom plimba prin ea câteva linii la un moment dat. Deci, aici e codul. Sper că e ușor de citit. Primul lucru pe care îl facem este am malloc un nou nod. Deci are un pointer la un nou nod care nu are destul de nimic setat în ea încă. Vom verifica pentru a vă asigura că noul nod nu este nul. În caz contrar, trebuie să renunțe. Deci, ce a verificat că, noi acum setați valorile din nodul. Așa că am pus noi n în câmpul nostru n. Și ne-am stabilit indicatorul de lângă punctul de capul originală, astfel încât să putem acum au introdus acest nodul în lista noastră. În cele din urmă, avem un punct central la nivel mondial la noul nostru nod, astfel încât, dacă ar fi să încep de la cap, ne-ar fi la acest Noul primul nod în loc de vechi primul nod. Și atunci când această funcție iese, nod nouă variabilă nu mai există, pentru că a fost locală a funcției. Deci, aceasta este starea lumii. Subliniază capul nostru global de noul nostru primul nod, ceea ce indică nostru primul nod original, care de puncte la nodul după aceea. Asta a fost inserare. Sper că a fost relativ simplu de urmat. Atunci când în dubiu, desena o imagine. Deci, mi se pare că a vorbi despre liste legate și se uită la Codul este foarte util nu. În timp ce se uită la o imagine a unui legat Lista îmi permite să cred, oh, așa Am acest nod aici. Dar dacă actualizez că pointer, sfârșește deconectat. Și m-am uitat unde nodul merge. Și codul de iese. Și aveți mai multe noduri care sunt deconectate. Și nu se termină cu lista pe care doriți. Deci, dacă vă trage imaginea și face pas cu pas, sperăm, veți vedea ordinea corectă a lucrurilor în ceea ce privește actualizarea indicii pentru a vă asigura că lista vine împreună. Insert este relativ simplă. O una mai complicată ar fi inserare într-o listă sortată. O funcție mai complicat este de a șterge și de a găsi, astfel încât în ​​căutarea printr-o listă de vedea dacă ceva este acolo. Poate că ați făcut acest lucru în pset6 atunci când a intrat în masa de hash și ați spus, bine, este cuvântul Apple în lista mea legată? Deci, este posibil să fi făcut deja acest lucru. Dar cu siguranta, reîmprospăta memoria și să încerce să reimplementat găsi și reimplementat șterge pentru o listă de legat. Notă de distracție, există, de asemenea, legat de două ori liste, în cazul în care au indicii care indică atât înainte și înapoi, astfel încât ai putea merge la nod următor și la nodul anterior. Și acolo a fost o întrebare pe anul trecut test de acest tip, de a vorbi despre listele de două ori-legate. Acum, că este o structură care esti relativ familiar cu, pentru că cele mai multe dintre voi, probabil, le-a folosit pe pset6. Aici e una care e un pic mai puțin familiar. Ca o notă separată, cred că Quiz 1 este în primul rând, mai greu decât Quiz 0, deoarece lucrurile pe care le faci, te nu s-au făcut la fel de mult. Pentru a pune că un alt mod, pentru Quiz 0, ai fi scris o mulțime de C. Și noi ați întrebat despre C. Pentru Quiz 1, vom să vă întreb despre PHP si JavaScript, care vă nu s-au scris la fel de mult de. Mergem să vă întreb despre C-cod care nu te-ai scris la fel de mult de, acest C lucruri avansate. Deci cu siguranta, practica WE lucruri a vorbit despre în curs pe care le nu a făcut neapărat pe problema setat. Vorbind de care, nu ați scris un teanc pe o problemă set. Dar a fost în curs. Iată imaginea la nivel înalt de stive de care dam dovada in fiecare an. Este stiva de tăvi în sala de mese Mather. La un nivel ridicat, stive sunt o ultima în, primul din structura de date. Asta înseamnă că te duci pentru a pune lucrurile in - 1, 3, 7, 12, 14, 0 negativ. Singurul lucru pe care nu am putut avea a spus - negativ 3, 0. Ai pus toate aceste lucruri inch Și ultima ai pus în este primul una care va ieși. Astfel încât aveți două operații - împinge și pop. Toate punerii în care am fost aratand ca aceasta este împinge. Și apoi, când ajung în a apuca ceva sau de a ajunge în partea de sus a apuca ceva, asta-i pop. Așa că am de gând să pună în aplicare stive. Și le-am arătat în curs folosind tablouri. Dar ai putea să le faci folosind liste legate. O stivă este un date conceptual structura, nu ca un -specifice de implementare unul. Deci, ce ar fi asta arata ca? Aceasta ar arata cam asa. Ai avea o dimensiune întreg. Și ai avea o serie de valori care suntem de asteptare tăvi, pentru că asta e ceea ce a fost imaginea pentru ne - int tăvi - și apoi unele capacitate maximă. Deci, ceea ce ar împinge arata ca? Ei bine, dacă avem un s stack, apoi să împingă ceva pe e, ne-ar obține dimensiunea s. Și că ar putea fi următoarea la fața locului deschis din gama noastră. Deci, dacă avem trei lucruri în stivă noastră, atunci tăvi 3 ar fi următoarea loc liber, deoarece 0, 1, și 2 sunt deja completate. Așa că am pus valoarea în s.trays [s.size], al treilea loc. Și apoi ne-am incrementa s.size să spunem, hei, am avut trei lucruri înainte. Acum, avem patru. Deci, data viitoare când vă împinge, tu esti O să pun ceva în 4. Sau data viitoare când pop, te duci să se uite la 3 în loc de 4 sau orice altceva. Și apoi ne vom întoarce la adevărata să zicem, hei, am reușit. Aceasta a lucrat. Ca o regulă de degetul mare, în cazul în care o funcție care este ar trebui să se întoarcă adevărat sau fals întoarce întotdeauna adevărat, s-ar putea au făcut ceva greșit. Deci, face acest lucru? Ei bine, acesta funcționează bine pentru 1, și 2, și 3, și 4, și cinci. Dar să spunem că am ajunge la capacitatea mea. Apoi m-am alerga într-o problemă, deoarece dacă dimensiunea este la fel ca și capacitate, eu sunt acum încearcă să pună ceva într-un matrice în cazul în care nu au spațiu. Deci, o verificare scurt pentru a remedia acest lucru. Dacă s.size CAPACITATE ==, return false. În caz contrar, du-te și de a face ceea ce am făcut. Deci, ce altceva am putea întreba despre pentru stive? Ce altceva ar trebui să studieze? Ce altceva ar trebui să practici? Ei bine, de punere în aplicare pop. Am făcut deja împinge. Voi rezolva asta. O implementare non-matrice, în cazul în care utilizați o listă legată, probabil. O implementare non-int. Am făcut int aici. Dar ar fi putut fi flotoare. Am fi putut fi siruri de caractere. Ar fi putut fi stele char. Uită-te la teste trecute pentru tipurile de întrebări care le-am întrebat despre stive. Îi voi spune că am acoperit stive în jurul la fel cum le-am acoperit în ultimii ani. Deci, întrebările test ar trebui să fi un bun indiciu. Mergând mai departe, chiar mai repede, cozi. Sunt ca stive. Dar ei sunt în primul rând, primul ieșit. Dacă ești britanic, coadă cuvântul probabil, a făcut o mulțime de sens pentru tine. În caz contrar, este posibil să aveți am auzit de ea ca o linie. Ei lucrează ca linia la magazinul Apple. Prima persoana să se prezinte la 03:00 în dimineața este primul persoană pentru a cumpăra iPad lui. Deci avem două operațiuni - Puneți în coadă și dequeue. Puneți în coadă pune cineva în linie. Dequeue trage primul persoană de pe linia. Din nou, putem pune în aplicare acest lucru cu o matrice. Deci, ceea ce este WE struct arătat în curs? A fost aceasta. Din nou, numere. Din nou, dimensiunea și acest nou front lucru. De ce există ceva numit față? Este indicele de alta element dequeue. Doar ține intern evidența primul tip pentru a arăta în sus, astfel încât să putem se poate scoate, atunci când avem nevoie pentru a. Cu siguranta uita-te la note de curs și să încercați să pună în aplicare Puneți în coadă și dequeue atunci când studiază pentru testul. Lucruri importante să se gândească. Ambalaj în jurul dacă partea din față, plus Dimensiunea se termină mai mare decât capacitatea. Din nou, în cazul în care structura este plin, ai de gând să aibă o problemă. Hash mese le-ați văzut înainte. Cei mai mulți dintre voi, probabil, puse în aplicare acestea pe pset6. Este o structură care are ca scop pentru O (1) inserare timp constant și O (1) căutare constantă de timp. În CS50, am implementat acest lucru ca o serie de liste legate. Componenta cheie a unui tabel hash este funcția de distribuire. Deci, se convertește dvs. de intrare, să spunem, un cuvânt din dicționar, într-un număr, care va fi indexul nostru. Și vom folosi ca index în gama noastră. Deci, aici este o imagine drăguț de la study.50.net. Noi arunca toate cuvintele în Funcția noastră hash. Și funcția de distribuire ne spune în cazul în care pentru a pune aceste cuvinte. Acest lucru este mare în țara în care există doar un singur cuvânt pentru fiecare slot de. Dar, așa cum vă amintiți de la pset6, acolo sunt mai multe cuvinte decât sloturi. Deci, ce se întâmplă când a obține o coliziune? În loc de a stoca o valoare în, să spunem, de masă hash 3, tu stoca o listă de legat. Și astfel încât în ​​loc de a avea pepene galben aici, ar avea o listă de legat, în cazul în care primul nod este cantalup. Și nodul următor este pisica. Și al treilea nod este coliziune, să spune, pentru că toate aceste cuvinte începe cu C. Deci, cele mai multe dintre voi a făcut asta pentru pset6. Dacă nu ați făcut un tabel hash pe pset6 și ați încercat ceva de genul un trie, revizuirea siguranta tabele de dispersie. Dacă ați făcut-o pe pset6, cu siguranta revizui tabele de dispersie. Și dacă ai făcut-o pe pset6 și nu a făcut- lucra destul de bine și tu a avut o mulțime de probleme cu ea, cu siguranta revizui tabele de dispersie. Deci, lecția într-adevăr este cu siguranta revizui tabele de dispersie. Vasta minoritate de ai încercat din incearca pe pset6. Imagine la nivel înalt. E ceva de genul asta, unde fiecare nod are un set de copii, în care fiecare copil corespunde o scrisoare. Și de fiecare nod, de asemenea, spune, hei, eu sunt un cuvânt. Deci, în acest caz, cuvântul Maxwell, dacă urmați M la A la X-W-E-L-L și apoi se urmează una. Și veți obține acest simbol, delta, care ne semnifica înseamnă acest lucru este un cuvânt. Deci, Maxwell este un cuvânt. Aceste delte sunt de-a lungul semnificare care lucrurile sunt cuvinte și care lucrurile nu sunt. Deci, în pset6, datele pe care le stocate alături de oricare dintre nodurile noastre a fost "Eu sunt un cuvânt. "Și cool thing despre încercări Se ele demonstrează inserție și căutare în O (lungime de un cuvânt). Deci, doar pentru a obține prin intermediul Maxwell, este M-A-X-W-E-L-L. Deci, șapte sau opt - Eu nu pot conta - pași pentru a obține în cele din urmă și verifica lucrurile. Punerea în aplicare atât de repede aici. Rob a trecut printr-o legătură Lista în postmortem lui. Deci, a verifica asta. Scuze. A trecut printr-un trie în post-mortem lui. Deci, a verifica asta. Dar aveți practic fiecare nod are 27 indicii pentru următoarele noduri și o Boolean de sunt eu un cuvânt. Check out postmortem lui Rob pentru modul în care de fapt, acest lucru este pus în aplicare. Structura noastră finală, arbori noastre și arbori de căutare binare. Deci, uita la acestea, acestea au fost acoperite cel mai recent Săptămâna 8, luni. Un copac este similar cu un trie, în afară de tine Nu trebuie neapărat 27 de noduri la fiecare punct. Și nu aveți aceste date la fiecare pas care semnifică dacă - calea nu contează. În timp ce un trie, calea de sus în de jos, Maxwell, a fost important pentru noi. Dar fiecare nod are mai multe copii, probabil. Avem ceva mai mult vocabular. Rădăcina copacului este la foarte de sus. Și spunem că cel mai de jos foarte nodurile care nu au nici copiii sunt frunze. Deci, ca un trie, un copac este o structură de noduri. Un tip comun de copac pe care vom pentru a vorbi despre este un arbore binar, în cazul în care fiecare nod nu are copii sau un copil sau doi copii. Deci, această imagine de aici nu este un arbore binar, deoarece nodul 3 are trei copii. Dar dacă ar fi să ignore cele, restul a este un arbore binar, deoarece demonstrează proprietatea pe care fiecare nod are zero, unu, sau doi copii. Deci, cum am putea exprima acest lucru în cod? Am putea avea un nod în care fiecare nod are un număr întreg în interiorul acestuia, precum ca un pointer la arborele din stânga și un pointer la copac de pe dreapta, astfel încât cei doi copii. Cum este acest lucru util? Ei bine, dacă am face reguli despre care am pune noduri, putem face căutarea mai repede. Deci, există un concept de o căutare binare copac, în cazul în care toate noduri subarbore stânga au o valoare mai mică decât nodul ne uităm la. Și toate nodurile de pe subarborele drept au o valoare mai mare decât nodul rădăcină. Acum, că arată ca o mulțime de cuvinte. Am de gând să-l pună în interiorul dublu citate și vă arăt o imagine. Deci, aici este un exemplu de un arbore binar de căutare. Vedea că vom începe cu 10. Totul la stânga 10 este mai mică decât aceasta. Și tot la dreapta este mai mare decât el. Dar mai mult decât atât, fiecare nod în copac exprimă această proprietate. Deci, nodul 7 are un 3 la stânga și un 9 spre dreapta. Deci, toate acestea sunt mai mici decât 10. Dar uita la doar cei, 7 are 3 pentru stângă și 9 la dreptul său. Și în mod similar pe dreapta, 15 a 14 pentru stângă și 50 la dreptul său. Deci, cele trei noduri de acolo, 15, 14, și 50, sunt, de asemenea, un arbore binar valid sau un arbore binar de căutare valabil. Și toate acestea sunt mai mari decât 10. Astfel încât acestea să poată fi din dreapta acolo. Există o întrebare? Audiența: Cum te descurci atunci când aveți două șapte? R. J. AQUINO: Da. Cum te descurci cu două valori că sunt la fel? Unii copaci de căutare binare spun că ignora duplicate, pentru că scopul este doar să spun, l-am văzut aceste lucruri până acum. Unii copaci binar de căutare ar putea spune au un număr interiorul nodului. Alții ar putea spune că totul a stânga este mai mică sau egală cu. Și tot la dreapta este mai mare. Este doar depinde de ceea ce problema este ce te rezolvarea. Deci, într-un dicționar, de exemplu, nu va pasa de duplicate. Le-ar arunca. Dar alte probleme s-ar putea pasa. Audiența: Este posibil să aveți o 1 la stânga 15, care este mai mic de 10? R. J. AQUINO: Nu. În cazul în care 14 aici au fost un 1, acest lucru ar nu este un arbore binar de căutare valabil, deoarece totul de la dreptul de 10 trebuie să fie mai mare decât aceasta. Și vom vedea de ce. În cazul în care în țara de căutare scopul meu este de pentru a găsi 14, am începe de la rădăcină. Așa că mă uit. OK. Vom începe de la rădăcină. Uită-te la 10. Ei bine, 14, tinta noastra, este mai mare decât 10. Așa că trebuie să fie pe dreapta. Acest lucru este foarte similar cu întreaga telefonul lucru pe carte am făcut, binar căuta acolo. Dar, în loc de căutare binare într-o matrice, suntem binar caută în acest copac. Deci, suntem încă în căutarea pentru 14. Ei bine, 14 este mai mică decât 15. Deci, dacă e în copac nostru, ea trebuie să să fie în acest domeniu aici. Acesta trebuie să fie în partea dreaptă a 10 și la stânga 15. Și astfel vom verifica acest nod. Și yay, am găsit 14. Eu nu am de gând să meargă prin ea. Dar aici e codul. Este de fapt destul de simplu, deoarece aceasta este recursiv. Ce am putea cere să faci pe un test? Am putea să vă întreb pentru a scrie acest cod. Am putea să vă cerem să se uite la acest cod și modifica acest cod și să explice ceea ce se face. Da. Întrebare? Audiența: Sunt aceste slide-uri va fi puse la dispoziție așa cum au fost ultima dată? R. J. AQUINO: Da. Deci, aceste diapozitive va siguranta fi postate. Audiența: Sunt de fapt scris chiar acum pe site-ul web. David tocmai a făcut asta. R. J. AQUINO: Lamelele sunt chiar acum pe site-ul web. Probabil ca o sa repar o pereche de typos Am observat și le rezolvați. Dar există un curent Versiunea pe site-ul. Alții lucruri pe care le-ar putea întreba ce să facă - scrie inserție. Scrie o versiune iterativ a Funcția recursive ne-am arătat sau vorbesc despre aceste lucruri, cum ar fi în paragrafe, în cuvinte, în propoziții. Compararea timpilor de funcționare și de a explica ceea ce ar dori să utilizeze un binar arbore căutare de loc de o hash de masă, de exemplu. Deci, să înțeleagă aceste structuri la un nivel destul de profund. Să înțeleagă cum să le scrie, cum să le folosesc, cum să vorbesc despre ele. Și veți fi setat toate. Întrebare? Audiența: Când sunteți scris arbore binar de căutare, cum a face tu determina ce valoare face ca rădăcină? R. J. AQUINO: Deci, întrebarea a fost, ceea ce Valoarea faci ca rădăcină? În funcție de codul dvs., poate avea o rădăcină global. Deci, este posibil să fi avut probabil în pset6 un tabel hash global. Sau s-ar putea trece la rădăcină în calitate de argument. Deci, această funcție de căutare aici ia un argument un nod *. Și astfel orice nod se întâmplă să fie uita la este cea pe care o tratează ca root atunci când îl trece inch Și eu sunt gata. Acestea sunt diapozitive mele. Următoarea persoană poate veni de swap într-un laptop și microfon. ROB BOWDEN: Cred că s-ar putea avea interpretat această întrebare în mod diferit. Dar l-am interpretat ca, în cazul în care aveți numerele 1, 2, și 3, cum putem știu să facă 2 radacina spre deosebire de 1 sau 3? Dacă vom face 2 rădăcină, atunci e frumos 1 și 3 la stânga și la dreapta. Dar dacă 1 este radacina, atunci este 1 la sus, 2 dreapta, 3 la dreapta. Deci, în mod implicit, tu nu stii ce să facă rădăcină. Și pentru orice algoritm ne asteptam la da, chiar primul lucru pe care insert ar fi radacina. Sau ne-ar da un arbore binar care există deja că are o rădăcină. Dar alte algoritmi există astfel încât rădăcina va actualiza, astfel încât, dacă ajung în situația în care este 1, 2, 3, s-ar actualiza automat pentru a face 2 noua rădăcină, astfel încât este mai bine echilibrat. ANGELA LI: cool. Hei, băieți. Eu sunt Angela. Și am de gând să duce la C noastră și apoi du-te în unele dintre ul nostru tehnologii - HTTP, HTML, și CSS. Deci, primul lucru este tampon atacuri de preaplin. Deci, haideți să aruncăm o privire la acest cod. Este destul de simplu. Există o foo funcție. Și nu se întoarce nimic. Dar este nevoie de un pointer la un șir numit bar. Și o să declare acest lucru tampon, care este un caracter matrice care are 12 sloturi. Și-l folosește memcpy, care este doar o funcție care copii de la o singură adresă într-o altă. Deci, aceasta este încercarea de a copia în tampon nostru de la orice bar indică spre. Deci, nici o idee despre ceea ce sa întâmplat cu acest cod? Audiența: În cazul în care bara este mai lungă decât C, se va suprascrie. ANGELA LI: Da, exact. Nu avem nici o garanție că bar va fi mai mică de 12. Tocmai am facut un numar arbitrar de 12. Și noi am fost ca, să sperăm că intrare noastră de utilizator este mai mică 12 de caractere. Deci, într-o lume ideală, în cazul în care de intrare nostru este întotdeauna cum era de asteptat, atunci vom ajunge ceva de genul, salut. Asta e mai puțin de 12 de caractere. Este citit în char c. Și apoi vom face ceva cu ea. Acesta nu contează cu adevărat. Dar o persoană rău intenționat ar putea face ceva mai mult ca aceasta, în cazul în care ne da orice bar este îndreptat la, se va indica la această gamă foarte mare de doar lui A. Și acest lucru este cale mai mult de 12. Deci, se va merge până la capăt aici pentru a în cazul în care restituirea Adresa folosit pentru a fi. Deci, haideți să spunem această funcție este numit foo. Poate foo a fost numit de către un alt funcție, care a fost numit de către principal. Deci, atunci când foo se execută, de care are nevoie să știe unde să se întoarcă la. Dacă foo a fost numit de către o funcție numită Baz, trebuie să știți că este Trebuie să mă întorc la Baz. Și asta e ceea ce această adresă de retur aici ne spune. Dar dacă îl suprascrie cu o altă adresa, în acest caz, aceasta este o reprezentare a adresa la bun început, din acest tampon, apoi ceea ce se întâmplă de fapt să se întâmple este că în loc de a se întoarce înapoi la Baz, care a solicitat funcția noastră, e doar de gând să meargă la partea din față a acestui cod. Și dacă acest lucru a fost acolo, deoarece o malware tip hacker a venit și injectat acest lucru, atunci poate că această sumă a lui A nu este, de fapt A lui. Și este de fapt doar cod care pauze calculator sau ceva dumneavoastră. Deci, pentru a fi defensivă cu privire la acest tip de lucru, va trebui niciodată să presupunem că introduse de utilizator este o anumită cantitate de caractere. De exemplu, atunci când făceai abecedar, vi sa spus că cuvinte au fost: doar de gând să fie de 40 de caractere maxim lung. Și că a fost bine. Dar dacă nu, atunci va trebui să asigurați-vă că pentru a citi numai în 45 caractere la un moment dat. În caz contrar, s-ar putea suprascrie tampon dumneavoastră. Orice întrebări cu privire la acest lucru. Da. Audiența: Ai putea să vorbești un pic mai mult despre astea? ANGELA LI: Îmi pare rău. Da. Audiența: Microfonul este doar pentru video. Voi încerca și de proiect. Bună, băieți. Sup? Deci, haideți să trecem peste câteva lucruri în Bibliotecă CS50, care ați fost utilizați toate semestru, cea mai mare parte pentru a obține datele introduse de utilizator. După cum știți, voi include CS50 bibliotecă de a face doar CS50.h, care conține toate prototipurile ale Funcțiile pe care le puteți folosi, cum ar fi GetString și getint, și GetFloat, et cetera. Și nu e asta o linie în CS50 bibliotecă care definește un șir de caractere, care voi cu toții de acum este doar un char *. Dar haideți să aruncăm o privire la cum funcționează getString. Aceasta este o versiune foarte prescurtată. Puteți trage fișierele de bibliotecă CS50 de, cred, manuals.CS50.net. Și puteți citi prin funcția propriu-zisă. Dar aceasta se referă la unele dintre părți importante. Așa că am creat ceva tampon cu o anumită capacitate. Și ceea ce facem este vom lua un caracter într-un moment din n standard. Asta în cazul în care utilizatorul le introduce text în consolă. Și astfel vom citi într-un caracter atât timp cât nu este un nou linie și nu este capăt de fișier, care este sfârșitul de intrare standard. Și pentru fiecare personaj pe care am citit în, în cazul în care personajul se termină adăugarea la numărul de caractere care le-am citit în și că este mai mult decât capacitatea noastră, atunci ceea ce facem este ne-am redimensiona nostru tampon, astfel că este de două ori mai mult timp. Din nou, aceasta protejează împotriva tampon atacuri de preaplin, pentru că ai citit în un caracter la un moment dat. Și dacă în orice moment ai citit prea multe, doar vă extindeți tampon ta. Ai înmulțește cu doi. Și apoi aveți mai mult spațiu. În caz contrar, doar adăugați un caracter de tampon. Și, după ce ați citit în toate caractere, se va micșora tampon înapoi la dimensiunea normală, se adaugă o terminator nul, și apoi să se întoarcă. Acum, să ne uităm la getint. Poate voi citi asta? Eu pot mări un pic. Nu știu cum funcționează calculatoarele. Nu face nimic. Eu nu pot mări în mod corespunzător. Acest lucru este foarte greu. Îmi pare rău. Să se uite la asta. Deci, ce getint nu este citește primul într-un șir de getString, care am implementat înainte. Și o parte importantă de reținut aici este în cazul în care această împărțire care se termină în sus lectură este ca nu este de fapt un șir de caractere, apoi ne-am întoarce la INT_MAX reprezintă eșec. De ce nu ne întoarcem INT_MAX loc de negativ 1 sau 1? Orice idei? Audiența: [inaudibil] negativă 1 pe o. ANGELA LI: Da, exact. Deci, tu esti mult mai probabil sa vreau doar la intrare 1 sau negativ 1 când vi se solicită pentru un n-lea și orice maxes n-lea. Este imens. Esti, probabil, nu o să-l folosească. Deci, aceasta este ca o decizie de design pentru asigurați-vă că nu accidental returna o eroare sau nu te întoarce 1, care poate fi analizat ca un răspuns corect. Deci, dacă o linie nu există, ne întoarcem INT-MAX. În caz contrar, vom folosi sscanf, care este ca scanf. Dar se citește dintr-un șir. Și avem această formatat string, care este de% i% c. Și vom încerca și se potrivesc, care cu indiferent de utilizator ne-a dat. Vrem numărul de lucruri potrivite să fie 1, ceea ce înseamnă că numai într-adevăr doriți pentru a se potrivi un număr întreg înconjurat de alb poate spațiu, poate nu. În acest caz, dacă ai pus în ceva cum ar fi bar, nu se potrivește deloc, pentru că nu trebuie să fie un număr întreg de la început. Deci, nu sscan transformat 0. Astfel încât să nu se întoarcă asta. Alternativ, dacă ai pus în ceva cum ar fi 1, 2, 3, A, B, C, care meciuri atât numărul întreg, dar, de asemenea, caracterul după ea. Deci sscanf va reveni 2, care Este, de asemenea, nu este ideal. Tu nu vrei 1, 2, 3, A, B, C, pentru a fi un int valid. Astfel că, de asemenea, nu funcționează. Dar spune-ai pus în ceva de genul 50. Care se va potrivi% i, ceea ce înseamnă acesta va primi citi în n. Și acum, n va conține numărul 50. Și atunci îl poți returna. În caz contrar, te-a lovit încercați din nou. Și apoi se merge doar peste din nou până veți obține o intrare corespunzătoare din partea utilizatorului. Orice întrebări cu privire la asta? Audiența: Deci, dacă ați fost de a imprima valoarea getint pe [inaudibil] ar fi doar întreg și Max? ANGELA LI: Da. Deci, dacă utilizați getint, ar trebui să-și asume că tu nu vrei să n-lea max este o intrare validă, pentru că ai de gând să presupunem că a fost rău. Audiența: Dacă nu am avea char c și cineva a pus în 1, 2, 3, Sam, ar fi încă de lucru de 1, 2, 3? ANGELA LI: Cred că ar funcționa. Dar tu nu vrei să 123Sam fie o intrare valabilă de către un utilizator. Asta nu e chiar un int. Deci, nu pare corect pentru a analiza ca un întreg. OK. În acest caz, hai mutarea lui pe internet. Deci, HTTP, nu este un limbaj. HTTP este doar un set de standarde pentru cum ai trimite lucruri de la clienti, că tu, la servere. Asta-i de alte persoane de pe web. Deci, HTTP standuri pentru Hypertext Transfer Protocol. Este inima și sufletul din întregul Web. Partea hipertext doar se referă la HTML. Transferul este clienti, cum ar fi va trimite cererea de servere, care dau răspunsuri. Iar protocolul este doar, cum vă așteptați un server pentru a se comporta? Și modul în care sunt trebuia să se comporte astfel încât să puteți eficientiza acest proces de comunicare? Deci, cereri HTTP arata foarte mult ca aceasta. GET este tipul de cerere. Ați văzut cererile GET și cereri POST. Că al doilea lucru acolo, / ma, asta e doar URI sau URL-ul de unde vreau să merg în gazdă. Deci, această cerere se cere pagină, cum ar fi www.facebook.com / mine. Și este o cerere GET. Și atunci acest HTTP/1.1, asta e doar versiunea de HTTP pe care îl utilizați. Este aproape întotdeauna 1.1. Și apoi există o grămadă de alte lucruri prea. Puteți vedea de fapt, aceste dacă deschide consola ta atunci când sunteți navigarea pe Web. Răspunsurile uite ceva mai mult ca aceasta. Partea de sus este, din nou, tip de HTTP pe care îl utilizați urmat de un cod de stare. Deci, 200 OK este totul rezolvat. Aici este dvs. de conținut. Conținutul dvs. este de gând să urmeze. Și atunci se va spune ce fel de conținut și alte chestii. Codurile de stare, există câteva cele importante pe care ar trebui să știi. 200 OK este ca totul e de aur. Totul funcționează. 403 Forbidden. Acest lucru le-ați văzut, probabil, dacă ați uitat la chmod ceva corect. Aceasta înseamnă că nu aveți permisiunile corecte la accesa pe server. E ca si cum, nu, tu nu-l vedea. 404 înseamnă că ceva nu există. Nu a fost găsit. Ați văzut, probabil că o mulțime. 500 Internal Server Error este, de obicei, ca ceva a mers prost pe partea de a serverului. Deci, atunci când au fost de punere în aplicare pset7, dacă ați avut erori PHP, ai putea de fapt, du-te la pagina și să vedem o grămadă de PHP eroare lucruri. Dar asta nu se întâmplă în mod normal, deoarece site-uri nu doresc cu adevărat să să vă spun de ce site-ul lor este rupt. Ei vor reveni, probabil, doar o 500 Eroare internă la server. Și apoi există 418 Sunt un ceainic. Există o întreagă poveste despre de ce asta e un lucru. Dar puteți citi despre asta pe cont propriu timp. Există o grămadă de alte coduri de stare prea. Dar acestea sunt cele ar trebui să știi. Deci, hai sa vorbim despre HTML. HTML, amintiți-vă, nu este o limbaj de programare. Este un limbaj de marcare. Asta înseamnă că descrie conținut. Aceasta vă spune ce un document HTML arată cum ar fi sau nu e ceea ce pare dar modul în care este structurat. Deci, se definește o structură și semantica de pagini web. E ca si cum, acesta este un paragraf. Aceasta este o lista ordonata. Aceasta este ca o secțiune a paginii mele. Aici e titlul. Se face chestii de genul asta. Nu stilul nici acestea, datorită asta e ceea ce faci în CSS. Si se pare ca o serie tag-uri de imbricate. Deci, pentru a folosi un exemplu de adevărat de bază Pagina HTML, aveți DOCTYPE declarație acolo. Această declarație DOCTYPE este spunând, suntem folosind HTML5. Apoi, aveți tag-ul HTML mare. Acesta conține un cap și un corp. În interiorul capului, aveți titlul. Asta e ceea ce se întâmplă în titlu bara de browser-ul dumneavoastră. Avem o etichetă de legătură care leagă într-o foaie de stil extern. Și atunci avem un script care trage dintr-un JavaScript din exterior. Și apoi în corpul nostru este de fapt ceea ce se afișat pe pagina. Avem un paragraf și apoi o imagine în respectivul alineat. Aceasta este o imagine de pisoi. Observați că imaginea tag-ul se închide. Deci, în loc de deschidere cu o imagine și apoi a face un alt / imagine, vă doar acest mic slash aici, care se închide. Și tag-ul imagine are, de asemenea, această tastă atribut valoare numit decolare. Acesta este textul alternativ care se întâmplă atunci când treceți peste el. Cele mai multe elemente HTML au o valoare cheie lucruri pe care puteți să-l da, diverse personalizare. Da. Audiența: [inaudibil]. ANGELA LI: Ei bine, asa ca este o atribut al tag-ul. Deci, dacă ați fost utilizați jQuery, ai putea selectați image.getAttribute. Și apoi puteți căuta obține atributul alt. Și aceasta vă va da pisoi. Dacă vă amintiți forme în HTML, de intrare elemente vor avea atribute de nume. Și asta e ceea ce foloseste PHP pentru a trimite cereri atunci când este prezentat un formular. Audiența: Ai menționat ceva despre cum dacă utilizați kittens.jpg sau ceva care are lipsea foldere sau alte fișiere dosar? ANGELA LI: Da. Deci, aceasta este ceea ce se numește o rudă cale, pentru că eu nu dau vă calea completă. Acest lucru este ca atunci când în C, dacă faci fopen un fisier, daca hi.txt fopen, care hi.txt este de așteptat să fie în aceeași director, dacă nu-l dau o mai cale complex. Audiența: Deci, ai putea preciza care dosarul [inaudibil]? ANGELA LI: Da. Si poti sa te uiti la cum să faci asta. Dar dacă aș fi vrut să se kittens.jpg afară din directorul părinte, mi-ar face .. / Kittens.jpg. Da. Scuze. Da. Oh, omule, am uitat întrebarea. Care a fost problema? Oh, întrebarea a fost este, kittens.jpg de așteptat să fie în același director? Și în acest caz, ea este. Dar puteți, de asemenea, da-l un anumit traseu astfel încât nu trebuie să fie. Bun? CSS. Deci, CSS, cum ar fi HTML, nu este un limbaj de programare. CSS este doar o serie de reguli de stil. Ea vine de la Cascading Style Sheets. Și să-l utilizați în combinație cu HTML pentru paginile de stil. Deci, există trei moduri puteți să-l includă. Un fel puteți face acest lucru este în capul parte a codului HTML, puteți doar deschide o etichetă stil și apoi stick- unele CSS reguli acolo. E destul de bine. Da. Audiența: Ai putea pune pe cei tag-uri stil în între, să să zicem, corp și / corp. Și atunci v-ar fi de styling numai în corp. ANGELA LI: Ai putea. O să meargă. Dar nu ar trebui, pentru că stilul este un fel de a metadatelor care ar trebui să meargă în capul documentului. Organism ar trebui într-adevăr să conțină numai ce se intampla de fapt la arata pe pagina dvs.. Audiența: Deci, te-ai pus stil in capul tau de stil întreaga pagină web, corect? ANGELA LI: Da. Astfel încât punerea stil aici, aceste reguli CSS se va aplica la întreaga pagină pe baza selectoare lor. Deci, cel mai bun mod de a face acest lucru este în schimb de a avea o etichetă stil in capul tau, aveți această legătură într-un stil extern foaie ca și cum ți-am arătat în exemplu anterior. Ce este acest lucru nu-l încearcă și găsește fișier style.css și apoi trage-l in și utilizează ca, stiluri pentru pagina. Și style.css dumneavoastră ar doar uita-te ca acest lucru. Ar fi doar o grămadă de CSS. Și, în sfârșit, există un alt fel pot include CSS, care într-adevăr nu ar trebui să facă niciodată. Este stilul inline apel. Și astfel orice element HTML poate, de asemenea, ia un atribut de stil. Și apoi, în acest atribut de stil, vă pot da reguli CSS. Deci, în acest caz, orice div sunt definirea chiar aici, o să au un fundal negru și o culoare text alb. Dar tu nu ar trebui să facă acest lucru, pentru că ceea ce acest lucru nu este o pune stilul dvs. în interiorul HTML dumneavoastră. Și știu că am vorbit despre HTML este structura și CSS este stilul. Dacă faceți acest lucru, se amesteca le împreună. Și nu e foarte curat. Deci, nu face asta. Folosind un exemplu de CSS, acolo sus, ne-am selectați doar corpul HTML documentar. Și suntem ca, totul e O să fie Comic Sans. De asemenea, nu recomandăm. Dar ai putea face asta. A doua regulă aici, se va pentru a selecta elementul pe Pagina cu ID-ul principal. Deci, orice element de HTML, i-am spus de identitate = Principal, am de gând să dea ca un Marja de 20-pixel și alinia totul, tot textul, la centru. Ultimul lucru pe care selectează prin clasa CSS. Astfel încât orice element de pe pagina pe care i-am dat o clasa secțiune, am de gând să-l facă o culoare de fundal de culoare albastru deschis. Da. Asta e tot ce am. Întrebare? Audiența: Ce face hashtag înainte principal face? ANGELA LI: Întrebarea este, ce face hashtag înainte do principal? În acest caz, hash în CSS înseamnă selectați de identitate. Deci, dacă am avut un element HTML, cum ar fi divid = principale, aceasta CSS selectează reguli lucrul cu ID-ul principal. Și în mod similar, termenul în fața secțiune este selectați de clasă CSS sau selectați de clasă HTML. Audiența: De ce este acolo o are înainte 6 în culoare de fundal? ANGELA LI: Da. Deci, întrebarea este, de ce este acolo un hash înainte de 6? Acest lucru este diferit de cel hash. Acest lucru înseamnă că dai o culoare hexazecimal. Culori, astfel încât hex, aceasta doar reprezintă o culoare. Și vă amintiți triplete RGB, atunci când ai facut PSET criminalistica? Acest lucru este similar. Primele două cifre reprezintă cât de mult roșu este în culoarea. Cea de a doua doi reprezintă cât de mult verde. Iar al treilea reprezintă cât de mult albastru. Și hash este acest lucru se întâmplă să reprezinte o culoare. Deci, nimic de la 0, 0, 0, 0, 0, 0 până la F, F, F, F, F, F este valabil. Este ceva culoare valabil, care poate fi afișată de browser-ul dumneavoastră. Întrebare? Audienta: Care este diferența dintre utilizarea de ID-ul și de clasă? ANGELA LI: Întrebarea este ce este diferența dintre utilizarea de ID-ul și de clasă? Puteți avea doar un element într-un Document HTML care are o anumită identitate. Deci, doar un singur lucru pe pagina mea este permis să aibă principal de identitate. Astfel încât să-l utilizați pentru acest lucru este antetul. Aceasta este de navigare. Aceasta este subsol. Clasele sunt diferite, pentru că puteți se aplică clasele în cât mai multe elemente HTML , după cum doriți. Deci, de exemplu, am făcut-o secțiune de clasă, pentru că nu e, probabil, mai mult de un de la pagina mea. Esti doar permis să aibă cât mai multe elemente de pe pagina cu aceeași Clasa ci doar una cu un anumit ID. Audiența: Deci, punct reprezintă clasa? ANGELA LI: Da. Un punct reprezintă o clasă. Rece. Asta e tot ce am, băieți. Mulțumesc. [Aplauze] ZAMYLA CHAN: Salut, toată lumea. Sunt Zamyla. Am de gând să se acoperă PHP, MVC, și SQL astăzi. O mulțime de materialul pe care voi fi de acoperire va fi destul de mult chiar din pset7. Bine. Deci, ce este PHP? PHP standuri pentru PHP Hypertext Preprocesor. Deci, în sine, este un recursiv nume, care este destul de rece. PHP este un limbaj de scripting server-side, și oferă backend și bazelor logice de site-ul nostru. Deci, Angela a vorbit foarte mult despre HTML și CSS care va face structura a site-ului. Dar ce se întâmplă dacă doriți să modificați că conținut dinamic sau în cazul în care variază pe baza utilizatorului sau anumite condiții? Asta în cazul în PHP vine inch Acum, de obicei, PHP ar putea dura câteva mai puține linii pentru a pune în aplicare același lucru in C. Asta pentru ca PHP se ocupă de memorie management pentru programator, spre deosebire de noi care au la malloc liber, lucruri de genul asta. Dar din moment ce PHP este o interpretare limba, de obicei, s-ar putea executa un pic mai lent decât C, care este un limbaj compilat. Pentru că suntem în mișcare de programare limbi, să ne uităm la modul în care sintaxă va diferi. Să fim foarte atenți să nu se confunda cu aceasta. Deci, cu sintaxa PHP, dacă sunteți integrarea PHP în interiorul unei pagini HTML fișier sau într-un fișier php. în sine, te trebuie să includeți codul în aer liber PHP și tag-uri PHP închise, cum ar fi urmează, ca și pe ecran. Variabile în PHP. Fiecare variabilă va începe cu semnul $ urmat de numele variabila dumneavoastră. Acum, variabile în PHP sunt liber tipizat, ceea ce înseamnă că nu aveți nevoie de pentru a indica ce tip de date este atunci când sunteți o declara. Cu toate acestea, acest lucru nu înseamnă că ele nu au nici un tip, la toate. Deci, dacă am declara o variabilă și doar setat l egal cu 1, și apoi declar o alta variabila, setați egal cu "1", și apoi un altul de 1,0, ei bine, în funcție de tipul de egalitate Operatorii Eu folosesc, dacă vreau să compare pentru toate tipurile, atunci vor fi egale. Dar dacă doriți să vă asigurați că tipuri sunt egale, PHP poate face în continuare că, chiar dacă noi nu indică ce tip este, atunci când ne-am în primul rând a face fișierul. Acum, în PHP, chiar dacă suntem trecerea de la programarea de limbi de pe C, încă mai avem noastră de încredere în cazul în stare, la fel ca aceasta. Avem încă bucle noastre în timp ce, doar ca aceasta, în cazul în care ați pus în ta condiție și apoi corpului buclei. Și atunci avem de asemenea noastre de buclă, care de obicei arata ca aceasta. Deci, dacă am vrut să itera peste tot nouă psets și să prezinte și un apel Funcția submitPset, atunci eu pot face asta aici, pe care voi au toate efectuată de către acest punct. Felicitări, apropo. Pentru aparatul de fotografiat, oameni a spus, vă mulțumesc. Acum, dacă nu doriți să utilizați doar acest pentru bucla, apoi PHP de fapt, de asemenea, a numit lucrurile bucle foreach. Deci, dacă am avut o serie de numere întregi, 0 prin 8, stocate în psets matrice, atunci am putea avea o buclă foreach care reiterează peste fiecare număr în psets. Și atunci am putea numi la fel funcționează de opt ori, la fel cum am făcut-o înainte. Deci, acest lucru pentru fiecare buclă este frumos, pentru că nu trebuie să, dacă nu știți lungimea exactă de matrice pe care le au, apoi folosind această buclă foreach se va ocupa de asta pentru tine. Așa că am făcut psets ca o matrice. Să ne uităm la asta. Matricele din PHP sunt de obicei la fel ca și cele pe care le-am avut în C, în cazul în care puteți declara o matrice. Și aici, eu pot declara un array gol și apoi construi dinamic, cu ajutorul indicii ca numere întregi. Deci index 0, am de gând pentru a stoca un număr întreg numit 1. La index 1 din lista mea, am de gând pentru a stoca valoarea de 2. Și în al treilea indicele dar al doilea număr, am de gând să stoca numărul 12. Acum, acest lucru este bine în faptul că funcționează funcționează bine. Dar spun că contează pentru mine ceea ce deține fiecare index. Pentru mine, indicele de 0 înseamnă modul în care multe pisici am. Iar indicele 1 reprezintă modul în care multe bufnițe am. Și cel următor înseamnă cât de mulți câini. Ei bine, atunci să se precizeze că, în loc să de a avea să-și amintească 0 se referă la pisici și de la 1 la bufnite, pot folosi tablouri asociative, ceea ce înseamnă că în loc de numere întregi ca indici mele, Eu pot folosi de fapt siruri de caractere. Deci, acest lucru este destul de util. Și ai de fapt doar înlocuit numerele întregi cu siruri de caractere. Și nu aveți un tablou asociativ. Da. Audiența: Exista un motiv pentru care nu există o subliniere pentru a doua parte, pentru că lista mea are matrice. ZAMYLA CHAN: Întrebarea a fost, este există un motiv pentru care există o subliniere între mea și lista? Nu. Asta e doar modul în care am numirea variabila mea. Audiența: În primul linie, e un cuvânt. ZAMYLA CHAN: Scuzele mele. Voi rezolva asta. Da. Ele ar trebui să fie același nume variabilă. Bună captură. OK. Deci, haideți să trecem la string concatenare. Dacă aș fi vrut să ia două șiruri, atunci eu pot să le înlănțui cu operatorul punct. Deci, dacă am Milo ca un prim nume și Banana ca un nume, apoi concatenarea cu operatorul punct și apoi pune un spațiu între va face un șir care conține Milo Banane, pe care eu pot ecou apoi sau, mai degrabă, imprima. Vorbind de ecou, ​​hai sa vorbim despre un util câteva - oops. Îmi pare rău. Câteva funcții PHP utile. Deci, avem - dificultăți tehnice. Un al doilea. L-am trimis. Probleme de PowerPoint. Și ne-am întors cu funcții PHP. Și ne-am întors cu funcții PHP. Deci, ne-am funcția necesită, în cazul în care dacă treci într-un dosar, aici este doar un exemplu de un fișier care S-ar putea trece inch Apoi, care va include codul PHP de la acel fișier pe care am indica. Și se va evalua ca inch Apoi, avem, de asemenea, ecou, ​​care este o paralelă cu printf. Exit este o paralelă a sparge, care iese din blocul de cod care ai intrat Apoi verifică goale dacă o anumită variabila este ca nul sau zero sau ceea ce este echivalat cu a fi gol. Da. Audiența: Pentru concatenarea string operator de punct o, în PHP, este faptul că aceeași ca și în cazul în care activarea JavaScript-se cu ajutorul punctul de concatenare înseamnă plus? Deci, pentru numele complet, ai putea avea dolar semneze primul + și apoi + dura? ZAMYLA CHAN: Da. Deci, întrebarea a fost dacă în PHP ne se poate folosi aceeași concatenarea string la fel ca în JavaScript cu plusurile. Și Iosif va intra în asta mai târziu. Cred că are un diapozitiv pe care. De fapt, e diferit. Deci, în JavaScript, trebuie să utilizați plus de a înlănțui siruri de caractere. Și în PHP, trebuie să utilizați operatorul punct. Deci sunt diferite. OK. Deci, acum că ne-am acoperit toate această PHP, unde o face într-adevăr veni la îndemână? Ei bine, vine la îndemână atunci când ne-am se poate combina cu HTML nostru. Deci, PHP nostru ne va da puterea de a modifica conținutul HTML o pagină înainte de a încărcare sale. Deci, în funcție de diferite condiții, de obicei, utilizatorul specifică care este conectat, putem afișa informații diferite. Linda, ai avut o întrebare? Audiența: poți înlănțui un număr întreg, de asemenea? ZAMYLA CHAN: Da, se poate. Deci, întrebarea este dacă poți înlănțui întregi sau alte variable.s acum, trecem la MVC, care este o paradigmă care ne-am folosit în pset7 și o mulțime de web designeri folosesc pentru organizarea codul în fișierele în site-ul lor. M vine de la model. Și, practic, fișiere model se va ocupa cu interacțiunile cu baza de date. Vizualiza fișiere, acestea se referă la estetica a site-ului. Și mânerele Controler cereri de utilizator, analizează date, are altă logică. În pset7, am combinat modelul și controlerul. Și ne-am chemat și controlere le-a pus în directorul public. Și vizualizarea de fișiere, le folosim ca șabloane din directorul template-uri. Deci, această schemă de aici reprezintă, de asemenea, că același tip de divizare cu Modelul și controlerul în purpuriu aici în stânga și ecranul din dreapta. Deci, aceasta este o schematică pe care unii dintre voi poate fi văzut la Orar de lucru sau diagrame care am fost de desen ca tine au fost imaginind PSET dumneavoastră. Deci, aici, într-o anumită controler, un model de controlor, ne-au funcții care se referă la interogarea SQL Baza de date, care execută logica de PHP. Poate v-ar privi în sus un stoc în Yahoo! Finanțe. Sau poate, ar trebui să verificați doar la vedea dacă un utilizator a prezentat o formează deja înainte de a avea vizitat pagina. Și atunci te-ar face o forma pe aici. După ce a fost prezentat ca formă de către utilizator, acțiunea care a fost specificate în tag-ul HTML a formularului ar indica pagina pe care o revine că datele. Deci, toate de care informațiile ar fi trimis înapoi la controler. Atunci probabil ca s-ar face un pic mai mult logică pe care și poate executa câteva mai multe interogări în baza de date SQL și apoi, în cele din urmă, să vină cu un frumos ambalate set de informații care le-ar trece în în alt șablon care afișează aceste informații. Acum, cum putem pachet de fapt, că informațiile sus? Ei bine, avem o functie numita Render că a fost în dosarul functions.php în pset7, în cazul în care trece în numele un fișier, numele unui șablon. Și apoi, de asemenea, trece în un tablou asociativ. Și astfel încât tablou asociativ reprezintă diferite informații pe care doriți să treci inch Acum, ce se întâmplă să fie constantă în aceste exemple este că tastele sau, mai degrabă, cheile asociativ matrice, acestea sunt ceea ce va fi de așteptat să fie constant de șablon, pentru că știe că are nevoie de ceva numit mesaj sau numit nume. Și apoi lucrurile de pe partea dreaptă, valori reale, astfel încât în ​​acest caz, cine e un băiat bun și Milo, cei care vor să fie valorile care se schimbă că operatorul se schimbă de fiecare dată sau bazat pe o anumită condiție și va trece că inch Deci, aici, în template-uri, vom vedea că ne-am folosesc caractere speciale HTML, ceea ce înseamnă, practic, doar că ne-o dorim pentru a obține șirul de la egal la egal care utilizatorul pus inch Și ne-o dorim pentru a substitui mesaj acolo. Deci, atunci când vom vedea de fapt, fișierul, specifice informații este trecut inch Rețineți că cheia de modul în care face fapte este că cheile de la asociativ tablouri, cei care devin variabile nume aici. Și astfel valorile care cheie în tablou asociativ devine apoi valoare a variabilei. Acum, haideți să trecem la SQL. Ea vine de la Structured Query Language. Și astfel aceasta este doar o programare Limba proiectat pentru gestionarea bazelor de date. Și a venit la îndemână pentru noi în site-ul nostru finanțe pset7. În esență, aceasta este doar o modalitate ușoară de a urmări și gestiona obiecte și tabele și le leagă unele de altele. Acum, cred că din baza de date SQL în principiu, ca un fișier Excel, poate, cu mai multe foi de file. Deci, ai putea avea mai multe tabele, probabil, care legate între ele. Și, la fel ca Excel, avem o mulțime de funcționalitatea pe care ne-o dorim. De exemplu, se poate selecta anumite rânduri. Putem introduce informații. Putem actualiza rânduri. Și putem șterge, de asemenea lucruri. SQL selecta lucrările de selectarea rândurilor sau un rând de coloane specificate de la un de baze de date care se potrivesc unei anumite Criteriile pe care le indicați. Deci, aici, când văd selectați * de la vrăjitori în care casa = Ravenclaw, apoi Sunt selectarea *, ceea ce înseamnă că sunt selectarea fiecare coloană în care rând din tabelul experți dar numai dacă coloana casa este egal cu Ravenclaw. Acum, acest lucru este pur sau SQL. Deci, dacă m-am dus în phpMyAdmin, care este modul specific pe care le folosim pentru a gestiona bazele noastre de date SQL, atunci am putea introduce că în site-ul phpMyAdmin. Și care ar putea executa. Dar noi, de fapt vrei sa faci că pe partea de PHP. Deci, cum facem asta? Ei bine, vom folosi funcția de interogare, care practic executa acea interogare SQL. Utilizarea? ca un substituent, putem trece la anumite Valorile pentru șir nostru că ne-am doresc să înlocuiască. Deci, poate că eu sunt de stocare diferit valorile din curr_house, care reprezintă casa de curent pe care am de gând prin intermediul. Deci, eu pot trece că, în calitate de substituent cu semnul de întrebare. Și apoi voi executa practic același lucru ca și am făcut-o înainte, cu excepția acum, eu sunt în PHP. Și interogarea va returna un tablou asociativ. Și am de gând să-l păstrează în rânduri. Acum, interogare poate eșua întotdeauna. Poate că interogarea SQL nu a putut executa deoarece masa nu exista. Sau poate, coloana nu exista. Ceva a mers prost. Ei bine, în acest caz, veți dori să facă vă că vă verificați dacă interogare întors false. Și că este, prin utilizarea triplu este egal cu operarea acolo. Și apoi îmi cer scuze, ceea ce este un alt Funcția CS50, trece într-un mesaj. Și dacă te uiți în cer scuze, tot ce într-adevăr nu este face apology.php. Da. Audiența: Ați putea explica ce că stele are între selecta și de la? ZAMYLA CHAN: Da, absolut. Deci, steaua între select și de la înseamnă că vreau să selecta întregul întregul rând de la masa mea. Am fi putut indicat selectați nume, an, casa. Și mi-ar lua doar pe cei trei coloane din masa mea. Dar dacă spun select *, atunci eu voi obține tot în acea coloană. Apoi, am de gând să te duci în spatele primului. Audiența: Deci, acest lucru este încă în SQL, corect? Este această interogare sau este PHP? ZAMYLA CHAN: Suntem într-o interogare. Deci, acest lucru este în PHP. Deci, folosind interogarea funcția PHP, vom executa o interogare SQL. Audiența: Este ceva in SQL sensibile la caz, cum ar fi selectați sau vrajitori sau casă? ZAMYLA CHAN: Este ceva în SQL caz-sensibil? Cred că da, da. Eu cred că SELECT și FROM Și unde sunt case-sensitive. Nu? ROB BOWDEN: Deci, e invers. Numele coloanelor și mijloacele de masă, toți cei care sunt sensibile la caz. Dar oricare dintre cuvintele cheie MySQL, cum ar fi SELECT, FROM și WHERE, cei care nu sunt case-sensitive. OK. Deci, opusul a ceea ce am spus. Astfel încât toate cuvintele cheie MySQL - selectați, din, unde - cei nu sunt sensibile la caz. Dar totul altceva este. OK. Ai în față. Audiența: Dacă am $ rânduri în ceea ce privește mai mult de un rând, înseamnă că este doar devine un tablou asociativ? ZAMYLA CHAN: Deci, întrebarea era dacă rânduri are mai mult de un rând în ea, nu să devină un tablou asociativ? Deci, este o serie de asociativ tablouri deja. Astfel încât, chiar dacă există doar un singur rând întors, atunci ai avea pentru a merge la index 0 de acest rezultat. Și atunci ai avea prima linie. Da, Belinda? Audiența: Când utilizați ===, este aceasta singura instanță? Sau sunt acolo alții? ZAMYLA CHAN: Deci, în acest caz, === este o comparație între tipuri. Scuze. === Este o comparație care compară tipurile. Și apoi == compară pe toate tipurile. Audiența: Puteți explica ce rânduri se află în această situație? Este rând de date? ZAMYLA CHAN: În slide-ul urmator, eu sunt de gând să explice ceea ce este rânduri. Deci, dacă nu te superi deține off pe asta. Și apoi în spate? Audiența: Pentru funcții, cum ar fi o interogare, face și-mi cer scuze [neauzit]? ZAMYLA CHAN: Întrebarea era dacă aceste funcții - de interogare, ne cerem scuze, și face - sunt comune în PHP. Acestea sunt cele care CS50 a scris pentru pset7. Și Jay? Audiența: Când aveți nevoie pentru a spune $ _SESSION, Este că doar pentru ID-uri? Sau ai putea fi spus că aici? ZAMYLA CHAN: Deci, întrebarea a fost, atunci când vom folosi $ _SESSION, care a fost un specific variabilă globală pe care o utilizați. Aici această variabilă se va fie local pentru funcția noastră. Deci, suntem doar declararea o nouă variabilă. Audiența: Cum se scuze puse în aplicare? ZAMYLA CHAN: Întrebarea a fost, modul în care este implementată-mi cer scuze? Și cred că aceasta este de fapt o destul de bune practici pentru voi să meargă în secțiunea functions.php și uita-te la mi cer scuze și a vedea cum ai putea avea făcut-o singur. Așa că am să las asta pentru tine, dar doar spun că dacă te uiți la cer scuze, atunci este nevoie de mesajul pe care îl prezentat să își ceară scuze, și apoi se face acel mesaj. Alte întrebări? Îmi place întrebări. Deci, păstrați-le vine. Audiența: [inaudibil] echo sau print acolo? ZAMYLA CHAN: Întrebarea a fost, poate nu le-am pus doar echo sau print acolo. Astfel că ar fi făcut ceva ușor diferite. Care ar fi imprimate de interogare a eșuat în care - bine, chiar acum, suntem de fapt în controler nostru. Deci, nu avem de fapt HTML înființat aici. Mi cer scuze de redare apologize.php de fapt, vă redirecționează la apology.php. OK. Deci, acum, să mergem pe de a aborda întrebare de mai devreme despre ceea ce este într-adevăr rânduri. Ei bine, interogarea va returna o serie de rânduri. Și fiecare rând este reprezentată de un tablou asociativ. Deci, dacă am executat unele interogare SQL și Am stocat rezultatul în rânduri, atunci folosind o buclă foreach, atunci matricea nume este primul acolo - rânduri. Și apoi am de gând pentru a apela fiecare rând acolo $ row. Astfel iterarea peste asta, eu pot apoi accesa coloana nume rândul dat lui, coloana an, și coloana casa. Rețineți că nu aș fi fost în stare să face acest lucru cu rânduri, pentru că indicele de rânduri Numele nu există. Rânduri este doar o serie de tablouri asociative. Astfel încât aveți două niveluri de acolo. Odată ce aveți matrice de rânduri, aveți pentru a obține în asta. Și apoi puteți accesa coloanele. Făcut ca să-l clar? Da, în față? Audiența: [inaudibil] deschide paranteze pentru [inaudibil]? ZAMYLA CHAN: Pardon? Audiența: Consolele deschise. ZAMYLA CHAN: acestea aici? Care este permițându-mi să includă că variabila. Da. Audiența: Când imprimați, ești imprimarea la codul HTML? ZAMYLA CHAN: Da. Când imprim, aceasta de aici se află în interiorul șablon meu acum, așa punctul meu de vedere al metodei MVC. Deci, eu sunt de imprimare în HTML. Audiența: Deci, dacă ne-am dus în developer instrumente după rularea acestui, am putea că de fapt în cod? ZAMYLA CHAN: Asta-i o mare întrebare, da. Deci, dacă te-ai dus în instrumente de dezvoltare în Firefox folosind Firebug sau Crom, atunci da, ai putea vezi HTML specific. Așa că nu ar arăta $ row ["Nume"]. Aceasta ar arăta în funcție de Numele este în acel rând. Audiența: Doar o problemă generală, ceea ce sunt și tr td definit ca? De ce ne-ar [inaudibil]? ZAMYLA CHAN: Tabelul tr rând, tabel atunci td coloană. OK. Publicul: Da, e de date tabel. ZAMYLA CHAN: date de masă. Da. Audiența: Este un rând în care rând este tratat ca o coloană? ZAMYLA CHAN: Îmi pare rău. Poți să repeți asta? Audiența: Cum te-ar vizualiza rânduri? ZAMYLA CHAN: Cum te-ai vizualiza rânduri în ce fel de mod? Vorbești despre aceste rânduri de aici sau rândurile tr? Audiența: Rândurile. ZAMYLA CHAN: Aceste rânduri de aici? Aș vizualiza acest lucru ca Am executa interogarea mea. Și se spune, OK, am nici 0 la n cantitate de rânduri care se potrivesc criteriilor pe care le-au interogat. Deci, am un numar de rânduri. Deci rânduri, de $ rânduri, magazine fiecare unul dintre aceste rânduri într-o matrice. Astfel încât, chiar dacă e doar unul dintre ei, e încă o serie de rânduri care se potrivesc. Așadar, de exemplu, aceasta este similar, atunci când preluat cache-ul de la utilizatori. Și criteriile de acolo a fost în cazul în care ID-ul este egal cu ID-ul de sesiune. Există într-adevăr este doar un rând care ar putea potrivi asta. Dar încă rânduri tocmai se întorsese de un singur rând. Așa că ar trebui să meargă la rânduri, index 0, indicele cache a ajunge de fapt la cache-ul. Audiența: Este funcția de imprimare în ecou același lucru? ZAMYLA CHAN: Da. Da. Imprima un ecou de la fel. Audiența: Este bucla foreach singura modalitate de a indexa în rânduri? ZAMYLA CHAN: Este o buclă foreach singurul mod în care puteți repeta prin rânduri? Nu. Puteți folosi, de asemenea, o pentru buclă, cu condiția că știți lungimea de matrice rândul lui. Audiența: Ai putea să-l accesați folosind un rând ca [inaudibil]? ZAMYLA CHAN: Deci nu se poate accesa folosind doar rând, dacă nu aveți un foreach buclă cu condiția ca nu v-ați declarat rând. Da. Da, în alb. Audiența: Deci, ce tr și td face? ZAMYLA CHAN: Deci tr și td sunt tag-uri HTML. tr indică începutul de un rând de tabel. Și fiecare td indică o Noua coloană de date tabel. Audiența: Pentru un vizual de ceea ce un rând este ca, doar imagina SQL, cum ei au un rând. [Neauzit]. ZAMYLA CHAN: Da. Acesta este un punct de mare. Puteți vizualiza rânduri ca doar ca într-un tabel Excel, doar lista de rânduri. OK. Bine. Deci, acum că am trecut peste selectați, în cazul în care nu există mai multe întrebări, vom du-te peste pe insert. Deci, dacă am vrut să insera în unele masă și introduceți anumite coloană valori, am putut să mă insera în Ravenclaw în anul 7. Dar, uneori, ar putea fi duplicat valori, așa cum am văzut în pset7 când ne-am au fost actualizarea portofoliul nostru. Deci, în acest caz, vrem sa folosim ON DUPLICAT UPDATE KEY, astfel încât să nu stoca mai multe rânduri cu aceeași valoare, dar mai degrabă o actualizați. Apoi, avem de fapt actualizare, care nu este o inserție. Este doar o actualizare în cazul în care vă actualizați într-un anumit tabel cu un anumit criterii și apoi, în cele din urmă, șterge, care face un lucru foarte asemănător. Audiența: Ai putea pe scurt du-te peste cheia duplicat? ZAMYLA CHAN: Da. În esență aici, am INSERT INTO Gringotts, este, galioane, aceste valori. Dar ID-ul, probabil, este o cheie unică Valoarea înființat în tabelul MySQL. Deci, dacă am deja că ID-ul creat, atunci eu nu pot insera un rând nou. Deci, dacă nu există deja, atunci am să-l actualizeze. În mijloc, în alb. Audiența: Deci insera, actualiza, șterge, și selectați, sunt cele toate disponibile la nivel local [inaudibil]? ZAMYLA CHAN: Deci introduce, update, șterge, și selectați sunt toate interogările SQL. Deci, ori de câte ori sunteți folosind SQL, veți avea cele disponibile. Audiența: Înapoi la chestionare anterioare - a existat o întrebare care se ocupa cu dacă ați avut o masă și a vrut să introduce rezultatele testelor într-o și introduceți Numele dvs., astfel încât acesta nu va lăsa [Inaudibil] scor de testare prietenului tău. Cum ar fi sa faci asta cu inserție? ZAMYLA CHAN: Deci, întrebarea a fost de aproximativ o întrebare pe termen mediu anterior. Eu nu sunt conștienți de ceea ce unul este chiar acum. Deci, poate că după aceea, dacă doriți să vin și-mi arate, atunci eu pot cu siguranță vă dau sfaturi. Dar, vorbind de inserarea lucruri, cum ar fi ținând scorul cuiva, atunci când nu ar trebui, hai sa vorbim despre Atacuri SQL injection. Astfel încât un atac SQL injection este, în esență, în cazul în care cineva ia avantaj de securitate scăzută a astfel încât să luați în date. Deci, aici, la fel ca și în finanțe CS50, atunci când ne-am conectat, putem intra într-o nume de utilizator sub forma de conectare, prima casetă de text, și apoi introduceți o parolă. Poate că s-ar putea uita codul nostru PHP ceva de genul asta, unde $ username este numele de utilizator și parola post-date este parola post-date. Și apoi ne-am doar execută interogarea noastră, să zicem, Bine, bine, interogarea noastră se va selectați de la utilizatorii noștri, în cazul în care numele de utilizator este una care le-au prezentat. Și parola este parola, ceea ce înseamnă că parolele se potrivesc. Acum, ce se întâmplă dacă în loc de fapt, depunerea o parolă real, cum ar fi 12345 și ghicitul în dinte care spune parola și încearcă să hack lor cont, dacă în schimb au prezentat acest lucru. Ele ar putea tip în poate o presupunere la o parolă. Și apoi s-ar termina citat apoi tastați sau 1 = 1. Care ar ritmul direct în SQL interogare să arate ceva de genul asta. Selectați de la utilizatori în cazul în care numele de utilizator = prongs și parola este egal crin sau 1 = 1. Deci, fie parola are pentru a fi corect sau 1 = 1, care este întotdeauna adevărat. Deci, în acest caz, în esență, un utilizator poate să profite de acest lucru și doar log se în și hack contul cuiva. De aceea ne-o dorim, pentru a evita cineva care avea de a face acest lucru. Dar, din fericire, funcția de interogare de către trecerea în substituenții vor avea grijă de asta pentru tine. De asemenea, nu vei dori de obicei, să prezinte de fapt, parolele înșiși. De aceea am distribuit sau criptate le în finanțe CS50. Audiența: testul trecut a vorbit despre siruri de caractere de evacuare MySQL. Nu trebuie să vă faceți griji despre asta? ZAMYLA CHAN: Asta este o întrebare bună. Siruri de caractere MySQL de evacuare este cu siguranta un funcție care a fost utilizat în interogarea noastră. Dar uite definitiv în asta. Aș spune că e un joc cinstit să știi care ai nevoie pentru a apela că funcționa pe un șir. Da, Belinda? Audiența: Cum știi când e ghilimele simple sau ghilimele? Și, de asemenea, mă simt ca și cum în curs tine menționat ceva despre care nu au [inaudibil] sau ceva sau al doilea citat singur la sfârșitul anului. Cred că el a subliniat în curs care tu ar trebui să aibă apostrof 1 și apoi nu au apostroful sau ceva. Audiența: [inaudibil]. Audiența: Chestia e ultimul single- citat în acolo, în această a doua cutie nu ar trebui să fie acolo. [Inaudibil] Pentru că, atunci când ia ultima singur cita afară și se potrivesc acestea pentru conținut în cazul în care parola este, dacă aveți că interogare, există un singur citat la final deja. Doriți să utilizați ca singur citat ca cel care se confruntă cu o [Neauzit]. Deci, ce este de fapt, în acest text cutie nu ar trebui să aibă asta. ZAMYLA CHAN: Voi schimba asta. OK. În cazul în care nu sunt întrebări, atunci eu voi trece-l pe Iosif pentru a vorbi despre JavaScript, etc. [Aplauze] JOSEPH ONG: Deci, suntem rulează un pic în urmă. Deci, dacă trebuie să pleci, asta e OK. Dar vă rugăm să păstrați capul în jos daca esti la mijloc, astfel încât să nu bloca aparatul de fotografiat și să utilizați ieșirea din spate, dacă trebuie să. Eu sunt Iosif de drum. Hi. De testare, de testare. Dan, este atat de buna? Rece. Deci, videoclipul va fi, de asemenea, postate on-line pentru cei care Trebuie să plec acum. Ciudat. OK. Astfel de revizuire test. Aceasta este o pisică. Acum, JavaScript, ceea ce nu este, poate, ca aww pentru unii dintre voi. OK. Deci, asta e în primul rând, amintesc de Zamyla. Amintiți-vă că PHP este rula pe server. Și o mulțime de ori, voi scrie bucle în PHP pentru a imprima HTML, corect? Deci, odată ce codul se execută, care Ieșire HTML pe care le imprimați este trimis pentru utilizator. Și odată ce acest lucru se întâmplă, nu mai poate PHP fi rulat, dacă nu reîncărcați pagina, de Desigur, care reexecutes PHP. Dar, odată ce imprimați că HTML, nu puteți merge oriunde. Așa că HTML este trimis la utilizator, care este browser-ul aici, în cazul în care Milo este utilizând computerul. Și atât de bine, sunt mai multe lucruri odată ce vom trimite HTML pentru utilizator. Uneori vrem să facem ceva de genul atunci când faceți clic pe ceva, ne-o dorim cutii de alertă pentru a pop-up, aceste tipuri de interacțiuni, cum ar fi atunci când apăsați cheie, atunci când faceți clic pe ceva pagina, vreau să se întâmple ceva. Ei bine, nu poți reexecute PHP cod odată că HTML este setat. Deci, cum faci asta? Va prezentam un nou limbaj denumit JavaScript, care rulează în browser care vă permite să faci lucruri pentru a HTML după ce primiți le de la server. Și acesta este motivul pentru care l-am a-side client apel limbaj de programare. Acesta funcționează pe computer - clientului. Orice întrebări cu privire la faptul că până acum? Ca paradigmă are sens pentru oameni? OK. Bun. Bine. Deci, primul lucru de remarcat este JavaScript nu este PHP. Ei au o sintaxă diferită, pe care vom merge în. Și au utilizări foarte diferite. JavaScript, din nou, pentru dvs. browser, pentru client. Server ruleaza undeva pe altcuiva computer care trimite informații pentru tine, corect? Deci, dacă vă cerem să scrie cod PHP la o întrebare examen, nu scrie JavaScript și vice-versa. Veți pierde doar de puncte, și nu va fi corect. Așa că haideți să trecem în unele diferențele de sintaxă - JavaScript pe stânga și PHP pe dreapta. Primul lucru pe care veți observa cu JavaScript, ne declara variabile cu cuvântul cheie var - V-O-R. PHP folosit semnul dolar, ca Zamyla discutat mai devreme. Dacă doriți să declare o asociativ matrice, vom vedea sintaxa familiar pe partea dreapta cu PHP. Pe partea stângă, în schimb folosiți acolade. Și apoi cheile sunt pe partea stângă. Atunci aveți un colon. Și apoi au valorile pe care doriți. Deci, acest lucru este modul în care ar face-o în PHP pe partea dreaptă, cu care a doua linie care pornește de la Milo. Și care este modul în care v-ar face pe partea stângă în JavaScript, dacă doriți ceea ce noi numim un obiect. Și obiecte în JavaScript sunt doar tablouri asociative. Deci, dacă doriți să accesați domenii, în PHP utilizați această sintaxă suport. Și în acest fel, puteți realoca acest domeniu proprietar de Lauren. Ei bine, în JavaScript, în cazul în care unul vrea să accesa un câmp și să îl modificați, aveți posibilitatea să folosiți sintaxa punct. Puteți folosi, de asemenea, sintaxa suport. Dar nu puteți utiliza dot sintaxa în PHP. Că nu va funcționa. Aceasta funcționează numai în PHP. Și, în sfârșit, pentru a imprima lucrurile la consola, folosiți console.log, care voi folosi o mulțime în pset8. Puteți console.log asta. Dacă doriți să imprimați o matrice în PHP, va trebui să utilizați de imprimare r. Și pe partea dreaptă, veți vedea i hash șir concatenare acolo. Cineva a întrebat mai devreme. Eu folosesc un plus în JavaScript. Dacă vreau să înlănțui ceva in PHP, am folosi punct. Acestea sunt diferite. Dacă sunteți scris de cod PHP, nu utilizați un plus. Dacă sunteți scris JavaScript cod, nu scrie un punct. Acesta va fi greșit. Și veți fi trist. Diferențe atât de sintaxă. Știu sintaxa, pentru că dacă trebuie să Trimite o întrebare și să utilizați sintaxa din limba greșit, acesta nu va funcționa. Și va fi greșit. Deci, hai sa vorbim despre un anumit control flux diferențe, modul de utilizare a bucle în fiecare dintre ele. Zamyla a trecut peste partea dreaptă. Chestii de pe partea dreaptă ar trebui să fie familiar. Să ne uităm la pe partea stanga. Când utilizați pentru n buclă în JavaScript, dvs. variabila buclă, var i de acolo, buclă peste cheile de matrice. Deci, vedeți nume, casa, și rol. Dacă I ​​i console.log, mă nume, casa, și rol. Acestea sunt cheile. În JavaScript, o buclă foreach merge peste valorile acestei matrice. Astfel încât să observați că sunt amândoi i. Dar aici, pe partea de PHP, se imprimă din Milo, CS50, și Mascot. Acestea sunt valorile din PHP. Deci, acestea sunt cum aceste două sunt diferite în diferite limbi. Deci, dacă utilizați un foreach buclă, nu pleca de la premisa că vă oferă cheile. Și dacă utilizați o de n buclă, nu Presupun că vă oferă valorile. Are acest sens până acum? Următorul diapozitiv este de gând să-ți arăt cum puteți accesa contrariul în fiecare dintre ele. Ei bine, dacă aveți cheia în JavaScript și doriți valoarea afară, doar index în matrice cu asta. Deci, Milo a i se va obține ceea ce vrei - valorile. Există această sintaxă diferită în PHP. Dacă chiar vrei să-l cunosc, eu nu fac cred că l-am arătat-o ​​încă. Dar dacă sunteți interesat, puteți utiliza sintaxa suplimentară din dreapta parte care vă va permite de fapt, să obțineți cheile în PHP atunci când utilizați un buclă foreach. Deci, doar un pic de trivia daca esti interesat. Deci, asta e doar pentru a demonstra diferențele dintre aceste două bucle. Nu le amesteca atunci când sunteți programarea o întrebare. Orice întrebări despre asta. Rece. Bine. JavaScript obiecte. Am vorbit despre ei. Sunt ca tablouri asociative. Singurul lucru pe care aș vrea să vă notați aici este că o valoare într-o asociativ matrice poate fi nimic în JavaScript. Acesta poate fi chiar o funcție, ca acolo. Am o funcție care este o valoare a unei chei. Și dacă vreau pentru a apela această funcție, Am acces doar coaja. Și apoi am pus paranteze după aceea. Și care funcționează. Deci, întrebări? Nu? OK. Bun. JavaScript, cum ar fi PHP, este vag tastat. Ce înseamnă asta? Ea are tipuri. Dar atunci când declară un JavaScript variabilă, tu spui var i. Tu nu-l spun. Asta nu e un lucru. Trebuie doar spun că este o variabilă. Și apoi JavaScript va ocupa de Tipuri de sub capota pentru tine. Ne poate converti liber între tipuri din cauza asta. Așa că am începe ca un număr în acest caz. Și apoi am un șir. Și eu am să-l adăugați. Și eu le retrocedeze înapoi în i.. Astfel pe prima linie, i este numărul. Pe a doua linie, i devine acum o șir după ce am face redistribuirea. Și aici, eu doar concatenarea că numărul de pe șirul. Deci, vezi că, chiar dacă am fost un întreg în prima parte, e un fel a cum ar fi convertit la un șir și apoi a fost adăugat pe care șir salut. Și așa mai departe asta e ceea ce vreau să spun de dactilografiere liber. Asta e ca să vă convertiți între tipuri foarte ușor. Și nu se arunca avertismente la tine ca C nu. Deci, i conține acum salut 123 de șirul. Următor. De asemenea, putem compara în mod liber între tipuri. Deci, dacă tocmai ați folosi ==, foarte mult ca și în PHP, JavaScript face un lucru similar. Șirul 123 este același cu numărul 123 atunci când utilizați egali duble. Atunci când este utilizat egali triple, de asemenea, dorește să se asigure că tipul este același. Astfel pentru că este un șir și care este un număr, chiar dacă ele sunt atât 123, atunci când utilizați triplu egal, te fals. În dublu egal caz, te adevărat, deoarece egal duble nu pasă de tip. Egali triple-i pasă de tip. Întrebări? OK. Și un alt lucru despre JavaScript este domeniul de aplicare este un fel de nivel mondial daca nu esti într-o funcție. Și funcționează la fel fel în PHP de fapt. Deci, haideți să mergem prin acest exemplu. I-am setat la 999. Și apoi mă duc în această pentru buclă. Deci, dacă am de imprimare i în acest pentru buclă, mă aștept 0, 1, 2, 3, 4. Am ajunge la i = 4. Ea i incrementeaza acum la 5 la capătul de bucla. Și apoi se rupe din bucla, deoarece acesta nu îndeplinește mai condiție. Ce crezi că următorul console.log afiseaza? Deci, asta e ceea ce ar face în C. În C, pentru că dacă aveți ca var i în afara și aveți var i în interiorul unei bucle, ca un pentru bucla, apoi se face astfel încât se luneta că cele două i sunt diferite. În JavaScript, se va doar trateze ca pe același i. Primesc 5, pentru că a fost valoarea după ce a ieșit din bucla. Deci, aceste lui i sunt în același i. Asta face sens? Ei bine, are sens din un punct de vedere JavaScript. Dar aceeași paradigmă nu reportare a C. Ei au diferite reguli de definire a domeniului. Da. Audiența: [inaudibil] în afara funcției [inaudibil]? JOSEPH ONG: Deci, în afara căreia funcție? Asa ca voi ajunge la faptul că, în doar o secundă. Deci, noi numim foo (i). Acest lucru trece i în foo, trepte ea, și apoi l busteni. Deci, a fost de 5. Deci, acesta devine 6. Dar ce vorbesc despre este că am în această funcție. Pentru că este un parametru, este luneta pentru această funcție. Deci, odată ce am obține de fapt, din care funcție, este acum de gând să meargă înapoi la vechea i. Că i se luneta doar pentru că este într-o funcție. Și ne-am domeniul de aplicare și funcții. Dar nu avem domeniul de aplicare în afara de funcții în JavaScript. Asta face sens? Da. Întrebare. Audiența: Same [inaudibil]? JOSEPH ONG: Deci da. În PHP, e același tip de lucru. Există o ușoară subtilitate de fapt. Dar poți să mă întrebi despre că după revizuirea. Nu aveți nevoie să știu că subtilitatea pentru testul. Pentru toate punctele de vedere, cum ar fi variabile, la nivel mondial și PHP, cu excepția cazului în acestea sunt într-o funcție, aceeași lucru în JavaScript. Da. Audiența: De ce este acest permis în JavaScript și nici unde altundeva? JOSEPH ONG: Deci, ce este permis în JavaScript și nu în C? Doar cine a venit cu JavaScript a decis că acest lucru a fost OK în JavaScript. Deci, e la fel ca un limbaj de programare convenție așa cum ne-ar spune. Da. Audiența: Deci, de ce a făcut a mers 6-5? JOSEPH ONG: Deci, acesta a plecat 6-5, pentru că atunci când eu am trecut în foo, care i în interiorul foo este acum luneta la foo, deoarece domeniul de aplicare există în funcții în JavaScript. Dar, odată ce ies de aici, pentru că a fost luneta la funcția, eu sunt doar utilizarea i regulat care a fost în interiorul Restul fluxului de control. Face sens? Pot să merg mai departe? Bine. Rece. Acceptarea este obiectelor sunt transmise prin referință. Stii cum, atunci când treci o matrice în C ai putea modifica de fapt matrice? Este același lucru în JavaScript. În cazul în care trec un obiect, în acest caz, am Milo a trecut în această funcție catify. Milo începe. Numele lui este Milo Banana. Eu trec ca obiect într-o funcție pentru că este un obiect, un asociativ matrice in JavaScript. Când m-am efectua o operație în această funcție, ea va de fapt, schimbarea obiectului. Deci, acest lucru se va întâmpla doar pentru obiecte în JavaScript, ca doar se întâmplă pentru tablouri din interiorul numelui C. Deci, Milo va deveni de fapt, cat acum. Asta face sens? Deci, aceasta funcționează numai pentru obiecte. Obiectele sunt transmise prin referință. Da. Audiența: Deci tu spui că în contrast cu i. variabil. JOSEPH ONG: Da. Care variabila am fost doar un număr, nu? E ca în C, atunci când trece un număr întreg o, face o copie. Și atunci când treci un array, este de fapt schimba matricea reală în C. Același lucru se întâmplă cu JavaScript în acest caz. Bine. Și apoi, Milo este trist pentru că el este acum o pisică. Asta a fost de fapt Milo după unele excursie la veterinar. Deci, cum putem folosi JavaScript într-o pagină web? Putem să-l includă. Acest lucru este cod HTML cu tag-uri de striptease. Deci, am tag-uri de striptease acolo. Și apoi am pus niște JavaScript Codul în tag-uri script. Și apoi se execută acest lucru. Când m-am doar o fac așa, e numit JavaScript inline. E un fel de murdar, pentru că JavaScript este, de fapt în HTML. O cale mai bună de a face acest lucru, mult mai frumos, este de a scrie JavaScript într-un fișier extern și apoi furniza tag-ul script cu o sursă. Și acest lucru va merge la acel fișier JavaScript și citi codul JavaScript de la că dosarul în schimb. Și în acest fel, nu aveți o mulțime de JavaScript la începutul dvs. Fișier HTML, ceea ce face într-adevăr murdar. Tocmai ai pus-o în altă parte. Și apoi îl va citi de acolo. A făcut că are sens? Probleme de plasament. În acest caz particular, script-ul este în fața organismului. Așa că atunci când am executa asta, nu e nimic în organism încă. Poate că acest lucru va face un pic mai mult simți când am arăta această parte următoare. În acest caz, script-ul vine după div. Deci, apare de fapt div pe pagina întâi. Chiar aici în acest cerc mic de culoare roșie, veți vedea apare textul. Și apoi alerta apare. In primul caz, pentru ca scenariul a fost înainte de div, alertă apare mai întâi. Și apoi div apare după vă respingerea caseta. Deci, executarea contează. Deci, vom păstra în vedere acest lucru. Acest lucru va fi important într-un pic. OK. Atât de bine, cum a face tu așteptați până la întreaga pagină este încărcată, atunci înainte de a executa un cod? Vom intra in acest lucru un pic Puțin mai târziu prea. Dar chiar a păstra această destinație de plasare probleme în minte de când ne-am vin la un alt diapozitiv. Așa că am ajunge la DOM acum. Și ceea ce este DOM? Deci, dacă te uiți la codul HTML, e doar o grămadă de text de pe ecran. Deci, cum se știe că JavaScript acesta este un element HTML? Deci, trebuie să avem o anumită memorie Reprezentarea acestei structura pe care o avem. Și ori de câte ori avem acest lucru în memorie reprezentare în JavaScript, numim că DOM. Și e doar un mod în care oamenii au decis că noi ar trebui să reprezinte această Structura HTML ca. Și ce înseamnă acest DOM arata ca? Ei bine, în reprezentare memorie, vom lua acest text. Și l-am transforma în memorie reprezentare. Deci, aceasta este HTML. Deci, ne-am afla în primul rând faptul că fiecare DOM copac are un document. Se pare ca un copac. Și documentul conține HTML tag-ul, de fapt totul în interiorul acestui acum. Tag-ul HTML are doi copii. Ea are un cap. Că cap, dacă te uiți la indentare acolo la modul în care este structurat între tag-uri apropiate, cap are un copil. Copilul este titlu. Exact. Acum, avem un copil corp. Și apoi că organismul are o copil numit familie. Și că familia are trei copii - mai vechi, de mijloc, și cel mai mic. Deci, ar trebui să știi cum să atragă o diagramă ca acest lucru atunci când ne-am întreba cum pentru a desena o diagramă, atunci când ne-am da tu HTML pe stânga. Știu cum să producă copac DOM. Și în interiorul acestor lucruri, nu doar un text, pe care l-am reprezentat cutii cât mai puțin. Are această structură arbore DOM face simț și ceea ce DOM este? Deci, ce p suport pentru? Peste aici, p acolo în care tag-ul reprezintă o tag-ul paragraf în HTML. Astfel încât să puteți privi în sus. Dar aceasta înseamnă doar că e ceva spațiu pentru un text. Și ea are unele CSS styling implicit, pentru că este o etichetă paragraf. Dar nu prea vă faceți griji cu privire la că o parte prea mult. Doar știu că este un substituent pentru un text. Da. Întrebare? Da. Audiența: Ați menționat doar CSS. Familia și hash hash toate chestiile astea este de fapt reprezentând ID-uri în CSS? JOSEPH ONG: Da, exact. Voi ajunge la ceea ce aceste hashes Adică într-o secundă. Când Angela a trecut peste CSS, ea a vorbit despre selectoare CSS. Acestea sunt selectorii CSS care ea a fost vorba. Da, Rob? ROB BOWDEN: Mi-ar comenta, de asemenea, că DOM în interiorul tag-ul titlu este de asemenea un nod de text. JOSEPH ONG: Corect. Deci, în interiorul tag-ul titlu, Am niște DOM text. Deci, într-adevăr, acest titlu ar trebui să aibă ca un cutie mică iasă din ea, de asemenea. Dar nu contează cu adevărat prea mult în acest caz. Noi nu le pasă într-adevăr de noduri de text, cum le numim, prea mult. OK, vom face. Aparent, facem. Si eu va stabili că, atunci când Eu îl încărcați din nou. Asta face sens? Deci, cum putem lucra cu DOM? Ori de câte ori te descurci cu DOM în JavaScript, există două etape. Selectați un element de DOM. Și apoi tu faci lucruri pentru ea. Deci, în acest caz, abstract, am selectat elementul de mijloc. Și apoi un exemplu de a face lucruri pentru aceasta ar fi modificarea textului. Care folosit pentru a fi Bob. Acum, ceea ce am făcut a fost să-l am schimbat Bob de Milo în acest caz. Deci, cum de fapt, vom face acest lucru? Cum facem selectarea? Și cum facem ceea ce facem chestii de lucru pe care odată l-am luat-o? Ei bine, modul în care voi l-au învățat în această clasă este prin utilizarea ceva ce numit jQuery. Deci, ce este jQuery? jQuery este o bibliotecă care face JavaScript mai ușor să scrie. Deci cineva a avut timp și a scris jQuery. jQuery este de fapt scris în JavaScript. Și apoi pentru că au făcut acest lucru, noi acum au o grămadă de funcții care putem folosi ca face noastre trăiește foarte usor. Deci, ce sunt unele dintre lucruri pe care le face? Se face selectarea elementelor mai ușor. Se face schimbarea HTML, adăugarea de clase mai ușor. Se face mai ușor Ajax. Vom ajunge la faptul că într-o secundă. Și este similară cu biblioteci C. Astfel încât să includă string.h, te strlen. Ai strcpy, toate aceste lucruri. Când includeți jQuery, te frumos moduri de a selecta elemente la schimbare lucruri, etc. Ai funcționalitate în plus că JavaScript nu te da. Deci, jQuery JavaScript nu este. jQuery este o bibliotecă care este scris în JavaScript care face JavaScript mai ușor să scrie. Deci, jQuery, nu este o programare limbă. Dar JavaScript este. face. Vă că veți obține terminologie dreapta. Orice întrebări? Da. E o întrebare? Bine. Deci, cum a face tu utilizați jQuery? Ei bine, atunci cand scrii ceva JavaScript cod și să includă o jQuery în partea de sus a fișierului ca o fișier script, utilizați semnul dolar acum pentru a obține acces la jQuery. Și acest lucru este diferit de semnul dolar în PHP. Este același simbolul tip de pe tastatură. Dar ei spun lucruri foarte diferite. Semn dolar în PHP înseamnă acest lucru este cum am declara o variabilă. În JavaScript, atunci când le-ați inclus jQuery, ea standuri pentru jQuery. Astfel încât să păstreze în minte. Deci, cum am putea selecta elemente DOM? Ei bine, atunci când o faci urât JavaScript Astfel, aveți acces la documenta variabilă globală. Și atunci veți obține elementul de familie ID. Acest lucru este foarte lung și prolix și nu foarte frumos. Sau puteți obține toate elementele că sunt o etichetă p. Care lucrează prea în JavaScript. Dar niciodată nu am arătat într-adevăr vă sintaxa prea mult. Ceea ce am aratat ce a fost jQuery. Astfel că întreaga selector acolo că a fost exprimată în activarea JavaScript-doar se condensat la acest dolar foarte frumos semneze familie hashtag. Și $ p, doar în cazul în care e așa. Dacă doriți să selectați toate etichetele p în interiorul o familie, am pus un spațiu între cele două. Și acum, vom obține toate p tag-uri în interiorul unei familii. Și uite familiar? Ei bine, Angela a vorbit despre Selectoare CSS. Dă-mi o secundă. Și astfel, în scopul de a selecta un element, folosiți doar acelasi lucru ca si tine ar face cu un selector CSS. Dacă puneți un hash in fata de ea, se selectează de identitate. Un punct selectează de clase. Dacă aveți doar un lucru fără hash sau puncte, se selectează aceste etichete. Întrebări. Da? Audiența: Când folosim punct în nostru HTML, este că nu jQuery? JOSEPH ONG: Dot în HTML nostru este un lucru JavaScript. Nu e un lucru jQuery. Modul în care voi l învățat cu jQuery este de a utiliza. html. Și apoi a trecut indiferent de HTML va fi. Asa ca voi ajunge la faptul că, în doar un al doilea, de fapt. Deci, cum putem face lucruri la elementul odată ce ne-am ales? Deci, asta e un exemplu de selectarea unui element. Deci, acum, vrem să facem lucruri pentru ea. Deci, în acest caz, lasă-mă să mă întorc la diapozitivul anterior. A fost Bob înainte. Și vreau să schimb asta în interiorul HTML pentru Milo. Așa că am apela funcția HTML din elementul. Această funcție este HTML o metodă de elemente. Și apoi l-am da ce Vreau HTML să fie. Și doar înlocuiește ceea ce este în interiorul că tag-ul cu tot ce-l dau. Da. Întrebare? Audiența: hashtag este utilizat pentru numai jQuery. [Inaudibil] nu ne-ar folosi. JOSEPH ONG: Da, exact. Dar nu vă faceți griji prea mult JavaScript despre pur. Vreau doar voi să se concentreze pe modul în care ar face-o cu jQuery, deoarece care va fi importante parte la testul. Corect. Exact. Deci, vedeți că hashtag, astfel încât corespunde selecta elementul cu mijlocul de identitate din cauza asta hashtag. Hashtag înseamnă identitate. Și acest element are o identitate de mijloc. Deci, asta e elementul vom selecta. Audiența: [inaudibil]. semn dolar hashtag [inaudibil]? JOSEPH ONG: Deci, nu. Întrebarea se poate utiliza. Valoare. Și valoare. Funcționează doar pe elemente că sunt intrări. În jQuery, ar fi . Val, nu. Valoare. Așa că voi ajunge la un mic exemplu care demonstrează toate acestea, în combinație într-un al doilea. Dar cred că acest lucru servește un mic fragment are sens pentru oameni până acum. Doriți să schimbați HTML, apela metoda HTML. Da. Audiența: Puteti explica Metoda din nou? JOSEPH ONG: Deci, o metodă este doar o funcție care face parte din una, în această caz, unul dintre aceste elemente DOM, pentru că te văd eu selectat elementul primul. De fapt, permiteți-mi să folosesc mouse-ul. Am selectat elementul de primul. Și apoi am numit acest HTML funcționeze că a avut. Și pentru că această funcție aparține acest lucru, o numim o metodă. Asta e doar un nume fantezist pentru ea. Spun asta din nou. Deci, amintiți-vă, am selectat Elementul acum. Și l-am pus în interiorul variabila elementului. Corecta? Așa că atunci când ne-o dorim pentru a schimba HTML pe interior, pentru că a fost Bob înainte, doriți să modificați acest text la Milo. Deci, noi numim HTML. Și l-am spune ce HTML interior acest element ar trebui să fie acum. Și așa se schimbă la Milo, pentru că l-am dat Milo. Audiența: Deci, ei lucrează împreună. [Inaudibil] JOSEPH ONG: Da, da. Ei lucrează împreună. Deci, unul din ei selectează Elementul primul. Iar cea de a doua nu ceva la ea. Da. Audiența: [inaudibil]. Dacă această metodă este diferită de la HTML aveți metoda egal real. JOSEPH ONG: Da. Aceasta este o metodă diferită. Aceasta este o metodă diferită. Și putem acoperi faptul că, în doar o secundă atunci când vom ajunge la un exemplu. Vreau să vă asigurați că vom accelera pentru că suntem în criză de timp. Dar ne-am rula mult peste timp acum. OK. Rece. Deci, dacă doriți să adăugați o clasă, există de asemenea, o metodă de adăugare de clasă. Acesta este doar un exemplu de ceea ce puteți face cu jQuery. Care adaugă doar o clasă. Dacă doriți să-l eliminați, puteți apela elimina. Asta e doar un alt lucru pe care îl pot face. Deci, mai multe exemple de lucruri pe care le puteți face. Deci, poate tocmai am pus la în partea de sus ca acest lucru? Cel mai tanar elimina. Dacă aș executa doar că JavaScript la partea de sus a dosarul meu, va merge asta? Corect. Deoarece de mijloc nu există încă. Deci, acest lucru nu este de gând să lucreze. Ordin de execuție. Se merge la partea de sus prima. Ce? Audiența: Cel mai tanar nu există încă? JOSEPH ONG: Da. Cel mai tanar nu există încă. Exact. Audiența: Ai spus de mijloc. JOSEPH ONG: Îmi pare rău. Cel mai tanar nu există încă. Și un alt lucru este că nu avem inclus jQuery depună cere script src. Astfel că nu va merge. De fapt, nu am făcut asta în slide-ul urmator, care este Ar trebui să se stabilească faptul că, fie. Dar modul în care facem acest lucru este JavaScript este determinate de un eveniment. Deci, ceea ce facem este să folosim un eveniment Handler pentru a face acest lucru. Și așa am selectați documentul primul set. Eu spun, OK, atunci când documentul este gata, lasă-mă să executați o funcție. Deci, asta e tot ceea ce înseamnă de sintaxă. Am selectat documentul. Acum, în cazul în care documentul este gata, executați funcția. Și astfel pe aici atunci când documentul este gata, ceea ce înseamnă toate HTML are încărcat, apoi am rulat funcția care elimină acest element. Iar acum, când am alerga această funcție că am trecut în gata, eu sunt garantat că toate HTML pagina va exista mai întâi. Da. Întrebare? Audienta: Care este cuvântul cheie eveniment în funcția? JOSEPH ONG: Deci, acel cuvânt cheie eveniment în Funcția este doar un parametru care devine trecut la funcția de pentru orice eveniment. Este doar ceva ce te gratuit. Când utilizați Stivuitoare-cheie în pset8, acest eveniment ar putea să vă spun, pentru exemplu, cheia pe care ați apăsat pe. În acest caz, pentru un eveniment gata, nu este de fapt foarte util. Dar pentru un eveniment-cheie în jos, e mai mult util, pentru că veți obține pentru a ști ce cheie ai presat prin accesarea cheie cod de pe acel obiect eveniment. Corecta? Asta face sens? OK. Da. Întrebare? Audiența: Deci, poate ai pus tag-ul script-ul de jos în jos? JOSEPH ONG: Deci da. Ai putea pune scriptul tag-ul mai mic jos. Dar atunci doar devine foarte murdar. Și ne place de a centraliza toate de codul nostru într-un singur loc. Și acest lucru ne va permite să o facă. Amintiți-vă mai devreme am spus că e un frumos modalitate de a se asigura că sunt elemente pe pagina înainte de a executa cod? Și acesta este doar un mod frumos v-ar realiza asta. Audiența: [inaudibil]. JOSEPH ONG: Da. Tu ar trebui să, nu? Pentru că amintiți-vă, ați inclus file din partea de sus a paginii. Deci, se va executa înainte de ajungi la partea de jos a paginii. OK. Deci, puteți, de asemenea, să adăugați un alt tip de tratare a evenimentului. Acesta procesează doar clicuri. Când m-am faceți clic pe cel mai mic, atunci se va deschide cu o alertă. Acesta este doar un alt tip de eveniment. Spre deosebire de evenimentul gata, acum folosi evenimentul click atunci când primiți clic pe un element. Și astfel, în acest caz, amintiți-vă, faceți clic handler este atașat la cel mai mic. Așa se întâmplă numai atunci când Am faceți clic pe cel mai mic. Și în celălalt, evenimentul gata a fost atașat documentului. Așa că așteaptă documentul să fie gata. Face sens? Cred că pot merge mai departe. Da. Întrebare? Audiența: [inaudibil]. în acest caz, folosiți [neauzit]. JOSEPH ONG: Oh, da, pentru că în acest caz, trebuie să așteptați pentru cel mai tânăr elementul să apară pe ecran primul înainte de a putea atașa un handler click pentru a ea, care este motivul pentru care l-am pus în interiorul a unui document pregătit. OK. Și viitoare, astfel încât acesta este un mare exemplu de modul în care s-ar combina totul. Acesta este doar un exemplu formular de validare le-ați văzut în curs. Deci, ia-o pas cu pas cum tu treci prin asta. Și aceasta va fi în totalitate bine. Doar citit-o de sus în jos. Am un formular în partea de jos. În cazul în care documentul este gata, am atașa un prezenta handler la forma, astfel încât când am formularul, am obține valorile în fiecare dintre aceste intrări. Și am verifica dacă este gol. Dacă e gol, mă voi întoarce false, deoarece Nu vreau să trimiteți formularul, deoarece forma este greșită. Dacă parola este gol sau este mai puțin mult de opt caractere, nu depun formă, pentru că asta e, de asemenea, greșit. Și fals retur doar previne formularul de depunere și merge la o nouă pagină. Și sperăm că, acest lucru are sens. Cred că voi ar trebui să meargă prin acest cod pas cu pas pe cont propriu. Și odată ce ați înțeles ce select elemente și de a face lucruri pentru a de fapt implică, acest lucru va face o mulțime de sens pentru tine. Da? Audiența: Ce înseamnă name = numele de utilizator înseamnă? JOSEPH ONG: Deci name = numele de utilizator și name = parolă înseamnă doar uita-te la atribut de orice te selectarea. Și apoi că trebuie să se potrivească. Așa că am intra în înregistrare. Și apoi ne-am uita-te la toate intrările și de înregistrare. Și apoi ne-am alege una în care numele atribut este egal cu numele de utilizator. Astfel încât primul Selector doar selectează de intrare de utilizator. Și că al doilea selector selectează doar parola una, pentru că acestea au atribute numele lor stabilit ca ceea ce ei ar trebui să fie. Întrebare? Audiența: La prezentarea, cum face partea de jos a rezolva partea de sus? JOSEPH ONG: Deci, asta e pentru că de tratare a evenimentului. Deci, suntem de așteptare pentru un eveniment prezinte care este concediat de la forma. Și asta e tot ce este prezenta. De ce am numi prezenta acolo sus? Se spune, atunci când formularul este transmis, I a lua un eveniment prezinte. Deci, permiteți-mi să intercepteze că și apoi executați acest cod în loc. Da? Audiența: De ce ai pentru a avea eveniment funcție? De ce nu doar [inaudibil] nu-i așa? JOSEPH ONG: Pentru ca în JavaScript, vă trebuie să declare funcții. Asta e doar modul în care funcționează în JavaScript. Trebuie să spun că se întâmplă pentru a rula o funcție. Deci vrei să-l spui că ești așteaptă o funcție aici în loc de doar acolade. Audiența: Și funcția este ceea ce urmează? JOSEPH ONG: Da. Funcția este tot ceea ce este în interiorul acolade după această funcție de cuvinte cheie. Da? Audiența: [inaudibil]. JOSEPH ONG: Pentru prezenta? Audiența: Nu, pentru funcția de fără evenimentul. JOSEPH ONG: Da. Deci, fără evenimentul, poti avea asta. Dacă nu aveți nevoie de eveniment, atunci puteți să-l omite. Dar dacă ai face, atunci doar pus-o acolo. Da. Întrebare rapid? Audiența: [inaudibil]. JOSEPH ONG: Da. Pentru că ceea ce trebuie să faci, document.ready spune doar așteptați pentru toate HTML pe pagina să se încarce mai întâi. Și, de obicei, vrei elemente de în loc înainte de a executa orice cod. Bine. Trebuie să ajungem la Ajax. Nu avem prea mult timp. Deci, argumente pro și contra. JavaScript este mai ușor de încercare scrie cu jQuery. Dar jQuery este un fel de lent. E ca si cum PHP este mai lent decât C, deoarece este interpretat. Și jQuery este un pic mai lent decât JavaScript, pentru că are o mulțime de lucrurile sub capota. Și așa că, dacă sunteți folosind jQuery, este doar un pic mai lent decât JavaScript, chiar dacă aceasta vă oferă eleganță frumos. Și, în sfârșit, Ajax. Până în prezent cu Ajax, nu ați văzut Ajax în încă punct de vedere al pset7, deoarece atunci când faci, vă prezintă o formă de citat. Se încarcă o pagină nouă. Astfel încât să obțineți acest bliț alb mare pe pagina iar cea încarcă pagina a doua, corect? Ar fi foarte frumos dacă nu au avut acest flash. Cum ar fi Facebook, dacă doar defilați la în partea de jos, se adaugă conținut nou fără refresh întreaga pagină. Deci, ceva de genul asta ar fi frumos. Acest lucru este cod JavaScript în partea stângă. Ai ceea ce este în interiorul de acea intrare. Veți obține informații de stoc de la Yahoo! Și apoi face un șir de mare care spune, OK, acesta este mesajul pe care vreau pentru a afișa pe ecran. Și apoi ai pus acest mesaj în interiorul de un element HTML care devine afișat pe ecran. Deci, asta e tot ce se întâmplă aici. Deci, practic, pentru că acest lucru este tot JavaScript și nu aveți nevoie pentru a rula mai PHP, acest lucru va asigurați-vă că că pagina nu reîmprospătare. Deci, aceasta este doar o idee abstractă că spun aici, pentru acum. Ideea abstractă este că dacă o faci toate în JavaScript, care nu au o pagina de reîmprospătare. Dar cum a face tu face de fapt acest lucru? Ei bine, de fapt, hai sa vorbim despre o problemă cu aceasta prima. O problemă este în JavaScript, execuție este sincron. Deci, va trebui să așteptați pentru o linie pentru a termina înainte de a executa următoarea linie. Și ce dacă am de gând pe la Yahoo!, și serverele lor sunt foarte lent, și le ia trei secunde pentru a Dă-mi înapoi ca informatii despre stoc? Când m-am lovit linia de preț, în cazul în care execuție este sincron, așa cum este de implicit, ceea ce este doar de gând să faceți este să Browser-ul dvs. este de gând să se stagneze pentru trei secunde. Și tu nu vei fi capabil să facă nimic în timp ce acesta devine ca date. O să fie înghețate. Și asta e rău. Tu nu vrei un utilizator să au o pagină web înghețat. Corecta? Asta e doar rău. Toată lumea este de acord? Dacă sunteți de navigare Facebook și-l îngheață și nu poți face nimic, tu obține cu adevărat frustrat. Deci, soluția este să facem ceva asincron în loc. Deci, tot acest lucru asincron spune este, am de gând să întreb URL-ul pentru anumite date. Și apoi am de gând să merg. Mă duc să păstreze executare indiferent de cod care a fost după aceea. Și apoi ori de câte ori că de date este gata, atunci eu va procesa. Asta e tot ce se spune. Audiența: Ajax doar face cod asincron? JOSEPH ONG: Este un asincron fel de date preiau. Deci, primul lucru despre Ajax este ea mă lasă să obține date de pe un site extern. Și al doilea lucru este că face sigur că că pagina mea nu stagneze în timp ce eu sunt preluarea datele. Asta e partea asincron de ea. Pentru că merge altundeva, pentru că am spus eu continui în timp ce este preluarea că datele, care face asincron. I a păstra executare. Astfel încât să păstreze asincron idee în minte. Și vă voi arăta ce diferența este. Versiunea sincron este pe partea stângă. Versiunea asincron este pe partea dreapta. Uită-te la numere pentru a vedea care trepte corespund ceea execută la fiecare linie. Acolo, alerta apare mai întâi. Deoarece obtinerea de informatii despre stoc la Yahoo! nevoie de trei secunde, acesta tarabe timp de trei secunde. Și apoi alerte prețul după aceste trei secunde. Deci, acum, care arată de alertă până la acea dată - trei secunde inch Și apoi alerteaza de după aceea. Asa ca merge doar pas cu pas. E ca și cum ceea ce voi ar accepta, corect? Cu executie asincron, vă avertiza în primul rând. Apoi te duci la acest URL. Și tu spui, am de gând să doar cere pentru datele. Și apoi am de gând să procesa mai târziu. Deci, se execută imediat linia următoare după ce am face asta cerere asincron. Deci, de 0.001 secunde, veți vedea hi alertă. Executa această funcție, la revedere de alertă. Și pentru că am făcut o promisiune pe care am ar prelucra datele mai târziu, ceea se întâmplă este atunci că datele se întoarce trei secunde mai târziu, apoi am rulat că Funcția pe care o am acolo. Da? Audiența: Puteți specifica sau clarifica ce înseamnă Ajax? JOSEPH ONG: Deci, Ajax este o modalitate că, dacă am nevoie de date atunci când eu sunt pe un site web și eu Nu vreau să necesară încărcarea paginii, apoi Eu folosesc aceasta tehnologie numită Ajax. Asta înseamnă doar în esență, du-te adu- date de la un alt site. Și o face într-un mod care doar nu bloca pagina mea de web. Audiența: Deci, este ca o inerent o parte din JavaScript sau jQuery? JOSEPH ONG: Deci, cineva a scris o modalitate de a face acest lucru în JavaScript cu mult timp în urmă. La un moment dat, ea nu exista. Și astfel cineva a inventat această tehnică pentru a permite oamenilor să solicite aceste date în acest mod. Și au scris unele lucruri să o facă pentru tine. Și jQuery doar vă oferă această mod foarte frumos de a face acest lucru cu acest $. obține funcția. intrebari? Pot răspunde la întrebări cu privire la Ajax după aceea prea. Voi fi aici. Deci, haideți să ne aducă de date fără refresh al paginii. Și hai să ne facem acest lucru în un mod asincron care nu se congela pagina. Prea mult timp, nu am citit că dacă explicație a fost prea mult pentru tine. Deci, în final, cross-site-ul atacuri de scripting. Am văzut acest lucru cu Zamyla. Dacă în cineva mea baza de date are acest nume, care este această etichetă scenariu, și eu au un cod pe pagina mea care imprimă în numele oamenilor într-un rând, sau am un cod JavaScript, care introduce acest nume în pagina, ceea ce HTML se produce? Ei bine, am imprima tag-ul HTML. Am imprima toate aceste tag-uri. Am ajuns la partea în care eu sunt de imprimare cu prietenii mei. Am imprima Lauren afară. Imprima Milo afară. Și apoi numele meu în baza de date este post script statutul de Facebook neonorantă. Pentru că am introdus acest lucru în pagina deoarece se pare ca JavaScript, atunci când această pagină este trimis la utilizator, este executat ca JavaScript. Și astfel aceasta este ceea ce noi numim un cross-site scripting atac. Cineva pune informații malware în baza de date care ar putea corespunde unele șir suplimentar sau unele șir JavaScript. Și atunci când acesta devine imprimat la Pagina în acest mod, atunci ce se întâmplă este că cod rău este executat că nu am de gând pentru ca acesta să fi executat. Și asta e tot un cross-site-ul atac scripting este. Și modul în care obține în jurul valorii acest lucru este ca Zamyla spus. Trebuie doar înveliți lucrurile în Caractere speciale HTML. Și acest HTML caractere speciale este un PHP Funcția care va preveni acest tip de lucru de la întâmplă cu tine dacă aveți un rău intenționat șir în baza de date. Doar ea scapă, astfel încât să nu se te interpretat ca HTML. Acesta înlocuiește mici paranteze cu ceea ce noi numim entități. Și ne-am dus peste acest lucru în curs prea. Deci, eu cred că voi ar trebui să aibă o bună stăpânire pe asta. Întrebări? Da. Audiența: Deci, cum ar fi [inaudibil]? JOSEPH ONG: Spune asta din nou. Audiența: Cum ar fi monitorul - JOSEPH ONG: Corect. Astfel încât să aveți ceva care spune, atunci când Am înregistra, de tip în numele meu. Tocmai am tip în acest domeniu, numele meu este dezbrăcat mesaj neonorantă Facebook stare aproape tag-ul script-ul. Și că tocmai se pune în baze de date, pentru că eu nu pot spune cineva în lume nu are un nume cu o săgeată în stânga sau script cuvânt în ea. Asta nu prea are sens. Deci, am să mă asigur că am igieniza lucrurile înainte de a imprima de la pagina. Audiența: Deci carduri speciale HTML previne tag-uri script-ul? JOSEPH ONG: Da. Deci, nu împiedică etichetele script. Ea doar se asigură că tag-uri script-ul nu primesc interpretat ca HTML sau - Da. Doar vine ca ceea ce este de fapt. Bine. Astfel că a fost revizuirea test. Rece. [Aplauze]