[Powered by Google Translate] [Walkthrough Problem Set 7] [Zamyla Chan] [Harvard University] [Dette er CS50] [CS50.TV] Hej alle, og velkommen til Walkthrough 7, CS50 Finans. Nu er vi officielt færdig med alle de psets i CS50, og vi er bare tilbage med endnu et, som vil være en sjov implementering et websted, hvor brugere kan logge ind på CS50 Finans og købe og sælge aktier. I dag skal vi have et par værktøjer til vores rådighed. Vi kommer til at tale om tilladelser. Når du har en web mappe, du vil ønsker at give brugerne mulighed for at udføre visse filer men også bare læse andre dem, så vi vil se på tilladelser, og hvordan du kan indstille dem. Så vi kommer til at se ind i PHP, HTML og SQL-kode. Første, tilladelser. Når du er i terminalen i en bestemt mappe, så hvad du vil gøre, er at du vil køre kommandoen chmod. Det er efterfulgt af enten bogstaver eller tal svarende til, hvad du dybest set ønsker verden at se, du dig selv at se, osv. For eksempel, når du har en mappe så du ønsker at mappe skal være eksekverbare af alle, der ser det, så hvad du ville gøre, er at du kan køre kommandoen chmod a + x og derefter navnet på din mappe. Når du har en fil, f.eks CSS-filer eller billedfiler - ligesom JPEG og bitmaps, sådan noget, eller nogen JavaScript-kode - du ønsker at at kunne læses af alle, så så hvad du gør, er du kunne bruge det wildcard - som er en asterisk - til stort set angive i CSS mappen - alt i denne mappe -  Jeg har tænkt mig at sige, at der kommer til at kunne læses af alle. Med tilladelser, når vi bruger bogstaverne Vi kan også bruge tal i stedet. Så du se, at i sidste ende, når du ønsker noget at være eksekverbar - der er repræsenteret med tallet 1 - noget at være læsbart er antallet 4 og derefter - skrivbar er nummer 2 - og så væsentlige, når du ønsker en kombination af disse, så du tilføje dem. Hvis du vil have noget at kunne læses, skrives, og eksekverbare, så ville du tilføje op 4, 2 og 1 og som vil give dig 7, så når du har en mappe, som du ønsker at det skal være eksekverbare af alle - samt læses og skrives - så er du gør, at 7, 1, 1. Det ville være 7 for dig, derefter 1 for de andre mennesker. Når du har spec, vil det faktisk angive, hvilke mapper og hvilke filer nødt til at være chmod-ed specifikt. For eksempel, når du har mapper - det er 7-1-1 - når du har billeder eller HTML, CSS, JavaScript, dernæst de kommer til at være 6, 0, 4 - eller 6, 4, 4 - og derefter PHP-filer kommer til at være 6, 0, 0. Tanken bag det er, at brugerne ikke skal faktisk se din PHP-kode, men blot være i stand til at se output. Great! Flytning ind i PHP. Simply, når du ønsker en PHP-fil, den fil endelse er. Php. Du kan også blande HTML med PHP-kode. Hvis du har en HTML-fil, for eksempel, så kan du vedlægge den med venstre vinkel, spørgsmålstegn, php - sætte din php kode - og så tæt på, at med et andet spørgsmålstegn og en ret vinkel. Variabler i PHP er meget lettere at håndtere end variabler i C. Enhver variabel bare starter med et dollartegn foran det, og de er svagt indtastet. Det betyder, at du ikke behøver at bekymre sig om at sætte noget svarende til en streng eller et helt tal. Man kan simpelthen sige, det er mit navn på variablen og så er dens værdi, så det vil være nemmere at håndtere dér. En anden ting er, at PHP giver dig mulighed for at bruge associative arrays. Du kan simpelthen definere et array som du ville i C ved at sige, dollar sign-navnet på dit array-lig, og derefter i firkantede parenteser har dybest set bare en liste af værdier af alle elementer i arrayet. Men i PHP hvad du kan også gøre, er at specificere dybest set den - det er lidt ligesom en hash-funktionen. Du kan angive indeks - hvad du vil kalde det - og derefter som svarer til en værdi. Hvis man faktisk passerer i a = 1, b = 2, c = 3, så dit array ved indeks en vil give dig 1. Denne Pset vil varme dig op med nogle PHP i et afsnit med spørgsmål, og så må vi dykke ned i CS50 Finance. Vi har et par - vi har nogle funktioner, dybest set, at gennemføre i denne hjemmeside. Vi ønsker at give brugerne mulighed for at tilmelde dig vores hjemmeside med et brugernavn og en adgangskode. Vi ønsker at give dem mulighed for at slå op et citat, og så ville vi printe ud af navnet på det citat, samt den nuværende pris, at det er på. Vi ønsker at give dem mulighed for at se en portefølje af alle de aktier, de har købt hidtil. Vi ønsker også at give dem mulighed for at købe aktier samt sælge dem. Og så til sidst, vi ønsker at give dem mulighed for at se historie af alle de transaktioner, som de har lavet. Så endelig, efter du har implementeret det hele, så er du velkommen til at implementere en ekstra feature. Vi vil gå ind i dem. Dem kan enten være der giver brugerne mulighed for at få ekstra penge ved at deponere ekstra kontanter, eller du kan give dem mulighed for at ændre deres adgangskode, eller noget lignende, e-maile dem en kvittering, når de køber eller sælger en aktie. Der er en begrænset liste over funktioner, som du kunne gennemføre selv, så det er den sidste der. Da dette er en hjemmeside, gutter har også en masse frihed til at tilpasse den. Vi gør give nogle CSS kode, men du er helt fri til at nappe det, gør det ser pænere, men underliggende er det en grundlæggende funktionalitet så altid henvise til spec om, hvad du rent faktisk har brug for at inkludere dér. Efter spec, vi skal bruge apparatet som også en server. Det kommer til at være vært for vores hjemmeside for os, på sin lokale server. Hvis du følger disse anvisninger og udpak Pset 7 fordeling kode ind i din virtuelle host / lokal vært mappe,  så kan du bare besøge http://localhost/ i Google Chrome i apparatet, og derefter du ville nå den kode, som du har skrevet Pset 7. Pset 7 kommer med en masse fordeling kode, og forhåbentlig we've - gennem alle de psets før dette - vænnet os til læsning gennem uddeling kode, at forstå, hvad funktioner er allerede fastsat, og hvordan vi måske kan bruge dem og de andre funktioner, som vi kommer til at gennemføre. I dette tilfælde har vi 3 mapper. Vi har en HTML mappe, en omfatter mappe og en skabeloner mappe. Hvad vi kommer til at gøre med denne Pset er slags adskille tænkning - programmeringen tænkning - den PHP-kode med den faktiske visuelle aspekt. Vi vil gerne have en PHP-fil, der gør alt tænkning, lyder i databasen, udskriver ting, har if-sætninger - ting - og så der vil sende data ind i vores skabelon-fil - eller template.php. Hvad der vil gøre, er at læse data og så vil det udskrive det. Vi kan behandle skabeloner som "dum" i, at vi egentlig ikke ønsker dem at gøre en masse arbejde ved beregningen ting. Vi ønsker, at vores controllere til at gøre det. En lille smule om det - lad os tage et kig på nogle af fordelingen kode. Her har vi vores index.html fil, og det er temmelig tom. Hovedsagelig hvad den gør - det siger vel, jeg kommer til at kræve den configuration.php fil. Vi kan ikke se, at lige der, men det er dybest set kalde configuration.php fil, og gennemførelsen af ​​dette. Efter det betyder, at det vil gøre porteføljen. Rendering er en funktion, så når vi arbejder i en controller, vi vil kalde render, giver vi det på filen og derefter de data, vi passerer i, så det ringer i portfolio.php--type identitetskort i disse data, således at porteføljen kan håndtere dette. Og nu, her, vi har vores login.php form.  Det er den controller, der dybest set tager sig af skovhugst i. Her kontrollerer det, om en formular blev sendt til denne fil og beskæftiger sig med validering af underkastelse. Vi vil se nærmere på dette undskylder funktion. Når vi ønsker at udskrive en fejlmeddelelse, vi bruger undskylder og som vil omdirigere brugeren til en bestemt side der vil udskrive den specifikke fejlmeddelelse, vi angiver. Fortsætter den, vil den forespørgsel i databasen - we'll komme ind mere om det senere. Så kan du se, at hernede hvis en form, der ikke blev sendt, så det gør en formular. Det betyder, at det går til login_form.php, så lad os se på det. Login.php er faktisk, hvor vi ser HTML beskæftiger sig med den faktiske visuelle aspekt. Her har vi et input tag for brugernavnet, en indgang til den adgangskode, samt en submit knap. Det er faktisk, hvor det visuelle aspekt og HTML-formular vil blive afholdt. Her står der, at det kommer til at blive indgivet af en bestemt metode, kaldet post. Vi vil komme ind i forskellene mellem metoder - sende versus få, er der også noget, der hedder sat - vi vil komme ind på disse metoder senere, men for den interesse for denne Pset, Jeg vil stærkt opfordre dig til at bruge post. Vi ved, at stort set når denne formular er indsendt - fra login_form.php-- så vil det gå til handling - login.php-- dybest set passere i alle disse parametre fra disse formularer i login.php. Resultaterne fra denne form er indeholdt i denne post associative array. Indekserne for de forskellige elementer i den post-array er præcis, hvad du angiver her. De siger, at navnet på denne indgang er brugernavn. Navnet på denne ene er password. Ligeledes kan du se brugernavnet som indekset for den associative array der. Hvis vi går til den omfatter mappe, har vi denne funktion fil, som vil være meget nyttig. Alle disse funktioner er implementeret for dig. Du behøver ikke specifikt at implementere nogle af disse selv, men de vil ganske nyttigt. Vi har undskylde, der som jeg sagde før, vil som udgangspunkt udskrive en fejlmeddelelse for dig på en bestemt side - apology.php. Så har vi dump, så hvis du bare ringe dump og derefter passere i variablen, så det vil bringe dig til en side, der vil vise, at variabel for dig. Så har vi logout, som vil dybest set afslutte et bestemt brugers session. Lookup vil være nyttig. Da vi har at gøre med citater og lagre, vi vil være i stand - og det er det væsentlige realtid. Vi er nødt til at vide, hvad disse bestand værdier er, så vi har den lookup funktion, som beskæftiger sig med Yahoos dokumentation af bestandene. Når du kigger op et bestemt symbol på et lager, vil den vende tilbage til dig aktiesymbolet samt navn og den aktuelle pris på denne bestand. Det er den lookup funktion. Så vi har at gøre med MySQL, så vil vi være der ønsker at udføre visse forespørgsler på vores SQL-database. Vi har forespørgsel til at håndtere - at slags abstrakt noget af det ud. Vi kommer til at være forbi i hel perlerække af vores SQL forespørgsel - og alle de variabler, der går i det - og hvad den gør, er faktisk at gennemføre det for os. I stedet for at skulle skrive alt dette ud, hver gang du ønsker at forespørge - ved at få alle resultaterne fra den pågældende forespørgsel - så kan du bare kalde den søgefunktion, og det vil vende tilbage til dig - afhængigt af hvad du bruger til din forespørgsel - sandsynligvis en række af alle de resultater, der svarer til forespørgslen eller lignende. Mere om det senere selv. Endelig har vi omdirigere, der, som navnet antyder, omdirigerer dig til en anden side. Og så har vi render, som vi vil komme til at kalde et par gange. Når du er i en controller, du kalder gøre i skabelonen siden og derefter passere i de værdier, som skabelonen så vil beskæftige sig med. Disse værdier er sandsynligvis vil beskæftige sig med den type output, du vil til at blive vist på din skabelon side. Okay. Det er de funktioner, og der er meget mere til denne fordeling kode. Jeg vil opfordre dig til at gå gennem denne og udforske det selv. Desuden vil det spec sandsynligvis gå dig gennem nogle andre elementer i distributionen kode. Her er en oversigt over de funktioner, der findes i functions.php. Okay. Den første opgave er at give brugerne mulighed for at registrere sig på hjemmesiden. Lige nu er der en login-formular på hjemmesiden, og du er udstyret med et par brugere med passwords. Du kan bruge disse brugernavne og logger ind, men du vil tillade folk at lave deres egne brugernavne og føje sig til hjemmesiden. Layoutet for tilmelding er temmelig ens til login formular, undtagen brugernavnet ikke er allerede eksisterende, og brugeren skal også give en ny adgangskode, og så vi typisk har en adgangskode bekræftelse. Når brugeren indtaster alle af disse oplysninger, vi ønsker at tilføje dem til vores database af brugere. Vi kommer til at have en database - en SQL-database - at vi kommer til at referere til. I denne database, vil vi have en tabel med alle brugere indeholdende deres brugernavn, deres password, og også hvor mange penge de har. I register, ønsker vi at give dem mulighed for at indtaste disse oplysninger. Vi ønsker at vise denne form. Vi ønsker at sikre, at deres password - at de kom én, og derefter også at adgangskoderne matcher, når de træder det to gange. Efter alt dette er gjort - forudsat at disse fejl kontrolleres - så vi ønsker at tilføje disse brugere til vores database. Endelig, når du har registreret dig, det er temmelig praktisk, hvis du ikke behøver at logge ind igen når du har registreret, så vi kommer til at logge dem ind på hjemmesiden, hvis de har registreret i succes. Den første opgave er at vise den form, og det er faktisk kommer til at være - hele denne registreringsproces vil blive modelleret temmelig nøje efter login undtagen i stedet for login.php du måtte have register.php. I stedet for login_form.php-, som er template - du har registrere form. Du ønsker at tilføje endnu en felt - en adgangskode bekræftelse felt - i stedet for bare den ene brugernavn og en adgangskode. Dernæst ønsker vi at undersøge, om de passwords matcher eller er tomme. Vi har controlleren - register.php--som vil tage sig af at gøre disse kontroller. Når en formular indsendes via post-metoden, derefter alle disse variable er indeholdt i stillingen array. Du vil være sikker på, at stillingen array-værdi ved indeks password svarer til bekræftelse element. Du ønsker at sikre, at de ikke er tomme, og du vil være sikker på, at det er den samme. En praktisk ting om PHP er, at vi ikke behøver at bruge streng sammenligne længere. Vi kan bruge den lig-lig operatør  at kontrollere, om strenge er lig med hinanden. For fejlhåndtering, vil du ønsker at undskylde. At undskylde, skal du blot kalde funktionen  og derefter angive en type meddelelse, du ønsker at output. Du derefter ønsker at føje brugeren til databasen. Indtil nu er alt hvad vi har gjort bare at handle lokalt med resultaterne af skemaet. Nu er vi faktisk ønsker at tilføje dem til vores database. For dette, vi først vil være sikker på, at brugernavnet ikke er tom. Forstå, at på en hjemmeside, kan du ikke have flere brugere med det samme brugernavn, så du vil være sikker på, at når du indsætter noget i din database - indsætte en ny bruger - så du ikke får en kollision mellem en allerede eksisterende brugernavn og det brugernavn, en bruger forsøger at sende. For dette, du engang udføre en forespørgsel - indsætte en bestemt bruger med deres password og et indledende beløb af kontanter - når du kalder denne forespørgsel, så mySQL reelt vil returnere falsk, hvis det mislykkes. Strukturen af ​​brugerne er således, at brugernavn er en entydig værdi, så du kan ikke have mere end én. Når du prøver og indsætte en ny række med et brugernavn, der allerede eksisterer, der kommer til at returnere falsk - ligesom en boolesk-værdi falsk. En tricky ting her er, at du ønsker at kontrollere, om resultatet er et resultat af din forespørgsel. Hvis det mislykkes, så vil du ønsker at tjekke med triple-lig operatør. Det er faktisk kommer til at kontrollere, om der er en fejl eller ej, der henviser til, blot en simpel lig-lig, ville det være sandt, hvis rækken var tom. Resultatet af en fejl, hvis der er en kollision mellem brugernavne er den faktiske falsk værdi. Her er hvordan du ville indsætte i en database. Her er den forespørgsel, du ville køre i nøje SQL. Én ting er, at du rent faktisk kan gå til det websted, der administrerer din SQL database og lege der ved at indtaste manuelt enten værdier eller rækker. Det vil output hvad SQL output. Du kan også køre SQL-kommandoer i din database  og så se, hvad syntaksen måtte være, og derefter omsætte det til forespørgslen funktion, som vi har i Pset 7, som vil være meget lig de forespørgsler, du rent faktisk kører. Hvis jeg ønskede at indsætte en ny række i min brugere bord, så jeg ville specificere insert into brugere, som er navnet på mit bord. Så ville jeg angive kolonnenavne. Så ville jeg give de værdier sammen med min adgangskode. Adgangskoder i vores brugere tabel gemmes ikke som bare strengen. De lagres som den krypterede version, så du vil få lyst til at køre funktionen crypt på selve password, og det vil give dig den rigtige type opbevaring for brugere array. Løb dette vil indsætte en ny række i din brugere tabel. For at imødegå den søgefunktion, før i C brugte vi procenttegn som pladsholder. Ligeledes det samme begreb om en pladsholder gælder her. Med forespørgsel, angiver du det hele forespørgslen, undtagen når du har at gøre med variabler som dit input i forespørgslen, så i stedet for faktisk at sætte dem inde - ligesom når vi havde printf udsagn i C. Vi ville sætte snoren og derefter har en pladsholder der, og derefter efter hver komma, angive, hvilke variable, vi havde. Her vil vi bruge spørgsmålstegnet tegn som vores pladsholder og derefter passere i hver variabel, henholdsvis i orden, for de pladsholdere - hvor disse variabler skal gå. Så her vil den første spørgsmålstegn erstattes af den faktiske brugernavn så det andet spørgsmålstegn ved password. Så endelig, når du har registreret dem og tilføjede dem til databasen, så du ønsker at logge dem ind på hjemmesiden. Vi har sådan en super-global variabel kaldet session. Session tager en vis id, og at id svarer til den bruger, der aktuelt er logget ind Hvad du ønsker at gøre, er at finde, hvad deres bruger-id er og derefter indstille den pågældende session id som den pågældende brugers id. En funktion, som du vil få lyst til at bruge her er der en SQL-kommando der vil hente den sidst indsatte id-nummer fra din tabel. Så rækker vil kalde - it'll kalder id - it'll tildele et navn til det nummer, den returnerer. Det vil kalde det id. Nu vi er færdige registrere, og vi kan gå videre til at citere. Citat giver brugeren mulighed for at indtaste navnet på en bestemt aktie, og så det vil returnere de kvaliteter af denne bestand. Hvad du ønsker at gøre her, er at have en controller og nogle skabeloner. I dette tilfælde vil vi have en controller, som vil gøre alt for at tænke for os. Det kommer til at kigge op symbolet og derefter passere i værdier til de skabeloner, der vil printe ud. Vi kommer til at have 2 skabeloner her. Vi kommer til at have 1 skabelon, der giver den form, hvorunder brugere vil indtaste navnet på det lager - navnet på aktien. Så vi vil også have en anden skabelon, der viser disse værdier. Du kan se på login for et eksempel på, hvordan du ville have en form, der accepterer input, undtagen i her, vi kun ønsker 1 felt. Vi ønsker ikke et brugernavn og en adgangskode felt. Vi ønsker blot 1 tekst felt der giver brugeren mulighed for at indtaste navnet på en bestemt aktie. Så du ønsker at sende disse data - når du har kigget op den pågældende bestand - til quote_form.php. Opslag vil returnere symbolet på en bestand, navn, og en pris. Disse er indeholdt i en associativ array. Slå op i lookup funktion inde i functions.php for mere information om tilbagelevering typer af dem. Great! Så til sidst, vil du ønsker at vise lager oplysninger. Du ønsker at sandsynligvis vise - du vil have adgang til disse variabler. Når du har prisen i en variabel - samt navn og symbol - så vil du ønsker at vise dem i din skabelon side. Denne skabelon side kunne kaldes show_quote.php eller noget. Din quote.php side vil gøre show citerer og derefter passere i alle disse værdier. Så i din php side, du rent faktisk udskrive disse værdier til HTML aspekt af siden. Du skal bare bruge printfunktionen og passerer i prisen. Der er 2 måder - du kan enten sammenkæde det med prik operatør, eller bruge en pladsholder. Brugerne efterhånden vil blive at købe og sælge aktier. Vi ønsker at give dem en eller anden måde at se alle de bestande, at de i øjeblikket har. Vi vil kalde det deres portefølje. Portefølje ville formentlig for hver bruger, indeholder en masse rækker angivelse af aktietype at de har og derefter hvor mange af dem, de har. Vores eksisterende tabel - lige nu har vi en brugere bord i vores database. Der indeholder en brugers brugernavn og password og hvor mange penge de har. Der er ingen reel måde at opbevare alle deres lagre inden for denne. Det er ikke ligesom vi kan indsætte nye kolonner for hver bestand. Det ville være en meget, meget lang række, fordi vi har en uendelig mængde af typer af lagre, de kunne have. Så i stedet, hvad vi vil gøre, er i den samme database, vi vil have en brugere bord, men så vil vi også have en portefølje bord. Porteføljen bord vil blive afgjort knyttet til brugernes bordet, men i stedet porteføljen tabelstruktur vil have lager oplysninger, hvor mange aktier af denne bestand brugeren har, samt en brugers bestemt id-nummer. Du har brugerne tabel, som har en id samt brugernavn, hash - som er den adgangskode, krypteret adgangskode - og derefter mængden af ​​kontanter, de har. Id-nummer vil være forbundet med id-nummer fra porteføljen. Porteføljen vil bare have symbolet på den bestand samt aktier - antallet af aktier af denne bestand, som brugeren har. I denne portefølje bord du ville have stort set alle aktier i besiddelse af alle de brugere på dit websted. Senere kun at fastsætte en bestemt brugers aktier - kun deres portefølje - du ville hente værdierne fra din portefølje bord, således at ID-nummeret er specifikt for den pågældende bruger. Når du får vist portefølje, vil du ønsker at rapportere hver af de bestande i en brugers portefølje. Du ønsker at rapportere antallet af aktier og den aktuelle værdi af disse aktier. Det aktuelle værdi af disse aktier er ikke lagret i porteføljen tabellen fordi det kommer til at være en opdatering - ved minimum - hver dag af Yahoo. For at få disse oplysninger, kan du ikke referere det fra din SQL-forespørgsel. Hvilken funktion giver det os ved? Hvilken funktion vil hente prisen? Det er opslag, vil så ved hjælp af opslag på en bestemt symbol giver dig en masse oplysninger. Det vil give dig 3 stykker af oplysninger - navn, symbol, samt prisen. Når du opslag et bestemt symbol, så kan du hente prisen, og derefter kan du bruge den pris, der skal vises i din portefølje. Porteføljen skal også vise brugerens aktuelle kassebeholdning. Dette område er gemt i din brugere tabel. Så huske, hvordan vi dybest set har til - vi har forskellige typer PHP-filer. Vi kommer til at have en controller, som dybest set gør alt tænker for dig. Og så har vi en skabelon, hvor skabelonen beskæftiger sig med output af data. Du er nødt til at tænke på, hvad variabler regulatoren bliver nødt til at tage i. Hvis vi har at gøre med en portefølje, der udsender hvert navn, symbol, og dele nummer, samt løbende Prisen på en aktie, så vil du ønsker at finde en måde at stort set passerer i - du kan passere i en matrix af værdier, der matcher det. Lad os gå ind i et eksempel på, hvordan du kan hente alle de bestande ejes af en bestemt bruger. Dette er ikke beskæftiger sig - endnu - med prisen på aktien. Hvad dette ville gøre, er at køre en forespørgsel. Det ville opnå symbol såvel som de aktier fra - Jeg ringer denne tabel, men i dette tilfælde hvad ville det så være? Hvad er navnet på den tabel, som vi har at gøre med, der har symbol og aktier for en bestemt bruger? Det er enten brugere eller portefølje. Portfolio. Hvad dette ville gøre, er query portefølje for de symboler og aktier for en bestemt bruger. Her vil jeg sige, (SELECT symbol, aktier fra TBL - men i stedet for tabel, er du nødt til at erstatte det med portefølje. »Hvor er dybest set min tilstand. Jeg siger jeg ønsker kun at få de associative arrays, som svarer  til denne følgende betingelse - id ligemænd.  Så jeg lægger en pladsholder der og derefter session id. Hvad dette vil gøre, er at sige for hver række i rækker. Dette er en pæn måde i stedet for rent faktisk at skulle oprette en for-løkke der gentager over alle de indekser, så i PHP du kan have en for-hver loop. Hvis du har en bestemt opstilling, så kan du sige jeg har tænkt mig at kalde hver efterfølgende element - Jeg har tænkt mig at kalde ethvert element dette navn. Så for hver enkelt af disse elementer, vil jeg kalde dem det, så jeg kan gøre dette. I denne for hver, har du rækker som din faktiske array, og hver række du vil kalde række. Hver gang det udfører kroppen, det vil gå op, og det vil opdatere rækken til næste element i rækker. Nu med hensyn til at købe aktier, hvad vi ønsker at gøre, er at få bestanden, som brugeren ønsker at købe og det samlede antal aktier, som brugeren ønsker at købe, og derefter - hvis de vil - tilføje, at materiel til deres portefølje. Det er klart, hvis de skal købe noget, så der kommer til at falde mængden af ​​penge, de har, så det kommer til at sænke deres kontanter. Vi vil beskæftige sig med ajourføring af porteføljen samt brugernes bordet, som indeholder kontanter. Men først skal du få den faktiske bestand og antal aktier, som brugeren ønsker. Til det skal du bruge en HTML-form, der vil bede om symbol af bestanden at du ønsker at købe, samt antallet af aktier. Så vil du ønsker at tilføje. Du ønsker at vælge bestemte værdier. Vi har været igennem dette lidt i forvejen, men når du forsøger at få bestemte rækker - hente bestemte rækker fra SQL-tabel, dette er den følgende syntaks. Du har markere, og derefter, hvis du angiver en stjerne, der vil dybest set returnere det hele, hele rækken for dig. Så igen, du har den tilstand, hvor, og så skal du angive - Jeg ønsker kun det brugernavn skal være lig med mail-in, så det vil kun hente den række i brugere, der svarer til mail-in. Når en bruger ønsker at tilføje en aktie til en portefølje, du nødt til at tjekke et par fejl. Du vil være sikker på, at brugeren rent faktisk har råd til bestanden, så vil du ønsker at tjekke deres kontanter. Før brugte vi stjerne til at hente en hel række fra en SQL-tabel. Men her kan vi faktisk bare angive, at jeg kun ønsker 1 værdi - Jeg ønsker kun kontanter. Så her ville den returnere penge til brugeren med id nummer 1. Hvis en bruger allerede har købt en bestemt bestand, men derefter køber mere af denne bestand, så i din portefølje - du ikke ønsker en separat linje, anden række, der indeholder den nye transaktion. Du rent faktisk ønsker at opdatere beløbet. Det eneste, der ændrer virkelig er den mængde aktier, som den pågældende bruger ejer. Hvis du bruger indsatsen i forespørgslen - så er det bare indsætte i din portefølje alle disse værdier - brugerens id-nummer samt symbolet på den bestand, de køber og aktierne, så vil du også ønsker at angive, ja, hvis jeg løber ind i en duplikeret nøgle - i dette tilfælde er det duplikeret nøgle ikke kun brugerens id, men også aktiesymbolet - fordi du kun kan have - vores udgangspunkt er, at du kun kan have 1 række  der svarer til 1 bestemt symbol. Så på den duplikeret nøgle - hvis du løber ind i en kollision der - du bare at opdatere aktier til sin nye værdi. Aktier er lig uanset hvad vi havde før plus antallet af aktier, som brugeren køber. Nu, hvor vi har opdateret porteføljen bordet, vi ønsker at opdatere brugerens kontanter. Det er i brugernes bordet, så vi kommer til at trække et bestemt beløb fra kontanter. Formentlig det vil være kontant lig kontante minus - og så et bestemt beløb. Hvis du vil opdatere kontanter, du ville - hvis jeg ønskede at tage penge væk fra mail-in, så ville jeg køre denne forespørgsel - »Opdatere brugernes og derefter indstille cash kolonnen til kontanter - Jeg ville fjerne 9.999 dollars, hvis brugernavn er lig med mail-in. Men i dette tilfælde, ønsker vi ikke at trække 9.999 specifikt. Vi ønsker at præcisere, ja, vi ønsker at trække den aktuelle pris på den bestand ganget med antallet af aktier, de køber. Nu har vi tilladt dem at se alle de lagre, de har, samt købe flere aktier. Vi har også tidligere givet dem mulighed for at slå op den aktuelle pris af en bestand. Her ønsker vi at give dem mulighed for at sælge dem. Først skal vi ønsker at vise dybest set - vi ønsker at give dem mulighed for at se alle de lagre, de har, så her vi ønsker at vise alle rækkerne fra porteføljen. Hvis de vælger at sælge en bestemt aktie, så vil vi antage, at de ønsker at sælge det hele. De er ikke bare kommer til at sælge 50% af deres aktier, kommer de til at sælge 100% af det. Vi kan bare slette hele rækken fra porteføljen. Vi kan slette den givne brugerens aktier i bestemte symbol. Der er syntaksen for det. Så vi ønsker at opdatere kontanter. Vi vil være at tilføje i kontanter svarende til det samlede antal aktier, de sælger ganget med den aktuelle pris på den bestand - ikke den pris, som de købte den, men snarere den pris, som de er - den aktuelle pris, når de sælger det. Til at henvise til aktuelle pris på en aktie, vil du ønsker at bruge opslag, som vil give dig prisen på en aktie på det aktuelle tidspunkt. Nu er vi tilbage med historie, som du vil tillade en bruger at holde styr på alle deres transaktioner - ønsker at se, når de solgte noget, når de købte en bestand. Vi ønsker at angive det tidspunkt, hvor de gjorde det så godt som hvor mange de har købt og hvilken status var. Har vi nogen strøm, eksisterende struktur, der angiver det? Nuvel, vi har portefølje, som viser det antal aktier, som en bruger har for en given aktie. Men vi strukturere portefølje på den måde, den opdaterer, når vi køber flere, hvorimod historien bør - hvis du køber Apple, 10 aktier i det, og så senere på sælge 5, så ville du ønsker at se dem separat som separate aktioner, særskilte rækker. Henviser til, at foranstaltninger til at visualisere det i vores portefølje tabel ville bare være en opdatering til den pågældende række,  så vi sandsynligvis vil ønsker en anden tabel. I vores database har vi vores brugere tabel, har vi vores portefølje tabel, og nu vi vil sikkert gerne en historie bord. Denne historie bord kan holde styr på den aktuelle dato, samt den bestand symbol, samt hvor mange aktier, og så hvad det er - om du skulle købe disse aktier, eller om du solgte dem. For at håndtere dato, der er et par måder, du kan gøre dette. PHP har en måde at holde styr på dato, som du kan se dig selv. I SQL kan du også bruge enten nu eller aktuelle tidsstempel. Det er op til dig. Bare sørg for, at hver gang en bruger køber eller sælger, vil du blive opdatere deres kontanter i users tabellen, vil du blive opdatere rækkerne i porteføljer tabellen, så skal du også være en opdatering af historien, så der vil være 3 separate SQL-forespørgsler, som du skal ringer der. Vi har en masse funktionalitet nu. Bare et par påmindelser om, at i dit indeks fil, du ønsker at linke til mindst din - men du vil få lyst til at give en bruger til at linke til buy.php side. Det kommer til at give en bruger - buy.php er controlleren, så det kommer til at enten sende dig til - der kommer til at sende dig til den form, der giver dig mulighed for at se tingene op. Vi har historie. Vi har logger ud, få et tilbud og derefter sælge. Det er på minimum, hvad du ønsker at vise. Med hensyn til porteføljen, er porteføljen faktisk vist i indekset siden. Hvis vi går til indeks, her ser vi, at den gør portfolio.php og passerer i det associative array - dybest set titlen lig portefølje. Så dette er styreenheden. Hvis vi går til den model for portfolio.php, så er alt det har, er - viser dybest set et billede, der siger, åh, dette site er under opbygning. Senere, når du passerer på - du komme forbi i stort set mere specifikke oplysninger. I stedet for bare titlen, vil du sandsynligvis blive passerer i flere ting. Når du har disse værdier, så portfolio.php kan håndtere disse værdier og printe dem ud i nogen form for orden. Når du har gennemført alle dem, du også nødt til at gennemføre 1 mere funktion. Dette kan enten tillader en bruger at ændre deres password, at nulstille deres password, hvis de har glemt det - så for nulstilling af adgangskoden, så du vil sandsynligvis også ønsker at redigere registrere, så det giver dem mulighed for at angive en e-mail, så hvis de glemmer deres password, så de kan få det. De kan sikkert komme ind i deres brugernavn, og derefter en e-mail vil blive sendt til dem med et link til at kunne nulstille deres password. Du kan få noget, der giver brugerne mulighed for at få kvitteringer hver gang de køber eller sælger noget, og så endelig, give dem mulighed for at tilføje kontanter til deres hjemmeside. Bare for at gå tilbage til begrebet controllere og skabeloner en lille smule. Du vil have noget som en - så du har en controller her. Lige nu ser vi på det login.php eksempel. Når vi har en controller, dybest set det kommer til at tage 2 sager. Når vi har controllere, vi er i dette stykke, at vi er også slags beskæftiger sig med når vi har formularer så godt. Regulatoren vil dybest set have separate aktioner - en, hvis en formular allerede er indgivet, og derefter to, hvis brugeren kommer til denne side for første gang og stadig behov for input denne form. Jeg har tænkt mig at hoppe til det pågældende sag først, før går op til det første tilfælde af med formen i. Her siger vi, hvis formularen er blevet forelagt med metoden post - ikke bekymre dig om, at en smule. Må ikke bekymre dig om det for meget, men forstår, at dybest set denne funktion beskæftiger sig med hvorvidt en form er blevet sendt eller ej. Denne betingelse gælder, hvis en bruger har indsendt formularen. Hvis ikke, så vil vi vil ringe Render login_form.php, og derefter passere i titlen. Denne titel er bare dybest set kommer til at vises i sidehovedet. Hvad dette gør, er dybest set siger, okay - ja, hvis en bruger går til login.php og faktisk ikke har logget ind, så jeg vil gerne sende dem til den side, der har denne formular der giver dem mulighed for at indtaste brugernavn og password. Så jeg gå til login_form, og så har det den faktiske form. Så, når brugeren sender denne formular, så vil de sende det til login.php med fremgangsmåden stilling. Så jeg faktisk kommer til at gå ind i denne del af min if-else loop. Så er det her, at vi behandler de værdier, der indtastes i formularen. Det er her, vi beskæftiger os med dem. Så når du beskæftige sig med disse værdier - hvis du har at gøre med - siger, at vi har at gøre med den quote.php side, hvor en person kan indtaste en bestand, de ønsker at slå op, og derefter se, at displayet - Det er slags ligner her. Her har vi en login-formular - ville i stedet sandsynligvis have et tilbud formular - men så når brugeren har faktisk fremlagt disse oplysninger, så vil du ønsker controlleren til at passere ind i en anden skabelon som vil vise dem, at faktiske oplysninger. Så lige her omkring, så vil du sandsynligvis - omkring slutningen af ​​din tilstand her - hvis metoden er lig post - så vil du sikkert gerne gøre en anden side - showet citerer - som sender dig til denne side - show_quote.php-- og derefter i denne fil vil referere disse værdier. Giver det mening? Vi har en controller, der dybest set handler de 2 sager - om du har indtastet en form i eller ej. Hvis du ikke har indtastet en formular, så det vil omdirigere dig til den form, som derefter vil sætte dig tilbage til denne side. Så, når du har oplysninger i regulatoren, vil dette organ beskæftige sig med det oplysning som nødvendigt - enten kigge op værdier for bestanden, og så når den er så op disse værdier og har dem i et pænt formateret array, så kan videregive denne opstilling ind i skabelonen siden  som beskæftiger sig med udsende disse oplysninger. Igen, da det er web, går det at være sjovt. Vi er uden for C, så vi ikke er begrænset til ASCII og at terminal output, så have det sjovt med dette. Du kan gøre det som et visuelt som du ønsker. Du kan tillade brugere at indtaste millioner af dollars på et tidspunkt, eller begrænse dem og være virkelig betyder og give dem mulighed for kun at indtaste 1 penny på et tidspunkt eller noget i den retning. Absolut være sikker på at have det sjovt med dette. PHP koden er en smule enklere i, at det er en smule nemmere at kortlægge din pseudokode i selve gennemførelsen. Så helt sikkert have det sjovt med det, fordi det er faktisk vores sidste brik i CS50. Med dette, var denne Walkthrough 7. Når du er færdig med at se walkthrough og færdig med din Pset, så disse var også psets, og nu er vi videre til det endelige produkt - efter vi kommer igennem quiz 1. Så forhåbentlig kan du bruge de værktøjer, du har lært fra psets - ikke kun syntaksen, men mere det abstrakte begreb hvordan man kan tage en vis - gerne, jeg ønsker at gøre dette og derefter rent faktisk at gennemføre det. At lære at kæmpe sig gennem syntaks og distribution kode. Læse andre folks kode og derefter fortolke denne bruger allerede eksisterende funktioner. Så held og lykke med den sidste Pset. Det har været en fornøjelse at lede walkthroughs. Jeg håber, at de har været nyttige for dig. Disse var Walkthroughs, og takker meget. [CS50.TV]