[Música tocando] DAVID MALAN: Tudo bem, isso é CS50. Este é o fim de semana oito. E hoje, vamos começar para preencher algumas peças quando se trata de construção coisas na web. Então, lembre-se que na segunda-feira nós gastamos muito mais tempo em PHP, que é esta dinâmica linguagem de programação que permite-nos de saída, entre outros coisas, HTML e outro tal conteúdo que vai querer ver. Mas não temos realmente olhou como nós estamos indo para armazenar qualquer informação. De facto, quase qualquer um de que a super- sites interessantes que você visita hoje ter algum tipo de banco de dados no back-end, certo? Facebook certamente armazena grandes quantidades de dados sobre todos nós e lojas Gmail tudo de seus e-mails. E assim, muitos outros sites não são apenas conteúdo estático que é informativo. É realmente dinâmico de alguma forma. Você fornecer informações, ele atualiza as páginas para outras pessoas. Você receber mensagens, você envia mensagens, e assim por diante. Então, hoje, olharmos mais de perto as bases de um projeto que você vai mergulhar na próxima semana, CS50 Finanças, que é, na verdade, vai ter de construir algo não em C, mas em PHP. Um site que parece um pouco algo como isto que permite comprar e vender ações que são, na verdade, vai basear-se em tempo real dados de ações do Yahoo Finance. E assim, em última análise, você terá a ilusão para si mesmo e para os usuários que na verdade você está comprando e vendendo ações e recebendo quase tempo real, atualizações, gerenciamento de um carteira, todos os quais vai exigir ter, em última análise, um banco de dados de usuários. Assim, em suas próprias palavras, especialmente se você não está Super familiarizado com computador ciência ou bancos de dados, o que Você conhece um banco de dados para ser agora, em termos não-técnicos? O que é isso? Como você o descreveria com a pessoa ou um amigo? AUDIÊNCIA: [inaudível] informação [inaudível] DAVID MALAN: Então, uma lista de informações, ou um store-- uma lista de informações que você pode querer armazenar sobre algo, como um usuário. E o que os usuários tenham associado com eles? Se você é um usuário no Facebook ou Gmail, quais são as características que todos nós usuários têm? Como, o que poderia ser alguns dos colunas na planilha para que nós aludido última vez? Porque mais uma vez, você pode pensar em um banco de dados realmente como um arquivo Excel fantasia ou Google Planilha ou arquivo Números Apple. Então, o que você acha de quando você pensa de um usuário? O que eles têm? O que é isso? AUDIÊNCIA: Um nome. DAVID MALAN: Um nome. Então, se o nome, tipo, David Malan seria o nome de algum usuário. O que mais faz um usuário tem? AUDIÊNCIA: Uma ID. DAVID MALAN: Uma ID. Assim, como um número de identificação, como seu Harvard ID ou seu Yale ID Net ou similares. O que mais pode um usuário tem? AUDIÊNCIA: Password. DAVID MALAN: Uma senha, talvez um endereço, talvez um número de telefone, talvez um endereço de e-mail. Assim, não há cachos de campos e esta poderia espécie de espiral fora de controle rapidamente, assim que você começar percebendo, oh, vamos guardar este e vamos guardar isso e aquilo. Mas como é que vamos realmente fazer isso? Então, novamente, o modelo mental ter para hoje como nós mergulhar em SQL real, Structured Query Language, é um banco de dados que se parece com isso. É apenas linhas e colunas. E você pode imaginar Google Spreadsheets ou qualquer número de outros programas. Mas o que é importante sobre o MySQL, que é o software de banco de dados que vamos usar, o livremente abertamente available-- usos Facebook isto e qualquer outro número de websites-- banco de dados armazena as coisas relacionalmente. E um banco de dados relacional Significa apenas que, literalmente, armazena seus dados em linhas e colunas. É simples assim. Assim, mesmo algo como Oracle que você pode ter ouvido falar de modo geral é um banco de dados relacional. E sob o capuz, isto armazena os dados em linhas e colunas. E Oracle cobra uma monte de dinheiro para fazer isso, considerando que taxas MySQL nada para o mesmo. Portanto, SQL vai nos dar pelo menos, quatro operações. A capacidade de selecionar dados, como leitura dados, inserir, excluir e atualizar dados. Em outras palavras, são aqueles realmente as quatro operações fundamentais que vão permitir-nos a mudar material naquelas linhas e colunas. A ferramenta que usaremos hoje, especialmente para aprender SQL e para brincar com ele é novamente chamado PHP MyAdmin. É ferramenta baseada na web é. Coincidência total que é escrito em PHP. Mas ele vai nos dar uma gráfica interface de usuário para que possamos realmente criar essas linhas e colunas e, em seguida, falar com eles via código. Então, vamos agora começar a o que eu acho que é francamente tipo do processo de diversão a construção de back-end de websites, as partes que os usuários não ver, mas certamente se preocupam, porque isso é um pouco de dados indo. Assim, semelhante a C e uma pouco menos como PHP, SQL ou um banco de dados que suporta SQL, tem pelo menos estes tipos de dados e cachos de outros. CHAR, VARCHAR, INT, BIGINT, Decimal e DATETIME. E não há um todo bando de outros recursos, mas vamos fazer isso título de exemplo real. Eu estou indo para ir para CS50 IDE onde, com antecedência, eu logado e eu também visitou uma URL para esta ferramenta chamada PHP MyAdmin. E no conjunto de problemas de sete, nós vamos dizer- exatamente como chegar a essa interface também. No canto superior esquerdo, Note que diz palestra. E isso apenas significa que com antecedência, eu criei um banco de dados chamado de leitura vazio que não tem planilhas nele ainda. Não há linhas e colunas. Porque o primeiro coisa que vamos fazer é começar a criar uma tabela que está indo para armazenar nossos usuários. Então, literalmente sobre aqui para a direita, eu sou vai dizer o banco de dados Eu quero uma tabela denominada Usuários. Então, isso é como o arquivo que eu deseja armazenar todos os meus dados em. E quantas colunas? Bem, vamos mantê-lo simples por agora. Eu só quero armazenar como um nome de usuário e um nome para um usuário. Vamos começar pequeno. Então, eu quero total de duas colunas. E eu estou indo para ir em frente e clique em Ir. E então, para estes colunas, o que eu vou para fazer-- se este Internet cooperates-- tudo bem, por isso vamos tentar isso de novo. Eu estou indo para criar uma tabela chamada Usuários com duas colunas, clique em Ir, OK. Agora temos que ter isso muito rápido. Obrigado, muito bem feito. Tudo bem, então o que queremos estas colunas ser chamado? Então, um vai ser chamado usuário. Então, tudo o que vejo aqui-- ea interface francamente fica um pouco feio, eventualmente, uma vez que você começar a digitar em todos esses dados. Mas o que é bom é que tipo de paradoxalmente, eu estou criando colunas, mas a ferramenta tem tolamente colocou-os em fileiras para que eu possa configurar essas colunas. Então, há dois espaços em branco lá em Nome. E um desses campos I quer chamado usuário, eo outro campo eu quero chamar Name. E agora eu tenho que escolher tipos de dados para essas coisas. Assim, enquanto no Excel e Google Spreadsheets, se você quer uma coluna, você literalmente basta digitar Nome ou nome de usuário, pressione Enter. Talvez você faz negrito apenas para maior clareza, mas é só isso. Você não especificar o tipos de colunas. Agora em Planilhas do Google ou Excel, pode especificar a forma como os dados são processados. Você poderia ir para o menu Formatar, e você pode especificar mostrar esta cifrão como, mostrar isso como um valor de ponto flutuante. Então, é semelhante em espírito à que o que estamos prestes a fazer, mas esta é realmente vai obrigar os dados a ser um certo tipo. Agora, apesar de um momento atrás eu disse que há apenas alguns tipos de dados, há realmente uma lote inteiro, e eles são em diferentes graus de especificidade. E como um aparte, você pode até fazer coisas extravagantes como geometrias de armazenamento dentro de um banco de dados. Você pode armazenar coisas como coordenadas de GPS e realmente encontrar, matematicamente, pontos que estão perto de outros. Mas vamos manter esta super simples e ir até aqui, todos os chamados tipos string. Então, aqui está uma lista de um todo monte de opções. CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. E é tipo de esmagadora. E, infelizmente, um pouco paradoxalmente a C, um CHAR não é realmente um CHAR. Se você especificar em um banco de dados que o seu tipo de dados é CHAR, isso significa que sim, é uma CHAR, mas é um ou mais CHARs. E você tem que especificar quantos CHARs você quer. Assim, que é um típico comprimento de um nome de usuário? Existe um limite tipicamente? AUDIÊNCIA: [inaudível] DAVID MALAN: 16 talvez? Algo como isso. Você sabe, de volta ao dia, que costumava ser oito. Às vezes é 16, às vezes é ainda mais do que isso. E assim, esta não faz significa dar-me um CHAR. Isso significa que eu tenho que especificar o comprimento do campo, e agora eu poderia dizer algo como 16. E há um trade off aqui. Então, vamos ver em um momento isto significa que um, cada nome de usuário tem que ser 16 caracteres. Mas espere um minuto, M-A-L-A-N. Se é isso meu nome de usuário e eu estou usando apenas cinco, o que você propõe que o banco de dados o que fazer para os outros 11 personagens que Eu reservado espaço para? O que você faria? AUDIÊNCIA: [inaudível] DAVID MALAN: Sim, apenas torná-los todos nulo. Faça-os espaços. Mas, provavelmente nulo, portanto, um monte de zeros barra invertida. Assim, por um lado, nós temos agora a certeza de que meu nome de usuário pode ser não mais do que 16 caracteres. E o outro lado da moeda é que que se eu tivesse um nome muito longo ou queria um tempo muito longo nome de usuário como alguns de vocês caras podem ter nessa faculdade ou em Yale.edu, você não pode ter um. E assim, de fato, se você tiver já registrado para um site e você obter gritou dizendo sua senha é muito longa ou seu nome de usuário é muito longo, é simplesmente porque um programador, quando configurar a sua base de dados, decidiu que este campo será não superior a este comprimento ser. Tudo bem, então o que se passamos a citar? Quanto tempo deve ser um nome típico do ser humano ser? Como muitos personagens, 16? Eu estou supondo que pudéssemos encontrar alguém nesta sala onde por sua primeira acrescido de última nome tiver mais de 16 caracteres. Então, o que é melhor do que isso, 17? 18? 25? Maior? 30? AUDIÊNCIA: [inaudível] DAVID MALAN: 5.000, oh meu Deus. Então, isso é provavelmente um acervo considerável limite superior, digamos assim. E aqui nós meio que temos para fazer uma chamada de julgamento. Como, não há nenhuma resposta certa aqui. Infinito não é bastante possível, porque estamos finalmente vai have-- estamos vai ficar sem memória. Então, nós temos que fazer uma julgamento em algum ponto. Muito comum seria, por exemplo, para use-- e deixe-me especificar CHAR aqui como antes-- 255 era literalmente o limite superior sobre este software de banco de dados anos atrás. E por isso, um grande número de seres humanos Gostaria apenas de dizer, tudo bem. 255 é o limite. Vamos apenas usar o máximo. E isso é muito ridículo. Como, se você está digitando é alguém nomear para 200 caracteres mais, que um pouco ridículo. Mas, lembre-se que não é ASCII o único sistema de caracteres. E assim, especialmente em um monte de línguas asiáticas onde há personagens que não pode expressar em teclados como o meu US teclado, alguns personagens realmente levar até 16 bits em vez de oito bits. E assim, isso realmente não é tão irrazoável que precisamos de mais espaço se queremos caber caracteres maiores do que a própria US aqueles centrados nós tendiam a discutir. Então, precisamos de algum limite superior. Eu não sei o que o melhor é, mas 255 é geralmente um comum. 25 sente baixo. 16, 32 se sentir fraca. Gostaria de errar no lado de algo maior. Mas há um trade off, como sempre. Qual é a, talvez, óbvio trade off de reservar 255 caracteres para o nome de todos no meu banco de dados? AUDIÊNCIA: [inaudível] DAVID MALAN: O que é isso? AUDIÊNCIA: [inaudível] DAVID MALAN: É um grande quantidade de memória, certo? H-A-L-A-N. Acabo desperdiçado 250 caracteres apenas para armazenar o meu nome defensiva, apenas no caso de alguém na classe tem um nome muito longo. Isso parece uma compensação indevida. Assim, verifica-se que SQL, esta linguagem de banco de dados, realmente suporta algo chamado VARCHAR ou CHAR variável. E este é o tipo de Nice, em que este permite que você especifique um não fixo largura, mas sim, uma largura variável. E mais especificamente, uma largura máxima do campo. Assim, isto significa que um nome pode ser não mais do que 250 caracteres, mas certamente pode ser menor. E o banco de dados vai ser inteligente. Se você colocar em M-A-L-A-N, isso só vai usar cinco, talvez seis bytes para como um caractere nulo de fuga, e não gastar um adicional 249 ou 250 bytes desnecessariamente. Então, isso parece que eu deveria ter começado com esta história. Mas há sempre uma troca. Assim, por um lado, um nome de usuário tenho especificada a ser codificado em 16, e talvez isso não era a chamada direita, talvez seja é, mas por que não usar VARCHARs para tudo? Ela existe por uma razão. Por que não usar VARCHARs para cada campo cujo comprimento você não sabe com antecedência se ele parece ser uma grande coisa, certo? Use somente tanto espaço como você precisa até este limite? AUDIÊNCIA: Slower. DAVID MALAN: Speller? AUDIÊNCIA: Torna-lo mais lento? DAVID MALAN: Ah, é mais lento. Bom, isso é quase sempre a resposta, francamente. Como, qual é a troca? Ele quer custa mais espaço ou custa mais tempo. Então, neste caso, pode ser mais lento. Por quê? AUDIÊNCIA: [inaudível] determinar [inaudível]. DAVID MALAN: Good. Assim, você pode se lembrar de mesmo PSED5, brincando com a sua abordagem ao dicionário, se você tem que alocar memória dinamicamente ou mantê- crescimento de um tampão, que pode realmente ser lento. Se você tem que chamar malloc debaixo do capô e talvez isso é o que o MySQL está fazendo, então certamente que poderia ser o caso. E se você acha maneira de volta para PSet-- ou mesmo Semanas dois, quando nós fizemos coisas como busca binária ou mesmo busca linear, uma das coisas agradáveis ​​sobre cada palavra em um banco de dados ou cada palavra em uma coluna sendo exactamente o mesmo comprimento, mesmo se um grupo inteiro daqueles personagens estiverem em branco, é que você pode usar acesso aleatório em seus dados, certo? Se você sabe que cada palavra é 16 caracteres de distância, você pode usar a aritmética de ponteiro, por assim falar, e ir para nos 16, 32, 48, 64, e você pode simplesmente pular de imediato, usando aritmética a qualquer uma das palavras em seu banco de dados. Considerando que se é um VARCHAR, o que você não tem que fazer? [Telefone tocando] Se é um VARCHAR, você não pode utilizar o acesso aleatório. O que você tem que procurar ou fazer? Sim? AUDIÊNCIA: [inaudível] DAVID MALAN: Olhe através do traço whole-- por toda a lista olhando para o que, mais provável? Que tipo de valor especial? AUDIÊNCIA: [inaudível] DAVID MALAN: Olhando para os terminadores nulos que demarcar a separação de palavras. Então, novamente, uma troca, e não há nenhuma resposta certa. Mas é aí, especialmente quando os usuários chegam a ser muitos e sua carga em seus servidores, o número de pessoas usando ele recebe alta, estas são realmente as decisões não triviais. Assim, podemos deixar estes como este, mas vamos rolar para baixo para a direita Aqui. Agora, há um par de colunas onde temos que fazer um julgamento. Será que faz sentido para permitir que um usuário de nome, nome de usuário de um usuário ou um usuário de nome, para ser nulo? Ou seja, apenas em branco. Sente um pouco sem sentido, assim que eu sou não indo para verificar as caixas. Mas acontece que em um banco de dados, você pode dizer, alguém pode, opcionalmente, ter esse valor. Esta coluna não têm para realmente estar lá. Agora, há este menu suspenso. E repare que eu ainda sou na primeira fila há, assim que eu estou falando sobre nome de usuário agora. E verifica-se que um banco de dados, ao contrário de uma mera planilha simples, tem as características poderosas chamados índices. E um índice é uma maneira de dizer a banco de dados com antecedência que eu, o humano sou mais esperto do que você. Eu sei que tipos de consultas, selecione ou inserir ou excluir ou atualização, que meu código vai acabar fazendo neste banco de dados. Eu quero ler um monte de dados. Eu quero inserir uma grande quantidade de dados. Eu quero constantemente eliminar uma grande quantidade de dados. Se eu sei que eu vou ser acessando um campo como usuário muito, Eu posso dizer a preventivamente banco de dados, eu sei mais do que você, e eu quero decreto que você deve índice neste campo. Quando a indexar um campo ou uma coluna significa que a base de dados de antemão deve pedir algumas idéias de, como, semana quatro e cinco e seis do CS50 e realmente construir-se algo como uma busca binária árvore ou algo geralmente chamado de uma árvore B que você iria aprender em uma classe como CS124 em Harvard, uma classe de algoritmos, ou qualquer número de outros lugares. O banco de dados eo inteligente pessoas que implementaram vai descobrir como armazenar que a tabela de informações na memória para que as pesquisas e outras operações são super rápido. Você não tem que fazê-lo. Você não tem que implementar busca linear ou busca binária ou mesclar tipo ou seleção tipo, nada disso. O banco de dados faz isso para você se você disser -lo preventivamente para o índice neste campo. E você pode ver também, há algumas outras características podemos dizer o banco de dados de aplicar. O que isso pode significar se eu escolher Único a partir deste menu, apenas intuitivamente? Sim? AUDIÊNCIA: [inaudível] DAVID MALAN: Sim, o nome de usuário tem que ser único. Isso é uma coisa boa ou uma coisa ruim para um banco de dados, para um site com os usuários? Usernames deve ser único? Sim, provavelmente. Se é isso que o campo que usamos para entrar, você realmente não quer ter pessoas a mesma sensação ou o mesmo nome de usuário. Assim, podemos ter a banco de dados de impor que assim que agora no meu código PHP ou qualquer idioma, Eu não tenho para, por exemplo, verificar necessariamente faz isso nome de usuário existe antes de eu deixar alguém registar-se? O banco de dados não permitirá que duas pessoas nomeadas David ou Malans cadastre-se neste caso. E como um aparte, embora esta menu só permite que você selecione um, um índice exclusivo é aquele que é indexado pelo desempenho super rápido, mas também reforça a singularidade. E nós vamos voltar ao que o outros dois dizer em apenas um momento. Enquanto isso, se eu for para minha segunda linha, que é o nome do usuário, eu deveria especificar que o nome deve ser único? Não, porque você poderia certamente have-- não há duas David Malans nesta sala, mais provável. Mas se escolher um nome diferente, poderíamos certamente ter colisões. Pense de volta para hash tabelas e similares. Então, nós certamente não queremos para tornar o campo nome exclusivo. Então, nós apenas estamos indo para sair que, como traço, traço, traço, nada. E eu vou deixar tudo o resto sozinho. Com efeito, a maior parte destes campos nós não terá que se preocupar. E quando eu estou pronto para salvar este, Se a Internet coopera, Eu clique em Salvar, e muito, muito, muito lentamente que o banco de dados são salvos. E agora eu estou de volta a esta interface, que é certo que, é esmagadora, à primeira vista. Mas tudo o que eu vou fazer é clicar na palavra Usuários na parte superior esquerda. Eu estou indo para ir até aqui, clique em Usuários, e por padrão, ele tem executado alguns SQL, mas mais sobre isso em um momento. Aqui é apenas um resumo do que eu fiz. E não se preocupe que você vê mencione do latim e do sueco aqui. Essas são apenas o padrão definições, porque MySQL originalmente, ou PHP MyAdmin, um dos dois aconteceu a ser escrito por algumas pessoas suecas. Mas isso é irrelevante no nosso caso aqui. Tudo bem, então por que é tudo isso interessante? Acontece que, eu posso inserir dados em um banco de dados, escrevendo código. E eu estou vá em frente e no meu arquivo aqui, eu sou indo para ir em frente e fingir que este é ligado a essa base de dados, que não é, no momento, mas vai ser quando chegarmos ao problema definido sete. E eu estou indo para ir em frente e executar uma função chamada de consulta, que damos-lhe no problema definir código de distribuição de sete, que leva pelo menos um argumento, que é apenas uma string. A seqüência de código SQL. Então, você está prestes a aprender a escrever Structured Query Language. Se eu quero inserir uma nova linha na minha banco de dados porque alguém tenha apresentado um formulário para o meu código, eu literalmente INSERT INTO utilizadores escrever o seguinte campos: nome de usuário, vírgula, nome, os valores, e agora eu preciso inserir algo como Malan, e citações, unquote 'David Malan. E agora mesmo para aqueles não familiarizados com SQL, por que estou usando aspas simples dentro dessa seqüência verde? O que pode ser a razão aqui? Repare que eu sou co-mistura duas línguas. Consulta é uma função PHP, mas é preciso um argumento. E que o argumento tem de ser ele próprio escrito em outra linguagem chamada SQL, Structured Query Language. Então, tudo o que eu acabei de destaque aqui é esta linguagem chamada SQL. Então, o que há com as aspas simples, assim como uma verificação de sanidade rápida? Continue. Eles são strings. Assim, citações, unquote Malan e citações, unquote David Malan são strings. E só de pensar intuitivamente agora, saber o que você sabe sobre C e PHP, por que eu não fazer isso, o que eu costumo aspas usado para strings? Por que eu não quero fazer isso? Sim? AUDIÊNCIA: [inaudível] DAVID MALAN: Exatamente. Porque eu já estou usando aspas no caminho fora do argumento para a função de PHP, Gostaria apenas confundir o intérprete. Ele não vai saber, que estes vão juntos? Será que estes andam juntos? Será que estes andam juntos? Então, eu alternar vez. Ou eu poderia fazer algo assim, Citação barra invertida ou citação barra invertida. Francamente, que só começa a ficar muito ilegível e feio. Mas isso iria conseguir o mesmo resultado que bem. Então, se eu fosse para executar este consulta agora, vamos ver o que acontece. Eu estou indo para ir em frente agora e, em vez do que executar o código PHP, que é o lugar onde você vai jogar no conjunto de problemas de sete, Eu estou indo em vez de ir para PHP MyAdmin. E eu vou manualmente ir para a aba SQL, e deixe-me fazer zoom na interface. E eu vou colar no a coisa que eu digitei. E o código de cores tem mudou um pouco agora, apenas porque os formatos de programas coisas um pouco diferente. Mas note que tudo que eu fiz é que eu disse, inserir em Usuários. Eu já especificado, então, em uma vírgula lista separada entre parênteses os dois campos que pretende inserir, e então eu disse literalmente valores seguido por outro parêntese, e, em seguida, os dois valores Eu quero plug-in, e agora para uma boa medida, Eu vou colocar um ponto e vírgula no final. Assim, este não é C. Este não é o PHP. Este é agora o SQL, e eu estou colando- em esta interface baseada na web que é indo só para me deixar, assim que eu clique em Ir, executar essa consulta no banco de dados executar dentro do CS50 IDE. Então, isso é bom. Observe que disse uma linha inserido, foi super rápido, 0,0054 segundos para inserir os dados. Então, isso soa muito saudável. Ele reformatado minha consulta para mim aqui só para vê-lo em uma espécie de código de cores versão. Mas agora se eu clicar Procurar, notar que, mesmo embora haja um monte de lixo em a tela, minha mesa tem agora duas linhas. Então, deixe-me ir em frente e fazer outra. Em vez disso, deixe-me vá para a guia SQL novamente. E desta vez eu vou inserir algo como Rob e seu nome será Rob Bowden. Bowden. Vamos clique em Salvar. Oops, prefiro ir. Clique em Procurar novamente, e Agora repare que eu tenho duas linhas. Então, essa é apenas uma maneira mais complexa maneira de abrir o Google Spreadsheets e apenas digitando uma linha em uma coluna. Mas o que é fundamental é que agora temos a sintaxe com o qual a escrever código para que em última análise, na verdade, poderíamos fazer alguma e isso. Lembre-se que suporte PHP Super variáveis ​​globais. O que está dentro de dólar assinar sublinhado GET em PHP? Nós demos uma olhada em um ou dois exemplos simples. E em PSet6, lembro que você tem Olá dot PHP que utiliza essa variável. O que se passa lá dentro? Ou o que é? Um pouco mais alto. AUDIÊNCIA: [inaudível] DAVID MALAN: É uma neve semente de matriz, a qual é apenas uma maneira elegante de dizer uma matriz que tem pares de valores-chave. E as teclas não são numéricos. Eles são palavras ou seqüências. E especificamente, o são os pares de chaves de valor? De onde eles vieram? Desculpa? AUDIÊNCIA: [inaudível] DAVID MALAN: Não? Aonde aqueles chave valor pares vem? Repita? Mais uma vez? Eu sou o único que ouve alguma coisa? [Risos] É isso mesmo, não é? AUDIÊNCIA: [inaudível] DAVID MALAN: Sim, eles vêm da seqüência de consulta. Então, se você voltar no tempo para quando joguei com Google e nós fomos para Google.com barra busca de interrogação q é igual a gatos, se eu fosse para pressionar Enter e se Google foram implementados em PHP, Código PHP que o Google escreveu teriam acesso ao sinal de dólar sublinhado GET dentro do qual é uma chave chamada Q e um valor chamados gatos que podem ser depois usadas usado para fazer uma pesquisa real com. Então, na verdade, o que eu vou fazer agora é voltar para o meu código PHP que novamente vai ver mais em PSet7. E em vez de ligar em valores codificados duros que não parece ser um muito website dinâmico, Vou dar-lhe um teaser do o seu código real faria. Você colocaria em dois pontos de interrogação como este. Eu não sei o que é o nome de usuário. Eu não sei o que o nome vai ser, mas eu sei que eu posso obtê-los de forma dinâmica. Assim, se o código que estamos escrevendo agora é o código em execução nos servidores do Google, ou se esta é Olá dot PHP, que vem com PSet6, Vou passar para a função de consulta assim como printf, dois outros argumentos. GET, citações, nome de usuário fecha aspas, e GET, citações, nome unquote. E agora, observe o que o estrutura geral é aqui. Tenho à esquerda lado da chamada, esta função chamada consulta no PHP. Eu ainda tenho como primeiro argumento, apenas uma seqüência de texto. Mas essa seqüência de texto é escrito em uma linguagem chamada SQL. E, francamente, não é uma grande língua. Nós só vamos falar sobre formalmente hoje, realmente. E então, em conjunto de problemas sete, há relativamente algumas características que nós somos vai alavancar. Os pontos de interrogação, porém, significa ligar um valor aqui e plugue no outro valor Aqui. E observem, eu tenho omitido o que de todo o maldito CITA-OS-- ele-- em torno da cotação assinala este tempo. Eu omiti a cotação marcas ao redor do ponto de interrogação, desculpe, desta vez. Então, o que é agradável sobre este pergunta característica que marca PHP tende a apoiar, Ruby e Python e outras linguagens, isto significa apenas plugue em alguns Valorizamos aqui e você sabe o quê? Você descobrir se usar aspas simples ou duplas. Não me preocupar com aqueles intelectualmente detalhes desinteressantes. Mas, certifique-se que ele está correto de modo que o meu código é em última análise, operacional e seguro, o que terá um significado muito tempo antes. Agora, quantos argumentos no total, só para ser claro, é a função de tomada de consulta? Quem quiser votar em mais de dois? Três? Claro, por que? Por que três? AUDIÊNCIA: [inaudível] DAVID MALAN: Exatamente. A primeira parte é a cadeia. O segundo argumento é sinal de dólar sublinhado GET suporte de nome de usuário. E o terceiro argumento é o mesma coisa, mas apenas o nome. Assim, em outras palavras, agora se eu tivesse um formulário web que tinha de campos de texto, uma para o nome do usuário, um para o seu nome, apenas como você veria em um site quando se registar algum site, isso pode ser o código no back-end que realmente faz a inserção agora na base de dados. Agora ao contrário, vamos avançar. Suponha que um usuário é agora o login e você quer para escrever o código PHP que verifica se a pessoa que está apenas logado é na verdade um usuário, você pode usar uma sintaxe muito simples. Você pode dizer SELECT, digamos Estrela, onde estrela significa tudo. Eu não sei o que eu quer, então me dê todas as colunas da tabela chamado de usuários, onde, e isso é bom. Select suporta o que é chamado um predicado, que é como uma forma de qualificar o que você quer. Onde nome de usuário é igual a Citação, unquote Malan. Então, aqui também, eu tenho incorporado dentro do argumento para uma função PHP, uma linha de código SQL. E que este código SQL tempo é, literalmente, indo para procurar citações, unquote Malan. Agora isso não é tudo o que útil, então eu vou pular essa e eu vou arrumar esta dica de Brady, e ir e plug-in em vez um ponto de interrogação aqui. Então, só para ficar claro, o que devo dizer ao meu segundo argumento ser se alguém acaba logado e eu querer verificar se ele ou ela é, na verdade, um usuário? AUDIÊNCIA: [inaudível] DAVID MALAN: Yeah. Ouço dólar sinal de sublinhado Obter cotação, nome de usuário fecha aspas. E que deve retornar para mim qualquer uma das linhas no meu banco de dados que tem um nome de Malan. Agora, esperamos, eu vou voltar zero se não Malan esteve aqui, ou um, se ele tem. Eu não deveria voltar dois, três ou quatro. Por quê? AUDIÊNCIA: [inaudível] DAVID MALAN: eu disse original, certo? Razão simples. Porque eu disse que ela tem que ser original, apenas logicamente, você só pode ter zero ou um Malans nesta tabela de banco de dados particular. Agora, como um aparte, apenas para que você já viu que, apesar de eu continuar usando GET e embora PSet6 utilizado apenas GET, você pode certamente ter POST. E lembrar que Publicar é outra técnica para a apresentação de informações de uma forma, mas não aparece na URL. É um pouco mais seguro, certamente, para coisas como nomes de usuários e senhas, PSet7 que irá, na verdade, envolvem. Então, vamos fazer isso em PHP MyAdmin e ver o que acontece. Eu estou indo para ir para a aba MySQL. E note que o valor padrão para PHP MyAdmin, apenas para tentar ser útil, é selecionar estrela de usuários onde um. Bem, um é sempre verdadeiro, assim este tem o bobo eficaz de apenas selecionar tudo. Mas eu vou ser um pouco mais pedante e manualmente digitar selecione Estrela usuários. Agora, tecnicamente, você pode citar o nome das tabelas. É raro que você tem que, mas observar essas não são suas citações normais do teclado dos EUA. Este é o chamado crase, que é geralmente no lado superior esquerdo canto do seu teclado. Mas é raro que você vai realmente precisa se preocupar com isso, então eu vou omiti-los de qualquer maneira. Então, agora, deixe-me ir em frente e bateu ir. E quantas linhas eu deveria ter de volta quando eu seleciono estrela de usuários? AUDIÊNCIA: [inaudível] DAVID MALAN: O número de linhas, com certeza. Mas como muitos nesta história concreta agora? Dois, porque não havia me e lá estava Rob. Então, se eu clicar em Go, vejo que visualmente Eu recebi de volta, na verdade, duas linhas. Há um monte de lixo no tela, mas eu só vejo duas linhas. Por outro lado, se eu fizer isso de novo e fazer Selecione Estrela usuários, onde nome de usuário é igual a citação, fecha aspas Malan, agora se eu clicar em Go, Eu só vou voltar uma linha. E, por último, se eu fizer algo como isto, suponha que eu não me importo com recebendo tudo, que é tipo de sem sentido agora, porque há apenas duas colunas. Não é como eu estou selecionando uma enorme quantidade de dados. Suponha que eu vá em frente e não SELECT nome DE usuários, onde nome de usuário é igual Malan, o que é agradável sobre SQL honestamente, é que ele realmente só faz o que você diga a ele para fazer. É muito sucinta, mas você literalmente apenas diga a ele o que você quer fazer. Selecione o nome dos usuários ONDE o nome de usuário é igual Malan. E isso realmente é que explícito. Então, agora se eu acertar Go, quantas linhas sou eu que vou voltar? Um, porque é apenas Malan, eu espero. Ou zero se ele não é Há, mas um máximo. E quantas colunas eu vou voltar? Quantas colunas? Desta vez, eu só vou para obter um, porque eu não fiz selecione estrela, que é tudo. Agora eu estou selecionando apenas o nome, então eu é só pegar de volta uma coluna e uma linha. E parece tipo de forma adequada ridículo, basta olhar super pequena como esta. Então, o que está realmente acontecendo? Quando você executar um SQL consulta usando select, o que você está recebendo volta da base de dados é como uma tabela temporária com linhas e colunas, talvez, mas que omitir qualquer coisa que Não foi realmente selecionado por você. Então, é como se alguém tinha uma grande planilha de todos os alunos registada para alguns grupo de estudantes, e você diz, me dar todo o calouro que tenho registrada para o nosso grupo de alunos, o que seu colega no grupo de estudantes pode fazer é que eles poderiam apenas entregar lhe toda a planilha. Isso é como dizer selecione estrela. E é um pouco chato se você só queria o calouro. E assim, se você, em vez disse: selecione estrela da tabela de banco de dados onde ano é igual a Citação, calouro unquote, é como se seu amigo no grupo de estudante literalmente em destaque e copiadas apenas as linhas caloiro, colou-los em um novo Google Planilha ou um arquivo do Excel, e entregou de volta o apenas como resultante de arquivo. Isso é tudo o que está acontecendo em conceptualmente aqui. Então, no final, não podemos fazer algumas coisas muito extravagantes por armazenar coisas como nomes de usuários e senhas e semelhantes. Mas, ao que parece, devemos fazê- um pouco diferente do que isso. Não é que inteligente apenas armazenar um nome de usuário e uma senha. Alguém mais cedo, eu acho aqui em baixo, sugeriu um ID. Agora, um ID poderia ser como um Harvard ID ou ID líquido de Yale, mas pode ser ainda mais simples no nosso caso base de dados. E, de fato, o caso comum é ter uma outra coluna. E eu estou indo para ir em frente e editar a minha mesa. E se você brincar com esta interface para PSet7, você verá que você pode conferir este botão aqui e adicionar um campo no inicio da tabela. E agora, se eu clicar em Go, que vai para me dar uma dessas formas de mais cedo. Eu estou indo para adicionar um campo denominado ID. E eu estou indo para torná-lo um tipo numérico. Eu tenho um monte inteiro de valores para valores numéricos. Eu só vou escolher um INT e Não se preocupe com os tamanhos diferentes. Eu não tenho para especificar ou um comprimento de um valor, porque ele vai ser 32 bits, não importa o quê. Atributos, nós não vimos antes. Qualquer participação em qualquer desses opções de menu desta vez? Para uma INT? O que você propõe? Não? Algum destes faz sentido? Sim. Sim, sem assinatura, certo? Geralmente, se nós estamos indo dar- todos um número único, que é o lugar onde esta história é indo, eu realmente só quer uma pessoa a ter o número, tipo, zero e um e dois e três e quatro. Eu não preciso de lidar com números negativos. Parece apenas uma complexidade desnecessária. Eu quero que quatro bilhões de valores possíveis, não quatro bilhões valores possíveis, então eu só duplicou o capacidade da minha INT. Como um aparte, se você quiser se relacionar isso para algo como o Facebook, para trás no tipo do meu dia quando Facebook saiu primeiro, Eu acredito que eles foram usando em seu banco de dados MySQL para armazenar um usuário do identificador, era apenas um INT. Mas, claro, há muito de pessoas reais no mundo. Há um monte de falso Facebook contas no mundo. E por isso, eventualmente, Facebook transbordou o tamanho de um INT, um quatro bilhões valor. É por isso que, se você olhar ao redor e há sites que podem dizer o que um ID único é. E se você nunca escolheu um nome de usuário Facebook, você vai ver a sua identificação única. Eu acho que é PHP dot perfil ponto de interrogação ID é igual a alguma coisa. Isso agora é algo como um grande INT, ou um longo se quiserem, que é um valor de 64 bits ou algo comparável. Assim, mesmo no mundo real fazer estes questões em última análise, às vezes importa. E acontece aqui, se eu sou dando todos os meus usuários uma identificação única, Eu quero ser super explícita e minimamente fazer esse campo único. Mas acontece lá fora é uma pedaço de nomenclatura também hoje que é uma chave primária. Se você está projetando um banco de dados mesa e você sabe com antecedência que uma das colunas dessa tabela deve e irá identificar exclusivamente linhas na tabela, você quer especificá-lo e dizer o banco de dados, esta é a minha chave primária. Pode haver duplicatas em outros campos, mas eu estou dizendo o banco de dados que este é a minha principal, o meu campo mais importante, que é garantida para ser exclusivo. Agora, isso parece redundante. Agora estou propondo que adicionar, clicando em Salvar aqui, um called-- campo e eu vou para ir em frente e clique AI, vamos voltar para que em um momento, salvar. Estou propondo agora que minha mesa semelhante a este. Eu tenho um campo INT chamado ID, um campo CHAR chamado usuário, um campo VARCHAR denominado Nome, mas ID, se é primário e, portanto, único, por que eu apenas resíduos tempo introduzindo o que efetivamente é uma segunda exclusivo campo chamado ID que é uma INT? Nome de usuário, recall, foi Já único, disse. Então, basta logicamente, você não precisa qualquer experiência de banco de dados à razão por isso, por que Eu poderia ter introduzido um INT como meu identificador único bem? O que está isto-- dizer de novo? AUDIÊNCIA: [inaudível] DAVID MALAN: Random o acesso é mais fácil, por quê? AUDIÊNCIA: [inaudível] DAVID MALAN: Sim, é apenas acessando números. Então, se você acha deste verdadeiramente é uma tabela, como uma matriz, agora eu tenho identificadores exclusivos que eu posso saltar ao redor. E ainda melhor do que isso é que quão grande é uma INT vai ser de novo? 32 bits ou quatro bytes. Quão grande é o meu nome vai ser? Maximamente? 16 bytes. Então, se você está realmente se preocupando com o desempenho do seu código, acho que volta para PSet5, você preferiria para procurar um valor de quatro bytes ou um 16 valor byte, certo? É realmente tão simples quanto isso. Você tem que fazer quatro vezes mais trabalho para procurar nomes de usuários porque esses são 16 bytes. Então, você tem que, literalmente, comparar todos os 16 bytes a ser Certifique-se sim, isso é nome de usuário que eu quero. Enquanto que para uma INT, você pode fazê-lo com apenas quatro bytes. E como um aparte para aqueles interessado em hardware de computador, verifica-se que você pode caber algo como um INT ou um valor de 32 bits em algo chamado um registo de um computador CPU, o que significa que é super, super rápido, mesmo com o menor nível de hardware do computador. Assim, não há apenas vantagens ao redor. Então o que isso quer dizer? Na verdade, quando você está projetando um banco de dados de tabela, a quase totalidade do tempo você está indo para não ter apenas os dados que lhe interessa, mas também algo como um identificador exclusivo porque isso vai deixe-nos fazer outras coisas. E vamos tropeçar um problema aqui. Suponha que os usuários não têm apenas nomes de usuários e nomes, mas eles também têm coisas como cidades e os estados e códigos postais, pelo menos, aqui em os EUA. Então, eu estou indo para ir em frente e apenas dizer rapidamente, Dá-me mais três colunas no fim da tabela. E isso vai ser City, este vai ser Estado, e isso vai ser Zip. Agora tipos City, que dados esta deve ser, talvez? VARCHAR? Eu não sei o que o maior cidade nome é. Em algum lugar na América, há provavelmente, alguns ridiculamente palavra longa, então vamos apenas ir com 255, um pouco historicamente ou arbitrária. Estado, o que você quer fazer? Chamada de julgamento, certo? O que é talvez o mais eficiente? Quantas personagens? Talvez apenas duas, se pudermos se safar fazendo apenas, como, MA para Massachusetts e assim por diante. Então, eu estou indo para ir um valor CHAR de dois. CEP é muito interessante. Estamos aqui em 02138, de modo que sugere que deveríamos usar o que? É um INT, certo? INT, INT, curto? Curto iria funcionar. Não? CHAR ou cinco, mas eu quero um INT. Por que empurrar para trás em um INT? Persuadir-me deste. O que é estúpido sobre um INT, a minha ideia? Sim. AUDIÊNCIA: Tome-se mais memória. DAVID MALAN: Tome-se mais memória. Quatro bytes, mas você é propondo um código postal como cinco bytes ou alguém era como um CHAR, que se sente como eh, isso não é realmente O caso. Bem, história divertida. Anos atrás, quando eu costumava usar Microsoft Outlook para o meu e-mail, Eu finalmente queria mudar para o Gmail. E assim, eu exportados toda a minha contatos do Outlook como um arquivo CSV. Valores separados por vírgulas, que apenas significava que eu tinha todos os meus amigos e último nomes nomes e números de telefone e códigos postais e tudo isso. E então eu fiz a erro de abri-lo em Excel, que é um programa de planilha que entende arquivos CSV, como vimos. Mas então, eu devo ter batido, como, Comando ou controle S em um ponto. E Excel, aparentemente no momento tinha uma característica em que a qualquer momento se viu um número, ele tentou ser útil. E se esse número começou com zeros, seria apenas se livrar deles. Por que você precisa de liderança zeros na inteiros? Eles são sem sentido, matematicamente. Eles não são sem sentido no sistema US Postal. Então, eu tive há anos, a este dia, eu ainda ter amigos que, quando o caso raro que eu preciso de alguém é abordar estes dias, Eu ainda vou ver que eu tenho um amigo em Cambridge, Massachusetts, 2138. E é irritante se você estiver tentar resolver de forma programática gerar envelopes ou simplesmente anote-a. E isso é por causa desta razão, Eu escolhi o tipo de dados errado. Então, eu amo a sua ideia. Vamos usar um campo CHAR. Cinco personagens, com exceção há um caso de canto. Se você ainda enviar e-mail, por vezes, códigos postais nos dias de hoje, eles são, como, mais quatro. Então, precisamos de um hífen e, em seguida, precisamos de mais quatro números. Então, para ser honesto, poderia ir muitas maneiras diferentes. Por agora, eu vou continuar o simples e eu sou apenas vai dizer que é um cinco valor CHAR e estamos vai pular todo o traço mais quatro. Mas estes são os tipos de compensações. E você pode pensar no mesmos problemas decorrentes com números de telefone ou outros campos. E agora, este é, na verdade, uma estrada tola de ir para baixo. Suponha que tanto Rob e eu e Hannah e Maria e [? Davon?] E Andy e outros sobre a equipe todos ao vivo em Cambridge, Massachusetts, 02138. Isso realmente me sinto idiota que eu sou adicionando a minha tabela de usuários, cidade, estado, e zip. Por quê? AUDIÊNCIA: [inaudível] DAVID MALAN: Diga outra vez? AUDIÊNCIA: [inaudível] DAVID MALAN: Eles são sempre indo para ir juntos, certo? Quando se vê, estamos acostumados a pensar este era o caso até que nós exaustivamente procurou todo os EUA, e despeja que há são algumas inconsistências onde várias cidades têm o mesmo zip, o que é estranho. Mas, se por agora estipulam que 02138 é sempre de Cambridge, Massachusetts, por que no mundo que você armazenar em seu banco de dados e Cambridge MA e 02138 para mim e para Hannah e para Rob e para [? Davon?] E para os outros que vivem aqui em Cambridge, é perfeitamente redundante. Devemos fugir com apenas armazenar o quê? Apenas o código postal. Mas então, se nós armazenamos apenas o código postal, eu quero, provavelmente, para o meu site para saber onde é 02138. Então, eu preciso de outra tabela. E isso é OK. E, de fato, este é um dos processos de projeto de concepção de tabelas que você vai fazer em PSet7 bem pelo qual Você quer fatorar dados comuns. Assim como temos vindo a fatoração código comum e factoring out comum estilos de CSS, aqui também no banco de dados, se eu só precisa de 02.138 para singularmente identificar alguém da cidade natal, não guarde Cambridge, Mass para cada usuário danado na sua tabela. Em vez disso, ter uma tabela separada chamada Zips que deve ter o que colunas? Provavelmente, um campo ID, apenas porque, para os princípios que estamos falando agora. Provavelmente um campo zip para 02138. E então, provavelmente, o que os outros colunas? Cidade e estado, mas só tem uma linha para 02.138, uma linha para 02.139, uma linha para 90210. E isso é, literalmente, todos os códigos postais que eu conheço. Então, agora, o que você pode fazer? Isto é problemático, porque agora eu tenho duas tabelas. Então, meus usuários são em sua maioria por aqui, mas a sua informação de estado da cidade é Por aqui. Assim, verifica-se com o SQL, não há na verdade, uma maneira de juntar informações, e você vai ver isso no PSet. Mas acontece que você pode fazer algo assim. Selecione Estrela usuários, zips Cadastre-ON usuários dot zip é igual a zips dot zip. Que é um pouco prolixo, reconhecidamente, mas isso só significa selecionar tudo, desde o processo de tomada de minha tabela de usuários e minha mesa zips. Juntá-los por um campo que eles têm em coluna. Então, literalmente fazendo algo assim, e me dar de volta uma nova tabela temporária isso é mais amplo, que é maior, que tem todo o colunas de ambos. E que, muito simplesmente, seria o sintaxe para fazer algo parecido com isto. Então, há essa frente, mas lá vai ser outras decisões de projeto você vai tem de fazer, não só com os índices mas também correr em desafios. Na verdade, há um desafio em qualquer projeto de banco de dados pelo que, por vezes, duas pessoas podem querer para acessar as mesmas linhas do banco de dados mesa. Então, isso é algo que vamos encontrar em PSet7 bem. Mas eu pensei que eu iria olhar para um ataque que é possível em SQL. Quais são algumas das problemas que podem surgir? Então, você vai encontrar isso em PSet7. E nós dizemos-lhe abertamente o que o solução de codificação para esse problema é. Mas se você tomar uma classe de nível superior, especialmente em sistemas operacionais, você vai encontrar uma questão de atomicidade, o problema de tentar fazer várias coisas ao mesmo tempo sem interrupção. E eu pensei que eu iria introduzir esta idéia para PSet7 com uma metáfora que eu mesmo aprendi em Margo Sistemas operacionais CS164 do Seltzer anos de classe atrás. Suponha que você tem um destes dormitório frigoríficos em seu quarto do dormitório ou casa, e você tem uma propensão real para leite. E assim, você chega em casa a partir de classes um dia, você abrir a geladeira. Oh, droga. Não há leite no frigorífico. Assim, você fechar o frigorífico, trancar a porta, bloquear o seu dormitório, caminhar ao virar da esquina a CVS, entrar na fila, e começar a verificar um pouco de leite. E isso vai levar um tempo, porque aqueles maldita auto check-out contadores demorar uma eternidade para usar de qualquer maneira. Então, enquanto isso, seu companheiro de quarto chega em casa. Ele ou ela realmente gosta de leite também. Eles vêm para a sala de dormitório, abrir a geladeira, oh, danado. Não há mais leite. Então, ele ou ela também vai ao virar da esquina. Mas agora, uma vez que não há como dois ou três ou quatro CVSes nas proximidades, eles acontecem para ir para um dos diferentes pessoas na praça. E agora, a poucos minutos mais tarde, tanto de você chegar em casa e ugh, pior problema que nunca. Agora você tem muito leite porque vai azedar. E você gosta de leite, mas você realmente não gosta de leite. Então, agora, este foi um caros erro, porque tanto de você tomou uma decisão com base no estado de variável que alguns estava no processo de sendo mudado por você, o iniciador de ir para obter leite. Então, o que é, talvez, um ser humano solução para esse problema? AUDIÊNCIA: [inaudível] DAVID MALAN: Deixe uma nota, certo? Sempre deixe uma nota, se você estiver familiarizado com esse show. Sim, existem dois de nós. Então, sempre deixar uma nota, ou literalmente bloquear o refrigerador com algum tipo de cadeado ou algo sobre a parte superior assim. Mas isso realmente vai ser problema-chave com design de banco de dados, especialmente quando você pode ter vários navegadores, vários laptops, vários usuários todos tentando atualizar as informações de uma só vez. As informações particularmente sensíveis como informações financeiras, qual com uma negociação de ações site como você estará construindo, E se você quiser verificar quanto dinheiro você tem e, em seguida, se você tem o suficiente, comprar algumas ações? Mas e se alguém que tem uma conta conjunta com você é tentando simultaneamente para comprar algumas ações? Então, ele ou ela é a verificação da Saldo da conta, tanto de você receber de volta o mesmo resposta, não há leite. Ou tanto de você voltar a resposta, você tem R $ 100 em sua conta. Tanto de você tentar tomar a decisão para comprar um quota de cerca de ações da empresa. E agora, o que acontece? Você tem duas partes? Você não tem ações? Problemas como a que pode surgir. Então, a gente vai encontrar isso. Ataques de injeção SQL, felizmente, são algo que vai ajudá-lo com, mas estes são atrozmente comuns nos dias de hoje ainda. Então, este é apenas um exemplo. Eu não faço nenhuma reivindicação que Sistema de Harvard PIN estiver vulneráveis ​​a este ataque em particular. Nós já tentou acessar. Mas, você sabe que nós ter um campo como este. E Net ID de Yale tem um similar tela procurando estes dias. E verifica-se, que talvez o PIN do sistema é implementado em PHP. E se were-- é não-- eles pode ter código que se parece com isso. Eles têm duas variáveis. Dê-me o nome de usuário e senha a partir da variável global pós super- que falamos anteriormente. Talvez Harvard tem uma consulta como selecione Estrela usuários onde nome de usuário é igual ao ea senha é igual a isso. E note que eu sou apenas ligá-lo usando a notação chaveta do outro dia, o que significa apenas ligar um valor Aqui. Eu não estou usando o questão técnica marca. Eu não tenho qualquer segundo ou argumentos terceiros. Eu sou apenas literalmente construir a cadeia de mim mesmo. O problema, porém, é que se alguém gosta de um scroob, que é uma referência a uma película, registra-se com algo parecido com isto, e eu removi os pontos que geralmente encobrir senhas, e se ele é particularmente malicioso e sua senha talvez é 12345, por o filme chamado "Spaceballs," mas ele criticamente tipos de apóstrofo depois do cinco, em seguida, literalmente, a palavra ou no espaço, e, em seguida, citações, um unquote iguala uma citação, Mas note que ele omitiu o que? Ele omitiu a citação à direita e ele é omitido a citação à esquerda. Porque, se esta invasor presunção de scroob é que as pessoas que escreveu este código PHP não eram tão brilhantes, talvez eles só têm algum único cita em torno da interpolação de uma variável com chaves? E talvez por isso, que podia tipo de completar o seu pensamento para eles, mas de uma forma que está acontecendo para deixá-lo invadiu o sistema de PIN. Em outras palavras, suponha que este é o código e, agora, ligar o que scroob digitado. E é vermelho, porque é ruim. E o texto subjacente é o que ele digitou, scroob poderia enganar servidor de Harvard para a construção de uma consulta SQL string que se parece com isso. Senha é igual a 12345 ou um é igual a um. O resultado de que, logicamente, é que este irá registrar scroob em se sua senha é 12345 ou se um é igual a um, o que é, naturalmente, sempre verdade, o que significa scroob sempre entra. E assim, a maneira de corrigir Neste, como em muitos casos, seria escrever mais na defensiva. Para usar algo como o nosso função de consulta real, que você verá em PSet7, onde se conecte algo como pontos de interrogação aqui. E a beleza da função de consulta que nós dar é que defende contra estas os chamados ataques de injeção SQL, onde alguém está enganando seu código em injetar seu próprio código SQL. Porque o que a função de consulta nós damos-lhe realmente vai fazer, se você usar a sintaxe de ponto de interrogação e um segundo e um terceiro argumento aqui, é o que ele acrescentar ao entrada que o usuário forneceu? Aqueles barra invertida cita. Então, ele escapa a qualquer potencialmente caracteres perigosos. Isso parece estranho agora, mas não é vulnerável porque não faz alterar a lógica mais porque essa senha é todo Agora, uma única citação que não é, de fato, a senha do scroob. Assim, tem havido algumas piadas sobre isso ao longo dos anos. Então, essa foi uma foto tirada de algum geek em um lote de estacionamento através do qual você pode saber que algumas cidades e estados tentar digitalizar a sua licença placa para cobrá-lo ou bilhete você se você passar por sem, como, a coisa E-Z Pass. Então, essa pessoa presume que talvez as pessoas que escrevem o sistema E-Z Passe não eram tão brilhantes, e talvez eles apenas concatenados uma corda, para que ele ou ela não podia maliciosamente não apenas completar o seu pensamento, mas, na verdade, executar um comando ruim, que não tenha mencionado ainda, mas você provavelmente pode adivinhar. Que, além de excluir e inserir e atualizar e selecionar, há também uma palavra-chave chamada gota, que literalmente exclui tudo na base de dados, que é particularmente ruim. Podemos zoom e isso se é um pouco difícil de ver. Isso, agora, é um famoso desenho animado que é maravilhosamente inteligente agora e compreensível. [Risos] Sim, legal. Tipo de geeking fora. Então, essas são, então, Ataques de injeção SQL. E eles são tão fáceis de evitar, utilizando o código de direito ou as bibliotecas certas. E você vai ver em PSet7, isso é por que nós damos-lhe a função de consulta. Assim, um par de teasers que nós pensamos dar-lhe aqui em nossa remanescente minutos juntos. Então, como você se lembra de semana zero, nós introduziu essas duas lâmpadas que são bons, não só porque eles são muito e são coloridos, mas porque suportam algo chamada de API, uma aplicação Interface de Programação de E em CS50, até agora, nós temos principalmente focada em GET e POST, mas verifica-se há outros verbos de HTTP, como PUT. E, de fato, este foi um slide de semana de zero pelo que se você escrever código que envia a la PSet6 uma solicitação HTTP que olha como este com este pedaço de texto na parte inferior, o que é chamado JSON, ou JavaScript Object Notation que falaremos na próxima semana, você pode ligar ou desligar ou mudar a cor das luzes como aqueles. Portanto, se CS50 também tem em adição a alguns dessas lâmpadas aqui em New Haven se você gostaria de emprestar para projetos finais, também alguns Microsoft Bandas, que são como relógios que você usa em torno de seu pulso Da mesma forma que tem uma API de maneira a ficar pode escrever seu próprio software para eles. Nós temos uma conta com Código iOS da Apple assim que se você tiver um relógio Apple ou um iPhone ou um iPad ou um iPod, você pode escrever código que realmente funciona sobre aqueles. Nós temos um grupo inteiro de Arduinos, que são computadores minúsculos pequenos sem casos, essencialmente, que você pode se conectar via USB, normalmente para o seu próprio Mac ou PC, escrever código que é executado sobre estes físico dispositivos sensores que muitas vezes têm sobre eles para que você possa interagir com o mundo real. Nós temos um grupo inteiro de dispositivos Leap Motion, que são dispositivos USB para Macs e PCs, aqui e mais uma vez, em New Haven. E se você conectá-lo ao seu Mac, você pode realmente controlar o seu computador escrevendo software que por meio de raios infravermelhos, descobre onde as mãos humanas são, mesmo sem tocar em seu teclado. Nós pensamos em compartilhar um rápido vislumbrar isso, por exemplo. [Música tocando] Então, nós temos um todo monte dessas coisas, também, chamado braçadeiras Myo que você colocou sobre seu antebraço e, em seguida, você pode controlar o real mundo ou o mundo virtual como este. [Música tocando] Ou, também temos alguns Google Papelão, que fica literalmente, como, uma caixa de papelão que você pode colocar no seu rosto, mas de slides no seu telefone para ele de modo que você colocou o copo de sua telefone realmente perto de seus olhos. E o Google é Papelão muito barato em US $ 10 ou US $ 20. E tem pequenas lentes que um pouco fora do turno a imagem na tela para o seu humano olhos para dar-lhe uma sensação de profundidade de modo que você realmente tem um 3D ambiente na frente de você. Temos também alguns Samsung engrenagem, que é a versão mais caro do presente, mas que pode de modo semelhante deslizar numa Telefone Android e dar-lhe a ilusão de-- ou dar a experiência da realidade virtual. E em nossos dois minutos finais, nós pensamos em tentar fazer isso. Se eu posso projetar o que tem Colton aqui só para aguçar o apetite, deixe-me ir em frente e jogue up na tela grande aqui. Deixe-me matar as luzes. Colton, você quer ir em frente e colocar em seu celular por um momento e venha até ao meio do palco? E você quer project-- isto é o que Colton vê. Agora, o Wi-Fi aqui é não tão forte para este dispositivo que este é super atraente, mas é, literalmente, Colton neste lugar mágico futurista. Ele só vê uma imagem. Você está vendo a sua esquerda e direita olho que o seu cérebro está costurando num tridimensional ambiente em seu rosto. Ele só está seleccionada uma opção de menu aqui. E então, novamente, ele está vestindo este auricular com um telefone Samsung nele que é sem fio projetando a nossa sobrecarga. Agora você está em Marte, eu acho? Colton: Eu acho que sim. Eu não tenho certeza [inaudível]. [Risos] DAVID MALAN: Acontece Marte tem estes menus. Colton: [inaudível] alguns cool lugares, se queremos ir a-- DAVID MALAN: Onde queremos ir? Colton: [inaudível] DAVID MALAN: E vamos ver Colton, onde está nos levando agora. Colton: [inaudível] DAVID MALAN: Então, há tantos lugares diferentes que você pode tomar-se. Há FAPIs através do qual você pode escrever jogos ou interações que executar, em última análise, no telefone. Então, você realmente só escrevendo um aplicativo de telefonia móvel. Mas graças ao software e os recursos gráficos, Colton agora é neste pequena casa de campo pouco. E correndo o risco de esmagadora nós mesmos, Colton e eu vou ficar por enquanto, ao final da aula aqui hoje se você gostaria de vir e jogar. E nós vamos trazê-los de volta na próxima semana também. Sem mais delongas é isso por hoje. Vamos vê-lo na próxima semana. [MUSIC - Ragga Twins, "homem mau"]