[MUZIKO Ludante] DAVID Malan: Bone, ĉi tiu estas CS50. Tio estas la fino de semajno ok. Kaj hodiaŭ, ni komencas plenigi iuj pecoj kiam temas konstruaĵo aferoj en la reto. Do, memoru, ke lunde ni pasigas multe pli da tempo en PHP, kiu estas tiu dinamika programlingvo ke Lasas nin eligo, inter aliaj aferojn, HTML kaj aliaj tiaj enhavo ke ni volas vidi. Sed ni ne vere rigardis kiel ni iras por stoki ajnan informon. Efektive, preskaŭ neniu de kiuj la super interesaj retejoj vi vizitas hodiaŭ havas ian datumbazo sur la dorso fino, ĉu ne? Facebook certe stokas amasojn de datumoj pri ni ĉiuj kaj Gmail tendencas ĉiuj de via retmesaĝoj. Kaj tial, multaj aliaj lokoj estas ne nur statika enhavo kiu estas informa. Estas vere dinamika iel. Vi havigi enigo, ĝi ĝisdatigas la paĝoj por aliaj personoj. Vi ricevas mesaĝojn, vi sendu mesaĝojn, kaj tiel antaŭen. Do hodiaŭ, ni rigardas pli proksime rigardis la subkonstruaĵoj de projekto ke vi plonĝi en sekva semajno, CS50 Financoj, kio fakte havos vin konstrui io ne estas en C, sed en PHP. Retejo kiu aspektas iom io tiamaniere kiu permesas aĉeti kaj vendi akcioj kiuj reale tuj desegni sur reala tempo stock datumoj de Yahoo Financoj. Kaj do finfine, vi havos la iluzio por vi mem kaj por uzantoj ke vi reale aĉetante kaj vendante stokoj kaj ekhavi preskaŭ reala tempo ĝisdatigoj, administri biletujo, ĉiuj kiuj tuj postulas havanta, finfine, datumbazon de uzantoj. Do, en viaj propraj vortoj, precipe se vi ne estas súper konata kun komputila scienco aŭ datumbazoj, kio vi scias datumbazon esti ĝuste nun, en _nontechnical_ terminoj? Kio estas tio? Kiel vi priskribus ŝin al kunloĝanto aŭ amiko? Spektantaro: [inaudible] informo [inaudible] DAVID Malan: Do, liston de informoj, aŭ store-- listo de informoj ke vi eble volas konservi pri io, kiel uzanto. Kaj kion fari uzantoj havas asociita kun ili? Se vi estas uzanto de Facebook aŭ Gmail, kio estas la karakterizaĵoj ke ni ĉiuj uzantoj havas? Kiel, kio povus esti iuj de la kolumnoj en la kalkultabelo por kiu ni aludis lastfoje? Ĉar denove, vi povas pensi pri datumbazo vere kiel fantazio Excel dosiero aŭ Google Kalkultabelo aŭ Apple Nombroj dosiero. Do, kion vi opinias pri kiam vi pensas de uzanto? Kion ili havas? Kio estas tio? Publiko: A nomo. DAVID Malan: A nomo. Do se nomo, kiel David Malan estus la nomo de iu uzanto. Kion alian pruvas uzanto havas? Publiko: An ID. DAVID Malan: An ID. Do, kiel ID nombro, kiel via Harvard ID aŭ via Yale Net ID aŭ similaj. Kion alian oni uzanto havas? Publiko: Pasvorto. DAVID Malan: Pasvorta, eble oni adreso, eble telefonnumero, eble retadreson. Do, ekzistas aroj da kampoj kaj ĉi povus ia spirale el kontrolo rapide tuj kiam vi komencas rimarki, ho, ni stoki ĉi kaj ni stoki tion kaj tion. Sed kiel ni efektive faru tion? Do denove, la mensa modelo havi por hodiaŭ kiel ni plonĝi en reala SQL, Strukturita Query Language, estas datumbazo kiu similas ĉi. Estas nur vicoj kaj kolumnoj. Kaj vi povas imagi Google Spreadsheets aŭ ajnan numeron de aliaj programoj. Sed kio estas ŝlosilo pri MySQL, kiu estas la datumbaza softvaro ni tuj uzi, la libere malkaŝe available-- Facebook uzoj ĝi kaj ajna nombro da aliaj websites-- datumbazo stokas aferoj relationally. Kaj rilata datumbazo nur signifas unu kiu laŭvorte stokas liajn datumojn en vicoj kaj kolumnoj. Ĝi estas kiel simpla kiel tio. Do, eĉ ion kiel Oracle ke vi eble ĝenerale aŭdis estas rilata datumbazo. Kaj sub la kapuĉo, ĝi tendencas datumoj en vicoj kaj kolumnoj. Kaj Oracle enspezas vin multan monon por fari tion, dum MySQL ŝargoj vi nenion por la sama. Do, SQL tuj donos nin almenaŭ kvar operacioj. La kapablon elekti datumojn, kiel legita datumoj, insert, forigi, kaj ĝisdatigo de datumoj. En aliaj vortoj, tiuj estas vere la kvar ŝlosilaj operacioj ke tuj permesos nin ŝanĝi havajxoj en tiuj vicoj kaj kolumnoj. La ilo kiun ni uzas nuntempe ĉefe lerni SQL kaj ludi kun ĝi estas denove nomita PHP MyAdmin. Estas ttt bazita ilo. Sumo koincido ke ĝi estas skribita en PHP. Sed ĝi tuj donu al ni grafikan uzantinterfaco por ke ni povas reale krei tiujn vicoj kaj kolumnoj kaj tiam paroli al ili per kodo. Do, ni nun komencas kion mi opinias estas sincere speco de la amuza procezo de konstruanta la malantaŭa fino de retejoj, la partoj kiuj uzantoj ne vidi, sed verŝajne faras zorgon pri, ĉar tio estas prefere datumoj okazas. Do, simila al C kaj iom malpli kiel PHP, SQL, aŭ datumbazo kiu elportu SQL, havas almenaŭ tiuj datumtipoj kaj aroj da aliaj. Char, VARCHAR, INT, BIGINT, Dekuma kaj DatoTempo. Kaj ekzistas tuta faskon da aliaj trajtoj, sed ni faru tion maniero de fakta ekzemplo. Mi tuj iros en CS50 IDE kie, anticipe, mi ensalutinta kaj Mi ankaŭ vizitis URL por tiu ilo nomita PHP MyAdmin. Kaj en problemo starigis sep, ni diros vi precize kiel atingi tiun interfaco ankaŭ. Sur la supra maldekstra angulo, rimarki ĝin diras prelegi. Kaj tio nur signifas ke anticipe, mi kreis malplena datumbazo nomita prelego kiu havas neniun kalkultabelojn en ĝi ankoraŭ. Mankas vicoj kaj kolumnoj. Ĉar la unua afero ni tuj faros Estas komenci al krei tabulon ke tuj stoki niajn uzantojn. Do, laŭvorte super tie dekstren, mi estas tuj rakontos la datumbazo Mi volas tablo nomita Uzantoj. Do, tio estas kiel la dosiero kiun mi volas konservi ĉiujn miajn datumojn en. Kaj kiom da kolumnoj? Nu, ni teni ĝin simpla por nun. Mi nur volas konservi kiel uzantonomo kaj nomon de uzulo. Ni komencos malgranda. Do, mi volas du kolumnoj entute. Kaj mi tuj iros antaŭen kaj klaku Iru. Kaj poste, por tiuj kolumnoj, kion mi tuj al do-- se ĉi interreto cooperates-- bone, do ni tuj provi tion denove. Mi tuj krei tabulon vokis Uzantoj kun du kolumnoj, klaku Iru OK. Nun ni havas vere rapida. Dankon, tre bone farita. Bone, do kion ni volas tiujn kolumnojn por nomi? Do, oni tuj nomos Uzulnomo. Do, ĉiuj mi vidas here-- kaj la interfaco sincere ricevas iom malbela eventuale, unufoje vi ektajpu en ĉiuj ĉi tiuj datumoj. Sed kio estas agrabla estas tia paradokse, mi krei kolumnojn, sed la ilo havas malsaĝe elmetis tion en vicoj por ke mi povas agordi tiujn kolumnojn. Do, ekzistas du spacoj tie sub Nomo. Kaj unu el tiuj kampoj mi volas nomi Uzulnomo: kaj la alia kampo Mi volas nomi Nomo. Kaj nun mi devas elekti datumtipoj por tio. Do, dum en Excel kaj Google Spreadsheets, se vi volas kolumno, vi laŭlitere nur tajpu Nomo aŭ Uzulnomo, batis Enter. Eble vi faras ĝin aŭdaca vizaĝo nur por klareco, sed jen ĝi. Vi ne specifas la tipoj de la kolumnoj. Nun en Google Spreadsheets aŭ Excel, vi povus specifas kiel la datumoj estas pruntitaj. Vi povus iri al la menuo Formato, kaj vi povas specifi montri tion kiel dolaro signo, montri tiun kiel glitpunktaj valoro. Do, ĝi estas simila en spirito al ke kion ni estas farontaj, sed tiu estas vere tuj devigi la datumoj esti certa tipo. Nun, eĉ se antaŭ momento mi diris ke ekzistas nur kelkaj datumtipoj, ekzistas reale amason, kaj ili estas en variantaj gradoj de specifeco. Kaj kiel flanken, vi povas eĉ fari imago aferoj kiel stokado geometrioj ene de datumbazo. Vi povas stoki aferojn kiel GPS koordinatoj kaj fakte trovas, matematike, punktoj kiuj estas proksimaj al aliaj. Sed ni tuj daŭru super simpla kaj iri ĝis tie, ĉiuj la tn kordo tipoj. Do, jen listo de tuta aro da ebloj. Char, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. Kaj ĝi estas speco de blindiga. Kaj bedaŭrinde, iom paradokse al C, char ne estas vere char. Se vi specifas en datumbazo ke via datumtipo estas char, tio signifas ke jes, ĝi estas Char, sed ĝi estas unu aŭ pli signoj. Kaj vi devas doni kiom da signoj vi volas. Do, kio estas tipa longo por salutnomon? Ĉu ekzistas limo tipe? Spektantaro: [inaudible] DAVID Malan: 16 eble? Io simila. Vi scias, tie en la tago, ĝi kutimis esti ok. Foje estas 16, foje ĝi estas eĉ pli ol tio. Kaj tiel, ĉi ne signifas doni al mi unu CHAR. Tio signifas mi devas entajpi la longo de la kampo, kaj nun mi povus diri ion kiel 16. Kaj tie estas komerco ekstere tie. Do, ni vidos post momento ke tiu signifas unu, ĉiun salutnomo devas esti 16 karakteroj. Sed atendu momenton, M-A-L-A-D. Se tio mian salutnomon kaj mi nur uzante kvin, kion vi proponas ke la datumbazo fari por la aliaj 11 karakteroj kiuj Mi rezervis spacon por? Kion vi farus? Spektantaro: [inaudible] DAVID Malan: Yeah, simple fari ilin ĉiuj nulaj. Faru ilin spacoj. Sed probable nula, do Multa backslash nuloj. Do, unuflanke, ni havas nun certigis ke mia salutnomo povas esti ne pli ol 16 signoj. Kaj la flip flanko de kiu estas ke se mi havis vere longan nomon aŭ volis vere longa salutnomo kiel kelkaj el vi uloj havu en tiu kolegio aŭ ĉe Yale.edu, vi ne povas havi unu. Do fakte, se vi havas iam registrita por retejo kaj vi get kriis al jene vian pasvorton tro longa aŭ via uzantnomo estas tro longa, ĝi estas simple ĉar programisto, kiam agordante sian datumbazon, decidis ke tiu kampo ne plu ol ĉi longo. Bone, do kion se ni procedi por citi? Kiom longe devus pli tipa homa nomo estas? Kiom da karakteroj, 16? Mi konjektas ni povis trovi iun en tiu ĉambro kie por lia aŭ ŝia unua pli lasta nomo estas pli longa ol 16 karakteroj. Do, kio estas pli bona ol tio, la 17? 18? 25? Bigger? 30? Spektantaro: [inaudible] DAVID Malan: 5.000, oh mia Dio. Do, tio estas probable deca supra ligis, ni diru. Kaj tie ni ia havis fari juĝon alvoko. Kiel, estas nenia dekstra respondon tie. Senfina estas ne tute eble, ĉar ni estas eventuale tuj have-- ni estas tuj kuri el memoro. Do, ni devas fari juĝon alvoko je iu punkto. Tre komuna estus, ekzemple, al use-- kaj lasu min specifi CHAR tie kiel before-- 255 estis laŭvorte la supra limo sur tiu datumbazo programaro antaŭ jaroj. Kaj do, multajn homojn estus ĝuste diri, fajna. 255 estas la limo. Ni simple uzu la maksimumo. Kaj tiu estas sufiĉe ridinda. Kiel, se vi tajpas iun estas citi por 200 pli karakteroj, ke iom ridinda. Sed, memoru ke ASCII ne la sola sistemo por karakteroj. Kaj tiel, speciale en Multaj aziaj lingvoj kie ekzistas karakteroj ni ne povas esprimi en klavaroj kiel miaj usonaj klavaro, iuj karakteroj reale levu 16 bitoj anstataŭ ok bitoj. Kaj do, ĉi reale finfine ne senkaŭza ke ni bezonas pli spaco se ni volas persvadi grandaj karakteroj ol la tre usonaj centric ones ni jam emis diskuti. Do, ni bezonas iun superan baron. Mi ne scias, kion la bona estas, sed 255 estas ĝenerale komuna. 25 sentas malalta. 16, 32 sentas malalta. Mi estus erari sur la flanko de io pli alta. Sed estas komerco ekstere, kiel ĉiam. Kio estas la, eble, evidente komerco ekstere de rezervante 255 signoj por ĉies nomon en mian datumbazon? Spektantaro: [inaudible] DAVID Malan: Kio estas tio? Spektantaro: [inaudible] DAVID Malan: Estas Multa memoro, ĉu ne? M-A-L-A-D. Mi ĵus malŝparis 250 karakteroj ĵus stoki mia nomo defende, ĉiaokaze iu en la klaso havas vere longan nomon. Tio ŝajnas kiel troa tradeoff. Do, rezultas ke SQL, ĉi datumbaza lingvo, fakte subtenas ion nomata VARCHAR, aŭ Variablo CHAR. Kaj tiu estas speco de bela en tiu ĉi permesas vin specifi ne fiksa larĝa, sed prefere, larĝa ŝanĝiĝema. Kaj pli specife, maksimuma larĝo de la kampo. Do, tio signifas ke nomo povas esti ne pli ol 250 signoj, sed ĝi certe povas esti pli malmultaj. Kaj la datumaro estas iranta esti lerte. Se vi metas en M-A-L-A-N, ĝi estas nur tuj uzos kvin, eble ses bitokoj por kiel Rampanta nula karaktero, kaj ne elspezas plia 249 aŭ 250 bajtoj nenecese. Do, tio ŝajnas kiel mi devus komencis kun tiu rakonto. Sed ĉiam estas tradeoff. Do, unuflanke, uzantonomon mi havas specifita esti malfacile kodita en 16, kaj eble tio estis ne rajtas nomi, eble estas, sed kial ne uzi VARCHARs por ĉio? Ekzistas por kialo. Kial ne uzi VARCHARs por ĉiu kampo kies longo ne scias anticipe se ĝi ŝajnas esti granda afero, ĉu ne? Uzu nur tiom da spaco kiel vi bezonas ĝis ĉi limo? Publiko: Pli malrapida. DAVID Malan: Speller? Publiko: Makes pli malrapida? DAVID Malan: Ho, ĝi estas pli malrapida. Bona, tio estas preskaŭ ĉiam la respondon, sincere. Kiel, kio estas la tradeoff? Ĝi ĉu kostas pli spaco aŭ ĝi kostas pli da tempo. Do, en ĉi tiu kazo, ĝi povus esti pli malrapida. Kial? Spektantaro: [inaudible] determinado [inaudible]. DAVID Malan: Bonan. Do, vi eble memoras de vespero PSED5, ludante kun via alproksimiĝo al la vortaro, se vi devas rezervi memoron dinamike aŭ konservi kreskanta buffer, ke povas efektive esti malrapida. Se vi havas nomi malloc sub la kapuĉo kaj eble jen kion MySQL faras, tial certe tio povus esti la kazo. Kaj se vi pensas vojo reen al PSet-- aŭ eĉ semajnoj du, kiam ni faris aĵojn kiel duuma serĉo aŭ eĉ lineara serĉo, unu el la belaj aferoj pri ĉiu vorto en datumbazo aŭ ĉiu vorto en kolumno esti ĝuste la sama longo, eĉ se tutan faskon da tiuj karakteroj estas malplena, estas ke vi povos uzi hazarda aliro sur via datumo, dekstra? Se vi scias, ke ĉiu vorto estas 16 karakteroj for, vi povas uzi puntero aritmetiko, por tiel paroli, kaj iru kun ni 16, 32, 48, 64, kaj vi povas nur salti senprokraste uzante aritmetiko al cxiuj vortoj en via datumbazo. Dum se ĝi estas VARCHAR, Kion vi anstataŭe devas fari? [TELEFONO sonorado] Se ĝi estas VARCHAR, vi ne povas uzi hazarda aliro. Kion vi havas por serĉi aŭ fari? Yeah? Spektantaro: [inaudible] DAVID Malan: Rigardu tra la whole-- spuro tra la tutan liston serĉanta kio, plej versxajne? Kia speciala valoro? Spektantaro: [inaudible] DAVID Malan: Looking por la nula terminadores ke Demarco la disiĝo de vortoj. Do denove, tradeoff, kaj estas nenia dekstra respondon. Sed ĉi tiu estas kie, speciale kiam viaj uzantoj alveni al esti multaj kaj via ŝarĝo sur viaj serviloj, la nombro de homoj uzanta ĝi ricevas alta, tiuj estas vere netriviala decidoj. Do, ni povas lasi tiujn kiel tiu, sed ni rulumu malsupren super dekstren tie. Nun, ekzistas paro de kolumnoj kie ni havas por fari juĝon alvoko. Ĉu havas sencon por permesi uzanto nomo, uzanto salutnomo aŭ uzanto nomo, esti nulaj? Tio estas, nur malplenaj. Sentas iom sensenca, do mi estas Ne tuj kontroli tiujn skatolojn. Sed rezultu en datenbazo, vi povas diri, iu povas laŭvole havas tiun valoron. Tiu kolumno ne havas por fakte esti tie. Nun, ekzistas tiu falmenuo. Kaj rimarki mi ankoraŭ en la unua vico tien, do mi parolas salutnomo nun. Kaj ĝi rezultas ke datumbazon, kontraste simpla nura kalkultabelo, havas potencajn funkciojn nomita indeksoj. Kaj indico estas maniero de diri la datumbazo anticipe ke mi la homa am pli inteligenta ol vi. Mi scias kion specoj de demandoj, elektu aŭ enmeti aŭ forigi aŭ ĝisdatigo, ke mia kodo tuj finos supre faranta sur tiu datumbazo. Mi volas legi multajn datumojn. Mi volas enmeti multajn datumojn. Mi volas konstante forigi multajn datumojn. Se mi scias, ke mi tuj estos aliranta kampo kiel Uzulnomo multe, Mi povas diri al la preventa datenbazo, mi scias pli ol vi, kaj mi volas dekreton vi devus indekso ĉi kampo. Kie indeksante kampon aŭ kolumno signifas ke la datumbazo anticipe devus prunti kelkajn ideojn de, kiel, semajno kvar kaj kvin kaj ses el CS50 kaj fakte konstrui supren iu kiel duuma serĉo arbo aŭ io kutime nomas B arbo ke vi lernus en klaso kiel CS124 ĉe Harvard, la algoritmoj klaso, aŭ ajnan numeron de aliaj lokoj. La datumbaza kaj la beleta homoj kiu implementado ĝin estos eltrovi kiel memori ke tablo de informoj en memoro por ke serĉoj kaj aliaj operacioj estas super rapida. Vi ne devas fari tion. Vi ne devas apliki lineara serĉo aŭ duuma serĉo aŭ kunfandi varo aŭ selektado varon, neniun el tio. La datumbazo faras ĝin por vi, se vi diros ĝi preemptively indeksi ĉi kampo. Kaj vi povas vidi ankaŭ, ekzistas iuj aliaj karakterizaĵoj ni povas diri al la datumbazo observigi. Kion povus signifi se mi elektas Unika de ĉi tiu menuo, ĝuste intuicie? Yeah? Spektantaro: [inaudible] DAVID Malan: Yeah, la salutnomo devas esti unika. Ĉu tio estas bona afero aŭ malbona afero por datumbazo, por retejo kun uzantoj? Devus salutnomoj esti unika? Jes, verŝajne. Se tion la kampo ni uzas ensaluti, vi ne vere volas popolo havanta la sama sento aŭ la sama salutnomo. Do, ni povas havi la datumbazo observigi ke tiel ke nun en mia PHP kodo aŭ ajna lingvo, Mi ne devas, ekzemple, kontroli nepre faras ĉi salutnomo ekzistis antaŭ mi lasu iun registriĝi? La datumbazo ne permesos du homoj nomis Davido aŭ Malans registri en tiu kazo. Kaj kiel flanken, kvankam ĉi menuo nur permesas vin elekti unu, unika indekso estas unu tio estas indeksita por súper rapida agado, sed ankaŭ efikigas unikeco. Kaj ni revenos al kio la aliaj du signifas en nur momento. Dume, se mi iros al mia dua vico, kiu estas la uzanto nomo, mi devus specifi ke la nomo devus esti unika? Ne, ĉar vi certe povus have-- ekzistas neniu du Davido Malans en tiu ĉambro, plej probable. Sed se ni elektas alian nomon, ni certe havos kolizioj. Pensu reen al hash tabloj kaj similaj. Do, ni certe ne volas fari la nomo kampo unika. Do, ni ĵus tuj forlasi ke kiel haltostreko, haltostreko, haltostreko, nenio. Kaj mi tuj forlasi ĉio alia sola. Efektive, la plej multaj el tiuj kampoj ni ne devos zorgi pri. Kaj kiam mi estos preta savi tiun, se la interreto kunlaboru, Mi alklakas Konservi, kaj tre, tre, tre malrapide faras la datumbazo get savis. Kaj nun mi revenis al tiu interfaco, kiu koncedite, Estas superfortanta ĉe unua ekrigardo. Sed ĉiuj mi tuj faros estas klako sur la vorto Uzantoj ĉe pinto maldekstra. Mi tuj iros tien, klaku Uzantoj kaj defaŭlte, ĝi ekzekutis iuj SQL, sed pli sur tiu en momento. Ĉi tie estas nur resumo de kion mi faris. Kaj ne zorgu ke vi vidos mencii de latina kaj sveda tie. Tiuj estas nur la defaŭlta fiksoj, ĉar MySQL origine, aŭ PHP MyAdmin, unu el la du okazis esti skribita de iuj svedaj personoj. Sed estas palaj en nia kazo tie. Bone, do kial ĉi ĉiuj interesa? Rezultas, mi povas enmeti datumojn en datumbazo skribante kodon. Kaj mi iras antaŭen kaj en mian dosieron ĉi tie, mi estas tuj iros antaŭen kaj ŝajnigi kiel ĉi estas telegramis al la datenbazo, kiu ne estas en la momento, sed tuj kiam ni atingos problemo starigis sep. Kaj mi tuj iros antaŭen kaj ekzekuti funkcio nomita query, kiun ni donos al vi en problemo starigis sep la dissendo kodo, ke prenas almenaŭ unu argumenton, Kiu estas nur ĉeno. Kordo de SQL-kodo. Do, vi estas estonta lerni kiel skribi Strukturita Query Language. Se mi volas enmeti novan vicon en miajn datumbazo ĉar iu prezentis formo al mia kodo, mi volus laŭvorte skribi INSERT INTO uzantoj la jenaj kampoj: uzantnomo, komo, nomo, la valoroj, kaj nun mi devas enmeti io kiel Malan kaj citaĵo, unquote 'Davido Malan.' Kaj nun eĉ por tiuj nekonataj kun SQL, kial mi uzas solan citaĵoj ene de tiu verda kordo? Kio povus esti la kialo tie? Rimarku mi ko-intervención subprema du lingvoj. Query estas PHP funkcio, sed prenas argumenton. Kaj tiu argumento devas mem esti skribita en alia lingvo nomata SQL, Strukturita Query Language. Do, ĉio, kion mi ĵus reliefigis tie estas tiu lingvo nomata SQL. Do, kio estas kun la citiloj, same rapidan prudento ĉeko? Antaŭen. Ili estas kordoj. Do, citaĵo, unquote Malan kaj citaĵo, unquote Davido Malan estas ŝnuroj. Kaj ĝuste pensas intuicie nun, sciante kion vi scias pri C kaj PHP, kial mi ne faros tion, kion mi kutime uzita citiloj por kordoj? Kial mi ne volas fari tion? Yeah? Spektantaro: [inaudible] DAVID Malan: Ĝuste. Ĉar mi jam uzis citiloj survoje eksteren de la argumento al la PHP-a funkcio, Mi nur konfuzas la interpretisto. Ĝi ne scias, ĉu tiuj iri kune? Ĉu tiuj iri kune? Ĉu tiuj iri kune? Do, mi alterni anstataŭe. Aŭ mi povus fari ion kiel tiu, backslash citaĵo aŭ backslash citaĵo. Sincere, ke ĵus komencas akiri tre nelegebla kaj malbela. Sed tio sukcesus la sama rezulto ankaŭ. Do, se mi estus ekzekuti ĉi query nun, ni vidu kio okazas. Mi tuj iros antaŭen nun kaj prefere ol ekzekuti la PHP kodon, kiun Kie vi ludos en problemo starigis sep, Mi tuj anstataŭ iri al PHP MyAdmin. Kaj mi permane iranta iri al la SQL langeto, kaj lasu min zomi en sur la interfaco. Kaj mi tuj almeti en la afero mi ĵus tajpis. Kaj la koloro kodigo havas ŝanĝis iomete nun, nur ĉar la programo formatojn aferojn iom malsame. Sed rimarki ke ĉiuj mi faris estas mi diris, enmeti en Uzantoj. Mi specifita do en komo apartigitaj parenteza listo la du kampoj, ke mi volas enmeti kaj tiam mi laŭlitere diris valoroj sekvis alia paren, kaj tiam la du valoroj Mi volas plug-in, kaj nun por bonan mezuron, Mi metos punktokomo ĉe la fino. Do, tio ne C. Tio ne PHP. Jen nun SQL, kaj min alglui ĝin en ĉi ttt bazita interfaco kiu nur tuj lasu min, Kiam mi klakas Iru ekzekuti ĉi konsulto sur la datumbazo kurante ene de CS50 IDE. Do tio estas bona. Avizo kiu diris unu vico enmetita, iris super rapida, 0,0054 sekundoj enigi tiun datumon. Do, tio sonas sufiĉe sana. Ĝi reformatigita mia query por min tie ĵus por vidi ĝin en ia koloro kodita versio. Sed nun se mi klakas Foliumu, rimarki ke, eĉ kvankam ekzistas multe de malordo sur la ekrano, mia tablo nun havas du vicojn. Do, lasu min antaŭeniri kaj fari alian. Anstataŭ tio, lasu min iri al la SQL langeto denove. Kaj cxifoje mi enmeti ion kiel Rob kaj lia nomo estos Rob Bowden. Bowden. Ni alklakas Konservi. Oops, prefere Iru. Klakas denove, kaj nun rimarkas mi havas du vicojn. Do, tio estas nur maniero pli kompleksa maniero de malfermado Google Spreadsheets kaj simple tajpante vico en kolumno. Sed kio estas ŝlosilo estas ke Ni nun havas la sintakson kun kiu skribi kodon por ke finfine, ni povis reale fari iun kaj ĉi. Memoru ke PHP apogoj super tutmonda variabloj. Kio estas interne de dolaro subskribi substreko GET en PHP? Ni prenis rigardi unu aŭ du simplaj ekzemploj. Kaj en PSet6, memoras vi havas saluton skalara PHP kiu uzas tiun variablon. Kio iras tien? Aŭ kio estas? Iom pli laŭte. Spektantaro: [inaudible] DAVID Malan: Estas neĝo semo de tabelo, kiu estas nur fantazio maniero diri al tabelo kiu havas ŝlosilan valoron paroj. Kaj la klavoj ne estas nombraj. Ili estas vortoj aŭ kordojn. Kaj specife, kion Estas tiuj ŝlosilaj valoro paroj? Kie ili estas? Pardonon? Spektantaro: [inaudible] DAVID Malan: Ne? Kie tiuj ŝlosilo valoro paroj venas? Diru denove? Denove? Ĉu mi la sola aŭdo ion? [Ridado] Tio pravas, jes? Spektantaro: [inaudible] DAVID Malan: Yeah, Ili veni de la query string. Do, se vi malantaŭenigi ĝustatempe al kiam ni ludis kun Google kaj ni iris al Google.com oblikvo serĉo demandosigno q egalas katoj, se mi batis Enter kaj se Google estis implementado en PHP, PHP kodo kiu Google skribis havus aliron al dolaro signo substreki GET interne de kiu Estas ŝlosila nomita Q kaj valoro vokis katojn ke povas tiam uzi kutimis fari faktan serĉo kun. Do, fakte, kion mi tuj do nun estas reiri al mia PHP kodo ke vi denove vidos pli de en PSet7. Kaj anstataŭ ŝtopanta en malmola kodita valoroj kiujn Ne ŝajnas kiel tre dinamikaj retejo, Mi tuj donos al vi teaser de kion via reala kodo farus. Vi metus en du demandosignojn ŝatas tion. Mi ne scias, kion la uzantnomo estas. Mi ne scias, kion la nomo tuj estos, sed mi scias ke mi povas akiri ilin dinamike. Do, se la kodo ni skribas nun estas la kodo kurante sur Google serviloj, aŭ se tio estas saluton punkto PHP, kiu venas kun PSet6, Mi tuj pasos en la konsulto funkcio nur kiel printf, du aliajn argumentojn. GET, citaĵo, unquote uzantnomo, kaj GET, citaĵo, unquote nomo. Kaj nun, rimarki kion la ĝenerala strukturo estas tie. Mi havas maldekstre mana flanko de la alvoko, tiu funkcio nomita query en PHP. Mi ankoraŭ havas kiel unua argumento, nur ŝnuron de teksto. Sed ke kordoj de teksto skribita en lingvo nomita SQL. Kaj sincere, ĝi ne estas granda lingvo. Ni nur tuj paroli pri ĝi formale hodiaŭ, vere. Kaj tiam en problemo aro sep, estas relative kelkaj trajtoj kiuj ni estas tuj utiligi. La demandosignojn, tamen, signifas konekti valoron tie kaj plug en alia valoro tie. Kaj rimarki, mi preterlasis kio el la tuta quote-- malbenita it-- ĉirkaŭ la citaĵo markas ĉi tempo. Mi preterlasis la citaĵo markojn ĉirkaŭ la demandosigno, bedaŭras, ĉifoje. Do, kio estas bela pri ĉi demandosigno trajto kiu PHP inklinas apogi, Ruby kaj Python kaj aliaj lingvoj, ĉi nur signifas ŝtopilo en iuj taksos tie kaj vi scias kion? Vi elkompreni se uzi solan citaĵoj aŭ duobla citaĵoj. Ne ĝenu min kun tiuj intelekte seninteresa detaloj. Sed, certigu ĝi estas korekta por ke mia kodo estas finfine operacia kaj sekura, kiu havos signifon antaŭ longe. Nun, kiom da argumentoj entute, nur por esti klara, estas la konsulto funkcio preno? Ĉiu volas voĉdoni por pli ol du? Tri? Certe, kial? Kial tri? Spektantaro: [inaudible] DAVID Malan: Ĝuste. La unua parto estas la kordo. La dua argumento estas dolaro signo substreki GET krampo uzantnomon. Kaj la tria argumento estas la samon, sed nur la nomon. Do alivorte, nun se mi havus ttt formo kiu devis teksto kampoj, unu por la uzanto salutnomo, unu por lia aŭ ŝia nomo, nur kiel vi vidus en retejo kiam vi registras por iu retejo, tio eble estu la kodo sur la dorso fino ke fakte faras la inserción nun en la datumbazo. Nun kontraste, ni rapide antaŭen. Supozu ke uzanto estas nun ensalutas, kaj vi volas skribi PHP kodo kiu kontrolas ĉu la persono kiu estas ĵus ensalutinta estas fakte uzanto, vi povas uzi sufiĉe simpla sintakso. Vi povas diri ELEKTU, ni diru Stelo, kie stelo signifas ĉion. Mi ne scias kion mi volas, do nur al mi ĉiuj kolumnoj de la tabelo nomata uzantoj kie, kaj tio estas agrabla. Elektu apogas kio estas nomata predikato, kiu estas kiel maniero de kvalifikanta kion vi volas. Kie salutnomo egalas citaĵo, unquote Malan. Do ankaŭ ĉi tie, mi enigita ene la argumento al PHP funkcio, linio de SQL-kodo. Kaj ke SQLa kodon ĉi tempo laŭvorte iri serĉi citaĵo, unquote Malan. Nun tio ne estas ĉiu, kiu estas utila, do mi tuj salti ke kaj mi tuj forsendos tiu beko de Brady, kaj iru kaj plug-in anstataŭ demandosigno tie. Do, nur por esti klara, kion do mia dua argumento estu se iu ĵus ensalutinta kaj mi volas kontroli ĉu li aŭ ŝi estas fakte uzanto? Spektantaro: [inaudible] DAVID Malan: Yeah. Mi aŭdas dolaro signo substreko GET citaĵo, unquote uzantnomon. Kaj ke devus reveni al mi iu el la vicoj en mia datumbazo kiuj havas salutnomon de Malan. Nun espereble, mi tuj reiros nulo se Malan neniam estis tie, aŭ se li havas. Mi ne devus reiri du aŭ tri aŭ kvar. Kial? Spektantaro: [inaudible] DAVID Malan: Mi diris unikan, dekstra? Simpla kialo. Mi pensis ĝi estas alvenis al esti unika, nur logike, vi povas nur havas nulo aŭ unu Malans en ĉi tiu aparta datumbazo tablo. Nun kiel flanken, nur do vi vidis ĝin, kvankam mi plu uzi GET kaj kvankam PSet6 nur uzita GET, vi certe povas havi POST. Kaj memoras ke Post estas alia tekniko por sendado informo de formo, sed ĝi ne montras supren en la URL. Ĝi estas iom pli sekuraj certe por aĵoj kiel salutnomoj kaj pasvortoj, kiu PSet7 estos, fakte, engaĝi. Do, ni faru tion en PHP MyAdmin kaj vidu kio okazas. Mi tuj iros al MySQL langeto. Kaj rimarki ke la defaŭlta valoro por PHP MyAdmin, nur por provi esti helpema, estas selekti stelo de uzantoj kie unu. Nu, unu estas ĉiam vera, do tiu havas la stultan efika de simple elektu ĉion. Sed mi tuj estos iom pli pedanta kaj permane tajpi el ELEKTU stelo de uzantoj. Nun teknike, vi povas citi la nomon de la tabloj. Ĝi estas malofta, ke vi devas, sed rimarki tiuj ne via normala citaĵoj sur Usono klavaro. Jen la tn backtick, kiu estas ĝenerale sur la supron maldekstra mano angulo de via klavaro. Sed estas malofta ke vi fakte bezonas zorgi pri tio, do mi simple preterlasi ilin ĉiuokaze. Do nun, lasu min iri antaŭen kaj batis iri. Kaj kiom da vicoj mi devus akiri reen kiam mi elektu stelon de uzantoj? Spektantaro: [inaudible] DAVID Malan: La nombro de vicoj, certas. Sed kiel multaj en tiu konkretan historion ĝuste nun? Du, ĉar ekzistis min kaj farigxis Rob. Do, se mi klakas Iru, mi vidas ke vide Mi alveninta reen ja du vicoj. Ekzistas multe de malordo sur la ekrano, sed mi nur vidas du vicoj. Kontraŭe, se mi faras tion denove kaj fari ELEKTU stelo de uzantoj, kie salutnomo egalas citaĵo, unquote Malan, nun se mi klakas Iru Mi nur tuj reiri unu vico. Kaj laste, se mi faras ion tiel, supozu ke mi ne gravas pri atingi ĉiu, kiu estas speco de sensignifa nun, ĉar tie estas nur du kolumnoj. Ne estas kiel mi elektanta grandega kvanto de datumoj. Eble mi antaŭeniru kaj ĉu SELECT nomo FROM uzantoj, kie salutnomo egalas Malan, kio estas agrabla pri SQLa honeste, estas ke ĝi vere nur faras kion vi diros ĝin fari. Estas bela konciza, sed vi laŭvorte nur sciigus tion kion vi volas fari. Elektu nomon de uzantoj kie la salutnomo egalas Malan. Kaj ĝi vere estas ke eksplicitaj. Do, nun se mi batis Iru kiom vicoj mi tuj reiri? Unu, ĉar ĝi estas nur Malan, espereble. Aŭ nulo se li ne tie, sed oni maksimume. Kaj kiom da kolumnoj Mi reiros? Kiom da kolumnoj? Ĉi tiu fojo, mi simple tuj akiri unu, ĉar mi ne elektu stelon, kiu estas ĉio. Nun mi elektante nur nomo, do mi nur reiri unu kolumno kaj unu vico. Kaj ĝi aspektas ia taŭge ridindaj, nur rigardante super malgranda kiel tiu. Do, kio vere okazas? Kiam vi ekzekuti SQLa query uzante unuaranga, kio vi fariĝas reen de la datumbazo estas kiel tabulo temporal kun vicoj kaj kolumnoj, eble, sed ke preterlasi ion, kio ne vere elektitaj de vi. Do, estas kiel se iu havis grandan kalkultabelo de ĉiuj studentoj registritaj por iuj studenta grupo, kaj vi diras, donu al mi ĉiujn la unuajarulo kiu havas registrita por nia studenta grupo, kio via kolego en la studenta grupo plenumadu Estas ili povis nur transdoni vi la tutan tabelon. Tio estas kiel diri unuaranga stelo. Kaj ĝi estas iom ĝena se vi nur volis ke la unuajarulo. Kaj do, se vi anstataŭe diris, unuaranga stelo el datumbazo tablo kie jaro egalas citaĵo, unquote unuajarulo, ĝi estas kvazaŭ via amiko en la studenta grupo laŭvorte reliefigita kaj kopiitaj nur la unuajarulo vicoj, pasted ilin en novan Google Kalkultabelo aŭ Excel-dosiero, kaj enmanigis vin reen la rezulta dosiero nur. Jen ĉio tio okazas sur koncepte tie. Do en la fino, ni povas fari iu bela imago aferoj stokante aferojn kiel salutnomoj kaj pasvortoj kaj similaj. Sed, verŝajne, ni devus fari iom malsame ol ĉi. Ĝi ne estas ke nur inteligentaj stoki salutnomon kaj pasvorton. Iu antaŭe, mi pensas malsupren tie, sugestis IRU. Nun IRU povus esti kiel Harvard ID aŭ Yale Net IRU, sed povus esti ecx pli simple en nia datumbazo kazo. Kaj efektive, la komuna kazo estas havi alian kolumnon. Kaj mi tuj iri antaŭen kaj redakti mia tablo. Kaj se vi amuziĝu kun tiu interfaco por PSet7, vi vidos ke vi povas kontroli tiun butonon tie kaj aldoni kampo komence de la tablo. Kaj nun se mi klakas Go, ĝi tuj doni al mi unu el tiuj formoj de antaŭe. Mi tuj aldonu kampon vokis ID. Kaj mi tuj faras ĝin nombran tipon. Mi havas tutan faskon de valoroj por numerics. Mi simple tuj elekti INT kaj Ne maltrankviliĝu pri la malsimilajn grandecojn. Mi ne devas specifi longitudon aŭ valoron, ĉar ĝi tuj estu 32 bitoj negrave kio. Atributoj, ni ne vidis antaŭe. Ajna intereso en iu el tiuj menuo opcioj ĉi tempo? Por int? Kion vi proponas? Neniu? Ĉu iu el tiuj havas sencon? Yeah. Yeah, sensigna, dekstra? Ĝenerale, se ni tuj donu ĉiuj unikan numeron, kiu estas kie ĉi rakonto estas irante, mi vere volas nur persono al havi la numeron kiel nulon kaj unu kaj du kaj tri kaj kvar. Mi ne bezonas pritrakti kun negativaj nombroj. Ĝi nur ŝajnas kiel troa komplikeco. Mi volas kvar miliardoj eblaj valoroj, ne kvar miliardoj eblaj valoroj, do mi nur duobligis la kapablo de mia INT. Kiel flanken, se vi volas rilatigi ĉi al io kiel Facebook, reen en varo de mia tago Facebook unua eliris, Mi kredas kion ili uzante en lia MySQL datenbazo stoki uzanto identigilon, estis nur INT. Sed kompreneble ekzistas multe de realaj homoj en la mondo. Ekzistas multe de falsaj Facebook kontoj en la mondo. Kaj tial fine, Facebook superfluis la grandeco de int, kvar miliardoj valoron. Tial, se vi rigardas ĉirkaŭe kaj ekzistas retejoj kiu povas diri al vi kion Via unika ID estas. Kaj se vi neniam elektis salutnomon en Facebook, vi vidos vian unikan ID. Mi kredas ke estas profilon skalara PHP demandosigno ID egalas ion. Ke estas nun io kiel granda INT, aŭ longa longa se vi volas, kiu estas 64-bita valoro aŭ io komparebla. Do, eĉ en la reala mondo faras cxi temoj finfine foje gravas. Kaj ĝi rezultas tie, se mi donante ĉiujn miajn uzantoj unika ID, Mi volas esti super eksplicita kaj minimume fari Use unika. Sed rezultu ke estas unu peco de nomenclatura hodiaŭ tro jen primara ŝlosilo. Se vi desegnante datumbazo tablo kaj vi scias anticipe ke unu el la kolumnoj en tiu tabelo devus kaj estos unike identigi vicoj en la tablon, vi volas entajpi ĝin kaj diri la datumbazo, tio estas mia primara ŝlosilo. Tie povus esti duobligitaj en aliaj kampoj, sed mi diras al la datumbazo tiu ĉi Mia primara, mia plej grava kampo, ke estas garantiita esti unika. Nun, ĉi tio ŝajnas redunda. Mi nun proponas, ke ni aldoni, klakante Konservu tie, kampo called-- kaj mi tuj iri antaŭen kaj klaku AI, ni revenos al kiu tre frue, Save. Mi proponas nun ke Mia tablo aspekti ĉi. Mi havas int kampo nomata ID, char kampo nomita Uzulnomo: a VARCHAR kampo nomata nomo, sed ID, se ĝi estas primara kaj tial unika, kial mi simple malŝparos tempo enkondukante kio efike estas dua unika kampo nomata ID kiu estas int? Uzulnomo: revokon, estis jam solaj, ni diris. Do simple logike, vi ne bezonas ajna datumbazo sperton al kialo tra ĉi, kial eble mi enkondukis int kiel mian solan ensalutilo tiel? Kio this-- rediras? Spektantaro: [inaudible] DAVID Malan: Hazarda aliro estas pli facila, kial? Spektantaro: [inaudible] DAVID Malan: Jes, ĝi estas nur aliranta nombroj. Do, se vi pensas pri tiu vere estas tabulo, kiel tabelo, nun mi havas unika ensalutiloj ke mi povas salti ĉirkaŭe. Kaj pli bona ol tio ankoraŭ estas ke kiom granda estas int tuj estos denove? 32 bitoj aŭ kvar bitokoj. Kiom granda estas mia uzantonomo tuj estos? Maksimume? 16 bajtoj. Do, se vi vere zorgas pri la rendimenton de via kodo, pensas reen al PSet5, vi preferas serĉi kvar bajto valoro aŭ 16 bajto valoron, ĉu ne? Vere estas tiel simpla kiel tio. Vi devas fari kvaroblon laboro serĉi salutnomoj ĉar tiuj estas 16 bajtoj. Do, vi devas laŭvorte kompari ĉiuj 16 bajtoj por esti certa jes, tiu estas uzantonomo mi volas. Dum por INT, vi povas faru ĝin kun nur kvar bajtoj. Kaj kiel flanken por tiuj interesita en komputila aparataro, ĝi rezultas vi povas adapti io kiel int aŭ 32-bita valoro en iu nomata registro en komputilo CPU, kiu signifas ĝi estas super, super rapida, eĉ ĉe la plej malalta nivelo de la komputila aparataro. Do, ekzistas nur avantaĝojn cxirkauxe. Do, kion tio signifu? Fakte, kiam vi desegni datumbazon tablo, preskaŭ ĉiuj de la tempo vi havos ne nur la datumoj vi zorgas pri, sed ankaŭ ion kiel identificador sola ĉar ĉi tiu tuj ni fari aliajn aferojn. Kaj ni stumbli unu problemo tie. Supozu ke uzantoj ne nur salutnomoj kaj nomoj sed ili ankaŭ havas aĵojn kiel urboj kaj statoj kaj poŝtkodoj, almenaŭ tie en Usono. Do, mi tuj iros antaŭen kaj nur rapide diru, donu al mi tri pli kolumnoj ĉe la fino de la tablo. Kaj tiu tuj estos Urbo, ĉi tiu tuj estos ŝtato, kaj ĉi tiu tuj estos Zip. Nun Urbo, kion datumtipoj devus esti tiu, eble? VARCHAR? Mi ne scias, kion la plej longa nomo urbo. Ie en Ameriko, ekzistas probable iuj ridinde longa vorto, Do ni nur iri kun 255, iom historie aŭ arbitre. Stato, kion vi volas fari? Juĝo alvokon, ĉu ne? Kio eble la plej efika? Kiom da karakteroj? Eble nur du, se ni povas senpune faranta nur, kiel, MA por Masaĉuseco kaj tiel antaŭen. Do, mi tuj iros char valoron de du. Poŝtkodo estas interesa. Ni estas ĉi tie en 02138, tiel ke sugestas ni devus uzi kion? Estas int, dekstra? INT, INT, mallonga? Mallonga laborus. Neniu? CHAR aŭ kvin, sed mi volas int. Kial puŝi reen sur int? Persvadi min de tiu. Kio estas stultaj pri int, mia ideo? Yeah. Spektantaro: Prenu pli da memoro. DAVID Malan: Prenu pli da memoro. Kvar bajtoj, sed vi estas proponante poŝtkodo kiel kvin bajtoj aŭ iu estis kiel char, kiuj sentas he, tio ne vere la kazo. Nu, amuza rakonto. Antaŭ jaroj, kiam mi kutimis uzi Microsoft Outlook por mia retpoŝto, Mi poste volis ŝanĝi al Gmail. Kaj do, mi eksportas ĉiuj miaj kontaktoj de Outlook kiel CSV-dosiero. Komo apartigis valorojn, kio ĝuste signifis min havis ĉiuj miaj amikoj nomoj kaj lasta nomoj kaj telefonnumerojn kaj poŝtkodoj kaj ĉiujn kiuj. Kaj tiam mi faris la eraro de malfermanta ĝin en Excel, kiu estas kalkultabelo programo kiu komprenas CSV dosierojn kiel ni vidis. Sed tiam, mi devas esti frapita, kiel, Komando aŭ Kontrolo S ĉe unu punkto. Kaj Excel ŝajne tiutempe havis trajto per kiu ajn ĝi vidis plurajn, ĝi provis esti helpema. Kaj se tiu nombro komencis kun nuloj, estus simple forigi ilin. Kial vi bezonas gvida nuloj sur entjeroj? Ili estas sensignifa, matematike. Ili ne estas sensignifa en Usono Poŝta sistemo. Do, mi havis dum jaroj, al tiu tago, mi ankoraŭ havas amikojn, ke kiam la malofta kazo ke mi bezonas ke iu estas alparoli tiujn tagojn, Mi ankoraŭ vidas ke mi havas amikon en Cambridge, Masaĉuseco, 2138. Kaj estas ĝena se vi estas provas ordigi de programmatically generi kovertoj aŭ nur jot ĝi malsupren. Kaj tio estas pro ĉi tiu kialo, Mi elektis la malĝustan datumtipo. Do, mi amas vian ideon. Ni uzas char kampo. Kvin karakteroj, krom estas angulo kazo. Se vi ankoraŭ sendu mesagxon, kelkfoje poŝtkodoj tiuj tagoj, ili estas, kiel, plus kvar. Do, ni bezonas streketo kaj tiam ni bezonas kvar pli numeroj. Do por esti honesta, ĝi povis iri diversmaniere. Nuntempe, mi tuj konservi ĝin simpla kaj mi estas nur dironta ke ĝi estas kvin CHAR valoro kaj ni tuj transsaltu la tuta haltostreko plus kvar. Sed tiuj estas la specoj de tradeoffs. Kaj vi povas pensi pri la samaj problemoj ekestanta kun telefono nombroj aŭ aliaj kampoj. Kaj nun jen estas vere malsagxa vojo iri malsupren. Supozu ambaŭ Rob kaj mi kaj Hannah kaj Maria kaj [? Davon?] Kaj Andy kaj aliaj sur la kunlaborantaro ĉiuj vivas en Cambridge, Massachusetts, 02138. Tiu fakte sentas stulta ke mi estas aldonante al miaj uzantoj tablo, urbo, stato, kaj ZIP. Kial? Spektantaro: [inaudible] DAVID Malan: Diru denove? Spektantaro: [inaudible] DAVID Malan: Ili estas ĉiam tuj iru kune, ĉu ne? Kiam ĝi turnas, ni kutimis pensi tio estis la kazo ĝis ni ĝisfunde traserĉis la tutan Usonon, kaj rezultas ke estas iuj inconsistencias kie multnombraj vilaĝoj havas la sama zip, kio estas bizara. Sed, se ni kondiĉas nun ke 02138 ĉiam Kembriĝo, Masaĉuseco, kial en la mondo volus vin gardi en via datumbazo Kembriĝo kaj MA kaj 02138 por mi kaj por Hannah kaj por Rob kaj por [? Davon?] Kaj por aliaj kiuj vivas tie en Cambridge, ĝi estas perfekte redunda. Ni devas foriri kun ĵus stokante kio? Nur la poŝtkodo. Sed tiam, se ni stoki ĝuste la poŝtkodo, mi volas, probable, por mia retejo scii kie 02138 estas. Do, mi bezonas alian tablon. Kaj tio estas bone. Kaj fakte, tiu estas unu el la dezajno procezoj de desegni tabloj ke vi faros en PSet7 tiel whereby vi volas faktora el komuna datumo. Ĝuste kiel ni estis faktoranta ekster komuna kodo kaj faktoranta ekster komuna stiloj de CSS, tie tro en la datumbazo, se mi nur bezonas 02138 al unike identigi ies hejmurbo, ne stokas Kembriĝo, Meso por ĉiun Darn uzanto en via tablo. Anstataŭe, ili havas apartan tablon nomita Zips ke devus havi kion kolumnoj? Probable IRU kampo, nur ĉar, por la principoj ni parolas pri nun. Probable zip kampo por 02138. Kaj tiam probable kion aliaj kolumnoj? Urbo kaj ŝtato, sed nur havas unu vico por 02138, unu vico por 02139, unu linio por 90210. Kaj tio estas laŭvorte ĉiuj poŝtkodoj mi scias. Do nun, kion vi povas fari? Tio estas problema, ĉar nun mi havas du tabloj. Do, mia uzantojn estas plejparte super tie, Sed ilia urbo ŝtata informo estas super tie. Do, rezultas kun SQL, ekzistas fakte manieron aliĝi informo, kaj vi vidos tion en la pset. Sed ĝi rezultas vi povas fari ion kiel tiu. ELEKTU stelo de uzantoj, JOIN zips SUR uzantoj dot zip egalas zips dot zip. Kiu estas iom wordy, Certe, sed tiu nur signifas unuaranga ĉion de la procezo de prenanta mian uzantoj tablo kaj mia zips tablo. Aliĝi ilin sur la kampo ili havas en kolumno. Do, laŭvorte faras ion kiel tiun, kaj redonu al mi nova portempa tablo jen pli larĝa, ke estas pli granda, kiu havas ĉiujn de la kolumnoj de ambaux. Kaj ke, tute simple, estus la sintakso por fari ion kiel tiu. Do, tie estas tio antaŭen, sed tie okazas esti alia dezajno decidoj vi instruos vin devas fari, ne nur kun indeksoj sed ankaŭ koliziante defioj. Fakte, Tie estas defio en ajna datumbazo dezajno whereby kelkfoje du homoj povus voli aliri la samajn vicojn de la datumbazo tablo. Do, tiu estas iu kiu ni renkontas en PSet7 tiel. Sed mi pensis mi rigardu unu atako kiu estas ebla en SQL. Kio estas kelkaj de la problemoj kiuj povas ekesti? Do, vi renkontas tiun en PSet7. Kaj ni diras al vi rekte, kion la kodigo solvo por tiu problemo estas. Sed se vi prenas pli altan nivelon klaso, speciale en operaciumoj, vi tuj renkontas elfluon de atomicidad, la problemo de provanta fari multnombraj aferojn samtempe sen interrompo. Kaj mi decidis enkonduki tiun ideo por PSet7 kun metaforo ke mi lernis mem en Margo Seltzer la CS164 operaciumoj klaso jaroj. Supozu ke vi havas unu el ĉi tiuj dormejo fridujoj en via dormejo ĉambro aŭ domo, kaj vi havas veran inklino al lakto. Kaj do, vi revenas hejmen el klasoj unu tagon, vi malfermas la fridujon. Ho, malbenita ĝi. Mankas lakto en la fridujo. Do, vi fermas la fridujon, ŝlosi la pordon, ŝlosi via dormejo, marŝi ĉirkaŭ la angulo al CVS, akiri en linio, kaj komenci kontrolanta iun lakton. Kaj ĝi tuj preni momenton, ĉar tiuj malbenita memon kaso nombriloj preni ĉiam uzi ĉiukaze. Do dume, via kunloĝanto venas hejmen. Li aŭ ŝi vere ŝatas lakto ankaŭ. Ili venis en la dormejo ĉambro, malfermos la fridujo, ho, Darn ĝi. Mankas pli lakto. Do, li aŭ ŝi ankaŭ iras ĉirkaŭ la angulo. Sed nun, kiam ekzistas kiel du aŭ tri aŭ kvar CVSes proksima, ili okazas por iri al unu el la malsamaj en la placo. Kaj tial nun, kelkajn minutojn poste, vi ambaŭ venas hejmen kaj uf, plej malbona problemo neniam. Nun vi havas tro da lakto ĉar ĝi tuj iros nematurajn. Kaj vi ŝatas lakton, sed vi ne vere ŝatas lakto. Do nun, tiu estis multekosta eraro ĉar vi ambaŭ faris decidon bazita sur la stato de iu variablo ke estis en la procezo de esti ŝanĝita de vi, iniciatoro de ricevos lakton. Do, kio estas eble homan solvo al tiu problemo? Spektantaro: [inaudible] DAVID Malan: Lasi noton, dekstra? Ĉiam skribu peton, se vi estas familiara kun tiu spektaklo. Jes, estas du el ni. Do, ĉiam skribu peton, aŭ laŭvorte ŝlosi la fridujon kun ia pendseruro aŭ io super la pinto tiel. Sed tio fakte tuj estos ŝlosila problemo kun datumbazo dezajno, Precipe kiam vi povus havi multoblaj retumiloj, multnombraj tekkomputiloj, multnombraj uzantoj ĉiuj provas ĝisdatigi informojn senprokraste. Aparte sentema informo kiel financa informo, whereby per provizo komercanta retejo kiel vi konstruos, kio se vi volas kontroli kiom monon vi havas kaj tiam se vi havas multe, aĉeti stoko? Sed kio se iu alia kiu havas komunan konton kun vi estas samtempe provanta aĉeti iuj proviza? Do, li aŭ ŝi estas kontrolanta la konto ekvilibro, ambaŭ de vi reiri la saman respondon, ne estas lakto. Aŭ vi ambaŭ reiri la respondo, vi havas $ 100 en la konto. Ambaŭ vi provos fari la decidon aĉeti unu porcion de iu kompanio stoko. Kaj nun kio okazas? Vi havas du agoj? Vi ne havas akciojn? Problemoj kiel tio povas ekesti. Do, ni renkontas tiu. SQL injekto atakoj, dankeme, Estas io ni helpos vin kun, sed tiuj estas atrociously komuna tiuj tagoj ankoraŭ. Do, tiu estas nur ekzemplo. Mi ne faru asertojn kiujn Harvard PIN sistemo estas vundeblaj al ĉi aparta atako. Ni provis. Sed, vi scias ke ni havi kampo kiel tiu. Kaj Yale Net ID havas similan rigardante ekrano tiujn tagojn. Kaj ĝi rezultas, ke eble la PIN sistemo estas efektivigita en PHP. Kaj se were-- estas not-- ili havu kodo kiu similas ĉi. Ili havas du variabloj. Donu al mi la uzantnomon kaj pasvorton el la post super tutmonda variablo ke ni parolis pri antaŭe. Eble Harvard havas query kiel ELEKTU stelo de uzantoj kie salutnomo egalas ke kaj pasvorton egalas tio. Kaj rimarki ke mi estas nur ŝtopanta ĝin en uzanta la krispa streĉa notacio de la aliaj tago, kio signifas nur ŝtopi en valoro tie. Mi ne uzante la demandosigno tekniko. Mi ne havas ajnan dua aŭ tria argumentoj. Mi estas nur laŭvorte konstrui la kordo mem. La problemo, tamen, estas ke se iu ŝatas scroob, kiu estas referenco al filmo, ensalutas per io tiamaniere, kaj mi forigis la punktojn kiuj kutimas kovri pasvortojn, se li estas aparte malica kaj lia pasvorton eble estas 12345, po la filmo nomita "Spaceballs" sed li kritike tipoj de sola citaĵo post la kvin, tiam laŭvorte la vorto aŭ en la spaco, kaj tiam citaĵo, unquote unu egalas citaĵo unu, Sed rimarki li preterlasis kio? Li preterlasis la citaĵo dekstre kaj li preterlasis la citaĵo maldekstre. Ĉar se tiu atacante scroob la supozo estas ke la personoj kiuj skribis ĉi PHP kodo ne estis tiel brila, eble ili nur havas iom sola citaĵoj ĉirkaŭ la interpola de variablo en buklaj krampoj? Kaj do eble li povus, speco de kompletigi lia penso por ili, sed en maniero kiu okazas permesos al li hakis en la PIN sistemo. Alivorte, supozi ke tiu estas la kodo kaj ni nun ŝtopi en kion scroob tajpita. Kaj ĝi estas ruĝa, ĉar ĝi estas malbona. Kaj la suba teksto estas kion li entajpis, scroob povus trompi Harvard servilo en konstruanta SQL query ŝnuro kiu similas ĉi. Pasvorto egalas 12345 aŭ unu egalas unu. La rezulto de kiu, logike, estas ke tiu estos log scroob en se lia pasvorto estas 12345 aŭ se unu egaluloj unu, kio estas kompreneble ĉiam vera, kio signifas scroob ĉiam ricevas en. Kaj do, la maniero ripari tiu, kiel en multaj kazoj, estus skribi pli defende. Uzi ion kiel nia fakta query funkcio, kiun vi vidos en PSet7, kie ni konekti io kiel demandosignojn tie. Kaj la beleco de la query funkcio kiu ni doni vin estas protektas kontraŭ tiuj tn SQL injekto atakoj, kie iu trompante vian kodon en injekti siajn proprajn SQL kodo. Pro kio la konsulto funkcio Ni donas vin efektive fari, se vi uzas la demandosigno sintakso kaj dua kaj tria argumento tie, Estas kion lin aldonas al la enigo ke la uzanto preparis? Tiuj backslash citaĵoj. Do, ĝi eskapas ajna potenciale danĝeraj karakteroj. Ĉi aspektas strangaj nun, sed ĝi ne estas vundebla ĉar ne ŝanĝi la logikon anymore ĉar tiu tuta pasvorto estas nun sola citaĵo tio ne, fakte, scroob pasvorton. Do, tie jam kelkaj ŝercoj pri tiu super la jaroj. Do, tio estis fotita de iu geek en parkejo whereby vi sciu ke kelkaj urboj kaj statoj provi skani via licenco lado al Bill vi aŭ bileto vi se vi iros tra ekstere, kiel, la E-Z Pass afero. Do, tiu persono paradas ke eble la personoj skribas la E-Z Pass sistemo ne tiel brila, kaj eble ili nur kroĉitaj kune cxeno, por ke li aŭ ŝi ne povis malice ne nur kompletigas lia penso, sed reale ekzekuti malbona komando, kiun ni ne menciis ankoraux, sed vi versxajne povas diveni. Ke krom forviŝi kaj enmeti kaj ĝisdatigo kaj selekti, ekzistas ankaŭ ŝlosilvorto nomita guto, kiu laŭvorte forigas ĉiun en la datumbazo, kiu estas aparte malbona. Ni povas zomi en sur ĉi se estas iom malfacile vidi. Tiu nun estas fama karikaturo ke estas mirinde saĝaj nun kaj komprenebla. [Ridado] Yeah, malvarmeta. Speco de geeking eksteren. Do tiuj, do, estas SQL injekto atakoj. Kaj ili estas tiel facile eviti per uzo dekstren kodo aŭ la dekstra bibliotekoj. Kaj vi vidos en PSet7, jen kial ni doni vin la konsulto funkcio. Do, paro de teasers ke ni pensis ke ni al vi ĉi tie en nia ceteraj minutoj kune. Do, kiel vi memoras el semajno nulo, ni enkondukis tiujn du ampoloj kiuj estas belaj, ne nur ĉar ili estas belaj kaj estas buntaj, sed ĉar ili apogas ion nomita API, apliko Programado Interfaco Kaj en CS50 tiele nun, ni plejparte temigis GET kaj POST, sed ĝi rezultas ekzistas aliaj HTTP verboj kiel meti. Kaj fakte, tiu estis slide de semajno nulo per kio se vi skribas kodo kiu sendas a la PSet6 HTTP peto ke aspektas kiel tiu kun ĉi eron de teksto ĉe la malsupro, nomata JSON, aŭ JavaScript Objekto Skribmaniero ke ni parolos pri venontsemajne, vi povas ŝalti aŭ elŝalti aŭ ŝanĝo la koloro de lumoj kiel tiuj. Do se CS50 ankaŭ havas krom kelkaj de tiuj ampoloj tie en New Haven se vi ŝatus prunteprenos ilin por fina projektoj, ankaŭ iuj Microsoft Bandoj, kiuj estas kiel rigardas ke vi portas ĉirkaŭ via pojno ke simile havas API por ke vi povas skribi vian propran programaron por ili. Ni havas konton kun Apple iOS kodon tiel ke se vi havas Apple aŭ Watch iPhone aŭ iPad aŭ iPod, vi povas skribi kodon kiu fakte kuras sur tiuj. Ni havas tutan faskon de Arduinos, kiuj estas malgrandaĵeto komputiloj sen kazoj, esence, ke vi povas konekti tra USB, tipe al via propra Mac aŭ PC, skribi kodon kiu funkcias sur tiuj fizikaj mekanismoj kiuj ofte havas sentilojn sur ilin do vi povas interagi kun la reala mondo. Ni havas tutan faskon de Leap Motion aparatoj, kiu estas USB aparatoj por Macs kaj PC, tie kaj denove, en New Haven. Kaj se vi konektas ĝin al via Mac, vi efektive povas kontroli vian komputilon skribante softvaron ke per transruĝaj radioj, figuroj el kie viaj homaj manoj estas, eĉ sen tuŝi via klavaro. Ni pensis ke ni dividas rapidan duonvidi ĉe tio, ekzemple. [MUZIKO Ludante] Do, ni havas tutajn faskon el tiuj aferoj, Ankaŭ nomita Myo brako bandoj kiun vi starigos super via antaŭbrako kaj tiam vi povas kontroli la realan mondo aŭ la virtuala mondo tiel. [MUZIKO Ludante] Aŭ, ni ankaŭ havas iuj Google Kartono, kiu estas laŭvorte, kiel, kartona skatolo vi povus meti sur vian vizaĝon, sed glito en via telefono en ĝin por ke vi metis la glason de via telefono vere proksime al viaj okuloj. Kaj Google Kartono estas tre malinda je $ 10 aŭ $ 20. Kaj ĝi havas malmultan lensoj ke iomete ekstere ŝanĝo la bildo sur la ekrano por via homa okulojn doni al vi la senton de profundo por ke vi efektive havas 3D medio antaŭ vi. Ni ankaŭ havas iuj Samsung Gear, kiu Estas la pli altekosta versio de ĉi, sed kiuj povas simile gliti en Android telefono kaj doni vin la iluzio of-- aŭ doni la sperto de virtuala realaĵo. Kaj en niaj finaj du minutoj, ni pensis ke ni provos fari tion. Se mi povas projekti kio Colton havas tien ĝuste por iri malfermante buŝo, lasu min antaŭeniri kaj ĵeti supren sur la granda ekrano tie. Lasu min mortigi la lumoj. Colton, ĉu vi volas antaŭeniri kaj metu sur via ĉelo dum momento kaj venis sur super al la mezo de la scenejo? Kaj ĉu vi volas project-- jen kion Colton vidas. Nun, la Wi-Fi en tie estas Ne tiel forta por ĉi tiu mekanismo ke tiu estas súper konvinka, sed Colton estas laŭvorte en tiu magia futurisma loko. Li vidas nur unu bildo. Vi vidas sia maldekstra kaj dekstra okulo ke lia cerbo estas stitching kune en tridimensia medion sur lia vizagxo. Li ĵus elektis menuopcion tie. Kaj tiel denove, li surhavas ĉi aŭdilo kun Samsung telefono sur ĝi jen inalámbricamente projektante nian superkape. Nun vi sur Marso, ĉu ne? COLTON: Mi kredas tiel. Mi ne certas [inaudible]. [Ridado] DAVID Malan: Rezultas Marso havas tiuj menuoj. COLTON: [inaudible] iu malvarmeta lokoj se ni volas iri to-- DAVID Malan: Kie ni volas iri? COLTON: [inaudible] DAVID Malan: Kaj ni vidu kie Colton a pren us nun. COLTON: [inaudible] DAVID Malan: Do, tie estas tiom da malsamaj lokoj vi povas preni vin mem. Ekzistas FAPIs per kiu vi povas skribi ludojn aŭ interagoj kiuj kuri, finfine, en la telefono. Do, vi vere nur skribanta poŝtelefono app. Sed danke al la programaro kaj la grafikaj kapabloj, nun Colton estas en ĉi eta dometon. Kaj riske de abrumadora ni mem, Colton kaj mi persistos proksimume por dum ĉe la fino de klaso tie hodiaŭ se vi ŝatus veni kaj ludi. Kaj ni alportas ilin reen venontsemajne tiel. Sen pli, Ado jen ĝi por hodiaŭ. Ni vidos vin proksima semajno. [MUZIKO - Ragga Twins, "Bad Man"]