[MUSIC JOC] DAVID MALAN: Bine, acest lucru este CS50. Acesta este sfârșitul săptămânii opt. Și astăzi, vom începe pentru a umple unele piese atunci când vine vorba de construcție lucruri de pe web. Deci, amintim că luni ne petrecem mai mult timp pe PHP, care este această dinamică limbaj de programare care ne permite de ieșire, printre altele, lucruri, HTML și alte astfel de conținut că vom vrea să vadă. Dar nu ne-am uitat la modul în care într-adevăr vom stoca informații. Într-adevăr, aproape orice de care super site-uri interesante pe care le vizitați astăzi au un fel de baze de date pe partea din spate, nu? Facebook stochează cu siguranță o mulțime de date despre noi toți și magazine Gmail toate de e-mailurile. Și astfel, de multe alte site-uri nu sunt doar conținut static care este informational. Este de fapt dinamic într-un fel. Va oferi de intrare, se actualizează paginile pentru alte persoane. Ai mesaje, va trimite mesaje, și așa mai departe. Așa că astăzi, ne privire mai atentă la bazele unui proiect că veți arunca cu capul în viitor săptămână, CS50 Finanțe, care este, de fapt va avea vă construi ceva nu este în C, dar în PHP. Un site care arata o ceva de genul asta care permite să cumpere și să vândă stocurile care sunt de fapt O să se bazeze pe timp real datele de stoc de la Yahoo Finance. Și astfel în cele din urmă, veți avea iluzie pentru tine și pentru utilizatorii ca esti de fapt, cumpararea si vanzarea de stocuri și obținerea timp real, aproape actualizări, gestionarea unei portofoliu, toate acestea va necesita având, în cele din urmă, o bază de date de utilizatori. Deci, în propriile tale cuvinte, mai ales dacă nu ești super-familiarizat cu calculatorul stiinta sau baze de date, ceea ce știi o bază de date pentru a fi acum, din punct de vedere non-tehnic? Ce este? Cum ați descrie o la un coleg de cameră sau un prieten? Audiența: [inaudibil] Informatiile [Inaudibil] DAVID MALAN: Deci, o listă de informații, sau o store-- o listă de informații că ați putea dori să stocheze despre ceva, ca un utilizator. Și ce utilizatorii au asociate cu ei? Dacă sunteți un utilizator de pe Facebook sau Gmail, care sunt caracteristicile că toți utilizatorii au? Cum ar fi, care ar putea fi unele dintre cele mai coloane în foaia de calcul la care se aluzie ultima dată? Pentru că, din nou, aveți posibilitatea să cred că de o bază de date într-adevăr ca un fișier Excel sau Google fantezie Foaie de calcul sau Apple a fișierului numere. Deci, ce părere ai de când vă gândiți la un utilizator? Ce au? Ce-i asta? Audiența: Un nume. DAVID MALAN: Un nume. Deci, dacă numele, cum ar fi, David Malan ar fi numele unei utilizator. Ce altceva face un utilizator are? Audiența: Un ID. DAVID MALAN: Un ID. Deci, ca un număr de identificare, cum ar fi Harvard dvs. ID-ul sau Yale ID-ul Net sau altele asemenea. Ce altceva ar putea avea un utilizator? Audiența: Parola. DAVID MALAN: O parolă, poate o adresa, poate un număr de telefon, poate o adresă de e-mail. Deci, nu e buchete de domenii și acest ar putea fel de scăpa de sub control repede îndată ce începe realizarea, oh, să stocați această și să stocheze acest lucru și că. Dar cum facem de fapt asta? Deci, din nou, modelul mental să aibă, pentru ziua de azi ca am se arunca cu capul în SQL real, Structured Query Language, este o bază de date care arata ca acest lucru. E doar rânduri și coloane. Și vă puteți imagina Google Spreadsheets sau orice număr de alte programe. Dar ceea ce este esențial despre MySQL, care este software-ul de baze de date vom pentru a utiliza, liber deschis available-- utilizări Facebook l și orice număr de alte websites-- baza de date stochează lucruri relațional. Și o bază de date relațională înseamnă doar una care literalmente stochează datele în rânduri și coloane. Este la fel de simplu ca asta. Deci, chiar ceva de genul asta Oracle s-ar putea fi auzit în general de este o bază de date relațională. Și sub capota aceasta, stochează datele în rânduri și coloane. Și Oracle vă un faultează mulțime de bani pentru a face asta, întrucât taxele MySQL ai nimic pentru același. Deci, SQL este de gând să ne dea cel puțin patru operațiuni. Capacitatea de a selecta date, cum ar fi citit date, insera, șterge, și datele de actualizare. Cu alte cuvinte, acestea sunt Într-adevăr patru operații cheie care sunt de gând să ne permite de a schimba lucruri în aceste rânduri și coloane. Instrumentul pe care vom folosi astăzi în special de a învăța SQL și să se joace cu ea este din nou numit PHP MyAdmin. Este instrument bazat pe web. Totală coincidență faptul că este scris în PHP. Dar o să ne dea un grafic interfață cu utilizatorul, astfel încât putem de fapt crea aceste rânduri și coloane și apoi vorbesc cu ei prin cod. Deci, să acum încep să ceea ce cred că este sincer un fel de distracție procesului de construirea capătul din spate al site-uri web, părțile care utilizatorii nu vezi, dar sigur face pasă, pentru că asta e mai degrabă de date va. Deci, similar cu C și o mai puțin ca PHP, SQL, sau o bază de date care acceptă SQL, are tipuri cel puțin acești date și ciorchini de alții. CHAR, VARCHAR, INT, BIGINT, Zecimal, și DATETIME. Și există un întreg grămadă de alte caracteristici, dar hai sa facem acest lucru prin Ca exemplu actuale. Am de gând să merg în CS50 IDE în cazul în care, în prealabil, am logat și am vizitat, de asemenea, o adresă URL pentru acest instrument numit PHP MyAdmin. Și în problema set de șapte, vom spune exact cum pentru a ajunge la această interfață deasemenea. Pe colțul din stânga sus, observați că spune prelegere. Și asta înseamnă doar că in avans, am creat o bază de date numită prelegere gol care nu are nici foi de calcul în ea încă. Nu există rânduri și coloane. Deoarece primul lucru pe care de gând să faci este să înceapă să creeze un tabel care va stoca utilizatorii noștri. Deci, literalmente peste aici la dreapta, eu sunt O să spun în baza de date Vreau un tabel numit utilizatori. Deci, acest lucru este ca fisierul pe care am doriți să stocați toate datele mele în. Și cât de multe coloane? Ei bine, hai să-l păstrați simplu pentru acum. Vreau doar pentru a stoca ca un nume de utilizator și un nume pentru un utilizator. Vom începe mici. Deci, vreau două coloane totală. Și am de gând să mergeți mai departe și faceți clic pe Go. Și apoi, pentru aceste coloane, ce am de gând la do-- dacă acest internet cooperates-- bine, așa că vom încerca să din nou. Am de gând pentru a crea un tabel numit Utilizatorii cu două coloane, faceți clic pe Du-te, OK. Acum ne-am luat o foarte repede. Mulțumesc, foarte bine făcut. Bine, deci ce vrem aceste coloane să fie numit? Deci, o va fi numit nume de utilizator. Deci, tot ce văd here-- și interfața sincer devine un pic urât în ​​cele din urmă, Odată ce începeți să tastați în toate aceste date. Dar ceea ce este frumos este la fel de în mod paradoxal, sunt crearea de coloane, dar instrumentul are prostește le-a pus în rânduri astfel încât să pot configura aceste coloane. Deci, sunt două spații acolo sub numele. Iar unul dintre aceste domenii am doresc să numita Utilizator, iar celălalt câmp vreau să chema numele. Și acum trebuie să aleagă tipuri de date pentru aceste lucruri. Deci, în timp ce în Excel și Google Spreadsheets, daca vrei o coloană, vă literalmente doar de tip nume sau Utilizator, a lovit Enter. Poate ai bold face doar pentru claritate, dar asta este. Tu nu specifică tipuri de coloane. Acum în Google Spreadsheets sau Excel, s-ar putea specifica modul în care este redat datele. Ai putea merge la meniul Format, și tu Puteți specifica arăta acest semn dolar ca, arăta ca o valoare în virgulă mobilă. Deci, e similare în spirit că ceea ce suntem pe cale să facem, dar acest lucru se întâmplă de fapt de a forța datele să fie un anumit tip. Acum, chiar dacă în urmă cu o clipă am a spus că este doar câteva tipuri de date, există de fapt o mulțime, și sunt în diferite grade de specificitate. Și, ca o paranteză, vă pot face chiar lucruri de lux ca geometrii de stocare în interiorul unei baze de date. Puteți stoca lucruri ca coordonatele GPS și de fapt a găsi, matematic, puncte care sunt aproape de alții. Dar am de gând să păstra acest super-simplu și du-te până aici, toate de așa-numitele tipuri șir. Deci, aici este o listă de grămadă de opțiuni. CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. Și e un fel de copleșitoare. Și, din păcate, destul de paradoxal la C, un CHAR nu este cu adevărat un CHAR. Dacă specificați în baza de date acest tip de date este CHAR, ceea ce înseamnă că da, e un CHAR, dar este unul sau mai multe caractere. Și va trebui să specificați câte caractere vrei. Deci, ce este un tipic lungime pentru un nume de utilizator? Există o limită de obicei? Audiența: [inaudibil] DAVID MALAN: 16 poate? Ceva de genul. Știi, înapoi în zi, este folosit pentru a fi opt. Uneori este de 16, uneori este chiar mai mult decât atât. Și așa, acest lucru nu Adică da-mi un CHAR. Aceasta înseamnă că trebuie să specificați lungimea câmpului, și acum am putea spune ceva de genul 16. Și există un compromis aici. Deci, vom vedea într-o clipă că aceasta înseamnă unul, fiecare nume de utilizator trebuie sa fie de 16 caractere. Dar stai un minut, M-A-L-A-N. Dacă asta e numele meu de utilizator și eu sunt doar folosind cinci, ce ai propune ca baza de date să facă pentru alte 11 personaje care Am rezervat spațiu pentru? Ce ai face? Audiența: [inaudibil] DAVID MALAN: Da, doar să le facă toate nule. Fă-i spații. Dar probabil nul, deci o mulțime de zerouri backslash. Deci, pe de o parte, ne-am acum a făcut-vă că numele meu de utilizator poate fi nu mai mult de 16 caractere. Și reversul, care este că, dacă am avea un nume foarte lung sau a vrut un foarte lung username ca unii dintre voi baieti ar putea avea în acel colegiu sau la Yale.edu, nu poți avea unul. Și astfel, de fapt, dacă ați înregistrat vreodată pentru un site web și te-ai tipat la a spune parola este prea lung sau numele de utilizator este prea lung, e pur și simplu pentru că un programator, atunci când configurarea bazei de date lui sau a ei, a decis că acest domeniu va să nu mai fie decât această lungime. Bine, ce dacă am proceda pentru a numi? Cât timp ar trebui să o Numele tipic omului fi? Cum multe personaje, 16? Cred că am putea găsi pe cineva în această cameră în cazul în care prin primul său plus ultima Numele este mai mare de 16 caractere. Deci, ce e mai bine decât atât, 17? 18? 25? Mai mare? 30? Audiența: [inaudibil] DAVID MALAN: 5000, oh Dumnezeule. Deci, asta e, probabil, o decent sus legat, să spunem. Și aici avem un fel de au pentru a efectua un apel hotărâre. Cum ar fi, nu e nici un răspuns aici. Infinit nu este destul de posibil, pentru că suntem în cele din urmă O să have-- suntem O să alerga afară de memorie. Deci, avem de a face o apel judecata la un moment dat. Foarte frecvente ar fi, de exemplu, la use-- și să-mi precizeze CHAR aici ca before-- 255 a fost literalmente limită superioară cu privire la acest software de baze de date ani in urma. Și astfel, o mulțime de oameni ar spune doar, bine. 255 este limita. Să folosim doar maxim. Și acest lucru este destul de ridicol. Ca, dacă sunteți tastarea cineva e nume pentru 200 de caractere plus, că un pic ridicol. Dar, amintiți-vă că nu este ASCII singurul sistem de caractere. Și astfel, în special într-o mulțime de limbi asiatice în cazul în care nu există caractere nu putem exprima pe tastaturi, cum ar fi SUA meu tastatură, unele caractere de fapt ia 16 biți în loc de opt biți. Și astfel, acest fapt nu este tot ceea ce nerezonabile că avem nevoie de mai mult spațiu, dacă vrem pentru a se potrivi caractere mai mari decât foarte SUA cele centrice am avut tendinta de a discuta. Deci, avem nevoie de niște limită superioară. Nu știu ce este cel mai bun, dar 255 este, în general unul comun. 25 se simte redus. 16, 32 se simt scăzut. Mi-ar err pe partea de ceva mai mare. Dar există un compromis, ca întotdeauna. Care este, probabil, evident compromis de rezervare 255 caractere pentru numele fiecăruia în baza mea de date? Audiența: [inaudibil] DAVID MALAN: Ce-i asta? Audiența: [inaudibil] DAVID MALAN: Este o mulțime de memorie, nu? M-O-L-A-N. Tocmai am pierdut 250 caractere doar pentru a stoca numele meu defensiv, doar în cazul în care cineva în clasa are un nume foarte lung. Care pare a fi o compromis nejustificat. Deci, se dovedește că SQL, acest limbaj de baze de date, sprijină de fapt ceva numit VARCHAR, CHAR sau variabilă. Și acest lucru este un fel de frumos în care această vă permite să specificați un fix nu latime, ci mai degrabă, o lățime variabilă. Și mai precis, o Lățimea maximă a câmpului. Deci, acest lucru înseamnă că un nume poate fie nu mai mult de 250 de caractere, dar poate fi cu siguranță mai puține. Și baza de date va fi inteligent. Dacă vă puneți în M-A-L-A-N, se doar de gând să utilizeze cinci, poate că șase octeți pentru ca un caracter nul posterior, și nu petrece o suplimentare 249 sau 250 bytes în mod inutil. Deci, acest lucru pare că ar trebui au început cu această poveste. Dar există întotdeauna un compromis. Deci, pe de o parte, un nume de utilizator Am specificate să fie greu codificate la 16, și poate că nu a fost apel dreapta, poate că este, dar de ce nu se utiliza VARCHARs pentru tot? Ea există pentru un motiv. De ce nu folosiți VARCHARs pentru fiecare domeniu a cărui lungime nu știți în avans în cazul în care pare a fi un lucru mare, nu? Utilizați numai la fel de mult spațiu ca aveți nevoie de până la această limită? Audiența: mai lent. DAVID MALAN: Speller? Audiența: Se face mai lent? DAVID MALAN: Oh, e mai lent. Bun, asta e aproape întotdeauna răspunsul, sincer. Cum ar fi, ce-i compromisul? Acesta fie costa mai mult spațiu sau costă mai mult timp. Deci, în acest caz, ar putea fi mai lent. Ce? Audiența: [inaudibil] determinarea [neauzit]. DAVID MALAN: Bine. Deci, s-ar putea retrage de la chiar PSED5, joc cu abordarea la dicționar, dacă trebuie să aloca memorie dinamic sau păstra în creștere un tampon, care poate fi de fapt lent. Dacă aveți de a apela malloc sub capota și poate asta e ceea ce MySQL este de a face, așa cu siguranță că ar putea fi cazul. Și dacă credeți mod Înapoi la PSet-- sau chiar săptămâni două, atunci când am făcut lucruri cum ar fi căutare binară sau chiar de căutare liniară, Unul dintre lucrurile frumoase despre fiecare cuvânt într-o bază de date sau de fiecare cuvânt într-o coloană fiind exact aceeași lungime, chiar în cazul în care o grămadă de aceste caractere sunt goale, este că puteți utiliza cu acces aleator pe datele tale, nu? Dacă știți că fiecare Cuvântul este de 16 caractere departe, puteți utiliza indicatorul aritmetice, astfel încât să vorbesc, și du-te la noi 16, 32, 48, 64, și puteți sări doar instantaneu, utilizând aritmetica la oricare dintre cuvintele din baza de date. Întrucât, dacă este un VARCHAR, ce ai în loc să faci? [Telefon care suna] Dacă e un VARCHAR, te nu se poate folosi cu acces aleator. Ceea ce trebuie sa te uiti pentru sau nu? Da? Audiența: [inaudibil] DAVID MALAN: Uită-te prin linia whole-- prin toata lista cauta ceea ce, cel mai probabil? Ce fel de valoare deosebită? Audiența: [inaudibil] DAVID MALAN: Caut pentru terminatorii nule că delimita separarea cuvintelor. Deci, din nou, un compromis, și nu există nici un răspuns corect. Dar acest lucru este în cazul în care, în special când utilizatorii ajunge să fie mai multe și sarcina pe serverele dvs., The Numărul de persoane care folosesc devine mare, Acestea sunt de fapt decizii netriviale. Deci, putem pleca acestea ca acest lucru, dar Să defilați în jos pe la dreapta Aici. Acum, există o pereche de coloane în cazul în care avem de a face un apel hotărâre. Are sens, pentru a permite unui utilizator nume, numele de utilizator a unui utilizator sau unui utilizator nume, pentru a fi nul? Asta este, doar gol. Se simte un pic lipsit de sens, așa că eu sunt nu de gând să verifice aceste cutii. Dar se pare că într-un de baze de date, vă pot spune, cineva poate avea opțional această valoare. Această coloană nu are a fi de fapt acolo. Acum, există această meniu vertical. Și observați încă sunt în primul rând acolo, așa că vorbesc despre numele de utilizator acum. Și se pare că o bază de date, Spre deosebire de un simplu simplu foaie de calcul, are caracteristici puternice numite indici. Și un index este un mod de a spune de baze de date în prealabil că am omul Sunt mai deștept decât tine. Știu ce fel de întrebări, selectați sau introduce sau șterge sau actualizare, că codul meu se va termina prin a face pe această bază de date. Vreau să citesc o mulțime de date. Vreau să inserați o mulțime de date. Vreau să în mod constant șterge o mulțime de date. Dacă știu că am de gând să fie accesarea unui câmp ca Username mult, Pot spune preemptively baze de date, știu mai mult decât tine, și vreau să decretăm că trebuie index acest domeniu. În cazul în care indexarea un câmp sau o coloană înseamnă că baza de date în avans ar trebui să împrumute unele idei de la, cum ar fi, patru saptamani si cinci și șase din CS50 și de fapt construi ceva de genul o căutare binară copac sau ceva în general, numit un copac B care le-ar învăța într-o clasă ca CS124 la Harvard, o clasă algoritmi, sau orice număr de alte locuri. Baza de date și Smart oameni care a implementat va dau seama cum de a stoca acest tabel de informații în memorie, astfel încât căutările și alte operațiuni sunt super rapid. Nu trebuie să o fac. Nu trebuie să pună în aplicare căutare liniară sau binar de căutare sau merge sort sau selecție un fel, nimic din toate acestea. Baza de date face pentru tine, dacă-ți spun l preventiv pentru a indexa acest domeniu. Și puteți vedea prea, nu e unele alte caracteristici putem spune baza de date să pună în aplicare. Ceea ce ar putea însemna dacă se aleg unic din acest meniu, doar intuitiv? Da? Audiența: [inaudibil] DAVID MALAN: da, numele de utilizator trebuie să fie unic. Este un lucru bun sau un lucru rău pentru o bază de date, pentru un site web cu utilizatorii? Ar trebui să fie nume de utilizator unic? Da, probabil. Dacă asta e ceea ce câmp vom folosi pentru a vă conecta la, nu vrei cu adevărat să oameni care au același simt sau același nume de utilizator. Deci, putem avea bază de date impune ca atât că acum, în codul meu PHP sau orice limbă, Eu nu trebuie să, de exemplu, verificați nu în mod necesar acest nume de utilizator exista înainte să mă înregistrez pe cineva? Baza de date nu va lasa două persoane cu numele de David sau Malans înregistrați în acest caz. Și, ca o paranteză, chiar dacă acest lucru meniu vă permite să selectați doar un singur, un index unic este una care este indexate pentru performanță super rapid, dar, de asemenea, forteaza unicitatea. Și ne vom întoarce la ceea ce alte două înseamnă într-o clipă. Între timp, dacă mă duc la Al doilea rând mea, care este numele utilizatorului, ar trebui să specificați că numele ar trebui să fie unic? Nu, pentru că ai putea cu siguranță have-- nu exista nici doi David Malans în această cameră, cel mai probabil. Dar dacă vom alege un alt nume, am putea avea cu siguranță coliziuni. Gandeste-te la hash tabele și altele asemenea. Deci, noi cu siguranță nu vreau pentru a face câmpul nume unic. Deci, noi suntem doar de gând să plece că, liniuță, liniuță, liniuță, nimic. Și am de gând să plec orice altceva numai. Într-adevăr, cele mai multe dintre aceste domenii nu vom avea să-i pese. Și când sunt gata pentru a salva acest lucru, în cazul în care internetul cooperează, Am faceți clic pe Salvare, și foarte, foarte, foarte încet se baza de date se salvează. Și acum m-am întors la acest interfață, care desigur, este copleșitoare la prima vedere. Dar am de gând să faceți este să faceți clic pe pe utilizatorii de cuvinte de la stânga sus. Am de gând să meargă aici, faceți clic pe Utilizatorii, și în mod implicit, aceasta a executat unele SQL, dar mai mult pe faptul că într-un moment. Iată doar un rezumat a ceea ce am făcut. Și nu vă faceți griji că te văd menționa de latină și suedeză aici. Acestea sunt doar implicit setări, pentru că MySQL inițial, sau PHP MyAdmin, unul dintre cei doi întâmplat care urmează să fie scrise de unii oameni suedezi. Dar e irelevant în cazul nostru aici. Bine, asa ca de ce este toate astea interesant? Se pare, pot insera date într-o bază de date de scrierea de cod. Și eu merge mai departe și în fișierul meu de aici, eu sunt merge mai departe și pretinde ca acest lucru este cu fir la baza de date, ceea ce nu este în acest moment, dar fie atunci când vom ajunge la problema a seta șapte. Și am de gând să merg mai departe și executa o funcție numită interogare, care vă va oferi în probleme stabilit șapte Cod de distribuție, care are cel puțin un argument, care este doar un șir. Un șir de cod SQL. Deci, esti pe cale de a învăța cum să scrie Structured Query Language. Dacă vreau să inserați un rând nou în mea baza de date pentru că cineva a depus un formular de codul meu, aș face literalmente scrie INSERT INTO utilizatori următoarele domenii: numele de utilizator, virgulă, numele, valorile, și acum am nevoie pentru a insera ceva de genul Malan, și citat, încheiat citatul "David Malan." Si acum chiar si pentru cei nefamiliarizati cu SQL, de ce sunt eu, folosind ghilimele simple în interiorul acestui șir verde? Care ar putea fi motivul aici? Observați că sunt co-amestec de două limbi. Interogare este o funcție PHP, dar este nevoie de un argument. Și acest argument trebuie să se fi scris în altă limbă numit SQL, Limbaj de interogare structurat. Deci, tot ceea ce am tocmai au subliniat aici este acest limbaj numit SQL. Deci, ce e cu ghilimelele simple, doar ca o verificare rapidă bun-simț? Daţi-i drumul. Sunt siruri de caractere. Deci, citat, unquote Malan și citat, încheiat citatul David Malan sunt siruri de caractere. Și gândesc intuitiv acum, știind ceea ce știi despre C și PHP, de ce nu am face acest lucru, pe care eu de obicei ghilimele second-hand de siruri de caractere? De ce nu vreau să fac asta? Da? Audiența: [inaudibil] DAVID MALAN: Exact. Pentru că eu sunt deja folosind ghilimele duble pe drum în afara argumentului la funcția PHP, Mi-ar confunda doar interpretul. Acesta nu va ști, nu astea merg impreuna? Nu acestea merg împreună? Nu acestea merg împreună? Deci, m-am supleant în schimb. Sau aș putea face ceva de genul asta, Citat backslash sau backslash citat. Sincer, care tocmai începe să obține foarte greu de citit și urât. Dar asta ar atinge același rezultat, de asemenea. Deci, dacă ar fi să execute această interogare acum, să vedem ce se întâmplă. Am de gând să merg mai departe acum și mai degrabă decât să execute codul PHP, care este în cazul în care veți juca în problema set de șapte, Am de gând să merg în schimb la PHP MyAdmin. Și am de gând manual pentru a merge la fila SQL, și lasă-mă mări interfata. Și am de gând pentru a lipi în lucru doar am scris. Și de codificare culoare are schimbat un pic acum, doar pentru că formatele de program lucrurile un pic diferit. Dar observați că tot ce am făcut este am spus, introduceți în Utilizatori. Am specificat, apoi, într-o virgulă separate lista paranteze doi domenii pe care vreau să insera, și apoi am spus literalmente valori urmat de un alt paren, și apoi cele două valori Vreau să plug-in, și acum pentru o bună măsură, Voi pune un punct și virgulă la sfârșitul anului. Deci, acest lucru nu este C. Aceasta nu este PHP. Acest lucru este acum SQL, și eu l lipirea în această interfață web care este doar de gând să mă lase, de îndată ce am faceți clic pe Go, executa această interogare în baza de date funcționare în interiorul IDE CS50. Deci acest lucru este bun. Observați că a spus un rând introduce, a mers super rapid, 0.0054 secunde pentru a introduce aceste date. Deci, asta sună destul de sănătos. Acesta reformulat interogarea mea pentru mine aici doar ca să-l văd în fel de versiune culori diferite. Dar acum, dacă am faceți clic Cautati, observați că, chiar deși există o mulțime de dezordine pe ecranul, masa mea are acum două rânduri. Deci, lasă-mă să merg mai departe și face o altă. În loc de aceasta, permiteți-mi să du-te la tab-ul SQL din nou. Și de data aceasta voi introduce ceva de genul Rob și numele lui va fi Rob Bowden. Bowden. Să faceți clic pe Salvare. Hopa, mai degrabă Du-te. Faceți clic pe Răsfoire, din nou, și acum am observat două rânduri. Deci, aceasta este doar un mod mai complex mod de deschidere Google Spreadsheets și doar tastând un rând într-o coloană. Dar ceea ce este esențial este că acum avem sintaxa cu care să scrie cod, astfel încât în cele din urmă, am putea de fapt face unele și acest lucru. Amintiti-va ca suporturi PHP variabile globale. super- Ce este în interiorul dolar semneze GET subliniere în PHP? Am luat o privire la un sau două exemple simple. Și în PSet6, amintesc aveți salut dot PHP care utilizează această variabilă. Ce se acolo? Sau ce este? Un pic mai tare. Audiența: [inaudibil] DAVID MALAN: Este o zăpadă semințe de matrice, care este doar un mod de a spune o fantezie matrice care are perechi de valoare cheie. Și tastele nu sunt numerice. Sunt cuvinte sau siruri de caractere. Și în special, ceea ce sunt acele perechi valoare-cheie? De unde vin ei? Ne pare rău? Audiența: [inaudibil] DAVID MALAN: Nu? Unde cei cheie perechi de valoare provin de la? Mai spune o dată? Din nou? Sunt singura ceva audiere? [Râsete] Asta-i drept, da? Audiența: [inaudibil] DAVID MALAN: Da, ei provin din șirul de interogare. Deci, dacă vă înapoi în timp pentru a atunci când ne-am jucat cu Google și ne-am dus la Google.com slash căutare semn de întrebare q este egal cu pisici, dacă ar fi să lovi Enter și dacă Google au fost implementate în PHP, Cod PHP care Google a scris ar avea acces la semn dolar sublinia GET interiorul care este un Q-cheie numit și o valoare numitele pisici care se poate folosi apoi folosit pentru a face o căutare reală cu. Deci, de fapt, ceea ce am de gând să face acum este reveni la codul meu PHP pe care le veți vedea din nou mai mult în PSet7. Și în loc de conectarea în valori greu codificate care nu pare ca o foarte site-ul dinamic, Am de gând să vă dau un teaser de ce s-ar face codul actuale. Te-ar pune în două întrebare marchează ca aceasta. Nu știu ce numele de utilizator este. Nu știu ce Numele va fi, dar știu că pot le obține dinamic. Deci, în cazul în care codul de noi scriem acum este codul rulează pe serverele Google, sau în cazul în care acest lucru este Hello punct PHP, care vine cu PSet6, Am de gând să treacă în funcția de interogare la fel ca printf, două alte argumente. GET, citat, numele de utilizator citatul, și de a lua, citat, numele încheiat citatul. Și acum, observa Ce Structura generală este aici. Am din stânga în partea stângă a apelului, această funcție numită interogare în PHP. Eu încă mai au, ca un prim argument, doar un șir de text. Dar că șir de text este scris intr-o limba numita SQL. Și sincer, nu e un limbaj mare. Vom doar vorbi despre aceasta în mod oficial astăzi, într-adevăr. Și apoi în problema set șapte, nu e relativ câteva caracteristici pe care suntem O să impulsioneze. Semnele de întrebare, deși, în medie conectați o valoare aici, și plug-in-un alt valoare Aici. Și notificare, am omis ce din întreaga naibii quote-- it-- în jurul cotației marchează acest moment. Am omis citat mărci jurul semn de întrebare, Ne pare rău, de data aceasta în jurul valorii de. Deci, ce e frumos despre acest Întrebarea facilitate marcă ce PHP tinde să sprijine, Ruby și Python și alte limbi, acest lucru înseamnă doar plug-in unele valoare aici și știi ce? Îți dai seama dacă se utilizează ghilimele simple sau duble. citate Nu mă deranjează cu cele Detalii neinteresante intelectual. Dar, asigurați-vă că este corect astfel încât în ​​cele din urmă este codul meu operațional și în condiții de siguranță, care va avea un sens înainte de mult timp. Acum, cât de multe argumente total de, doar pentru a fie clar, este funcția luarea de interogare? Oricine vrea să voteze pentru mai mult de două? 3? Sigur, de ce? De ce trei? Audiența: [inaudibil] DAVID MALAN: Exact. Prima parte este șirul. Al doilea argument este un semn dolar sublinia GET suport nume de utilizator. Și al treilea argument este același lucru, dar doar numele. Deci, cu alte cuvinte, acum dacă am avut un formular web care a avut la câmpuri de text, una pentru numele de utilizator al utilizatorului, una pentru numele lui sau ei, doar ca tine ar vedea într-un site web atunci când vă înregistrați pentru unele site-ul, aceasta ar putea fie codul de pe partea din spate, care nu, de fapt introducerea acum în baza de date. Acum în schimb, să fast forward. Să presupunem că un utilizator este acum logare si doriti pentru a scrie cod PHP care verifică dacă persoana care tocmai a autentificat este de fapt un utilizator, puteți utilizați sintaxa destul de simplu. Puteți spune SELECT, să spunem stele, în cazul în care stele înseamnă totul. Nu știu ce-am vreau, așa că dă-mi toate coloanele din tabel numit utilizatorii în cazul în care, și acest lucru este frumos. Selectați susține ceea ce este numit un predicat, care este ca o modalitate de a se califica ceea ce vrei. În cazul în care numele de utilizator este egal cu Citat, încheiat citatul Malan. Deci aici, am încorporat în interiorul argumentul la o funcție PHP, o linie de cod SQL. Și codul SQL acest timpul este literalmente va pentru a căuta citat, încheiat citatul Malan. Acum, că nu e tot ce este util, așa că am de gând să săriți peste asta și am de gând să lase acest sfat de la Brady, și du-te și plug-in în loc un semn de întrebare aici. Deci, doar pentru a fi clar, ceea ce ar trebui să de-al doilea argument mea fi în cazul în care cineva tocmai a autentificat și eu doriți să verificați dacă el sau ea este de fapt un utilizator? Audiența: [inaudibil] DAVID MALAN: Da. Am auzit dolar semn de subliniere Trimiteti solicitare, numele de utilizator încheiat citatul. Și că ar trebui să se întoarcă la mine oricare dintre rânduri în baza mea de date care au un nume de utilizator de Malan. Acum sperăm, am de gând să mă întorc zero, în cazul în care nu este Malan fost aici, sau o dacă are. Nu ar trebui să mă întorc doi sau trei sau patru. Ce? Audiența: [inaudibil] DAVID MALAN: I-am spus unic, nu? Motiv simplu. Pentru că am spus că se află trebuie să fie unic, în mod logic doar, poti avea doar zero sau unul Malans în această bază de date tabel special. Acum ca o paranteza, doar ca ați văzut aceasta, chiar dacă am păstra folosind GET și chiar dacă PSet6 utilizat numai GET, puteți avea cu siguranță POST. Și reamintească faptul că este un alt post tehnica pentru transmiterea de informații dintr-o formă, dar nu apare în URL-ul. E un pic mai sigur sigur pentru lucruri cum ar fi numele de utilizator și parole, care PSet7 va fi, în fapt, implică. Deci, hai sa facem acest lucru în PHP MyAdmin și să vedem ce se întâmplă. Am de gând să merg la fila MySQL. Și observați că valoarea implicită pentru PHP MyAdmin, doar pentru a încerca să fie de ajutor, este de a selecta stele de la utilizatorii care unul. Ei bine, unul este întotdeauna adevărat, astfel încât acest lucru are prostie efectiv de a selecta doar tot. Dar am de gând să fie un pic mai pedant si manual tip out SELECT stele de la utilizatori. Acum tehnic, puteți cita numele tabelelor. Este rar ca trebuie sa, dar acestea nu sunt observați citate normale de pe tastatură SUA. Aceasta este așa-numita backtick, care este, în general, pe de o parte din stânga sus colț de tastatură. Dar e rar că veți de fapt, trebuie să deranjez cu asta, așa că am să le omite doar oricum. Deci, acum, lasă-mă să merg mai departe și a lovit du-te. Și câte rânduri ar trebui să mă înapoi, atunci când am selectați stea la utilizatori? Audiența: [inaudibil] DAVID MALAN: Numărul de rânduri, sigur. Dar câți în acest Povestea de beton chiar acum? Doi, pentru că nu a fost mine și nu a fost Rob. Deci, dacă am faceți clic pe Du-te, am vedea că vizual Am ajuns înapoi, într-adevăr, două rânduri. Există o mulțime de dezordine cu privire la ecran, dar văd doar două rânduri. În schimb, în ​​cazul în care fac acest lucru din nou și de a face SELECT stele din partea utilizatorilor, în cazul în care numele de utilizator este egal cu Citat, citatul Malan, acum, dacă mă faceți clic pe Go, Am doar o să mă întorc un rând. Și, în fine, dacă fac ceva de genul asta, să presupunem că că nu-mi pasă de obtinerea totul, care este un fel de sens acum, pentru că există doar două coloane. Nu e ca și cum am selectarea o mare cantitate de date. Să presupunem că mergi înainte și selectați nume din utilizatori, în cazul în care numele de utilizator este egal cu Malan, ceea ce este frumos despre SQL sincer, este faptul că de fapt doar nu ceea ce-l spun să faci. E destul de succint, dar literalmente doar spun ceea ce vrei să faci. Selectați numele de utilizatori unde numele de utilizator este egal cu Malan. Și într-adevăr este că explicit. Deci, acum, dacă am lovit Du-te, cât de multe rânduri am să mă întorc? Unu, pentru că este doar Malan, sperăm. Sau zero, dacă nu e acolo, dar maxim. Și câte coloane va mă întorc? Câte coloane? De data aceasta, Mă duc pentru a obține o pentru că nu am selectați stele, care este totul. Acum eu sunt selectarea doar numele, așa că am doar mă întorc pe o coloană și un rând. Și se pare un fel de adecvat ridicol, doar în căutarea super- mic ca aceasta. Deci, ceea ce într-adevăr se întâmplă se? Când executați un SQL interogare folosind select, ce vei primi înapoi de la baza de date este ca un tabel temporar cu rânduri și coloane, poate, dar că omite nimic din ce nu a fost de fapt ales de tine. Deci, e ca si cum cineva ar fi o mare foaie de calcul a tuturor elevilor înregistrat pentru unele grup de student, și spui, da-mi toate boboc care au înregistrată pentru grupul nostru de studenți, ceea ce colegul dumneavoastră în grup de studenti s-ar putea face este acestea ar putea preda doar tine tot foaia de calcul. E ca și cum spune selectați stele. Și e un pic enervant în cazul în care ai vrut doar boboc. Și așa, dacă ați spus în schimb, selectați stele din tabelul de baze de date în cazul în care este egal cu anul Citat, student în anul întâi citatul, e ca și cum prietenul tău în grupul studenților literalmente evidențiate și copiate numai rândurile boboc, le lipite într-o nouă Google Foaie de calcul sau un fișier Excel, și ai dat verso numai fișier rezultat. Asta e tot ce se intampla pe conceptual aici. Deci, în cele din urmă, putem face unele lucruri destul de fantezie prin stocarea lucruri ca numele de utilizator și parole și altele asemenea. Dar, se pare, ar trebui să facem un pic diferit decât aceasta. Nu e ca la numai inteligent stoca un nume de utilizator și o parolă. Cineva mai devreme, cred că aici, a sugerat un ID. Acum un ID ar putea fi ca un Harvard ID sau Yale de identitate Net, dar ar putea fi mai simplu în cazul nostru de baze de date. Și într-adevăr, comună cazul este de a avea o altă coloană. Și am de gând să merg înainte și edita masa mea. Și dacă joci cu Această interfață pentru PSet7, veți vedea că puteți verifica acest buton aici și adăugați un câmp la începutul tabelului. Și acum, dacă mă faceți clic pe Du-te, va să-mi dea una dintre aceste forme de la mai devreme. Am de gând să adăugați un câmp numit ID. Și am de gând să-l un tip numeric face. Am o grămadă de valori pentru valori numerice. Mă duc pentru a alege un INT și nu vă faceți griji cu privire la dimensiunile disparate. Nu trebuie să specificați o lungime sau o valoare, pentru ca va fi 32 de biți, indiferent de ce. Atributele, nu am vazut inainte. Nici un interes în oricare dintre aceste opțiunile de meniu de data asta? Pentru un INT? Ce ai propus? Nu? Efectuați oricare dintre aceste sens? Da. Da, nesemnat, nu? În general, în cazul în care vom da toată lumea un număr unic, care este în cazul în care această poveste este merge, eu chiar vreau doar o persoană să aibă numărul de zero ca și unu și doi și trei și patru. Nu am nevoie pentru a face față cu numere negative. Mi se pare ca complexitate nejustificată. Vreau patru miliarde de valori posibile, nu patru miliarde posibile valori, așa că am doar dublat capacitate de INT meu. Ca o paranteza, dacă doriți să se refere acest lucru ceva de genul Facebook, înapoi în fel de ziua mea, atunci când Facebook a ieșit primul, Cred ceea ce au fost folosind în baza lor de date MySQL pentru a stoca un utilizator identificator, a fost doar un INT. Dar, desigur, există o mulțime de oameni reali din lume. Există o mulțime de fals Facebook conturile din lume. Și astfel în cele din urmă, Facebook umplut dimensiunea unui INT, patru miliarde de valoare. Motiv pentru care, dacă te uiți în jurul valorii de site-uri web și nu există care pot să vă spun ce ID-ul dvs. este unic. Și dacă nu ați ales un nume de utilizator în Facebook, veți vedea ID-ul unic. Cred că e profilul PHP dot semn de întrebare ID egal ceva. Care este acum ceva ca o mare INT, sau un lung timp, dacă va fi, care este o valoare pe 64 de biți sau ceva similar. Deci, chiar și în lumea reală face aceste probleme în cele din urmă, uneori, contează. Și se pare că aici, dacă sunt oferind tuturor utilizatorilor mei un ID unic, Vreau să fiu foarte explicită și minim face acest domeniu unic. Dar se pare că există un bucată de nomenclatură și astăzi care este o cheie primară. Dacă sunteți proiectarea unei baze de date masă și te știe în avans că una dintre coloanele din tabelul menționat ar trebui să și va identifica în mod unic rânduri în tabel, pe care doriți să specifica-o și spune în baza de date, aceasta este cheia primară. Ar putea fi duplicate în alte domenii, dar eu spun că această baza de date este primar mea, domeniul meu cel mai important, care este garantat de a fi unic. Acum, acest lucru pare redundant. Eu sunt acum propune ca noi adauga, făcând clic pe Salvare aici, un called-- câmp și am de gând a merge mai departe și faceți clic pe AI, ne vom întoarce la că într-un moment, Salvare. Eu propun acum ca masa mea arata ca acest lucru. Am un câmp INT numit ID, un câmp CHAR numit Username, un câmp VARCHAR pus numele, dar ID-ul, dacă e primar și, prin urmare, unic, de ce am irosi timp ce introducerea în mod eficient este un al doilea unic câmp numit ID, care este un INT? Nume, rechemare, a fost deja unic, ne-a declarat. Așa că în mod logic, nu aveți nevoie de orice experiență de baze de date pentru un motiv prin aceasta, de ce s-ar putea am introdus o INT ca identificator meu unic, precum și? Ce se astea-- spun din nou? Audiența: [inaudibil] DAVID MALAN: Random accesul este mai ușor, de ce? Audiența: [inaudibil] DAVID MALAN: Da, e doar accesarea numere. Deci, dacă vă gândiți la acest adevarat este un tabel, cum ar fi o matrice, acum am identificatori unici că pot sări în jurul. Și mai mult decât atât este faptul că încă mai cât de mare este un INT va fi din nou? 32 biți sau patru octeți. Cât de mare este numele meu de utilizator va fi? Maxim? 16 bytes. Deci, dacă sunteți cu adevărat pese performanța de cod, cred că înapoi la PSet5, ați prefera pentru a căuta o valoare de patru octet sau un 16 Valoarea octet, nu? Este într-adevăr este la fel de simplu ca asta. Trebuie să faci de patru ori mai mult de lucru pentru a căuta nume de utilizator pentru că cei sunt 16 bytes. Deci, va trebui să literalmente compara toate cele 16 bytes pentru a fi Sigur, da, aceasta este numele de utilizator vreau. Întrucât pentru o INT, puteți face-o cu doar patru octeți. Și, ca o paranteza pentru cei interesat de hardware-ul computerului, se pare că se poate potrivi ceva de genul un INT sau o valoare pe 32 de biți în ceva numit un registru într-un computer CPU, ceea ce înseamnă că e super, super rapid, chiar și la cel mai mic nivel de hardware-ul computerului. Deci, nu e doar avantaje peste tot în jurul. Deci, ce înseamnă acest lucru? De fapt, atunci când sunteți proiectarea unui tabelul bazei de date, aproape tot timpul ai de gând să nu aibă doar datele pe care le pasă, dar, de asemenea ceva de genul un identificator unic deoarece acest lucru este de gând să să facem alte lucruri. Și să excursie pe o problema aici. Să presupunem că utilizatorii să nu aibă doar numele de utilizator și numele, dar au, de asemenea, lucruri cum ar fi orasele și state și coduri zip, cel puțin aici, în SUA. Deci, am de gând să merg mai departe și doar spun repede, da-mi mai multe trei coloane la sfârșitul tabelului. Și acest lucru va fi City, acest lucru se va fi de stat, și acest lucru va fi Zip. Acum tipuri City, ce date ar trebui să fie asta, poate? VARCHAR? Nu știu ce cel mai lung nume de oraș este. Undeva în America, nu e probabil un cuvânt ridicol de mult, Să mergem cu 255, oarecum istoric sau arbitrar. De stat, ceea ce vrei să faci? Apel judecată, nu? Care este poate cel mai eficient? Câte personaje? Poate doar două, dacă putem scape cu a face doar, cum ar fi, MA de Massachusetts și așa mai departe. Deci, am de gând să merg o valoare CHAR de două. Codul zip este unul interesant. Suntem aici, în 02138, astfel încât sugerează că ar trebui să folosească ce? E un INT, nu? INT, INT, scurt? Scurt ar funcționa. Nu? CHAR sau cinci, dar vreau un INT. De ce împinge înapoi pe un INT? Convinge-mă de asta. Ce este stupid despre o INT, ideea mea? Da. Audiența: ocupă mai mult de memorie. DAVID MALAN: Luați mai multă memorie. Patru bytes, dar tu ești propunând un cod poștal ca cinci bytes sau cineva a fost ca un CHAR, care se simte ca nu-i așa, că nu e chiar cazul. Ei bine, povestea distractiv. Cu ani în urmă, când am folosit pentru a utiliza Microsoft Outlook pentru e-mail meu, În cele din urmă mi-am dorit pentru a comuta la Gmail. Și așa, am exportat toate mele contacte din Outlook ca un fișier CSV. Virgulă valori separate, care tocmai a însemnat am a avut toate prietenii numele meu și ultimul nume și numere de telefon și coduri poștale și toate astea. Și apoi am făcut greșeală de deschidere-l în Excel, care este o program de calcul tabelar care înțelege fișiere CSV ca le-am vazut. Dar apoi, cred că am lovit, cum ar fi, Comanda sau controlul S la un moment dat. Și Excel aparent, la momentul a avut o caracteristică prin care ori de câte ori a văzut un număr, a încercat să fie de ajutor. Și dacă acest număr a început cu zerouri, ar primi doar scăpa de ele. De ce ai nevoie de conducere zerouri pe numere întregi? Sunt lipsite de sens, matematic. Nu sunt lipsite de sens în sistemul US Postal. Deci, am avut de ani de zile, la această zi, eu încă au prieteni care, atunci când caz rar ca am nevoie de cineva e aborda aceste zile, Voi vedea în continuare că am au un prieten din Cambridge, Massachusetts, 2,138. Și e enervant dacă ești încercarea de a sorta de programatic genera plicuri sau doar nota. Și asta pentru că acest motiv, Am ales tipul de date greșit. Deci, îmi place ideea ta. Să folosim un câmp CHAR. Cinci caractere, cu excepția există un caz în corner. Dacă trimiteți încă e-mail, uneori zip coduri în aceste zile, sunt, cum ar fi, plus patru. Deci, avem nevoie de o cratimă și apoi avem nevoie de mai multe patru numere. Deci, să fiu sincer, ar putea du-te mai multe moduri diferite. Pentru moment, am de gând să păstreze simplu și eu sunt doar de gând să spun că este un cinci valoare CHAR și suntem O să săriți peste tot bord, plus patru. Dar acestea sunt tipurile de compromisuri. Și puteți cred că a aceleași probleme care apar cu numere de telefon sau alte domenii. Și acum, aceasta este de fapt un drum prost pentru a merge în jos. Să presupunem că atât Rob și eu și Hannah și Maria și [? Davon?] Și Andy și altele în cadrul personalului toate trăiesc în Cambridge, Massachusetts, 02138. Acest fapt simt prost că sunt adăugând la masa de utilizatorii mei, oraș, stat, și ZIP. Ce? Audiența: [inaudibil] DAVID MALAN: Spune din nou? Audiența: [inaudibil] DAVID MALAN: Sunt mereu de gând să meargă împreună, nu? Când se pare, am folosit să cred acesta a fost cazul până când vom exhaustiv căutat întreaga SUA, și apoi că există sunt unele neconcordanțe în cazul în care mai multe orașe au În același zip, care este ciudat. Dar, dacă ne-am stipulează acum că 02138 este întotdeauna Cambridge, Massachusetts, de ce din lume nu ar magazin în baza de date Cambridge și MA și 02138 pentru mine și pentru Hannah și pentru Rob și pentru [? Davon?] Și pentru alții care trăiesc aici în Cambridge, e perfect redundant. Ar trebui să scape cu doar stocarea ce? Doar codul poștal. Dar apoi, dacă vom păstra doar cod postal, vreau, probabil, pentru site-ul meu să știe unde 02138 este. Deci, am nevoie de un alt tabel. Și asta e în regulă. Și, de fapt, aceasta este una dintre cele mai procesele de proiectare a tabelelor de proiectare că veți face în PSet7 precum prin care vrei să factor în date comune. La fel ca am fost de factoring din Codul și factoring în comun comun stiluri de CSS, aici prea în baza de date, dacă am nevoie doar 02138 de unic identifica orașul natal cuiva, nu se păstra Cambridge, Mass pentru fiecare utilizator darn în tabel. În schimb, au un tabel separat numit Fermoare că ar trebui să aibă ce coloane? Probabil un câmp de identitate, doar pentru că, pentru principiile vorbim despre acum. Probabil un câmp zip pentru 02138. Și apoi, probabil, ce alte coloane? City și de stat, dar au doar un singur rând pentru 02138, un rând de 02139, un rând de 90210. Și că este literalmente toate codurile ZIP știu. Deci acum, ce poti face? Acest lucru este problematic, deoarece acum am două tabele. Deci, utilizatorii mei sunt în mare parte aici, dar informațiile lor de stat orașului aici. Deci, se pare cu SQL, nu e de fapt, o modalitate de a se alătura informații, și veți vedea acest lucru în PSET. Dar se pare că poți face ceva de genul asta. SELECT stele de la utilizatori, TE fermoare ON Utilizatorii dot zip este egal cu fermoare dot zip. Care este un pic prolix, Desigur, dar acest lucru doar înseamnă selectați totul, de la proces de a lua masa de utilizatori meu și masa mea fermoare. Alăturați-vă-le pe cea câmp au în coloana. Deci, literalmente face ceva ca aceasta, și dă-mi înapoi un nou tabel temporar asta e mai mare, e mai mare, care are toate coloanele de la amândoi. Și că, pur și simplu, ar fi sintaxă pentru a face ceva de genul asta. Deci, există această perspectivă, dar nu se întâmplă să fie alte decizii de design veți trebuie să facă, nu numai cu indici dar, de asemenea rulează în provocări. De fapt, există o provocare în orice bază de date de proiectare care, uneori, doi oameni ar putea dori pentru a accesa aceleași rânduri de date masa. Deci, acest lucru este ceva pe care o vom întâlni în PSet7, de asemenea. Dar m-am gândit la o uite atac care este posibil, în SQL. Care sunt unele din problemele care pot apărea? Deci, veți întâlni acest lucru în PSet7. Și am să vă spun pur și simplu ceea ce soluție de codificare pentru această problemă este. Dar dacă luați o clasă de nivel superior, în special în sistemele de operare, ai de gând să întâlni o problemă de atomicitatea, problema de încercarea de a face mai multe lucruri dintr-o dată fără întrerupere. Și m-am gândit să introducă această idee pentru PSet7 cu o metaforă că m-am învățat în Margo Sisteme de operare CS164 Seltzer lui clasă de ani în urmă. Să presupunem că aveți unul dintre aceste cămin frigidere în cameră cămin sau casa, și aveți o înclinație reală pentru lapte. Și așa, ai venit acasă de la cursuri o zi, când deschideți frigiderul. Oh, la naiba. Nu e nici lapte în frigider. Deci, închideți frigider, încuie ușa, blocarea cămin ta, mers pe jos în jurul valorii de colț la CVS, intra in linie, și începe verificarea pentru unele lapte. Și că va dura ceva timp, pentru că cei de sine checkout naibii contoare ia pentru totdeauna pentru a utiliza oricum. Deci între timp, colegul tău de cameră vine acasă. El sau ea place foarte lapte, de asemenea. Ei vin în camera de camin, deschide frigiderul, oh, ea naibii. Nu e nici mai mult lapte. Deci, el sau ea, de asemenea, merge în jurul valorii de colț. Dar acum, din moment ce nu e ca și cum doi sau trei sau patru CVSes apropiere, se întâmplă să merg la unul din cele cele diferite in piata. Și așa acum, la câteva minute mai târziu, amândoi vin acasă și Ugh, problema cel mai rău vreodată. Acum ai prea mult lapte pentru că va merge acru. Și îți place laptele, dar Nu-mi place cu adevărat de lapte. Deci, acum, acest lucru a fost un scump greșeală pentru că amândoi a luat o decizie pe baza stare de unele variabile care a fost în procesul de fiind schimbat de tine, inițiatorul mergi la a lua de lapte. Deci, ceea ce este, probabil, un om soluție la această problemă? Audiența: [inaudibil] DAVID MALAN: Lasă un bilet, nu? Lăsați întotdeauna o notă, dacă ești familiarizat cu acest spectacol. Da, există două noi. Deci, lăsați întotdeauna o notă, sau bloca literalmente frigider cu un fel de lacăt sau ceva pe partea de sus de genul asta. Dar asta e, de fapt va fi problema-cheie cu un design de baze de date, mai ales atunci când s-ar putea avea mai multe browsere, mai multe laptop-uri, mai mulți utilizatori toate încercarea de a actualiza informațiile dintr-o dată. Informații deosebit de sensibile cum ar fi informațiile financiare, prin care, cu un stoc de tranzacționare site-ul ca vei fi construirea, Ce se întâmplă dacă doriți să verificați cât de mult bani aveți și apoi, dacă aveți suficient, cumpara unele stoc? Dar dacă cineva care are un cont comun cu tine încearcă în același timp să cumpere unele stoc? Deci, el sau ea este verificarea soldul contului, amândoi mă întorc la fel răspuns, nu exista nici lapte. Sau ambele te întorci răspunsul, aveți 100 $ în cont. Ambele încercați să ia decizia pentru a cumpăra o acțiune din unele Stock Company. Și acum, ce se întâmplă? Ai două acțiuni? Nu aveți niciun acțiuni? Probleme de genul asta pot apărea. Deci, vom întâlni asta. Atacurile SQL injection, din fericire, sunt ceva ce te ajuta cu, dar acestea sunt atroce comune in aceste zile încă. Deci, aceasta este doar un exemplu. Eu fac nici o pretenție că Sistemul Harvard PIN este vulnerabile la acest atac special. Am încercat. Dar, știi că noi au un câmp de genul asta. Și Yale de identitate Net are un similară Ecranul cauta in aceste zile. Și se pare, că poate Sistemul PIN este implementat în PHP. Și dacă were-- e not-- ei ar putea avea cod care arata ca acest lucru. Ei au două variabile. Dă-mi de utilizator și parola de la variabila globală post-super- despre care am vorbit mai devreme. Poate Harvard are o interogare ca SELECT stele de la utilizatori în cazul în care numele de utilizator este egală cu cea si parola este echivalent cu cel. Și observați că eu sunt doar conectându-l în utilizarea notația bretele buclat de la celălalt zi, ceea ce înseamnă doar conectați într-o valoare Aici. Nu mă folosind întrebare tehnică marca. Nu am nici o secundă sau argumente terțe. Sunt doar literalmente construirea șir mine. Problema, însă, este faptul că în cazul în care cineva ca un scroob, care este o referință la un film, busteni cu ceva de genul asta, și am scos punctele care acopera, de obicei, până parole, ceea ce în cazul în care este în special malware și parola poate este 12345, pe filmul numit "Spaceballs" dar el critic tipuri de citat singur după cinci, apoi literalmente cuvântul sau în spațiul, și apoi citat, unul încheiat citatul este egal cu citat o, Dar observați că a omis ce? A omis citat pe dreapta și el a omis citat din stânga. Pentru că dacă acest atacator prezumția scroob lui este că oamenii care a scris acest cod PHP nu au fost atat de stralucitoare, Poate că doar au unele singur citează în jurul valorii de interpolare unei variabile in acolade? Și astfel, poate, el ar putea fel de a finaliza gândirii lor pentru ei, dar într-un mod care va să îl lase să intrat în sistemul de PIN. Cu alte cuvinte, să presupunem că aceasta este codul iar noi conectați acum în ceea ce scroob tastat. Și este roșu, pentru că e de rău. Iar textul de bază este ceea ce el tastat în, scroob ar putea truc server de la Harvard în construirea o interogare SQL șir care arata ca acest lucru. Parola este egal 12345 sau un egal unul. Rezultatul pe care, în mod logic, este că acest lucru va log scroob în cazul în care parola este 12345 sau dacă unul egali unul, care este, desigur, întotdeauna adevărat, ceea ce înseamnă scroob devine întotdeauna în. Și astfel, calea pentru a remedia acest, ca într-o mulțime de cazuri, ar fi să scrie defensive. Pentru a utiliza ceva de genul nostru Funcția real de interogare, care veți vedea în PSet7, unde am conectați ceva de genul întrebare marchează aici. Și frumusețea Funcția de interogare pe care le da este apără împotriva acestor așa-numitele atacuri SQL injection, unde cineva este pacalirea codul în injectarea propriul cod său SQL. Pentru că ceea ce funcția de interogare oferim va face de fapt, dacă utilizați sintaxa semn de întrebare și un al doilea și un al treilea argument aici, este ceea ce a adauga la intrare care utilizatorul furnizat? Cei backslash citate. Deci, se scapă orice potențial caractere periculoase. Acest lucru arata ciudat acum, dar nu este vulnerabil deoarece nu Modificarea logicii mai pentru că toată parola este acum un singur citat care nu este, De fapt, parola scroob lui. Deci, acolo a fost unele glume despre această a lungul anilor. Deci, asta a fost o fotografie făcută de unele Geek într-o parcare prin voi să știe că unele orașe și statele încercați să scanați licența placă să te sau bilet factura tine dacă te duci prin fara, cum ar fi, chestia e-Z Pass. Deci, această persoană presupune că poate oamenii scris sistemul E-Z Pass nu au fost atât de strălucitoare, și poate că doar concatenate împreună un șir de caractere, astfel încât el sau ea nu a putut cu rea intenție nu a finaliza doar gândirea lor, dar de fapt executa o comandă de rău, care noi nu am menționat încă, dar, probabil, puteți ghici. Că, în plus pentru a șterge și introduce și actualizarea și selectați, există, de asemenea un cuvânt cheie numit picătură, care literalmente șterge totul în baza de date, care este deosebit de rău. Putem mări acest lucru, dacă e un pic greu pentru a vedea. Acest lucru, acum, este un desen animat celebru asta e minunat inteligent acum și ușor de înțeles. [Râsete] Da, se răcește. Un fel de geeking afară. Astfel încât acestea, atunci, sunt Atacurile SQL injection. Și sunt atât de ușor, pentru a evita, prin utilizarea codul corect sau bibliotecile dreapta. Și veți vedea în PSet7, asta e de ce vă oferim funcția de interogare. Deci, un cuplu de teasere că ne-am gândit vă dau aici, în nostru minute rămase împreună. Deci, după cum vă amintiți de săptămână la zero, am a introdus aceste două becuri care sunt frumos, nu doar pentru că acestea sunt destul de pline de culoare sunt, ci pentru că sprijină ceva numit API, o aplicație Interfață de programare și în CS50 până acum, ne-am cea mai mare parte axat pe GET și POST, dar se pare există alte verbe cum ar fi HTTP UPT. Și, de fapt, aceasta a fost un tobogan de la zero, săptămână prin care, dacă scrie cod care trimite a la PSet6 o cerere HTTP care arata ca acest lucru cu acest bucată de text în partea de jos, care se numește JSON, sau JavaScript Object Notation că vom vorbi despre săptămâna viitoare, puteți activa sau dezactiva sau schimbare culoarea luminilor cum ar fi cele. Deci, dacă CS50 are, de asemenea, în plus față de unele dintre aceste becuri aici, în New Haven dacă doriți să împrumute le pentru proiecte finale, de asemenea, unele Microsoft Benzi, care sunt ca ceasuri pe care le purta în jurul valorii de încheietura mâinii care au în mod similar un API, astfel încât să poate scrie software-ul propriu pentru ei. Avem un cont cu Codul Apple iOS astfel că, dacă aveți un Apple ceas sau un iPhone sau un iPad sau un iPod, puteți scrie cod care de fapt, ruleaza pe cele. Avem o grămadă de Arduinos, care sunt computere mici mici fără cazuri, în esență, care vă puteți conecta prin USB, de obicei, la propria Mac sau PC, scrie cod care ruleaza pe aceste fizice dispozitivele care au de multe ori senzori pe ele astfel încât să puteți interacționa cu lumea reală. Avem o grămadă de dispozitive Leap Motion, care sunt dispozitive USB pentru Mac-uri și PC-uri, aici și din nou, în New Haven. Și dacă îl conectați la Mac, puteți controla de fapt, computerul de software-ul scris că prin raze infrarosii, cifrele de unde mâinile tale umane sunt, chiar și fără a atinge tastatura. Ne-am gândit să împărtășesc o rapidă bucatica la acest, de exemplu. [MUSIC JOC] Deci, avem un întreg gramada de aceste lucruri, de asemenea, numit benzi braț Myo care ai pus peste antebratul și apoi puteți controla real lume sau lumea virtuală ca aceasta. [MUSIC JOC] Sau, avem, de asemenea unele Google Carton, care este literalmente, cum ar fi, o cutie de carton ai putea pune pe dumneavoastră fata, dar diapozitiv în telefon în ea astfel încât ai pus sticla de dvs. telefon foarte aproape de ochi. Și Google carton este destul de ieftine la 10 $ sau 20 $. Și are lentile mici că ușor de pe schimbare imaginea de pe ecran pentru uman ta ochii pentru a vă oferi un sentiment de adâncime astfel încât să aveți de fapt o 3D mediu în fața ta. Avem, de asemenea unele Samsung Gear, care este versiunea mai scump din acest, dar care poate aluneca în mod similar într-o Telefon Android și vă va oferi iluzia de-- sau oferi o experienta de realitate virtuală. Și în nostru final două minute, ne-am crezut că vom încerca să facem acest lucru. Dacă eu pot proiecta ce are Colton aici doar pentru a vă deschide apetitul, lasă-mă să merg mai departe și arunca pe marele ecran aici. Permiteți-mi să-l omoare pe luminile. Colton, vrei să mergi mai departe și a pus pe mobil pentru un moment și vino la mijloc al etapei? Și vrei să project-- aceasta este ceea ce vede Colton. Acum, Wi-Fi în aici este nu atât de puternic pentru acest dispozitiv că acest lucru este foarte convingătoare, dar Colton este literalmente în acest loc magic futurist. El vede doar o imagine. Vedeți ochiul stânga și la dreapta că creierul lui sunt coasere împreună într-o tridimensională mediu pe fata lui. Tocmai selectat o opțiune de meniu aici. Și astfel, din nou, el poartă acest set cu cască cu un telefon Samsung pe el, care este wireless proiectare la deasupra capului nostru. Acum sunteți pe Marte, cred? COLTON: Cred că da. Nu sunt sigur [neauzit]. [Râsete] DAVID MALAN: Se pare că Marte are aceste meniuri. COLTON: [inaudibil] unele rece Locuri dacă vrem să mergem sa-- DAVID MALAN: Unde vrem să mergem? COLTON: [inaudibil] DAVID MALAN: Și să vedem Unde e Colton ne duce acum. COLTON: [inaudibil] DAVID MALAN: Deci, nu e atât de multe diferite locuri vă puteți lua. Există FAPIs prin care puteți scrie jocuri sau interacțiuni care rula, în cele din urmă, la telefon. Deci, într-adevăr doar scris o aplicatie de telefon mobil. Dar, datorită software-ul și capacitățile grafice, acum Colton se află în această mic cabana mica. Și cu riscul de a copleșitoare noi înșine, Colton și voi lipi în jurul valorii de iar la sfârșitul clasei aici astăzi dacă doriți să vină și să se joace. Și vom le aducă înapoi săptămâna viitoare, de asemenea. Fără alte formalități asta e pentru ziua de azi. Ne vedem săptămâna viitoare. [MUSIC - Ragga TWINS, "om rău"]