[RIPRODUZIONE DI BRANI MUSICALI] DAVID MALAN: Va bene, questo è CS50. Questa è la fine di otto settimane. E oggi, iniziamo a riempire alcuni pezzi quando si tratta di costruzione cose sul web. Quindi, ricordare che il Lunedi passiamo molto più tempo su PHP, che è questa dinamica linguaggio di programmazione che ci permette di uscita, tra l'altro cose, HTML e altri tali contenuti che ci vogliamo vedere. Ma noi non abbiamo davvero guardato come stiamo andando a memorizzare tutte le informazioni. Infatti, quasi tutte che il super interessanti siti web visitati oggi avere una sorta di banca dati sul back-end, giusto? Facebook salva sicuramente un sacco di dati su tutti noi e negozi Gmail tutto delle vostre email. E così, molti altri siti non sono solo contenuto statico che è informativo. In realtà dinamica in qualche modo. Si fornisce di ingresso, aggiorna le pagine per altre persone. Si riceve un messaggio, di inviare messaggi, e così via. Così oggi, guardiamo più da vicino le basi di un progetto che ti immerge in prossimo settimana, CS50 Finanza, che è in realtà sta per avere a costruire qualcosa che non in C, ma in PHP. Un sito che sembra un po 'di qualcosa di simile che permette di acquistare e vendere titoli che sono in realtà andare a attingere in tempo reale i dati di stock da Yahoo Finance. E così alla fine, avrete la illusione per te e per gli utenti che si sta effettivamente comprando e vendendo scorte e ottenere tempo quasi reale gli aggiornamenti, la gestione di un portafoglio, tutte sta per richiedere avere, in definitiva, un database di utenti. Così, con parole tue, soprattutto se non siete eccellente familiarità con il computer scienza o banche dati, cosa fai a sapere di un database per essere in questo momento, in termini non tecnici? Cos'è? Come descriveresti lo a un compagno di stanza o un amico? PUBBLICO: [incomprensibile] Informazioni [incomprensibile] DAVID MALAN: Quindi, un elenco di informazioni, o un store-- un elenco di informazioni che si potrebbe desiderare di memorizzare di qualcosa, come un utente. E che cosa gli utenti hanno essi associati? Se sei un utente su Facebook o Gmail, quali sono le caratteristiche che tutti noi utenti hanno? Come, cosa potrebbe essere alcune delle colonne nel foglio di calcolo a cui alluso l'ultima volta? Perché ancora una volta, è possibile pensare ad un database davvero come un file di Excel di fantasia o Google Foglio di calcolo o un file Numbers di Apple. Allora, cosa ne pensi di quando si pensa di un utente? Che cosa hanno? Che cos'è? PUBBLICO: Un nome. DAVID MALAN: Un nome. Quindi se il nome, come, David Malan sarebbe il nome di un utente. Che altro ha un utente? PUBBLICO: Un ID. DAVID MALAN: un ID. Così, come un numero di identificazione, come il vostro Harvard ID o il vostro ID Yale netto o simili. Che altro potrebbe avere un utente? PUBBLICO: password. DAVID MALAN: Una password, forse un indirizzo, forse un numero di telefono, forse un indirizzo email. Quindi, ci sono mazzi di campi e questo potrebbe sorta di spirale fuori controllo rapidamente non appena si inizia realizzando, oh, cerchiamo di conservare questo e cerchiamo di conservare questo e quello. Ma come possiamo effettivamente fare che? Così ancora una volta, il modello mentale avere per oggi come noi tuffarsi in effettivo SQL, Structured Query Language, è un database che assomiglia a questo. E 'solo righe e colonne. E si può immaginare di Google Spreadsheets o un qualsiasi numero di altri programmi. Ma ciò che è fondamentale su MySQL, che è il software di database che andremo ad utilizzare, la liberamente apertamente available-- usi Facebook e qualsiasi numero di altri websites-- database memorizza le cose relazionale. E un database relazionale solo uno che letteralmente significa memorizza i dati in righe e colonne. E 'così semplice. Quindi, anche qualcosa di simile Oracle potreste aver sentito parlare di genere è un database relazionale. E sotto il cofano, memorizza i dati in righe e colonne. E Oracle una carica sacco di soldi per farlo, che le tariffe di MySQL voi nulla per lo stesso. Quindi, SQL sta per dare noi almeno quattro operazioni. La capacità di selezionare i dati, come lettura dati, inserire, eliminare e aggiornare i dati. In altre parole, questi sono in realtà le quattro operazioni fondamentali che stanno andando per permetterci di cambiare roba in quelle righe e colonne. Lo strumento che utilizzeremo oggi soprattutto imparare SQL e di giocare con lui è di nuovo chiamato PHP MyAdmin. E 'strumento web based. Una coincidenza totale che è scritto in PHP. Ma sta andando a darci una grafica interfaccia utente in modo che possiamo realmente creare queste righe e colonne e poi parlare con loro tramite codice. Allora, ora cominciamo a quello che penso è francamente tipo di processo di divertimento costruire il back-end di siti web, le parti che gli utenti non lo fanno vedere, ma sicuramente fare preoccupano, perché questo è piuttosto di dati in corso. Quindi, simile a C e po 'meno come PHP, SQL o un database che supporta SQL, ha almeno questi tipi di dati e mazzi di altri. CHAR, VARCHAR, INT, BIGINT, Decimale e DATETIME. E c'è un intero mucchio di altre caratteristiche, ma facciamo questo per a titolo di esempio reale. Ho intenzione di andare in CS50 IDE dove, in anticipo, ho collegato e ho visitato anche un URL per questo strumento chiamato PHP MyAdmin. E nel problema impostare sette, vi racconteremo esattamente come arrivare a questa interfaccia anche. In alto a sinistra, notarlo dice lezione. E questo significa solo che in anticipo, ho creato un database chiamato lezione vuoto che non ha ancora i fogli di calcolo in esso. Non ci sono righe e colonne. Poiché il primo cosa stiamo andando a fare è cominciare a creare una tabella che sta per archiviare i nostri utenti. Così, letteralmente sopra qui a destra, io sono andando a dire il database Voglio un tavolo chiamato utenti. Quindi, questo è come il file che ho desidera memorizzare tutti i miei dati. E quante colonne? Beh, teniamolo semplice per ora. Voglio solo archiviare come un utente e un nome di un utente. Inizieremo piccolo. Quindi, voglio totale due colonne. E ho intenzione di andare avanti e fare clic su Vai. E poi, per queste colonne, quello che sto per fare-- se questo Internet cooperates-- tutto bene, quindi stiamo andando a cercare di nuovo. Ho intenzione di creare una tabella chiamata Gli utenti con due colonne, fare clic su Vai, OK. Ora l'abbiamo veramente veloce. Grazie, molto ben fatto. Va bene, allora ciò che vogliamo queste colonne di essere chiamato? Quindi, si sta andando ad essere chiamato Nome utente. Quindi, tutto quello che vedo qui-- e l'interfaccia diventa francamente un po 'brutto alla fine, una volta che si inizia a digitare in tutti questi dati. Ma ciò che è bello è che una sorta di paradossalmente, sto creando colonne, ma lo strumento ha scioccamente li a schiera e in modo che io possa configurare queste colonne. Quindi, ci sono due spazi vuoti lì sotto Nome. E uno di questi campi I vogliono chiamato Nome utente, e l'altro campo voglio chiamare Nome. E ora devo scegliere tipi di dati per queste cose. Così, mentre in Excel e Google Spreadsheets, se si desidera una colonna, è letteralmente basta digitare nome o nome utente, premere Invio. Forse si rendono grassetto solo per chiarezza, ma questo è tutto. Non si specifica il tipi di colonne. Ora in Google Spreadsheets o Excel, si potrebbe indicare come i dati vengono resi. Si potrebbe andare al menu Formato, e tu possibile specificare mostrargli il segno del dollaro come, mostrare questo come un valore in virgola mobile. Quindi, è simile nello spirito a che quello che stiamo per fare, ma questo è in realtà sta per forzare i dati da un certo tipo. Ora, anche se un attimo fa ho Detto questo ci sono solo alcuni tipi di dati, c'è in realtà un bel po ', e sono in vari gradi di specificità. E per inciso, è può anche fare cose di fantasia come geometrie di stoccaggio all'interno di un database. È possibile memorizzare le cose come coordinate GPS ed effettivamente trovare, matematicamente, punti che sono vicini agli altri. Ma stiamo andando a mantenere questo super semplice e andare fino a qui, tutto i cosiddetti tipi di stringhe. Quindi, ecco una lista di un sacco di opzioni. CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. Ed è una specie di travolgente. E purtroppo, un po ' paradossalmente a C, un CHAR non è davvero un CHAR. Se si specifica in un database che il tipo di dati è CHAR, ciò significa che sì, è un CHAR, ma è uno o più CHAR. E si deve specificare quanti CHAR si desidera. Allora, che cosa è un tipico di lunghezza per un nome utente? C'è un limite di solito? PUBBLICO: [incomprensibile] DAVID MALAN: 16 forse? Qualcosa del genere. Sai, in giorno, è usato per essere otto. A volte è 16 volte è ancora di più. E così, questo non lo fa dire dammi un CHAR. Questo significa che devo specificare la lunghezza del campo, e ora potrei dire qualcosa come 16. E c'è un compromesso qui. Quindi, vedremo in un momento questo significa che uno, ogni nome utente deve essere di 16 caratteri. Ma aspettate un minuto, M-A-L-A-N. Se questo è il mio nome utente e sto usando solo cinque, cosa vorresti proporre che il database da fare per gli altri 11 personaggi che Ho riservato lo spazio per? Cosa faresti? PUBBLICO: [incomprensibile] DAVID MALAN: Sì, solo tutti loro nulla fare. Renderli spazi. Ma probabilmente nullo, così un sacco di zeri backslash. Così, da un lato, abbiamo ora fatto in modo che il mio nome utente può essere non più di 16 caratteri. E il rovescio della medaglia di ciò è che se avessi davvero un nome lungo o voluto un tempo molto lungo nomeutente come alcuni di voi ragazzi potrebbero avere in quel college o a Yale.edu, non si può avere uno. E così in effetti, se hai mai registrato per un sito web e si ottiene urlato a dire la password è troppo lungo o il tuo nome utente è troppo lungo, è semplicemente perché un programmatore, quando configurare sua banca dati, ha deciso che questo campo sarà non più di questa lunghezza essere. Va bene, e allora se si procede a un nome? Quanto tempo dovrebbe un tipico nome di umano essere? Come molti personaggi, 16? Sto indovinando potremmo trovare qualcuno in questa stanza dove per il suo primo più ultimo nome è più lungo di 16 caratteri. Allora, cosa c'è di meglio di questo, il 17? 18? 25? Maggiore? 30? PUBBLICO: [incomprensibile] DAVID MALAN: 5.000, oh mio Dio. Quindi, questo è probabilmente un discreto limite superiore, diciamo. E qui noi abbiamo tipo di per effettuare una chiamata in giudizio. Come, non c'è una risposta proprio qui. Infinito non è del tutto possibile, perché siamo alla fine andando a have-- siamo andando a esaurire la memoria. Quindi, dobbiamo fare un chiamata in giudizio a un certo punto. Molto comune sarebbe, per esempio, a use-- e fammi specificare CHAR qui come before-- 255 è stato letteralmente limite superiore di questo software di database anni fa. E così, un sacco di esseri umani sarebbe solo dire bene. 255 è il limite. Diciamo basta usare il massimo. E questo è abbastanza ridicolo. Come, se si sta digitando di qualcuno nome per oltre 200 personaggi, che un po 'ridicolo. Ma, ricordate che non è ASCII l'unico sistema per caratteri. E così, soprattutto in un molte lingue asiatiche dove c'è personaggi non possiamo esprimere alle tastiere come il mio Stati Uniti tastiera, alcuni personaggi in realtà prendere 16 bit invece di otto bit. E così, questo in realtà non è poi così irragionevole che abbiamo bisogno di più spazio se vogliamo andare bene caratteri più grandi rispetto alla molto Uniti quelli centric abbiamo avuto la tendenza a discutere. Quindi, abbiamo bisogno di qualche limite superiore. Non so quale sia la migliore è, ma 255 è generalmente un comune. 25 si sente basso. 16, 32 si sentono basso. Vorrei peccare per eccesso di qualcosa di più alto. Ma c'è un compromesso, come sempre. Qual è la, forse, ovvio trade off di riservare 255 CHAR per il nome di tutti nel mio database? PUBBLICO: [incomprensibile] DAVID MALAN: Che cos'è? PUBBLICO: [incomprensibile] DAVID MALAN: E 'un sacco di memoria, giusto? M-A-L-A-N. Ho appena sprecato 250 personaggi solo per memorizzare il mio nome in difesa, in caso qualcuno nella classe ha una molto lungo nome. Che sembra un compromesso eccessivo. Così, si scopre che SQL, questo linguaggio di database, in realtà sostiene qualcosa chiamati VARCHAR o char. E questo è una specie di piacevole in quanto tale consente di specificare non un fisso larghezza, ma piuttosto, una larghezza variabile. E più precisamente, un larghezza massima del campo. Quindi, questo significa che un nome può essere non più di 250 caratteri, ma può certamente meno. E il database sta per essere intelligente. Se si mette in M-A-L-A-N, è solo andando ad utilizzare cinque, forse sei byte per come un carattere null finale, e non spendere un ulteriore 249 o 250 byte inutilmente. Quindi, questo sembra come dovrei hanno iniziato con questa storia. Ma c'è sempre un compromesso. Così, da un lato, un nome utente ho specificata da hardcoded a 16, e forse che non era la chiamata giusta, forse è, ma perché non usare VARCHAR per tutto? Esiste per un motivo. Perché non usare VARCHAR per tutti i campi la cui lunghezza non si conosce in anticipo se sembra essere una grande cosa, giusto? Usare solo tanto spazio quanto è necessario fino a questo limite? PUBBLICO: lento. DAVID MALAN: Speller? PUBBLICO: Lo rende più lento? DAVID MALAN: Oh, è più lento. Bene, questo è quasi sempre la risposta, francamente. Come, qual è il compromesso? E 'uno dei due costa più spazio o costa di più tempo. Quindi, in questo caso, potrebbe essere più lento. Come mai? PUBBLICO: [incomprensibile] determinando [incomprensibile]. DAVID MALAN: Good. Quindi, si potrebbe ricordare anche da PSED5, giocare con il vostro approccio al dizionario, se si deve allocare dinamicamente la memoria o mantenere crescere un buffer, che può effettivamente essere lento. Se devi chiamare malloc sotto il cofano e forse questo è ciò che MySQL sta facendo, in modo da sicuramente che potrebbe essere il caso. E se pensate che modo torna a PSet-- o addirittura settimane, due cose quando abbiamo fatto come ricerca binaria o anche ricerca lineare, una delle cose belle di ogni parola in un database o ogni parola in una colonna essendo esattamente la stessa lunghezza, anche se un intero gruppo di quei personaggi sono vuote, è che è possibile utilizzare accesso casuale i vostri dati, giusto? Se si sa che ogni parola è 16 caratteri di distanza, è possibile utilizzare l'aritmetica dei puntatori, in modo da parlare, e andare a noi 16, 32, 48, 64, e si può saltare solo utilizzando il aritmetica a qualsiasi delle parole nel database. Mentre se si tratta di un VARCHAR, cosa invece deve fare? [Telefono squilla] Se si tratta di un VARCHAR, si non è possibile utilizzare l'accesso casuale. Che cosa si deve cercare o fare? Sì? PUBBLICO: [incomprensibile] DAVID MALAN: Guarda attraverso la traccia whole-- tutta la lista ricerca di ciò che, più probabile? Che tipo di valore speciale? PUBBLICO: [incomprensibile] DAVID MALAN: Guardando per i terminatori Null che delimitano la separazione delle parole. Quindi, di nuovo, un compromesso, e non c'è una risposta giusta. Ma è qui, soprattutto quando gli utenti arrivare a essere molti e il carico sui server, il numero di chi lo utilizza ottiene alto, queste sono in realtà scelte non banali. Quindi, possiamo lasciare questi come questo, ma cerchiamo di scorrere verso il basso sulla destra Qui. Ora, ci sono un paio di colonne dove dobbiamo fare una chiamata in giudizio. Ha senso per consentire a un utente di il nome, il nome utente di un utente o di un utente del nome, per essere nullo? Cioè, solo vuoto. Si sente un po 'assurdo, quindi sono Non andando a controllare quelle scatole. Ma risulta in un database, è possibile dire, qualcuno può opzionalmente avere questo valore. Questa colonna non ha di essere effettivamente lì. Ora, c'è questo menu a discesa. E accorgo io sono ancora in prima fila là, così io sto parlando di nome utente ora. E si scopre che un database, a differenza di un semplice foglio di calcolo semplice, ha caratteristiche potenti chiamati indici. E un indice è un modo di raccontare la database in anticipo che l'umana Sono più intelligente di te. Io so che tipo di query, selezionare o inserire o cancellare o aggiornare, che il mio codice sta per finire per fare su questo database. Voglio leggere un sacco di dati. Voglio inserire un sacco di dati. Voglio sempre eliminare un sacco di dati. Se so che ho intenzione di essere l'accesso a un campo, come nome utente molto, Posso dire preventivamente il base di dati, ne so più di te, e voglio decreto che si dovrebbe indice di questo campo. Qualora l'indicizzazione di un campo o una colonna significa che il database in anticipo dovrebbe prendere in prestito alcune idee da, come, Settimana quattro e cinque e sei da CS50 ed effettivamente costruire qualcosa di simile a una ricerca binaria albero o qualcosa generalmente chiamato un albero B che si sarebbe imparare in una classe come CS124 a Harvard, una classe di algoritmi, o un qualsiasi numero di altri posti. Il database e la smart persone che hanno implementato la capirà come memorizzare tale tabella di informazioni in memoria in modo che le ricerche e altre operazioni sono super veloce. Non devi farlo. Non è necessario implementare ricerca lineare o ricerca binaria o merge sort o selezione tipo, nulla di tutto ciò. La banca dati fa per voi se dite essa preventivamente all'indice questo campo. E si può vedere anche, non c'è altre caratteristiche siamo in grado di dire il database di far rispettare. Che cosa potrebbe significare se scelgo Unico da questo menu, solo intuitivamente? Sì? PUBBLICO: [incomprensibile] DAVID MALAN: Sì, il nome utente deve essere univoco. E 'questo un bene o un male per un database, per un sito web con gli utenti? Dovrebbero essere i nomi utente unico? Sì, probabilmente. Se questo è ciò che il campo usiamo il login, non si vuole veramente per le persone che hanno la stessa sensazione o lo stesso nome utente. Quindi, possiamo avere la database di far rispettare che così che ormai nel mio codice PHP o qualsiasi altro linguaggio, Non ho, ad esempio, controllare fa necessariamente questo nome utente esisto prima di lasciarti registrare qualcuno? Il database non permetterà che due persone di nome Davide o Malans registrano in questo caso. E per inciso, anche se questo menu consente solo di selezionare uno, un indice univoco è uno che è indicizzato per prestazioni super veloce, ma impone anche unicità. E torneremo a quello che il altri due significare in un attimo. Nel frattempo, se vado a la mia seconda fila, che è il nome dell'utente, dovrei specificare che il nome dovrebbe essere unico? No, perché si potrebbe certamente have-- non c'è due David Malans in questa stanza, molto probabilmente. Ma se si sceglie un nome diverso, potremmo sicuramente collisioni. Ripensate alle tabelle e simili. Quindi, noi certamente non vogliamo per rendere il campo nome univoco. Quindi, stiamo solo andando a lasciare che, come cruscotto, plancia, cruscotto, niente. E ho intenzione di lasciare tutto il resto da solo. Infatti, la maggior parte di questi campi non dovremo preoccuparsi. E quando sono pronto a salvare questo, Se Internet coopera, Clicco Salva, e molto, molto, molto lentamente fa la banca dati vengono salvati. E ora sono tornato a questo interfaccia, che è vero, è travolgente a prima vista. Ma tutto quello che ho intenzione di fare è fare clic su sulla parola Utenti in alto a sinistra. Ho intenzione di andare qui, fare clic su Gli utenti, e per impostazione predefinita, ha eseguito alcuni SQL, ma più su che in un momento. Ecco solo un riassunto di quello che ho fatto. E non preoccuparsi che si vede parlare di latino e lo svedese qui. Questi sono solo il default impostazioni, perché MySQL in origine, o PHP MyAdmin, uno dei due è accaduto per essere scritto da alcune persone svedesi. Ma è irrilevante nel nostro caso qui. Va bene, e allora perché è tutto questo interessante? Si scopre, posso inserire dati in un database scrivendo codice. E sto vado avanti e nel mio file qui, sono intenzione di andare avanti e far finta come questo è collegato al database, che non è al momento, ma sarà essere quando si arriva a problema impostato sette. E ho intenzione di andare avanti e eseguire una funzione chiamata di query, che vi daremo in problema impostare il codice sette di distribuzione, che prende almeno un argomento, che è solo una stringa. Una stringa di codice SQL. Quindi, si sta per imparare a scrivere Structured Query Language. Se voglio inserire una nuova riga nel mio database perché qualcuno ha presentato un modulo per il mio codice, vorrei letteralmente scrivere INSERT INTO utenti la seguente i campi: nome utente, virgola, nome, i valori, e ora ho bisogno di inserire qualcosa come Malan, e citazione, unquote 'David Malan.' E adesso anche per chi non conosce SQL, perché sto usando apici all'interno di questa stringa verde? Quale potrebbe essere il motivo qui? Notate Sono commistione due lingue. Query è una funzione PHP, ma ci vuole un argomento. E tale argomento deve essere di per sé scritto in un'altra lingua chiamato SQL, Structured Query Language. Così, tutto ciò che hanno appena messo in evidenza qui è questo linguaggio chiamato SQL. Quindi, qual è con le virgolette singole, proprio come un controllo di integrità rapida? Vai avanti. Sono stringhe. Così, citazione, unquote Malan e citazione, unquote David Malan sono stringhe. E proprio pensando intuitivamente ora, sapendo quello che sai di C e PHP, perché ho fatto a non fare questo, che di solito virgolette usati per le stringhe? Perché non ho voglia di farlo? Sì? PUBBLICO: [incomprensibile] DAVID MALAN: Esattamente. Perché io sto già usando virgolette sulla strada al di fuori dell'argomento alla funzione PHP, Vorrei solo confondere il interprete. Non si sa, fanno questi vanno insieme? Do questi vanno insieme? Do questi vanno insieme? Così, invece alterno. Oppure avrei potuto fare qualcosa di simile, preventivo backslash o preventivo backslash. Francamente, che inizia appena a ottenere molto illeggibile e brutto. Ma che sarebbe raggiungere lo stesso risultato pure. Quindi, se dovessi eseguire questo domanda ora, vediamo cosa succede. Ho intenzione di andare avanti ora e piuttosto di eseguire il codice PHP, che è dove giocherai nel problema set di sette, Ho intenzione di andare invece PHP MyAdmin. E ho intenzione manualmente per andare alla scheda SQL, e fammi ingrandire i dell'interfaccia. E ho intenzione di incollare la cosa che ho appena scritto. E la codifica colore ha cambiato un po 'ora, proprio perché i formati di programmi le cose un po 'diverso. A meno di notare che tutto quello che ho fatto è che ho detto, inserire gli utenti. Ho specificato, poi, in una virgola separato lista tra parentesi i due campi che voglio inserire, e allora ho detto letteralmente valori seguito da un altro parentesi tonda, e poi i due valori Voglio plug-in, e ora per buona misura, Metterò una virgola alla fine. Quindi, questo non è C. Questo non è PHP. Questo è ora SQL, e sto incollandolo in questa interfaccia web based che è solo andando a lasciarmi, non appena clicco Go, eseguire la query sul database in esecuzione all'interno di CS50 IDE. Quindi questo è un bene. Si noti che ha detto una riga inserito, è andato super veloce, 0,0054 secondi per inserire tali dati. Quindi, che suona abbastanza sano. Si riformattato mia domanda per me qui solo per vederlo in una sorta di codice colore versione. Ma ora se clicco Sfoglia, si noti che, anche se c'è un sacco di confusione su lo schermo, il mio tavolo ha ora due file. Quindi, mi permetta di andare avanti e fare un altro. Invece di questo, mi permetta vai alla scheda di SQL di nuovo. E questa volta farò inserire qualcosa di simile Rob e il suo nome sarà Rob Bowden. Bowden. Cerchiamo di fare clic su Salva. Oops, piuttosto Go. Fare di nuovo clic su Sfoglia e ora notare ho due righe. Quindi, questo è solo un modo più complesso modo di aprire Google Spreadsheets e solo digitando una riga in una colonna. Ma che cosa è fondamentale è che ora abbiamo la sintassi con cui scrivere codice in modo che in ultima analisi, potremmo realmente fare un po 'e questo. Ricordiamo che supporta PHP variabili globali eccellente. Ciò che è dentro di dollaro accedi sottolineatura GET in PHP? Abbiamo dato un'occhiata a uno o due semplici esempi. E in PSet6, ricordano avete ciao dot PHP che utilizza questa variabile. Che cosa va in là? O che cosa si tratta? Un po 'più forte. PUBBLICO: [incomprensibile] DAVID MALAN: E 'una neve seme di array, che è solo un modo elegante per dire un array con coppie di valori chiave. E le chiavi non sono numerici. Sono parole o stringhe. E in particolare, cosa sono quelle coppie di valori chiave? Da dove vengono? Scusate? PUBBLICO: [incomprensibile] DAVID MALAN: No? Dove fare quelli chiave coppie di valori vengono? Dillo ancora? Ancora? Sono l'unica udienza qualcosa? [Risata] Proprio così, sì? PUBBLICO: [incomprensibile] DAVID MALAN: Sì, provengono dalla stringa di query. Quindi, se si riavvolge in tempo per quando abbiamo giocato con Google e siamo andati a Google.com barra Ricerca punto di domanda q è uguale a gatti, se dovessi premete Invio e se Google sono state implementate in PHP, Codice PHP che Google ha scritto avrebbero accesso a simbolo del dollaro sottolineare GET all'interno del quale è una chiave denominata Q e un valore cosiddetti gatti che si può quindi utilizzare usato per fare una ricerca vera e propria con. Così, in effetti, quello che ho intenzione di fare ora è tornare al mio codice PHP che vedrete ancora più in PSet7. E invece di collegare in valori codificati duri che non sembra come un molto sito web dinamico, Sto per darvi un teaser di ciò che il codice vero e proprio avrebbe fatto. Si potrebbe mettere in due punti interrogativi come questo. Non so che cosa il nome utente è. Io non so quale sia il nome sta per essere, ma so che posso ottenere in modo dinamico. Quindi, se il codice che stiamo scrivendo ora è il codice in esecuzione sui server di Google, o se questo è ciao puntino PHP, che viene fornito con PSet6, Ho intenzione di passare in la funzione di query proprio come printf, due altri argomenti. GET, citazione, il nome utente unquote, e GET, citazione, nome unquote. E ora, che cosa la nota struttura generale è qui. Ho a sinistra lato della chiamata, questa funzione chiamata query in PHP. Ho ancora come prima argomento, solo una stringa di testo. Ma quella stringa di testo è scritto in un linguaggio chiamato SQL. E, francamente, non è una grande lingua. Stiamo solo andando a parlare formalmente oggi, davvero. E poi nel problema set sette, c'è relativamente alcune caratteristiche che siamo andando a sfruttare. I punti interrogativi, però, significano plug in un valore qui e presa in un altro valore Qui. E notate, ho omesso cosa da tutto il maledetto quote-- it-- intorno alla citazione segna questa volta. Ho omesso la citazione segni intorno il punto interrogativo, mi dispiace, questa volta. Allora, che cosa è bello su questo domanda caratteristica marchio che PHP tende a sostenere, Ruby e Python e altri linguaggi, questo significa solo presa in qualche apprezzi qui e sapete una cosa? A capire se utilizzare apici singoli o doppi apici. Non preoccupatevi di me con quelle dettagli intellettualmente interessante. Ma, assicurarsi che sia corretto in modo che il mio codice è in ultima analisi, operativa e sicuro, che avrà un significato prima lungo. Ora, quanti argomenti totale, solo per Sia chiaro, è la funzione di presa di query? Chiunque vuole votare per più di due? Tre? Certo, perché? Perché tre? PUBBLICO: [incomprensibile] DAVID MALAN: Esattamente. La prima parte è la stringa. Il secondo argomento è il segno del dollaro sottolineare staffa GET nome utente. E il terzo argomento è il stessa cosa, ma solo il nome. In altre parole, ora se avessi un modulo web che doveva campi di testo, uno per il nome utente dell'utente, uno per il suo nome, semplicemente come si farebbe vedere in un sito web al momento della registrazione per qualche sito web, questo potrebbe essere il codice sul back-end che in realtà fa l'inserimento ora nel database. Ora invece, andiamo avanti veloce. Supponiamo che un utente è ora l'accesso e si desidera scrivere il codice PHP che controlla se la persona che ha appena registrato è in realtà un utente, è possibile utilizzare la sintassi abbastanza semplice. Si può dire SELECT, diciamo stella, dove stella significa tutto. Io non so quello che ho vogliono, così appena mi danno tutte le colonne della tabella chiama gli utenti dove, e questo è bello. Selezionare sostiene ciò che è chiamato un predicato, che è come un modo di qualificare ciò che si desidera. Dove nome utente uguale citazione, unquote Malan. Quindi anche qui, io ve conficcarono all'interno della discussione a una funzione PHP, una riga di codice SQL. E che il codice SQL questo il tempo è letteralmente andando per la ricerca di preventivo, unquote Malan. Ora che non è poi così utile, così ho intenzione di saltare quel e ho intenzione di mettere via questo suggerimento da Brady, e andare e plug-in invece un punto interrogativo qui. Così, tanto per essere chiari, cosa dovrebbe il mio secondo argomento essere se qualcuno ha appena effettuato il login e io voler controllare se lui o lei è in realtà un utente? PUBBLICO: [incomprensibile] DAVID MALAN: Sì. Sento dollaro segno di sottolineatura GET citazione, nome utente unquote. E che dovrebbe tornare a me una delle righe nel mio database che hanno un nome utente di Malan. Ora si spera, ho intenzione di tornare zero se Malan non è mai stato qui, o uno se ha. Non dovrei tornare due o tre o quattro. Come mai? PUBBLICO: [incomprensibile] DAVID MALAN: Ho detto unico, giusto? Motivo semplice. Perché ho detto è avuto modo di essere unico, solo logicamente, si può avere solo zero o uno Malans in questo particolare tabella di database. Ora, come un a parte, solo così hai visto , anche se io continuo ad usare GET e anche se PSet6 utilizzati solo Get, si può certamente avere POST. E ricordare che la Posta è un altro tecnica per la presentazione delle informazioni da un modulo, ma non si presenta nell'URL. E 'un po' più sicuro certamente per cose come nomi utente e password, PSet7 che sarà, infatti, comporta. Quindi, cerchiamo di fare questo in PHP MyAdmin e vedere cosa succede. Ho intenzione di andare alla scheda MySQL. E notare che il valore predefinito per PHP MyAdmin, solo per cercare di essere utile, è quello di selezionare stelle da parte degli utenti dove uno. Bene, uno è sempre vero, quindi questo ha la stupida efficace di sufficiente selezionare tutto. Ma ho intenzione di essere un po ' più pedante e manualmente digitare out SELEZIONA stelle da parte degli utenti. Ora tecnicamente, è possibile citare il nome delle tabelle. E 'raro che si deve, ma notano questi non sono le vostre citazioni normali sulla tastiera statunitense. Questo è il cosiddetto backtick, che è generalmente sul lato superiore sinistro angolo della vostra tastiera. Ma è raro che ci effettivamente bisogno di preoccuparsi di questo, quindi mi limiterò a li tralascio comunque. Così ora, lasciami andare avanti e ha colpito andare. E quante righe dovrei comprare indietro quando seleziono stelle da parte degli utenti? PUBBLICO: [incomprensibile] DAVID MALAN: Il numero di righe, certo. Ma quanti in questo storia concreta in questo momento? Due, perché c'era me e c'era Rob. Quindi, se clicco Go, vedo che visivamente Ho ottenuto indietro, anzi, due file. C'è un sacco di confusione sulla schermo, ma vedo solo due righe. Al contrario, se faccio questo di nuovo e fare Scegliere categoria degli utenti, dove username uguale citazione, unquote Malan, ora se clicco Go, Sto solo andando a ottenere indietro una riga. E, infine, se lo faccio qualcosa di simile a questo, supponiamo che non mi interessa ottenere tutto, che è una specie di insignificante oggi, perché ci sono solo due colonne. Non è che io sto selezionando una quantità enorme di dati. Supponiamo che io vado avanti e non selezionare il nome da utenti, dove username è uguale Malan, cosa c'è di bello su SQL onestamente, è che in realtà fa solo quello che gli si dice di fare. E 'piuttosto succinta, ma letteralmente solo indicare cosa si vuole fare. Selezionare il nome da dove gli utenti il nome utente uguale Malan. Ed è davvero così esplicito. Così, ora, se ho colpito Go, quanti righe Sto per tornare indietro? Uno, perché è solo Malan, si spera. O pari a zero se non è lì, ma al massimo. E quante colonne posso tornare? Quante colonne? Questa volta, sto solo andando per ottenere uno perché non ho selezionare stella, che è tutto. Ora sto selezionando solo nome, così ho solo tornare una colonna e una riga. E sembra sorta di appropriato ridicolo, solo guardando super piccolo come questo. Allora, che cosa sta realmente accadendo? Quando si esegue un SQL query utilizzando select, quello che stai ricevendo indietro dal database è come una tabella temporanea con righe e colonne, forse, ma che omettere tutto ciò che Non è stato effettivamente scelto da voi. Quindi, è come se qualcuno aveva un grande foglio di calcolo di tutti gli studenti registrato per alcuni gruppo di studenti, e tu dici, dammi tutta la matricola che hanno registrato per il nostro gruppo di studenti, cosa il vostro collega in gruppo di studenti potrebbe fare si potrebbero semplicemente consegnare voi tutto il foglio di calcolo. E 'come dire selezionare stella. Ed è un po 'fastidioso se si voleva solo la matricola. E così, se invece ha detto, Scegliere categoria da tabella di database dove l'anno è uguale citazione, matricola unquote, è come se il tuo amico nel gruppo di studenti letteralmente evidenziato e copiate solo le righe matricola, li incollato in un nuovo Google Foglio di calcolo o un file di Excel, e si restituì il risultante solo file. Questo è tutto quello che sta succedendo su concettualmente qui. Così, alla fine, si può fare alcune cose piuttosto di fantasia memorizzando le cose come nomi utente e le password e simili. Ma, a quanto pare, dovremmo fare un po 'diverso rispetto questo. Non è che intelligente per solo memorizzare un nome utente e una password. Qualcuno prima, penso qui, ha suggerito un ID. Ora, un ID potrebbe essere come un Harvard ID o di Yale Net ID, ma potrebbe essere ancora più semplice nel nostro caso database. E in effetti, il caso comune è di avere un'altra colonna. E ho intenzione di andare avanti e modificare il mio tavolo. E se si gioca in giro con questa interfaccia per PSet7, vedrai che è possibile controllare questo bottone qui e aggiungere un campo all'inizio della tabella. E ora se clicco Go, sta andando di darmi una di quelle forme da prima. Ho intenzione di aggiungere un campo denominato ID. E ho intenzione di farne un tipo numerico. Ho un sacco di valori numerici per. Sto solo andando a scegliere un INT e Non preoccuparti per le dimensioni più disparate. Non devo specificare una lunghezza o un valore, perché sta andando essere 32 bit non importa quale. Gli attributi, non abbiamo visto prima. Gli interessi in uno di questi opzioni di menu questa volta? Per un INT? Che cosa proponete? No? Qualcuno di questi ha senso? Già. Sì, non firmato, giusto? In generale, se stiamo andando a dare ognuno un numero unico, che è dove questa storia è andare, voglio davvero unico una persona di avere il numero come lo zero e uno e due e tre e quattro. Non ho bisogno di trattare con numeri negativi. Sembra proprio come eccessivamente complesso. Voglio quattro miliardi di possibili valori, non quattro miliardi di possibili valori, così ho appena raddoppiato il capacità del mio INT. Per inciso, se si vuole mettere in relazione questo a qualcosa come Facebook, indietro in una sorta di mio giorno in cui Facebook è uscito prima, Credo che quello che erano utilizzando nel loro database MySQL per memorizzare un utente di identificatore, era solo un INT. Ma, naturalmente, ci sono un sacco di persone reali nel mondo. C'è un sacco di falso Facebook conti nel mondo. E così alla fine, Facebook traboccava la dimensione di un INT, un quattro miliardi valore. Ed è per questo, se si guarda in giro e c'è siti web che può dirvi cosa il vostro ID univoco è. E se non avete mai scelto un nome utente Facebook, vedrete il vostro ID univoco. Penso che sia il profilo PHP puntino ID punto interrogativo è uguale a qualcosa. Questo è ora qualcosa di simile a un grande INT, o una lunga lungo se si vuole, che è un valore a 64 bit o qualcosa di simile. Così, anche nel mondo reale fare queste problemi in ultima analisi, a volte contano. E si scopre qui, se sono dando tutti i miei utenti un ID univoco, Voglio essere esplicito eccellente e minimamente rendere questo campo univoco. Ma si scopre c'è un pezzo di nomenclatura anche oggi questa è una chiave primaria. Se stai progettando un database tavolo e si conosce in anticipo che una delle colonne di tale tabella dovrebbe e sarà identificare univocamente le righe nella tabella, si desidera specificarla e raccontare il database, questa è la mia chiave primaria. Ci potrebbero essere dei duplicati in altri campi, ma io dico il database che questo è il mio primario, il mio campo più importante, che è garantito per essere unico. Ora, questo sembra ridondante. Ora sto proponendo che abbiamo aggiungere, facendo clic su Salva qui, un called-- campo e sto andando di andare avanti e fare clic AI, torneremo a che in un momento, Salva. Io propongo ora che mio tavolo simile a questa. Ho un campo INT denominato ID, un campo CHAR denominato Nome utente, un campo VARCHAR chiamato Nome, ma ID, se è primario e quindi unico, perché ho appena sprecato tempo l'introduzione di quello effettivamente è un secondo unico campo chiamato ID che è un INT? Nome utente, richiamo, è stato già unica, abbiamo detto. Quindi, solo logicamente, non è necessario ogni esperienza del database alla ragione attraverso questo, perché Avrei potuto introdotto un INT come il mio identificativo univoco come bene? Cosa c'è questo-- dire di nuovo? PUBBLICO: [incomprensibile] DAVID MALAN: Random accesso è più facile, perché? PUBBLICO: [incomprensibile] DAVID MALAN: Sì, è basta accedere numeri. Quindi, se si pensa a questo veramente è un tavolo, come un array, ora ho identificatori univoci che io possa saltare. E meglio di così è ancora quella quanto è grande è un INT sarà di nuovo? 32 bit o quattro byte. Quanto è grande il mio nome utente sarà? Al massimo? 16 byte. Quindi, se siete veramente preoccuparsi le prestazioni del vostro codice, ripensa a PSet5, si preferisce per la ricerca di un valore quattro byte o un 16 valore di byte, giusto? E 'davvero così semplice come sembra. Devi fare quattro volte tanto lavoro per la ricerca di nomi utente perché quei sono 16 byte. Quindi, si deve letteralmente confrontare tutti i 16 byte per essere certo sì, questo è il nome utente che voglio. Mentre per un INT, è possibile farlo con soli quattro byte. E come una digressione per chi interessati in hardware, si scopre che può andare bene qualcosa di simile un un valore a 32 bit in qualcosa INT o chiamato un registro in un computer CPU, che significa che è super, super veloce, anche al minor livello di hardware del computer. Quindi, ci sono solo vantaggi tutto intorno. Che cosa significa questo? Infatti, quando si sta progettando un tabella di database, quasi tutto il tempo hai intenzione di non avere solo i dati che ti interessano, ma anche qualcosa di simile un identificatore univoco perché questo sta per facciamo altre cose. E cerchiamo di viaggio più di un problema qui. Supponiamo che gli utenti non hanno solo nomi utente e nomi, ma hanno anche le cose come le città e stati e codici di avviamento postale, almeno qui negli Stati Uniti. Così, ho intenzione di andare avanti e dire in fretta, darmi altri tre colonne alla fine della tabella. E questo sta per essere città, questo sta per essere stato, e questo sta per essere Zip. Ora tipi City, che cosa dati questo dovrebbe essere, forse? VARCHAR? Io non so quale sia il più lungo il nome della città è. Da qualche parte in America, non c'è probabilmente qualche assurdamente lunghi parola, così facciamo solo andare con 255, un po ' storicamente o arbitrariamente. Stato, quello che vuoi fare? Chiamata in giudizio, giusto? Qual è forse il più efficiente? Quanti personaggi? Forse solo due, se possiamo farla franca facendo proprio, come, MA per Massachusetts e così via. Così, ho intenzione di andare un valore CAR di due. Codice di avviamento postale è interessante. Siamo qui a 02138, in modo che suggerisce che dovremmo usare ciò? Si tratta di un INT, giusto? INT, INT, a breve? Breve avrebbe funzionato. No? CHAR o cinque, ma voglio un INT. Perché spingere indietro su un INT? Convincermi da questo. Che cosa è stupido su un INT, la mia idea? Già. PUBBLICO: Raccogliere più memoria. DAVID MALAN: Raccogliere più memoria. Quattro byte, ma sei proponendo un codice postale come cinque byte o qualcuno è stato come un CHAR, che si sente come eh, che non è proprio il caso. Beh, divertente storia. Anni fa, quando ho utilizzato Microsoft Outlook per la mia e-mail, Alla fine ho voluto passare a Gmail. E così, ho esportato tutti i miei contatti da Outlook come file CSV. Comma Separated Values, che appena significava che aveva tutti i miei nomi di amici e ultimo nomi e numeri di telefono e codici postali e tutto questo. E poi ho fatto il errore di aprirlo in Excel, che è un programma di foglio di calcolo che capisce file CSV come abbiamo visto. Ma poi, devo aver colpito, come, Comando o di controllo S a un certo punto. E a quanto pare Excel al momento aveva una caratteristica in cui ogni volta che ha visto un numero, ha cercato di essere utile. E se quel numero è iniziato con zeri, sarebbe solo sbarazzarsi di loro. Perché avete bisogno di leader zeri sul interi? Sono senza senso, matematicamente. Non sono senza senso nel sistema, US Postal. Così, ho avuto per anni, a questo giorno, ho ancora avere amici che, quando la caso raro che ho bisogno di qualcuno affrontare in questi giorni, Io continuo a vedere che ho avere un amico a Cambridge, Massachusetts, 2138. Ed è fastidioso se siete cercando di risolvere di programmazione generare buste o semplicemente buttar giù. E questo è a causa di questo motivo, Ho scelto il tipo di dati sbagliato. Così, mi piace la tua idea. Usiamo un campo CHAR. Cinque personaggi, ad eccezione c'è un caso d'angolo. Se ancora invia la posta, a volte zip codici in questi giorni, sono, come, più quattro. Quindi, abbiamo bisogno di un trattino e poi abbiamo bisogno di più di quattro numeri. Quindi, per essere onesti, potrebbe andare molti modi diversi. Per ora, ho intenzione di continuare a semplice e io sono solo andare a dire che si tratta di un cinque valore CHAR e siamo andando a saltare l'intero cruscotto più quattro. Ma questi sono i tipi di compromessi. E si può pensare al stessi problemi derivanti con numeri di telefono o altri campi. E ora, questo è in realtà una strada sciocco andare giù. Supponiamo che sia Rob ed io e Hannah e Maria e [? Davon?] E Andy e altri sul personale vivono tutti a Cambridge, Massachusetts, 02138. Questo in realtà sentire stupido che io sono aggiungendo al mio tavolo utenti, città, provincia, e zip. Come mai? PUBBLICO: [incomprensibile] DAVID MALAN: Dire di nuovo? PUBBLICO: [incomprensibile] DAVID MALAN: Sono sempre intenzione di andare insieme, giusto? Quando si scopre, eravamo abituati a pensare questo era il caso fino a quando non esaustivamente cercato tutta Stati Uniti, e scopre che c'è sono alcune incongruenze dove più città hanno la stessa cerniera, che è strano. Ma, se stipuliamo per ora che 02138 è sempre Cambridge, Massachusetts, perché nel mondo vorresti conservare in il database Cambridge e MA e 02138 per me e per Hannah e per Rob e per [? Davon?] E per gli altri che vivono qui a Cambridge, è perfettamente ridondante. Dovremmo scappare con appena l'archiviazione che cosa? Solo il codice di avviamento postale. Ma allora, se salviamo solo il codice di avviamento postale, io voglio, probabilmente, per il mio sito per sapere dove è 02138. Così, ho bisogno di un altro tavolo. E questo è OK. Ed in effetti, questo è uno dei processi di progettazione di tavoli progettazione che farete in PSet7 pure per cui volete scomporre dati comuni. Proprio come siamo stati lo scorporo codice comune e factoring fuori comune stili CSS, qui Anche nel database, se ho solo bisogno di 02138 univocamente identificare città natale di qualcuno, non conservare Cambridge, Mass per ogni utente rammendare nella tabella. Invece, avere una tabella separata denominata Zip che dovrebbe avere ciò che le colonne? Probabilmente un campo ID, proprio perché, per i principi che stiamo parlando di ora. Probabilmente un campo zip 02138. E poi probabilmente quello che altre colonne? Città e stato, ma hanno una sola riga per 02138, una riga per 02139, una riga per 90210. E questo è letteralmente tutti i codici di avviamento postale che conosco. Così ora, cosa si può fare? Questo è problematico, perché ora ho due tabelle. Così, i miei utenti sono per lo più qui, ma il loro informazioni sullo stato della città di qui. Così, si scopre con SQL, c'è in realtà un modo per unire le informazioni, e vedrete questo nel PSet. Ma si scopre che puoi fare qualcosa di simile. SELEZIONA stelle da parte degli utenti, JOIN cerniere ON utenti punteggiano zip zip uguale punteggiano zip. Che è un po 'prolisso, è vero, ma questo solo significa selezionare tutto dal processo di prendere la mia tabella utenti e il mio tavolo cerniere. Partecipa loro da una campo che hanno in colonna. Così, letteralmente facendo qualcosa in questo modo, e mi danno indietro una nuova tabella temporanea che è più ampio, che è più grande, che ha tutte le colonne da entrambi. E che, molto semplicemente, sarebbe il sintassi per fare qualcosa di simile. Quindi, c'è questo in anticipo, ma ci sta andando ad essere altre decisioni di progettazione Avrete devono fare, non solo con gli indici ma anche correre in sfide. In realtà, c'è una sfida in ogni progettazione di database per cui a volte due persone potrebbero desiderare per accedere alle stesse file di database tavola. Quindi, questo è qualcosa che faremo incontrare in PSet7 pure. Ma ho pensato di guardare un attacco che è possibile in SQL. Quali sono alcune delle problemi che possono sorgere? Quindi, si incontrano in questo PSet7. E vi diciamo quello che il titolo definitivo soluzione che codifica per questo problema. Ma se si prende una classe di livello superiore, in particolare nei sistemi operativi, si sta andando ad incontrare una questione di atomicità, il problema di cercare di fare più cose in una sola volta senza interruzione. E ho pensato di introdurre questo idea per PSet7 con una metafora che io stesso ho imparato in Margo Sistemi operativi CS164 di Seltzer anni di classe fa. Supponiamo di avere uno di questi dormitorio frigoriferi nella vostra stanza del dormitorio o casa, e si dispone di un vero e proprio debole per il latte. E così, si arriva a casa dalle classi un giorno, si apre il frigo. Oh, maledizione. Non c'è latte in frigo. Quindi, si chiude il frigo, chiudere la porta, bloccare il dormitorio, camminare dietro l'angolo per CVS, mettersi in fila, e avviare il controllo fuori per un po 'di latte. E sta andando a prendere un po ', perché quelli accidenti di self-checkout contatori prendono sempre di usare comunque. Così nel frattempo, il tuo compagno di stanza torna a casa. Lui o lei piace molto latte. Vengono nella stanza del dormitorio, aprire il frigorifero, oh, accidenti. Non c'è più latte. Così, lui o lei anche va dietro l'angolo. Ma ora, dal momento che c'è come due o tre o quattro CVSes nelle vicinanze, capita di andare ad uno dei quelli diversi in piazza. E così ora, a pochi minuti più tardi, tutti e due tornare a casa e ugh, problema peggiore. Ora avete troppo latte perché sta andando ad andare acida. E ti piace il latte, ma si non mi piace veramente il latte. Così ora, questo era un costoso errore perché tutti e due preso una decisione sulla base del stato di qualche variabile che sia in fase di essere cambiato da voi, l'iniziatore di andare a prendere il latte. Quindi, qual è forse un essere umano soluzione a questo problema? PUBBLICO: [incomprensibile] DAVID MALAN: Lascia una nota, giusto? Lasciare sempre una nota, se siete familiarità con quello show. Sì, ci sono due di noi. Così, lasciare sempre una nota, o letteralmente bloccare il frigorifero con qualche tipo di lucchetto o qualcosa sopra le righe in quel modo. Ma questo è in realtà sta per essere problema chiave con la progettazione di database, soprattutto quando si potrebbe avere più browser, più computer portatili, più utenti tutti cercando di aggiornare le informazioni in una sola volta. Informazioni particolarmente sensibili come le informazioni finanziarie, per cui con una compravendita di azioni sito web come ti verrà la costruzione, cosa succede se si desidera controllare quanti soldi avete e poi se avete abbastanza, comprare qualche azione? Ma cosa succede se qualcun altro che ha un conto cointestato con te è allo stesso tempo cercando per comprare un po 'di azione? Così, lui o lei è il controllo della saldo del conto, tutti e due ottenere indietro la stessa risposta, non c'è latte. O entrambi si ottiene indietro la risposta, si dispone di $ 100 nel conto. Entrambi si tenta di prendere la decisione acquistare una azione della alcune azioni della società. E ora, che cosa succede? Hai due parti? Non ci sono parti? Possono sorgere problemi del genere. Quindi, noi incontreremo quello. Attacchi di SQL injection, per fortuna, sono qualcosa ti aiuteremo con, ma questi sono atrocemente comune in questi giorni ancora. Così, questo è solo un esempio. Non faccio affermazioni che Sistema Harvard PIN vulnerabili a questo attacco particolare. Abbiamo provato. Ma, si sa che ci avere un campo come questo. E di Yale ID Net ha un simile cercando schermo in questi giorni. E si scopre, che forse il PIN di sistema è implementato in PHP. E se were-- è not-- essi potrebbe avere il codice che assomiglia a questo. Hanno due variabili. Dammi il nome utente e la password dalla variabile globale post eccellente che abbiamo parlato in precedenza. Forse Harvard ha una query come SELEZIONARE stelle da parte degli utenti dove username è uguale a quella e password eguaglia quella. E noto che io sono solo collegarlo usando la notazione parentesi graffa dall'altro giorno, che significa semplicemente collegare un valore Qui. Io non sto usando la domanda tecnica contrassegno. Non ho alcun secondo o il terzo argomento. Sono solo letteralmente costruendo la stringa me stesso. Il problema, però, è che se qualcuno come un scroob, che è un riferimento ad un film, registra con qualcosa di simile, e ho rimosso i punti che di solito coprire le password, e se egli è particolarmente dannoso e la sua password, forse è 12345, per il film intitolato "Balle spaziali" ma criticamente tipi un apostrofo dopo le cinque, poi letteralmente la parola o nello spazio, e quindi preventivo, uno unquote è uguale a uno preventivo, Ma bando ha omesso che cosa? Ha omesso la citazione a destra e ha omesso la citazione a sinistra. Perché se l'aggressore la presunzione di scroob è che le persone che hanno scritto questo codice PHP non fosse così brillante, forse hanno solo qualche singolo cita intorno l'interpolazione di una variabile in parentesi graffe? E così, forse, avrebbe potuto genere di completare il loro pensiero per loro, ma in un modo che sta andando di lasciarlo hackerato il PIN di sistema. In altre parole, supponiamo che questo è il codice e ora inseriamo cosa scroob digitato. Ed è rossa, perché è male. E il testo sottostante è quello che ha digitato, scroob potrebbe ingannare il server di Harvard in costruzione di una query SQL stringa simile a questa. Password uguale a 12345 o uno fa uno. Il risultato di cui, logicamente, è che questo registrerà scroob in se la sua password è 12345 oppure, se uno uguale uno, che è ovviamente sempre vero, il che significa scroob ottiene sempre. E così, il modo per risolvere questo, come in molti casi, sarebbe quello di scrivere di più sulla difensiva. Per usare qualcosa come il nostro funzione di query effettiva, che vedrete in PSet7, dove noi inseriamo qualcosa come punti interrogativi qui. E la bellezza della funzione di interrogazione che abbiamo darvi è che difende contro questi i cosiddetti attacchi di SQL injection, dove qualcuno sta ingannando il codice in iniettare il proprio codice SQL. Perché quello che la funzione di query diamo si effettivamente fare, se si utilizza la sintassi punto interrogativo e un secondo ed un terzo argomento qui, è che cosa ha aggiungere al input che l'utente fornito? Quelli backslash cita. Quindi, sfugge a qualsiasi potenziale personaggi pericolosi. Questo sembra strano ora, ma non è vulnerabile perché non più cambiare la logica perché tutta quella password è ora una sola offerta che non è, infatti, la password di scroob. Quindi, ci sono stati alcune battute su questo nel corso degli anni. Quindi, questa è stata una foto scattata di qualche geek in un parcheggio per cui si potrebbe sapere che alcune città e gli stati cercano di eseguire la scansione del licenza Piastra per emettere la fattura o di biglietto se si passa attraverso, senza, come, la cosa E-Z Pass. Quindi, questa persona presume che forse le persone che scrivono il sistema E-Z Passo non erano così brillante, e forse appena concatenato insieme una stringa, in modo che lui o lei non poteva maliziosamente non solo completare il loro pensiero, ma in realtà eseguire un comando male, che non abbiamo ancora detto, ma si può intuire. Che, oltre a cancellare e inserire e aggiornare e selezionare, c'è anche una parola chiave chiamato goccia, che letteralmente cancella tutto nel database, che è particolarmente grave. Siamo in grado di ingrandire questa se è un po 'difficile da vedere. Questo, oggi, è un famoso cartone animato questo è meravigliosamente intelligente ora e comprensibile. [Risata] Sì, fresco. Tipo di geeking fuori. Quindi questi, poi, sono Attacchi di SQL injection. E sono così facile da evitare utilizzando il codice giusto o le librerie giuste. E vedrete in PSet7, che è perché vi diamo la funzione di query. Quindi, una coppia di occhiolini che abbiamo pensato darvi qui nel nostro rimanendo insieme minuti. Quindi, se ne ricorda a settimana pari a zero, abbiamo introdotto questi due lampadine che sono belle, non solo perché sono abbastanza e sono colorate, ma perché supportano qualcosa chiamato una API, un'applicazione Interfaccia di programmazione e in CS50 finora, abbiamo per lo più incentrata sulla GET e POST, ma si scopre ci sono altri verbi HTTP PUT come. Ed infatti, questo era una diapositiva di settimana a zero per cui se si scrive codice che invia a la PSet6 una richiesta HTTP che sembra che questo con questa porzione di testo nella parte inferiore, che si chiama JSON, o JavaScript Object Notation che ne parleremo la prossima settimana, è possibile attivare o disattivare o modificare il colore delle luci come quelle. Quindi, se CS50 ha anche oltre ad alcuni di quelle lampadine qui a New Haven se si desidera prendere in prestito loro per progetti finali, anche un po 'di Microsoft Bande, che sono come Orologi che si indossa al polso che allo stesso modo hanno una API in modo da in grado di scrivere il proprio software per loro. Abbiamo un conto con Codice Apple iOS così che se avete un Orologio Apple o un iPhone o un iPad o un iPod, è possibile scrivere codice che in realtà funziona su quelli. Abbiamo un sacco di Arduino, che sono minuscoli computer senza casi, essenzialmente, che è possibile collegare via USB, in genere al proprio Mac o PC, scrivere il codice che viene eseguito su questi fisico dispositivi che spesso hanno i sensori su di loro in modo da poter interagire con il mondo reale. Abbiamo un sacco di dispositivi Leap movimento, che sono i dispositivi USB per Mac e PC, qui e ancora una volta, a New Haven. E se lo si collega al Mac, si può effettivamente controllare il computer scrivendo software che tramite raggi infrarossi, di capire verso dove le vostre mani umane sono, anche senza toccare la tastiera. Abbiamo pensato di condividere un rapido intravedere questo, per esempio. [RIPRODUZIONE DI BRANI MUSICALI] Quindi, abbiamo un intero mucchio di queste cose, Anche chiamato bracciali Myo che si mette sopra il vostro avambraccio e quindi è possibile controllare il vero il mondo virtuale come questo mondo o. [RIPRODUZIONE DI BRANI MUSICALI] Oppure, abbiamo anche un po 'di Google Cartone, che è letteralmente, come, una scatola di cartone si potrebbe mettere sulla vostra faccia, ma scorrevole nel telefono in esso in modo che si mette il bicchiere del vostro telefono cellulare veramente vicino agli occhi. E Google è di cartone piuttosto a buon mercato a $ 10 o $ 20. E ha poco lenti che leggermente fuori turno l'immagine sullo schermo per il umana occhi per offrirti un senso di profondità in modo che in realtà hanno un 3D ambiente di fronte a voi. Abbiamo anche un po 'di Samsung Gear, che è la versione più costosa di questo, ma che può scorrere in un modo simile Telefono Android e vi darà l'illusione di-- o dare l'esperienza di realtà virtuale. E nei nostri ultimi due minuti, abbiamo pensato di provare a fare questo. Se posso proiettare ciò che Colton ha qui solo per stuzzicare l'appetito, mi permetta di andare avanti e butto sul grande schermo qui. Mi permetta di uccidere le luci. Colton, vuoi andare avanti e mettere sul vostro cellulare per un attimo e venire su oltre al centro del palco? E vuoi project-- questo è quello che vede Colton. Ora, la connessione Wi-Fi a qui è non così forte per questo dispositivo che questo è super avvincente, ma Colton è letteralmente in questo luogo futuristico magico. Si vede solo un'immagine. Stai visualizzando l'occhio sinistro e destro che il suo cervello sono cucendo insieme in un tridimensionale ambiente sul suo volto. Ha appena selezionata un'opzione di menu qui. E così ancora una volta, indossa questo auricolare con un telefono Samsung su di esso che è in modalità wireless proiettando la nostra testa. Ora sei su Marte, mi pare? COLTON: Penso di sì. Non sono sicuro che [incomprensibile]. [Risata] DAVID MALAN: Risulta Marte ha questi menu. COLTON: [incomprensibile] po 'di fresco posti se vogliamo andare a-- DAVID MALAN: Dove vogliamo andare? COLTON: [incomprensibile] DAVID MALAN: E vediamo dove ci Colton sta prendendo ora. COLTON: [incomprensibile] DAVID MALAN: Quindi, c'è così tanti luoghi diversi si può prendere da soli. C'è FAPIs tramite la quale è possibile scrivere giochi o interazioni eseguire, in ultima analisi, al telefono. Quindi, è in realtà solo scrittura di un telefono cellulare app. Ma grazie al software e le capacità grafiche, ora Colton è in questo piccolo piccolo cottage. E con il rischio di travolgendo noi stessi, Colton e mi atterrò in giro per mentre alla fine della classe qui oggi se volete venire e giocare. E noi li porteremo la prossima settimana pure. Senza ulteriori, ado questo è tutto per oggi. Ci vediamo la prossima settimana. [MUSICA - Ragga TWINS, "uomo cattivo"]