[Powered by Google Translate] [Walkthrough Problem Set 7] [Zamyla Chan] [Harvard University] [Dette er CS50] [CS50.TV] Hei alle sammen, og velkommen til Walkthrough 7, CS50 Finance. Nå er vi offisielt ferdig med alle psets i CS50, og vi bare igjen med en mer som kommer til å være en morsom implementering av et nettsted der brukerne kan logge på CS50 Finans og kjøpe og selge aksjer. I dag, skal vi ha noen verktøy til rådighet. Vi kommer til å snakke om tillatelser. Når du har en web-mappe, du kommer til å ønske å tillate brukere å utføre visse filer men også bare lese andre seg, så vi vil se nærmere tillatelser og hvordan du kan sette dem. Så vi kommer til å se nærmere på PHP, HTML og SQL-kode. Først tillatelser. Når du er på terminalen i en bestemt katalog, så hva du ønsker å gjøre er du ønsker å kjøre chmod kommandoen. Det er etterfulgt av enten bokstaver eller tall tilsvarende det du i utgangspunktet vil at verden skal se, deg selv å se, etc. For eksempel, når du har en mappe, så du ønsker at mappen skal være kjørbare av alle som ser det, så hva ville du gjøre er at du kan kjøre kommandoen chmod a + x og deretter navnet på mappen din. Når du har en fil som CSS-filer eller bildefiler - som JPEG og punktgrafikk, ting som det, eller noen JavaScript-kode - du vil at skal kunne leses av alle, så da hva du gjør er at du kan bruke wildcard - som er en stjerne - i utgangspunktet indikere i CSS-mappen - alt i denne mappen -  Jeg kommer til å si at det kommer til å kunne leses av alle. Med tillatelser, når vi bruker bokstavene, Vi kan også bruke tall i stedet. Så, ser du at til slutt når du vil ha noe å være kjørbare - som er representert ved tallet 1 - noe å være lesbar er nummer 4 og deretter - skrivbar er nummer 2 - og så egentlig når du vil ha en kombinasjon av disse, så du legger dem til. Hvis du vil ha noe å være lesbar, skrivbar, og kjørbar, så ville du legge opp 4, 2 og 1, og som vil gi deg 7, så når du har en mappe du vil at skal være kjørbare av alle - samt lesbar og skrivbar - så du gjør at 7, 1, 1. Det ville være 7 for deg, så en for andre mennesker. Når du har spec, vil det faktisk spesifisere hvilke mapper og hvilke filer må være chmod-ed spesifikt. For eksempel, når du har mapper - de er 7-1-1 - når du har bilder eller HTML, CSS, JavaScript, da de kommer til å være 6, 0, 4 - eller 6, 4, 4 - og deretter PHP-filer skal være 6, 0, 0. Tanken bak det er at brukerne ikke skal faktisk se PHP-kode, men bare være i stand til å se resultatet. Flott! Flytte inn PHP. Ganske enkelt, når du vil ha en PHP-fil, er filsuffiks. Php. Du kan også blande HTML med PHP-kode. Hvis du har en HTML-fil, for eksempel, så kan du legge den med venstre vinkel, spørsmålstegn, php - sette php kode - og deretter lukke det med en annen spørsmålstegn og en rett vinkel. Variabler i PHP er mye lettere å håndtere enn variabler i C. Enhver variabel starter bare med et dollartegn foran det, og de er svakt skrevet. Det betyr at du ikke trenger å bekymre deg for å sette noe lik en streng eller et heltall. Du kan rett og slett si, dette er mitt navn på variabelen og så er dette sin verdi, så det kommer til å bli lettere å håndtere det. En annen ting er at PHP kan du bruke assosiative arrays. Du kan rett og slett definere en rekke som du ville gjort i C ved å si, dollar sign-navnet på array-likemenn, og deretter i hakeparenteser har i utgangspunktet bare en liste over verdier av alle elementene i matrisen. Men, i PHP hva du kan også gjøre er spesifisere utgangspunktet - Det er typen som en hash-funksjon. Du kan angi indeksen - hva du vil kalle det - og deretter som svarer til en verdi. Hvis du faktisk passere i en 1 =, b = 2, c = 3, deretter din matrise på indeksen en vil gi deg en. Dette pset vil varme deg opp med noen PHP i en del av spørsmålene, og vi dykke inn CS50 Finance. Vi har et par - har vi noe funksjonalitet, i utgangspunktet, å gjennomføre i dette nettstedet. Vi ønsker å tillate brukere å registrere seg i vår nettside med et brukernavn og et passord. Vi ønsker å tillate dem å slå opp et sitat, og deretter vil vi skrive ut navnet på dette sitatet, så vel som den nåværende prisen som det er. Vi ønsker å tillate dem å se en portefølje av alle aksjene som de har kjøpt så langt. Vi ønsker også å tillate dem å kjøpe aksjer samt selge dem. Og så til slutt, ønsker vi å tillate dem å se historien av alle transaksjoner som de har gjort. Så, til slutt, etter at du har gjennomført alt dette, da er du fri til å implementere en ekstra funksjon. Vi vil gå inn i dem. De kan enten være slik at brukerne kan få ekstra penger ved å deponere ekstra penger, eller du kan tillate dem å endre passordet, eller noe sånt, e dem en kvittering når de kjøper eller selger en aksje. Det er en begrenset liste over funksjoner som du kan implementere selv, så det er den siste der. Siden dette er et nettsted, dere har også en stor frihet til å tilpasse den. Vi gjør gi noen CSS-kode, men du er definitivt fri til å finpusse det, gjør det ser bedre, men underliggende er det en grunnleggende funksjonalitet så alltid forholde seg til spec om hva du faktisk trenger å inkludere det. Etter spec, vi skal bruke apparatet som også en server. Det kommer til å være vertskap for vår hjemmeside for oss, på sin lokale server. Hvis du følger disse instruksjonene og pakk ut pset 7 distribusjon kode inn din virtuelle host / lokale verten mappe,  så kan du bare gå http://localhost/ i Google Chrome i apparatet, og så ville du komme koden som du har skrevet pset 7. Pset 7 kommer med en haug med distribusjon kode, og forhåpentligvis Vi hare - gjennom alle psets før dette - vant oss til å lese gjennom distribusjon kode, forstå hvilke funksjoner er allerede gitt, og hvordan vi kan være i stand til å bruke disse og de andre funksjonene som vi kommer til å implementere. I dette tilfellet har vi tre mapper. Vi har en HTML-mappe, en inkluderer mappe, og en maler-mappen. Det vi skal gjøre med dette pset er slags skille tenkning - programmering tenkning - av PHP-koden med den faktiske visuelle aspektet. Vi vil ha en PHP-fil som gjør alt de tenker, leser inn i databasen, skriver ut ting, har hvis uttalelser - sånt - og deretter som vil sende data inn i vår mal fil - eller template.php fil. Hva som vil gjøre er å lese dataene og deretter vil det skrive den ut. Vi kan behandle maler som "dumme" i at vi ikke egentlig vil ha dem til å gjøre mye arbeid i å beregne ting. Vi ønsker at våre kontrollere for å gjøre det. En liten bit på det - la oss ta en titt på noen av distribusjonen koden. Her har vi vår index.html fil, og det er ganske tom. Egentlig hva det gjør - det sier vel, jeg kommer til å kreve configuration.php filen. Vi ser ikke at akkurat der, men det er i utgangspunktet kalle configuration.php filen, og gjennomføring som. Etter det gjør det, kommer det til å gjengi porteføljen. Rendering er en funksjon, så når vi er i en kontroller, vi kaller render, vil vi gi den filen og deretter dataene som vi passerer i, slik at det ringer i portfolio.php--type pass i disse dataene, slik at porteføljen kan håndtere det. Og nå, her har vi vårt login.php form.  Dette er kontrolleren som i utgangspunktet tar seg av logging i. Her sjekker det hvis en form ble sendt til denne filen og avtaler med å validere underkastelse. Vi vil se nærmere på dette si unnskyld funksjonen. Når vi ønsker å skrive ut en feilmelding, vi bruker beklager og som vil omdirigere brukeren til en bestemt side som vil skrive ut den aktuelle feilmeldingen som vi viser. Fortsetter på, vil det søke i databasen - vi vil komme inn mer om det senere. Så ser du at her nede hvis en form som ikke ble sendt, så det gjør et skjema. Det betyr at det går til login_form.php, så la oss se på det. Login.php er faktisk der vi ser HTML arbeider med den faktiske visuelle aspektet. Her har vi en inngang tag for brukernavnet, en inngang for passordet, samt en sendeknappen. Det er faktisk der det visuelle aspektet og HTML-skjema kommer til å bli holdt. Her står det at det kommer til å bli presentert av en bestemt metode, kalt innlegget. Vi vil komme inn på forskjellene mellom metodene - poste versus få, det er også noe som heter sagt - vi får inn disse metodene senere, men for interessen for denne pset, Jeg vil sterkt oppfordre deg til å bruke innlegget. Vi vet at i utgangspunktet når dette skjemaet er sendt - fra login_form.php-- så vil det gå til handling - login.php-- utgangspunktet passere i alle disse parameterne fra disse skjemaene til login.php. Resultatene fra det skjemaet er inneholdt i dette innlegget assosiativ array. Indeksene for de ulike elementene i innlegget rekke er akkurat hva du angir her. Du sier at navnet på denne inngangen er brukernavn. Navnet på dette er passordet. Tilsvarende ser du brukernavnet som indeksen for assosiativ array der. Hvis vi går til inkluderer mappen, har vi denne funksjoner filen som kommer til å være svært nyttig. Alle disse funksjonene er implementert for deg. Du trenger ikke å spesifikt implementere noen av disse selv, men de kommer til å ganske nyttig. Vi har beklager, som som jeg sa tidligere, vil i utgangspunktet skrive ut en feilmelding for deg på en bestemt side - apology.php. Da har vi dump, så hvis du bare ringe dump og deretter passere i variabelen, så det vil ta deg til en side som viser at variabelen for deg. Da har vi utlogging, som vil i utgangspunktet avslutte en viss brukers økt. Lookup kommer til å være nyttig. Siden vi har å gjøre med sitater og aksjer, vi kommer til å være i stand til - og det er egentlig sanntid. Vi trenger å vite hva de som lager verdier er, så vi har lookup funksjon som omhandler Yahoo dokumentasjon av aksjer. Når du ser opp en viss symbol på en aksje, vil den gå tilbake til deg aksjesymbolet samt navn og gjeldende pris på at aksjen. Det er oppslaget funksjonen. Så vi har å gjøre med MySQL, så vi kommer til å være som ønsker å utføre visse spørsmål på vår SQL database. Vi har spørring for å håndtere - til slags abstrakt noe av det ut. Vi kommer til å være bestått i hele strengen av vår SQL spørring - og alle variablene som går i det - og hva dette gjør er faktisk utføre det for oss. I stedet for å måtte skrive alt dette ut hver gang du ønsker å spørre - ved å få alle resultatene fra dette søket - så kan du bare ringe spørringen funksjon, og det vil komme tilbake til deg - avhengig av hva du bruker for søket - sannsynligvis en rad av alle resultatene som samsvarer med søket eller lignende. Mer om det senere skjønt. Endelig har vi omdirigere som, som navnet antyder, omdirigere deg til en annen side. Og da har vi gjengi, som vi kommer til å kalle et par ganger. Når du er i en kontroller, kaller du gjengi i malen siden og deretter passere i de verdiene som malen vil da forholde seg til. Disse verdiene er sannsynligvis kommer til å være håndtere den type produksjon som du vil til å bli vist på malen siden. Okay. De er de funksjonene, og det er mye mer til denne fordelingen koden. Jeg oppfordrer deg til å gå gjennom dette og utforske det selv. Dessuten vil spec trolig gå gjennom noen andre elementer av fordelingen koden. Her er en oppsummering av de funksjoner som finnes i functions.php. Okay. Den første oppgaven er å tillate brukere å registrere seg på nettsiden. Akkurat nå er det en login form på nettstedet, og du er utstyrt med noen få brukere med passord. Du kan bruke disse brukernavn og logger på, men du vil tillate folk å lage sine egne brukernavn og legge seg til nettstedet. Oppsettet for registrering er ganske lik den login form, bortsett brukernavnet er ikke pre-eksisterende, og brukeren trenger også å tilveiebringe en ny passord, og da typisk vi har et passord bekreftelse. Når brukeren innganger all denne informasjonen, vi ønsker å legge dem til i vår database av brukere. Vi kommer til å ha en database - en SQL database - at vi kommer til å referere til. I denne databasen, vil vi ha en tabell med alle brukerne inneholder brukernavn, passordet sitt, og også hvor mye penger de har. I register, ønsker vi å tillate dem å gå inn som informasjon. Vi ønsker å vise at formen. Vi ønsker å sørge for at deres passord - at de kom en, og da også at passordene samsvarer når de kommer inn den to ganger. Etter alt som er gjort - forutsatt at disse feilene blir sjekket - så vi ønsker å legge disse brukerne i databasen vår. Til slutt, når du har registrert deg, det er ganske praktisk hvis du ikke trenger å logge inn på nytt når du har registrert deg, så vi kommer til å logge dem på nettsiden hvis de har registrert vellykket. Den første oppgaven er å vise form, og dette er faktisk kommer til å være - hele denne registreringen skal være modellert ganske tett etter innlogging unntatt i stedet for login.php har du kanskje register.php. Istedenfor login_form.php--som er den mal - vil du ha registrere form. Det er lurt å legge en mer felt - et passord bekreftelse felt - i stedet for bare ett brukernavn og ett passord. Deretter vil vi sjekke om passordene samsvarer eller er tomme. Vi har kontrolleren - register.php--som kommer til å ta vare på å gjøre disse kontrollene. Når et skjema sendes via post metoden, deretter alle disse variablene er inneholdt innenfor innlegget array. Du ønsker å være sikker på at innlegget rekke verdien på indeksen passord samsvarer med bekreftelse element. Du vil være sikker på at de ikke er tomme, og du vil være sikker på at de er de samme. En praktisk ting om PHP er at vi ikke trenger å bruke streng sammenligne lenger. Vi kan bruke lik-lik operatør  å sjekke om strenger er lik hverandre. For feilhåndtering, vil du ønsker å be om unnskyldning. Å be om unnskyldning, du bare kalle funksjonen  og deretter angi en type melding som du vil utgang. Du deretter ønsker å legge brukeren til databasen. Frem til nå, alt vi har gjort bare å gjøre lokalt med resultatene av skjemaet. Nå, vi faktisk ønsker å legge dem til i vår database. For dette, må vi først vil være sikker på at brukernavnet ikke er tomt. Forstå at på en nettside, kan du ikke ha flere brukere med samme brukernavn, slik at du ønsker å være sikker på at når du setter noe inn i databasen - sette inn en ny bruker - så du ikke får en kollisjon mellom en pre-eksisterende brukernavn og brukernavnet som en bruker prøver å sende. For dette, når du utfører en spørring - sette inn en bestemt bruker med deres passord og en innledende mengde kontanter - når du kaller det spørringen, og deretter MySQL vil faktisk return false hvis det mislykkes. Strukturen av brukere er slik at brukernavnet er en unik verdi, slik at du ikke kan ha mer enn én. Når du prøver og sette inn en ny rad med et brukernavn som allerede eksisterer, som kommer til å returnere falsk - som en boolsk-verdi false. En lur ting her er at du ønsker å sjekke om resultatet er resultatet av søket. Hvis det mislykkes, så vil du ønsker å sjekke med trippel-lik operatør. Det er faktisk kommer til å sjekke om det er en feil eller ikke, mens i bare en enkel lik-lik, ville det være sant hvis raden var tom. Resultatet av en svikt dersom det er en kollisjon mellom brukernavn er den faktiske falsk verdi. Her er hvordan du ville sette inn en database. Her er spørsmålet som du ville kjøre strengt i SQL. En ting er at du faktisk kan gå til nettsiden som administrerer SQL database og spille rundt det ved å skrive inn manuelt både verdier og rader. Det vil produksjonen hva SQL produksjonen er. Du kan også kjøre SQL-kommandoer i databasen  og deretter se hva syntaksen kan være, og så oversette det inn i søket funksjon som vi har i pset 7, som kommer til å være svært lik spørringene som du faktisk kjører. Hvis jeg skulle sette inn en ny rad i min bruker tabell, så jeg ville spesifisere sette inn i brukere, som er navnet på mitt bord. Så jeg ville spesifisere kolonnenavnene. Så jeg ville gi verdiene sammen med passordet mitt. Passord i våre brukere tabellen lagres ikke som bare strengen. De er lagret som den krypterte versjonen, slik at du ønsker å kjøre funksjonen krypten på selve passordet, og som vil gi deg den riktige typen lagring for brukere array. Kjører dette vil sette inn en ny rad i din bruker tabell. Å håndtere spørringen funksjon, før i C brukte vi prosenttegn som plassholder. Tilsvarende gjelder det samme konseptet med en plassholder her. Med spørring, angir du hele spørringen, bortsett når du arbeider med variabler som input din inn i søket, så i stedet for faktisk å sette dem inne - som når vi hadde printf uttalelser i C. Vi ville sette strengen og deretter har en plassholder der, og så etter hvert komma, angi hvilken variabel vi hadde. Her skal vi bruke spørsmålstegn tegn som plassholder vår og deretter passere i hver variabel, henholdsvis i orden, for plassholdere - hvor disse variablene skal gå. Så her vil det første spørsmålstegn bli erstattet av den faktiske brukernavn deretter den andre spørsmålstegn ved passord. Så til slutt, når du har registrert dem og lagt dem til databasen, så du vil logge dem inn på nettstedet. Vi har en slags super-global variabel kalt økten. Session tar en viss id, og at id tilsvarer brukeren som er logget inn Hva du ønsker å gjøre er å finne hva deres bruker id er og deretter sette den økten id som den aktuelle brukeren id. En funksjon som du ønsker å bruke her er en SQL-kommando som vil hente den siste satt id nummer fra tabellen. Da rekker vil kalle - it'll ringe id - it'll tildele et navn til nummeret som den returnerer. Det vil kalle det id. Nå har vi ferdig registrere, og vi kan gå videre for å sitere. Sitat lar brukeren legge inn navnet på et visst lager, og da blir det returnere kvaliteter som lager. Hva du ønsker å gjøre her er å ha en kontroller og noen maler. I dette tilfellet skal vi ha en kontroller som kommer til å gjøre alt de tenker for oss. Det kommer til å slå opp symbolet og deretter passere i verdiene til de malene som skal skrive ut. Vi kommer til å ha to maler her. Vi kommer til å ha en mal som gir den form som brukerne kommer til å innspill navnet på lager - navnet på aksjen. Da vi også kommer til å ønske en annen mal som viser disse verdiene. Du kan se inn login for et eksempel på hvordan du ville ha en form som godtar inndata, bortsett fra i her, vi vil bare ha en feltet. Vi ønsker ikke et brukernavn og et passord-feltet. Vi vil bare ha en tekstfelt som lar brukeren legge inn navnet på et visst lager. Så du ønsker å sende dataene - når du har sett opp som lager - til quote_form.php. Oppslag vil returnere symbolet på et lager, navnet, og en pris. De befinner seg innenfor en assosiativ array. Slå opp oppslagstabellen funksjon i functions.php for mer informasjon På returen typer av dem. Flott! Så til slutt, vil du ønsker å vise aksjeinformasjon. Det er lurt å trolig vise - du vil ha tilgang til disse variablene. Når du har prisen på en variabel - samt navn og symbol - så vil du ønsker å vise dem i malen siden. Malen side kan kalles show_quote.php eller noe. Din quote.php side ville gjengi showet sitat og deretter passere i alle disse verdiene. Så i php side, du faktisk skrive ut disse verdiene til HTML aspektet av siden. Du bare bruker utskriftsfunksjonen og passerer i prisen. Det er 2 måter - du kan enten sette sammen den med prikken operatør, eller bruke en plassholder. Brukerne til slutt kommer til å være å kjøpe og selge aksjer. Vi ønsker å gi dem noen måte å se alle de aksjer som de har for øyeblikket. Vi kommer til å kalle det sin portefølje. Portefølje ville, formodentlig for hver bruker, inneholder en haug med rader notering type aksjer som de har, og deretter hvor mange av dem de har. Vår eksisterende tabell - akkurat nå har vi en bruker tabell i vår database. Som inneholder en brukers brukernavn samt deres passord og hvor mye penger de har. Det er ingen reell måte å lagre alle sine aksjer i det. Det er ikke som vi kan sette inn nye kolonner for hver aksje. Det ville være en veldig, veldig lang rad fordi vi har en uendelig mengde typer aksjer som de kunne ha. Så er stedet hva vi skal gjøre i løpet av den samme databasen, Vi vil ha en bruker tabell, men da får vi også en portefølje bord. Porteføljen tabellen vil bli definitivt knyttet til brukere tabellen, men i stedet porteføljen tabellstrukturen vil ha informasjon om aksjer, hvor mange aksjer som lager brukeren har, så vel som en brukerens spesielle ID-nummer. Du har brukerne tabellen som har en id samt brukernavn, hash - som er passordet, den krypterte passord - og da mengden av kontanter de har. ID-nummeret vil bli knyttet til id-nummer fra porteføljen. Porteføljen ville bare ha symbolet på lager samt aksjer - antall aksjer i denne bestanden som brukeren har. I den porteføljen tabellen vil du ha i utgangspunktet alle aksjer besatt av alle brukerne på nettstedet ditt. Senere vil angi bare en viss brukers aksjer - bare deres portefølje - du ville hente verdiene fra din portefølje bord slik at ID-nummeret er spesifikt for denne brukeren. Når du viser porteføljen, vil du ønsker å rapportere hver av aksjene i en brukers portefølje. Det er lurt å rapportere antall aksjer og den nåværende verdien av disse aksjene. At dagens verdi av disse aksjene er ikke lagret i porteføljen tabellen fordi det kommer til å bli oppdatert - minst - hver dag av Yahoo. Å få den informasjonen, kan du ikke referere at fra SQL-spørring. Hvilken funksjon gir det oss? Hvilken funksjon vil få prisen? Det er oppslag, vil så bruke lookup på en bestemt symbol gi deg mye informasjon. Det vil gi deg 3 stykker av informasjon - navnet, symbolet, samt prisen. Når du oppslag en viss symbol, så kan du få prisen, og deretter kan du bruke prisen til å bli vist i din portefølje. Mappen skal også vise brukerens gjeldende kontantbeholdning. Dette feltet er lagret i din bruker tabell. Så da huske hvordan vi i utgangspunktet har til - vi har ulike typer PHP-filer. Vi kommer til å ha en kontroller som i utgangspunktet gjør all tenkingen for deg. Og så har vi en mal der malen omhandler gi ut data. Du må tenke på hva variabler kontrolleren må ta i. Hvis vi har å gjøre med en portefølje som sender ut alle navn, symbol, og dele nummer, samt gjeldende pris på en aksje, så vil du ønsker å finne en måte å utgangspunktet passerer - du kan passere i en matrise med verdier som samsvarer med dette. La oss gå inn et eksempel på hvordan du kan hente alle aksjene eid av en bestemt bruker. Dette er ikke å håndtere - ennå - med prisen på aksjen. Hva dette ville gjøre er å kjøre en spørring. Det ville få den symbol så vel som aksjene fra - Jeg ringer denne tabellen, men i dette tilfellet hva ville det være? Hva er navnet på tabellen som vi arbeider med som har symbol og aksjer for en bestemt bruker? Det er enten brukere eller portefølje. Porteføljen. Hva dette ville gjøre er spørring portefølje for symbolene og aksjer for en bestemt bruker. Her, sier jeg, (SELECT symbol, aksjer fra TBL - men i stedet for bord, du kommer til å erstatte den med portefølje. 'Hvor er utgangspunktet mitt tilstand. Jeg sier jeg bare ønsker å få de assosiative matriser som tilsvarer  til dette følgende betingelse - id lik.  Så jeg setter en plassholder der og da økten id. Hva dette ville gjøre er å si for hver rad i rader. Dette er en ryddig måte i stedet for å faktisk måtte sette opp en for loop som gjentar over alle indeksene, deretter i PHP kan du ha en for-hver loop. Hvis du har en gitt matrise, så du kan si jeg kommer til å ringe hver etterfølgende element - Jeg kommer til å ringe hver element dette navnet. Så, for hver og en av disse elementene, kommer jeg til å kalle dem dette, så jeg kan gjøre dette. I dette for hver, har du rader som den faktiske array, og hver rad du skal ringe rad. Hver gang den utfører kroppen, det vil gå opp og det vil oppdatere rad til neste element i rader. Nå, i form av å kjøpe aksjer, hva vi ønsker å gjøre er å få aksjen som brukeren ønsker å kjøpe og mengden av aksjer som brukeren ønsker å kjøpe, og deretter - hvis de vil - legge til at aksjen til sin portefølje. Selvfølgelig, hvis de kjøper noe, så det kommer til å redusere hvor mye penger de har, så det kommer til å redusere sine penger. Vi kommer til å håndtere oppdatere porteføljen samt brukere tabellen, som inneholder kontanter. Men først må du få den faktiske lager og mengden aksjer som brukeren ønsker. For det, vil du trenge et HTML-skjema som vil be om symbolet på lager at du ønsker å kjøpe, så vel som antall aksjer. Så vil du ønsker å legge til. Det er lurt å velge visse verdier. Vi har gått gjennom dette litt allerede, men når du prøver å oppnå visse rader - hente visse rader fra SQL tabellen, dette er følgende syntaks. Du har valgt, og hvis du angir en stjerne, som vil i utgangspunktet returnere hele, hele raden for deg. Så igjen, har du tilstand der, og så angir - Jeg vil bare brukernavnet til å være lik post-i, så det vil bare hente rad brukere som tilsvarer post-i. Når en bruker ønsker å legge en andel i en portefølje, du må sjekke for noen feil. Du vil være sikker på at brukeren faktisk kan ha råd aksjen, slik at du ønsker å sjekke sine penger. Før brukte vi star å hente en hel rad fra en SQL-tabell. Men her kan vi faktisk bare spesifisere at jeg bare vil ha 1 verdi - Jeg vil bare ha penger. Så her vil det returnere kontanter for brukeren med id nummer 1. Hvis en bruker har allerede kjøpt et visst lager, men da kjøper mer av denne bestanden, deretter i porteføljen din - du ikke vil ha en egen linje, en annen rad som inneholder det nye transaksjonen. Du faktisk ønsker å oppdatere beløpet. Alt som endrer egentlig er mengden aksjer som den brukeren eier. Hvis du bruker innsatsen til spørring - så det er sett bare inn i din portefølje alle disse verdiene - brukerens id nummer, samt symbolet på lager som de kjøper og aksjene, så vil du også ønsker å spesifisere, vel, hvis jeg får et duplikat nøkkel - i dette tilfellet, er den duplisert nøkkelen ikke bare brukerens id, men også aksjesymbolet - fordi du kan bare ha - Vårt utgangspunkt er at du bare kan ha en rad  som tilsvarer en bestemt symbol. Så, på duplikatnøkkel - hvis du får en kollisjon der - du bare kommer til å oppdatere aksjer til sin nye verdien. Aksjene tilsvarer hva vi hadde før, pluss det antall aksjer som brukeren kjøper. Nå som vi har oppdatert porteføljen tabellen, vi ønsker å oppdatere brukerens kontanter. Det er i brukere tabellen, så vi kommer til å bli trekke et bestemt beløp fra kontant. Antagelig kommer det til å være kontanter tilsvarer kontanter minus - og deretter et visst beløp. Å oppdatere kontanter, ville du - hvis jeg ønsket å ta bort penger fra post-i, så jeg ville kjøre dette søket - 'Oppdatere brukernes og deretter sette kontanter kolonnen til kontanter - Jeg ville fjerne 9999 dollar bare hvis brukernavnet er lik post-i. Men, i dette tilfellet, ønsker vi ikke å trekke 9999 spesielt. Vi ønsker å spesifisere, vel, ønsker vi å trekke dagens pris på aksjen multiplisert med antall aksjer som de kjøper. Nå har vi tillot dem å se alle de aksjer som de har, samt kjøpe flere aksjer. Vi har også tidligere tillatt dem å slå opp den aktuelle prisen på en aksje. Her ønsker vi å tillate dem å selge dem. Først ønsker vi å vise utgangspunktet - vi ønsker å tillate dem å se alle aksjer som de har, så her vi ønsker å vise alle radene fra porteføljen. Hvis de velger å selge en bestemt aksje, så vi kommer til å anta at de ønsker å selge alt sammen. De er ikke bare kommer til å selge 50% av sine aksjer, de kommer til å selge 100% av det. Vi kan bare slette hele raden fra porteføljen. Vi kan slette gitt brukerens aksjer i visse symbol. Det er syntaksen for det. Så vi ønsker å oppdatere kontanter. Vi kommer til å legge i kontanter lik antall aksjer de selger multiplisert med den gjeldende prisen på aksjen - ikke prisen som de kjøpte den, men heller den prisen som de er - dagens pris når de selger det. Referere til gjeldende pris på en aksje, vil du ønsker å bruke oppslag, noe som vil gi deg prisen på en aksje på det nåværende tidspunkt. Nå er vi igjen med historie, som du vil tillate en bruker å holde styr på alle sine transaksjoner - ønsker å se når de solgte noe, når de kjøpte en aksje. Vi ønsker å angi hvor lang tid som de gjorde det, så vel som hvor mange de kjøpte og hva lager det var. Har vi noen av de aktuelle, eksisterende struktur som angir det? Vel, vi har portefølje som viser antall aksjer som en bruker har for en gitt andel. Men vi strukturere portefølje på den måten at den oppdaterer når vi kjøper flere, mens historien bør - hvis du kjøper Apple, 10 aksjer i det, og så senere å selge 5, så du ønsker å se dem separat som separate handlinger, separate rader. Mens handlingen å visualisere at i vår portefølje tabellen ville bare være en oppdatering til den aktuelle raden,  så vi sannsynligvis kommer til å ønske en annen tabell. I vår database har vi våre brukere bord, har vi vår portefølje bord, og nå vil vi sannsynligvis ha en historie bord. At historien tabellen kan holde orden på dagens dato, så vel som den spesielle aksjesymbol, samt hvor mange aksjer, og deretter hvilke tiltak det er - om du skulle kjøpe disse aksjene, eller om du skulle selge dem. Å håndtere date, det er et par måter du kan gjøre dette. PHP har en måte å holde styr på dato, som du kan se opp selv. I SQL kan du også bruke enten nå eller nåværende tidsstempel. Det er opp til deg. Bare sørg for at hver gang en bruker kjøper eller selger, vil du være å oppdatere sine penger i brukere tabellen, vil du være å oppdatere radene i porteføljene tabellen, så vil du også oppdatere historien, så det kommer til å være 3 separate SQL-spørringer som du skal kalle det. Vi har en haug av funksjonalitet nå. Bare et par påminnelser om at i indeksen fil, vil du ønsker å koble til minst din - men du ønsker å tillate en bruker til å koble til buy.php siden. Det kommer til å tillate en bruker - buy.php er kontrolleren, slik det kommer til å enten sende deg til - som kommer til å sende deg til skjemaet som lar deg se ting opp. Vi har historie. Vi har logge ut, får et tilbud og deretter selge. De er på minimum hva du ønsker å vise. I form av porteføljen, er porteføljen faktisk vist i indeksen siden. Hvis vi går til indeks, her ser vi at det gjør portfolio.php og passerer i assosiativ array - i utgangspunktet tittelen lik portefølje. Så, dette er kontrolleren. Hvis vi går til malen for portfolio.php, da alt det har er - viser i utgangspunktet et bilde som sier, oh, er dette nettstedet under bygging. Senere, når du passerer i - du være bestått i utgangspunktet mer spesifikk informasjon. I stedet for å bare tittelen, vil du sannsynligvis være bestått i flere ting. Når du har disse verdiene, så portfolio.php kan håndtere disse verdiene og skrive dem ut i alle slags orden. Når du har gjennomført alle disse, må du også gjennomføre en mer funksjon. Dette kan enten være slik at en bruker å endre passordet, å tilbakestille passordet sitt hvis de har glemt det - så for tilbakestilling av passord, og deretter du vil sannsynligvis også vil redigere register slik at det tillater dem å angi en e-post, så hvis de glemmer passordet sitt, så de kan få det. De kan sikkert gå inn i sitt brukernavn, og deretter en e-post vil bli sendt til dem med en link for å kunne tilbakestille passordet sitt. Du kan ha noe som tillater brukere å få kvitteringer hver gang de kjøper eller selger noe, og så til slutt, la dem legge penger til deres hjemmeside. Bare for å gå tilbake til begrepet kontrollere og maler litt. Du vil ha noe som en - slik at du får en kontroller her. Akkurat nå ser vi på login.php eksempel. Når vi har en kontroller, i utgangspunktet det kommer til å ta 2 tilfeller. Når vi har kontrollerne, er vi i dette stykket som vi er også slags håndtere når vi har skjemaer også. Kontrolleren vil i utgangspunktet ha separate handlinger - en hvis en form allerede er sendt inn, og deretter to hvis brukeren kommer til den siden for første gang, og fortsatt må innspill som form. Jeg kommer til å gå til det saken først før du går opp til det første tilfellet av å ha form i. Her sier vi, hvis skjemaet er sendt med metoden post - ikke bry deg om at litt. Ikke bry deg om det for mye, men forstår at utgangspunktet denne funksjonen omhandler om et skjema er sendt inn eller ikke. Denne tilstanden er sant hvis en bruker har sendt inn skjemaet. Hvis ikke, så vi kommer til å ønske å ringe render login_form.php, og deretter passere i tittelen. Denne tittelen er bare utgangspunktet kommer til å vises i overskriften. Hva dette er i utgangspunktet sier, ok - vel, hvis en bruker går til login.php og har faktisk ikke logget inn, da vil jeg sende dem til siden som har som danner som tillater dem å legge inn brukernavn og passord. Så jeg går til login_form, og deretter som har den faktiske form. Deretter, når brukeren sender skjemaet, de kommer til å sende den til login.php med metoden innlegget. Da jeg faktisk kommer til å gå inn i denne delen av min if-else loop. Da er det her at vi håndtere verdiene angitt i skjemaet. Det er her vi håndtere disse. Så når du avtale med disse verdiene - hvis du arbeider med - sier vi arbeider med quote.php siden der noen kan skrive en aksje som de ønsker å se opp, og deretter se at skjermen - det er slags lignende her. Her har vi en login form - you'd trolig ha et tilbud form - men da når brukeren har faktisk hevdet at informasjon, så du vil kontrolleren til å passere inn i en annen mal som vil vise dem at faktiske opplysninger. Så da rett rundt her, så vil du sannsynligvis - rundt slutten av din tilstand her - hvis metoden er lik post - så vil du sannsynligvis ønske å gjengi en annen side - showet sitat - som sender deg til den siden - show_quote.php-- og deretter i den filen vil referere disse verdiene. Gjør det fornuftig? Vi har en kontroller som i utgangspunktet omhandler 2 tilfeller - enten du har angitt et skjema eller ikke. Hvis du ikke har angitt et skjema, så det vil omdirigere deg til dette skjemaet, som vil sette deg tilbake til den siden. Deretter, når du har informasjon i kontrolleren, vil den kroppen håndtere det informasjon som er nødvendig - enten ser opp verdier for lager, og deretter når den er så opp disse verdiene og har dem i en pent formatert matrise, da kan passere denne matrisen inn i malen siden  som tar for seg gi ut denne informasjonen. Igjen, siden det er web, det kommer til å bli gøy. Vi er utenfor C, så vi ikke er begrenset til ASCII og at terminal utgang, så ha det gøy med dette. Du kan gjøre det så visuelle som du vil. Du kan tillate brukere å legge inn millioner av dollar på en gang, eller begrense dem og bli virkelig mener og la dem bare for å legge inn 1 krone av gangen eller noe sånt. Definitivt være sikker på å ha det gøy med dette. PHP-koden er litt enklere i at det er litt lettere å kartlegge din pseudokode inn i selve gjennomføringen. Så, definitivt ha det gøy med dette fordi det er faktisk vår siste brikke i CS50. Med det, var dette Walkthrough 7. Når du er ferdig med å se på walkthrough og ferdig med pset, da disse var også psets, og nå er vi på det endelige produktet - etter at vi får gjennom quiz 1. Så forhåpentligvis kan du bruke verktøyene som du har lært fra psets - ikke bare syntaks, men mer abstrakt forestilling om hvordan du kan ta en viss - liker, jeg ønsker å gjøre dette, og deretter faktisk gjennomføre det. Lære å slite gjennom syntaks og distribusjon kode. Lese andres kode, og deretter tolke at bruk eksisterende funksjoner. Så, lykke til med den siste pset. Det har vært en glede å lede walkthroughs. Jeg håper de har vært nyttig for deg. Disse var Walkthroughs, og takker veldig mye. [CS50.TV]