[Jouer de la musique] DAVID MALAN: Très bien, cela est CS50. Ceci est la fin de la semaine huit. Et aujourd'hui, nous commençons de combler certaines pièces quand il vient à la construction choses sur le web. Donc, rappeler que le lundi nous passons beaucoup plus de temps sur PHP, qui est cette dynamique langage de programmation qui nous permet de sortie, entre autres choses, HTML et d'autres tel contenu que nous allons voulons voir. Mais nous ne sommes pas vraiment regardé comment nous allons stocker toute information. En effet, presque toutes que le super sites intéressants que vous visitez aujourd'hui avoir une sorte de base de données à l'extrémité arrière, à droite? Facebook stocke certainement beaucoup de données de nous tous et de tous les magasins de Gmail de vos emails. Et donc, beaucoup d'autres sites ne sont pas seulement contenu statique qui est informationnel. Il est réellement dynamique en quelque sorte. Vous fournissez entrée, il met à jour les pages pour d'autres personnes. Vous recevez des messages, vous envoyez messages, et ainsi de suite. Donc, aujourd'hui, nous regardons de plus près les fondements d'un projet que vous allez plonger dans la prochaine semaine, CS50 Finances, qui qui se passe réellement à avoir vous construisez quelque chose de pas en C, mais en PHP. Un site web qui ressemble un peu quelque chose comme ça qui permet d'acheter et de vendre les stocks qui sont en fait va puiser en temps réel les données de stock de Yahoo Finances. Et finalement, vous aurez la illusion pour vous et pour les utilisateurs que vous êtes réellement achat et la vente les stocks et obtenir le temps réel près mises à jour, la gestion d'un portefeuille, qui va exiger ayant, en fin de compte, une base de données d'utilisateurs. Donc, dans vos propres mots, surtout si vous n'êtes pas familiers avec des super ordinateur la science ou de bases de données, ce qui savez-vous une base de données pour être en ce moment, en termes non techniques? Qu'Est-ce que c'est? Comment le décririez-vous à un colocataire ou un ami? AUDIENCE: [inaudible] informations [inaudible] DAVID MALAN: Donc, une liste d'informations, ou un store-- une liste d'informations que vous pourriez vouloir stocker à propos de quelque chose, comme un utilisateur. Et qu'est-ce que les utilisateurs ont associé avec eux? Si vous êtes un utilisateur sur Facebook ou Gmail, quelles sont les caractéristiques que nous tous les utilisateurs ont? Comme, ce qui pourrait être une partie de la les colonnes de la feuille de calcul à laquelle nous fait allusion la dernière fois? Parce qu'encore une fois, vous pouvez penser à une base de données vraiment comme une fantaisie fichier Excel ou Google Tableur ou Apple File Numbers. Alors, que pensez-vous de quand vous pensez à un utilisateur? Qu'ont-ils? Qu'est ce que c'est? PUBLIC: Un nom. DAVID MALAN: Un nom. Donc, si le nom, comme, David Malan serait le nom d'un utilisateur. Quoi d'autre ne possède un utilisateur? Public: Une pièce d'identité. DAVID MALAN: Une pièce d'identité. Alors, comme un numéro d'identification, comme votre Harvard ID ou votre Yale Net ID ou similaire. Quoi d'autre pourrait avoir un utilisateur? AUDIENCE: Mot de passe. DAVID MALAN: Un mot de passe, peut-être une adresse, peut-être un numéro de téléphone, peut-être une adresse e-mail. Donc, il ya des grappes de champs et ce pourraient sorte de spirale hors de contrôle rapidement dès que vous commencez réaliser, oh, nous allons stocker cette et nous allons stocker ceci et cela. Mais comment pouvons-nous réellement le faire? Encore une fois, le modèle mental d'avoir pour aujourd'hui comme nous plonger dans SQL réelle, Structured Query Language, est une base de données qui ressemble à ceci. Ce ne sont que lignes et colonnes. Et vous pouvez imaginer Google Spreadsheets ou tout nombre d'autres programmes. Mais ce qui est la clé sur MySQL, qui est la logiciel de base de données que nous allons utiliser, l'librement ouvertement available-- utilisations Facebook et un certain nombre d'autres websites-- base de données stocke les choses sur le plan relationnel. Et une base de données relationnelle signifie simplement celui qui littéralement stocke ses données en rangées et colonnes. C'est aussi simple que ça. Donc, même quelque chose comme Oracle vous pourriez avoir entendu parler de général est une base de données relationnelle. Et sous le capot, il stocke des données en rangées et en colonnes. Et Oracle vous une facture beaucoup d'argent pour le faire, tandis que les frais de MySQL vous rien pour la même. Donc, SQL va nous donner au moins quatre opérations. La possibilité de sélectionner des données, comme lecture données, insérer, supprimer, et les données de mise à jour. En d'autres termes, ceux qui sont vraiment les quatre opérations clés qui vont nous permettre de changer trucs dans ces lignes et de colonnes. L'outil que nous allons utiliser aujourd'hui en particulier d'apprendre SQL et de jouer avec lui est de nouveau appelé PHP MyAdmin. Il est outil Internet. Coïncidence totale que il est écrit en PHP. Mais ça va nous donner un graphique interface utilisateur afin que nous puissions effectivement créer ces lignes et de colonnes puis leur parler via le code. Donc, nous allons commencer dès maintenant à ce que je pense est franchement type de processus de fun la construction de l'extrémité arrière de sites Web, les pièces que les utilisateurs ne voir, mais sûrement nous soucions, parce que ce qui se passe plutôt données. Donc, similaire à C et un peu moins comme PHP, SQL, ou une base de données qui prend en charge SQL, a au moins ces types de données et grappes d'autrui. CHAR, VARCHAR, INT, BIGINT, DECIMAL, et DATETIME. Et il ya un ensemble de tas d'autres fonctions, mais nous allons le faire par A titre d'exemple réel. Je vais aller dans CS50 IDE où, à l'avance, je suis connecté et je l'ai aussi visité une URL pour cet outil appelé PHP MyAdmin. Et dans le problème réglé sept, nous dirons vous exactement comment se rendre à cette interface aussi bien. Dans le coin supérieur gauche, remarquerez qu'il dit donner des conférences. Et cela signifie juste que à l'avance, je créé une base de données appelée conférence vide qui n'a pas encore de feuilles de calcul en elle. Il n'y a pas rangées et de colonnes. Parce que le premier chose que nous allons faire est de commencer à créer une table cela va stocker nos utilisateurs. Donc, littéralement plus ici pour le droit, je suis va dire à la base de données Je veux une table appelée utilisateurs. Donc, cela est comme le fichier que je vouloir stocker toutes mes données dans. Et combien de colonnes? Eh bien, nous allons garder les choses simples pour le moment. Je veux juste pour stocker comme un nom d'utilisateur et un nom pour un utilisateur. Nous allons commencer petit. Donc, je veux deux colonnes totale. Et je vais aller de l'avant et cliquez sur OK. Et puis, pour ceux-ci colonnes, ce que je vais si à ce do-- Internet cooperates-- tout droit, donc nous allons essayer encore une fois. Je vais créer une table appelée Utilisateurs avec deux colonnes, cliquez sur OK, OK. Maintenant, nous avons vraiment rapide. Merci, très bien fait. Très bien, alors que voulons-nous ces colonnes pour être appelé? Donc, on va être appelé Nom d'utilisateur. Donc, je ne vois ici-- et l'interface obtient franchement un peu laide éventuellement, une fois que vous commencez à taper dans toutes ces données. Mais ce qui est beau est ce genre de paradoxalement, je crée des colonnes, mais l'outil a bêtement les déposèrent en rangées de sorte que je peux configurer ces colonnes. Donc, il ya deux flans il sous Nom. Et l'un de ces domaines, je vouloir appelé Nom d'utilisateur, et l'autre domaine que je veux appeler Nom. Et maintenant, je dois choisir types de données pour ces choses. Ainsi, alors que dans Excel et Google Spreadsheets, si vous voulez une colonne, vous littéralement il suffit de taper le nom ou nom d'utilisateur, appuyez sur Entrée. Peut-être que vous le rendre gras juste pour la clarté, mais ça y est. Vous ne spécifiez pas le les types de colonnes. Maintenant dans Google Spreadsheets ou Excel, vous pourrait indiquer comment les données est rendue. Vous pouvez aller dans le menu Format, et vous peut spécifier montrer ce signe comme du dollar, montrer cela comme une valeur en virgule flottante. Ainsi, il est similaire dans l'esprit que ce que nous sommes sur le point de le faire, mais ce qui se passe réellement à la force les données à un certain type. Maintenant, même si il ya un instant, je dit il ya seulement quelques types de données, il ya en fait un beaucoup, et ils sont en faisant varier les degrés de spécificité. Et en passant, vous peut même faire des choses fantaisistes comme géométries de stockage à l'intérieur d'une base de données. Vous pouvez stocker des choses comme les coordonnées GPS et effectivement trouver, mathématiquement, des points qui sont proches à d'autres. Mais nous allons garder ce super simple et aller jusqu'à ici, tous les types dits cordes. Donc, voici une liste de tas ensemble d'options. CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT. Et il est un peu écrasante. Et malheureusement, un peu paradoxalement, à C, CHAR est pas vraiment un CHAR. Si vous indiquez dans une base de données que votre type de données est CHAR, cela veut dire que oui, il est un CHAR, mais il est un ou plusieurs caractères. Et vous devez spécifier combien de caractères que vous voulez. Donc, ce qui est un typique longueur pour un nom d'utilisateur? Y at-il une limite généralement? AUDIENCE: [inaudible] DAVID MALAN: 16 peut-être? Quelque chose comme ça. Vous savez, de retour dans le jour, il l'habitude d'être huit. Parfois, il est 16, parfois il est encore plus que cela. Et donc, cela ne dire me donner un CHAR. Cela signifie que je dois spécifier la longueur du champ, et maintenant je pourrais dire quelque chose comme 16. Et il ya un compromis ici. Donc, nous le verrons dans un instant cela signifie que l'un, chaque nom d'utilisateur doit être de 16 caractères. Mais attendez une minute, M-A-L-A-N. Si tel est mon nom et je suis seulement en utilisant cinq, que proposeriez-vous que la base de données à faire pour les 11 autres caractères Je l'ai réservé un espace pour? Que feriez-vous? AUDIENCE: [inaudible] DAVID MALAN: Ouais, juste rendre tous nuls. Faites-les espaces. Mais probablement nulle, donc un beaucoup de zéros de barre oblique inverse. Donc, d'une part, nous avons maintenant fait en sorte que mon nom d'utilisateur peut être pas plus de 16 caractères. Et le revers de la médaille est que si je devais vraiment un nom long ou voulu un très long username comme certains d'entre vous les gars pourraient avoir dans ce collège ou au Yale.edu, vous ne pouvez pas en avoir un. Et en fait, si vous avez jamais enregistré pour un site Web et vous obtenez crié à dire votre mot de passe est trop long ou votre nom d'utilisateur est trop long, il est tout simplement parce que un programmeur, lorsque la configuration de sa base de données, décidé que ce champ pas dépasser cette longueur. Très bien, tant pis si nous procédons à nommer? Combien de temps devrait une le nom de l'homme typique être? Combien de caractères, 16? Je devine que nous pourrions trouver quelqu'un dans cette salle où, par sa première, plus dernier nom est plus de 16 caractères. Alors, quoi de mieux que cela, 17? 18? 25? Plus gros? 30? AUDIENCE: [inaudible] DAVID MALAN: 5000, oh mon Dieu. Donc, voilà sans doute une vie décente borne supérieure, dirons-nous. Et ici, nous avons sorte de pour faire un appel du jugement. Comme, il n'y a pas de bonne réponse ici. Infini est pas tout à fait possible, parce que nous sommes finalement aller à have-- nous sommes aller à manquer de mémoire. Donc, nous avons à faire un appel de jugement à un moment donné. Très commune serait, par exemple, à use-- et laissez-moi préciser CHAR ici comme before-- 255 était littéralement le limite supérieure de ce logiciel de base de données il y a des années. Et donc, beaucoup d'êtres humains dirais simplement, très bien. 255 est la limite. Disons simplement utiliser le maximum. Et cela est assez ridicule. Comme, si vous tapez quelqu'un est nommer pour 200 caractères plus, que un peu ridicule. Mais, rappelez-vous que ASCII est pas le seul système pour les personnages. Ainsi, en particulier dans un beaucoup de langues asiatiques où il ya des personnages nous ne pouvons pas exprimer sur les claviers comme mon US Clavier, certains caractères réellement prendre jusqu'à 16 bits au lieu de huit bits. Et ainsi, ce fait est pas tout à fait déraisonnable que nous avons besoin de plus espace si nous voulons adapter caractères plus gros que le très américain celles centrées nous avons tendance à discuter. Donc, nous avons besoin d'une certaine limite supérieure. Je ne sais pas ce que le meilleur est, mais 255 est généralement une commune. 25 se sent faible. 16, 32 sentir faible. Je voudrais tromper sur le côté de quelque chose de supérieur. Mais il ya un compromis, comme toujours. Quel est le, peut-être, évident compromis de réserver 255 caractères pour le nom de tout le monde dans ma base de données? AUDIENCE: [inaudible] DAVID MALAN: Qu'est-ce que? AUDIENCE: [inaudible] DAVID MALAN: Il est un beaucoup de mémoire, non? M-A-L-A-N. Je viens gaspillé 250 caractères juste pour stocker mon nom défensivement, juste au cas où quelqu'un dans la classe a un très long nom. Cela semble être un compromis indu. Donc, il se trouve que SQL, cette langue de base de données, soutient en fait quelque chose appelés VARCHAR, ou variable CHAR. Et cela est une sorte de Nice en ce qui vous permet de spécifier pas un fixe largeur, mais plutôt, une largeur variable. Et plus particulièrement, un la largeur maximale du champ. Donc, cela signifie qu'un nom peut pas plus de 250 caractères, mais il peut certainement être moins. Et la base de données va être intelligent. Si vous ne mettez dans M-A-L-A-N, il va seulement utiliser cinq, peut-être six octets pour comme un caractère nul final, et ne pas dépenser une somme additionnelle 249 ou 250 octets inutilement. Donc, cela semble comme je le devrais ont commencé avec cette histoire. Mais il ya toujours un compromis. Donc, d'une part, un nom d'utilisateur, je l'ai spécifiée pour être codé en dur à 16 ans, et peut-être était pas l'appel à droite, peut-être est, mais pourquoi ne pas utiliser Varchars pour tout? Il existe pour une raison. Pourquoi ne pas utiliser Varchars pour chaque champ dont la longueur que vous ne savez pas à l'avance si elle semble être une bonne chose, non? Utilisez uniquement autant d'espace que vous avez besoin jusqu'à cette limite? AUDIENCE: Plus lent. DAVID MALAN: Speller? AUDIENCE: rend plus lent? DAVID MALAN: Oh, il est plus lent. Bon, voilà presque toujours la réponse, franchement. Comme, quel est le compromis? Il coûte plus d'espace soit ou il en coûte plus de temps. Donc, dans ce cas, il pourrait être plus lent. Pourquoi? AUDIENCE: [inaudible] détermination [inaudible]. DAVID MALAN: Bon. Ainsi, vous pourriez rappeler de même PSED5, jouer avec votre approche le dictionnaire, si vous avez à allouer dynamiquement de la mémoire ou de garder la croissance d'une mémoire tampon, qui peut effectivement être lente. Si vous devez appeler malloc sous le capot et peut-être qui est ce que MySQL est en train de faire, de sorte sûrement que cela pourrait être le cas. Et si vous pensez façon Retour à PSet-- ou même deux semaines, quand nous avons fait des choses comme recherche binaire ou même la recherche linéaire, Une des belles choses sur chaque mot dans une base de données ou chaque mot dans une colonne étant exactement la même longueur, même si tout un tas de ces caractères sont vides, est que vous pouvez utiliser accès aléatoire sur vos données, non? Si vous savez que tous les mot est de 16 caractères de suite, vous pouvez utiliser un pointeur arithmétique, ainsi parler, et aller à nous 16, 32, 48, 64, et vous pouvez simplement sauter instantanément en utilisant l'arithmétique à l'un des mots dans votre base de données. Tandis que si elle est une VARCHAR, qu'est-ce que vous avez à faire à la place? [Le téléphone sonne] Si il est une VARCHAR, vous ne peuvent pas utiliser l'accès aléatoire. Qu'est-ce que vous avez à chercher ou à faire? Ouais? AUDIENCE: [inaudible] DAVID MALAN: Regardez à travers la trace whole-- toute la liste à la recherche de ce que, le plus probable? Quel genre de valeur particulière? AUDIENCE: [inaudible] DAVID MALAN: Regarder pour les terminaisons null qui délimitent la séparation des mots. Donc encore une fois, un compromis, et il n'y a pas de bonne réponse. Mais cela est le cas, en particulier lorsque vos utilisateurs obtiennent d'être beaucoup et votre charge sur vos serveurs, le nombre de personnes qui l'utilisent devient haut, ce sont en fait des décisions non triviaux. Donc, nous pouvons laisser ceux-ci comme cela, mais nous allons faites défiler vers la droite Ici. Maintenant, il ya un couple de colonnes où nous avons à faire un appel du jugement. Est-il judicieux de permettre à un utilisateur de nom, le nom d'utilisateur ou d'un utilisateur d'un utilisateur nom, d'être nulle? Voilà, tout simplement vide. Se sent un peu absurde, donc je suis ne va pas vérifier ces boîtes. Mais il se trouve dans un base de données, vous pouvez dire, quelqu'un peut éventuellement avoir cette valeur. Cette colonne n'a pas pour être réellement là. Maintenant, il ya ce menu déroulant. Et notez que je suis encore dans la première rangée là, si je parle maintenant le nom d'utilisateur. Et il se trouve que d'une base de données, contrairement à un simple, simple feuille de calcul, a des fonctionnalités puissantes appelées indices. Et un indice est une façon de dire au base de données à l'avance que je l'humain suis plus intelligent que vous. Je sais quels types de requêtes, sélectionnez ou d'insérer ou de supprimer ou de mise à jour, que mon code va se terminer jusqu'à faire sur cette base de données. Je veux lire un grand nombre de données. Je veux insérer un grand nombre de données. Je veux constamment supprimer un grand nombre de données. Si je sais que je vais être l'accès à un domaine comme Nom d'utilisateur beaucoup, Je peux dire la préventivement base de données, je sais plus que vous, et je tiens à ce que le décret vous devriez indice ce domaine. Lorsque l'indexation d'un champ ou une colonne signifie que la base de données à l'avance devrait emprunter quelques idées à partir, comme, la semaine de quatre et cinq et six de CS50 et effectivement construire quelque chose comme une recherche binaire arbre ou quelque chose généralement appelé un arbre B que vous souhaitez apprendre dans un cs124 comme de classe à Harvard, une classe d'algorithmes, ou tout nombre d'autres endroits. La base de données et la smart personnes qui mis en œuvre va comprendre comment stocker cette table d'informations en mémoire afin que les recherches et d'autres opérations sont super rapide. Vous n'êtes pas obligé de le faire. Vous ne disposez pas de mettre en œuvre recherche linéaire ou recherche binaire ou le tri par fusion ou de la sélection Trier, rien de tout cela. La base de données fait pour vous si vous dites il préventivement à l'index ce domaine. Et vous pouvez voir aussi, il ya d'autres caractéristiques nous pouvons dire la base de données à appliquer. Qu'est-ce que cela pourrait signifier si je choisis Unique à partir de ce menu, juste intuitivement? Ouais? AUDIENCE: [inaudible] DAVID MALAN: Ouais, le nom d'utilisateur doit être unique. Est-ce une bonne chose ou une mauvaise chose pour une base de données, pour un site Web avec les utilisateurs? Si les noms d'utilisateur unique? Oui, probablement. Si cela est ce que le domaine, nous utiliser pour vous connecter, vous ne voulez pas vraiment aux personnes ayant la même sensation ou le même nom d'utilisateur. Donc, nous pouvons avoir la base de données de sorte que les appliquer que maintenant dans mon code PHP ou toute autre langue, Je ne dois pas, par exemple, de vérifier n'a pas nécessairement ce nom d'utilisateur existe avant que je laisse quelqu'un inscrire? La base de données ne permettra pas que deux personnes nommées David ou Malans inscrire dans ce cas. Et en passant, même si cette menu ne vous permet de sélectionner l'un, un index unique est celui qui est indexées pour des performances ultra-rapide, mais il impose également l'unicité. Et nous allons revenir à ce que le deux autres dire dans un instant. Pendant ce temps, si je vais à mon deuxième rangée, qui est le nom de l'utilisateur, dois-je préciser que le nom doit être unique? Non, parce que vous pourriez certainement have-- il n'y a pas deux David Malans dans cette salle, le plus probable. Mais si nous choisissons un nom différent, nous pourrions sûrement avoir des collisions. Pensez aux différentes tables et autres. Donc, nous ne voulons certainement pas pour rendre le champ de nom unique. Donc, nous allons juste de quitter que tiret, tiret, tiret, rien. Et je vais quitter tout le reste seul. En effet, la plupart de ces champs nous ne devrons pas se soucier. Et quand je suis prêt à sauver ce, si coopère Internet, Je clique sur Enregistrer, et très, très, très lentement la base de données ne se sauva. Et maintenant, je suis de retour à cette interface, ce qui est vrai, est écrasante au premier coup d'œil. Mais tout ce que je vais faire est de cliquer sur sur le mot Utilisateurs en haut à gauche. Je vais monter ici, clique Utilisateurs, et par défaut, il a exécuté un certain SQL, mais plus de détails dans un instant. Voici juste un résumé de ce que je faisais. Et ne vous inquiétez pas que vous voyez parler du latin et suédois ici. Ce ne sont que la valeur par défaut paramètres, car MySQL à l'origine, ou PHP MyAdmin, l'un des deux est arrivé être écrit par des gens suédois. Mais il est hors de propos dans notre cas ici. Très bien, alors pourquoi est- tout cela intéressant? Il se trouve, je peux insérer des données dans une base de données en écriture de code. Et je vais de l'avant et dans mon fichier ici, je suis aller de l'avant et faire semblant comme ce qui est relié à la base de données, qui il est pas pour le moment, mais il sera quand nous arrivons à problème posé sept. Et je vais aller de l'avant et exécuter une fonction appelée requête, dont nous allons vous donner dans le problème réglez le code de distribution de sept, qu'il prend au moins un argument, qui est juste une chaîne. Une chaîne de code SQL. Donc, vous êtes sur le point d'apprendre à écrire Structured Query Language. Si je veux insérer une nouvelle ligne dans mon base de données parce que quelqu'un a soumis une forme à mon code, je serait littéralement écrire INSERT INTO utilisateurs la suivante champs: Nom d'utilisateur, virgule, le nom, les valeurs, et maintenant je dois insérer quelque chose comme Malan et devis, Ils ont dit 'David Malan. Et maintenant même pour ceux qui ne connaissent SQL, pourquoi suis-je en utilisant des guillemets simples à l'intérieur de cette chaîne verte? Quelle pourrait être la raison ici? Remarquez que je suis co-mélange deux langues. Query est une fonction PHP, mais il prend un argument. Et cet argument doit être lui-même écrit dans une autre langue appelée SQL, Structured Query Language. Donc, tout ce que je viens de souligner ici est ce langage appelé SQL. Alors, quel est avec les guillemets simples, tout comme un test de cohérence rapide? Aller de l'avant. Ils sont des chaînes. Donc, entre guillemets Malan et devis, Ils ont dit David Malan sont des chaînes. Et juste à y penser intuitivement maintenant, sachant ce que vous savez à propos de C et PHP, pourquoi ai-je pas fait cela, que je généralement guillemets occasion pour les chaînes? Pourquoi ai-je veux pas faire cela? Ouais? AUDIENCE: [inaudible] DAVID MALAN: Exactement. Parce que je suis déjà en utilisant guillemets sur le chemin en dehors de l'argument à la fonction de PHP, Je voudrais juste confondre l'interprète. Il ne saura pas, ne ceux-ci vont ensemble? Ne ceux-ci vont ensemble? Ne ceux-ci vont ensemble? Donc, je alterne place. Ou je pourrais faire quelque chose comme ça, citant oblique ou barre oblique inverse devis. Franchement, qui commence juste à devenir très illisible et laid. Mais ce serait atteindre le même résultat que bien. Donc, si je devais exécuter cette requête maintenant, nous allons voir ce qui se passe. Je vais aller de l'avant maintenant et plutôt à exécuter le code PHP, qui est où vous allez jouer dans sept problème posé, Je vais aller à la place de PHP MyAdmin. Et je vais manuellement pour aller à l'onglet SQL, et laissez-moi un zoom avant sur l'interface. Et je vais coller la chose que je viens tapé. Et le codage de couleur a changé un peu maintenant, simplement parce que les formats de programme les choses un peu différemment. Mais remarque que tout ce que je l'ai fait est je l'ai dit, insérer dans l'utilisateur. Je l'ai précisé, puis, dans une virgule séparés liste entre parenthèses les deux domaines que je veux insérer, et alors je l'ai dit littéralement valeurs suivie par une autre parenthèse, et ensuite les deux valeurs Je veux plug-in, et maintenant pour faire bonne mesure, Je vais mettre un point-virgule à la fin. Ainsi, ce ne sont pas C. Cela ne veut pas PHP. Ceci est maintenant SQL, et je suis coller dans cette interface basée sur le web qui est aller juste pour me laisser, dès que je clique sur Go, exécuter cette requête sur la base de données fonctionne à l'intérieur du CS50 IDE. Donc, ce qui est bon. Notez que dit une rangée inséré, est allé super rapide, 0,0054 secondes pour insérer ces données. Donc, cela semble assez saine. Il reformaté mon requête pour moi ici juste pour le voir dans une sorte de version couleur codée. Mais maintenant, si je clique Parcourir, remarquer que, même si il ya beaucoup de désordre sur l'écran, ma table a maintenant deux rangées. Alors, laissez-moi aller de l'avant et faire une autre. Au lieu de cela, laissez-moi allez dans l'onglet SQL nouveau. Et cette fois, je vais insérer quelque chose comme Rob et son nom sera Rob Bowden. Bowden. Disons cliquez sur Enregistrer. Oops, plutôt aller. Cliquez sur Parcourir à nouveau, et maintenant je dois remarquer deux rangées. Donc, cela est juste une façon plus complexe moyen d'ouvrir Google Spreadsheets et juste en tapant une ligne dans une colonne. Mais ce qui est important est que nous avons maintenant la syntaxe avec laquelle écrire le code de sorte que en fin de compte, nous pourrions réellement et faire un peu de cela. Rappelons que les supports de PHP des variables super-globales. Ce qui est à l'intérieur du dollar signer GET soulignement en PHP? Nous avons pris un coup d'œil à l'un ou deux exemples simples. Et dans PSet6, souvenez vous avez bonjour dot PHP qui utilise cette variable. Ce qui se passe là-dedans? Ou quel est-il? Un peu plus fort. AUDIENCE: [inaudible] DAVID MALAN: Il est un de neige graine de tableau, ce qui est juste une façon élégante de dire un tableau qui comporte des paires clé-valeur. Et les touches ne sont pas numérique. Ils sont des mots ou des chaînes. Et précisément, ce sont les paires clé-valeur? D'où viennent-ils? Pardon? AUDIENCE: [inaudible] DAVID MALAN: Non? Où faire les touche paires de valeurs viennent? Répete? De nouveau? Suis-je la seule chose de l'audience? [Rires] Cela est vrai, oui? AUDIENCE: [inaudible] DAVID MALAN: Ouais, ils provenir de la chaîne de requête. Donc, si vous rembobinez à temps pour quand nous avons joué avec Google et nous sommes passés à Google.com slash Recherche d'interrogation q est égal chats, si je devais appuyez sur Entrée et si Google ont été mis en œuvre en PHP, Code PHP que Google a écrit auraient accès à signe dollar GET souligner l'intérieur de laquelle est une clé appelée Q et une valeur appelés chats qu'il peut ensuite utiliser utilisé pour faire une recherche réelle avec. Donc, en fait, ce que je vais faire est maintenant revenir à mon code PHP que vous aurez à nouveau de voir davantage dans PSet7. Et au lieu de brancher dans lequel les valeurs codées des disques ne semble pas comme un très site web dynamique, Je vais vous donner un teaser de ce que votre code réel ferait. Vous mettriez en deux question marque comme ça. Je ne sais pas ce que le nom d'utilisateur est. Je ne sais pas ce que le nom va être, mais je ne sais que je peux obtenir dynamiquement. Donc, si le code que nous écrivons maintenant est le code en cours d'exécution sur les serveurs de Google, ou, si cela est bonjour dot PHP, qui est livré avec PSet6, Je vais passer dans la fonction de requête tout comme printf, deux autres arguments. GET, devis, nom d'utilisateur unquote, et GET, devis, nom unquote. Et maintenant, notez ce que le structure générale est ici. Je dois à gauche côté de l'appel, cette fonction appelée requête en PHP. Je dois toujours comme une première l'argument, juste une chaîne de texte. Mais cette chaîne de texte est écrite dans un langage appelé SQL. Et franchement, il est pas une grosse langue. Nous allons seulement parler formellement aujourd'hui, vraiment. Et puis en problème posé sept, il ya relativement quelques caractéristiques que nous sommes va exploiter. Les points d'interrogation, cependant, signifient brancher une valeur ici et bouchon dans une autre valeur Ici. Et remarquez, je l'ai omis ce du monde sacrément quote-- it-- autour de la cotation marque cette fois. Je l'ai omis la citation marques autour de l'interrogation, Désolé, cette fois-ci. Donc, ce qui est agréable à ce sujet interrogation caractéristique qui PHP tend à soutenir, Ruby et Python et d'autres langues, Cela signifie simplement prise dans certains appréciez ici et vous savez quoi? Vous comprenez si vous souhaitez utiliser guillemets simples ou doubles. Ne me dérangez pas avec ceux intellectuellement détails inintéressants. Mais, assurez-vous qu'il est correct de sorte que mon code est finalement opérationnelle et sécuritaire, qui aura un sens avant longtemps. Maintenant, combien d'arguments totalisera, juste pour être clair, est la fonction requête prise? Tout le monde veut voter pour plus de deux? Trois? Bien sûr, pourquoi? Pourquoi trois? AUDIENCE: [inaudible] DAVID MALAN: Exactement. La première partie est la chaîne. Le second argument est le signe dollar souligner GET support nom d'utilisateur. Et le troisième argument est le même chose, mais juste le nom. En d'autres termes, maintenant si je devais un formulaire web qui a eu pour les champs de texte, un pour le nom de l'utilisateur, un pour son nom, tout simplement comme vous verriez dans un site Web lorsque vous vous inscrivez pour un certain site Web, cela pourrait être le code sur l'extrémité arrière que fait réellement l'insertion maintenant dans la base de données. Maintenant, en revanche, de laisser une avance rapide. Supposons un utilisateur est maintenant vous connecter et que vous voulez d'écrire du code PHP qui vérifie si la personne qui vient de se connecter est en fait un utilisateur, vous pouvez utiliser la syntaxe assez simple. Vous pouvez dire SELECT, disons étoiles, où étoiles signifie tout. Je ne sais pas ce que je veulent, donc juste me donner toutes les colonnes de la table appelé les utilisateurs où, et cela est agréable. Choisir soutient ce qui est appelé un prédicat, qui est comme une façon de qualifier ce que vous voulez. Où nom d'utilisateur est égal entre guillemets Malan. Donc, ici aussi, je l'ai embarqué l'intérieur de l'argument à une fonction de PHP, une ligne de code SQL. Et que ce code SQL le temps va littéralement pour rechercher entre guillemets Malan. Maintenant que tout ce qui est pas utile, donc je vais sauter cette et je vais mettre de côté cette astuce de Brady, et aller et plug-in à la place un point d'interrogation ici. Donc, juste pour être clair, ce qui devrait être mon second argument être si quelqu'un vient connecté et je vouloir vérifier si il ou elle est en fait un utilisateur? AUDIENCE: [inaudible] DAVID MALAN: Ouais. Je entends dollar signe de soulignement Obtenez un devis, nom d'utilisateur unquote. Et cela devrait revenir à moi l'une des lignes dans ma base de données qui ont un nom d'utilisateur de Malan. Maintenant, je l'espère, je vais revenir zéro si Malan n'a jamais été ici, ou si il a un. Je ne devrais pas revenir deux ou trois ou quatre. Pourquoi? AUDIENCE: [inaudible] DAVID MALAN: je l'ai dit uniques, non? Raison simple. Parce que je l'ai dit il faut que ce être unique, tout logiquement, vous ne pouvez avoir zéro ou une Malans dans cette table de base de données particulière. Maintenant, en passant, juste pour que vous avez vu il, même si je continue à utiliser GET et même si PSet6 seulement utilisés GET, vous pouvez certainement POST. Et de rappeler que Postes est un autre technique pour la soumission d'informations à partir d'un formulaire, mais il ne se présente pas dans l'URL. Il est un peu plus sécurisé certainement pour des choses comme les noms d'utilisateur et mots de passe, qui PSet7 sera, en fait, impliquer. Donc, nous allons le faire en PHP MyAdmin et de voir ce qui se passe. Je vais aller sur l'onglet MySQL. Et remarquez que la valeur par défaut pour PHP MyAdmin, juste pour essayer d'être utile, est de sélectionner étoiles des utilisateurs où un. Eh bien, on est toujours vrai, donc cela a l'idiot efficace il suffit de sélectionner du tout. Mais je vais être un peu plus pédant et manuellement taper étoiles SELECT FROM utilisateurs. Maintenant, techniquement, vous pouvez citer le nom des tables. Il est rare que vous devez, Mais remarquez ce ne sont pas vos citations normales sur le clavier américain. Ceci est la backtick dite, qui est généralement sur la main en haut à gauche coin de votre clavier. Mais il est rare que vous aurez effectivement besoin de se soucier de cela, donc je vais juste omettre de toute façon. Alors maintenant, laissez-moi aller de l'avant et a frappé aller. Et le nombre de lignes que je devrais obtenir retour lorsque je sélectionne étoiles des utilisateurs? AUDIENCE: [inaudible] DAVID MALAN: Le nombre de lignes, bien sûr. Mais combien dans ce histoire concrète en ce moment? Deux, parce qu'il n'y avait moi et il y avait Rob. Donc, si je clique sur OK, je vois visuellement que Je suis devenu le dos, en effet, deux rangées. Il ya beaucoup de désordre sur la écran, mais je ne vois que deux rangées. En revanche, si je fais cela à nouveau et à faire SELECT étoiles des utilisateurs, où username égal à égal entre guillemets Malan, maintenant si je clique sur Go, Je vais seulement revenir une rangée. Et enfin, si je fais quelque chose comme ceci, supposons que je ne me soucie pas obtenir tout, qui est une sorte de sens aujourd'hui, parce qu'il n'y a que deux colonnes. Il est pas comme je sélectionne une énorme quantité de données. Supposons que je vais de l'avant et ne SELECT name FROM utilisateurs, où username est égal Malan, Ce qui est bien à propos de SQL honnêtement, est que cela a vraiment fait juste ce que vous lui demandez de faire. Il est assez succinct, mais vous littéralement juste dire ce que vous voulez faire. Sélectionnez le nom des utilisateurs où le nom d'utilisateur est égal Malan. Et il est vraiment explicite. Donc, maintenant, si je frappe Go, combien rangées vais-je récupérer? Un, parce qu'il est juste Malan, je l'espère. Ou zéro si il est pas là, mais un maximum. Et combien de colonnes vais-je récupérer? Combien de colonnes? Cette fois, je vais juste pour en obtenir un parce que je ne l'ai pas sélectionnez étoiles, qui est tout. Maintenant, je suis tout simplement en sélectionnant le nom, donc je juste revenir une colonne et une rangée. Et il semble sorte de manière appropriée ridicule, simplement en regardant super- petite comme ça. Donc, ce qui se passe vraiment? Lorsque vous exécutez une requête SQL requête en utilisant select, ce que vous obtenez retour de la base de données est comme une table temporaire à rangées et colonnes, peut-être, mais que tout ce qui omettent n'a pas été effectivement choisi par vous. Ainsi, il est comme si quelqu'un avait un grand tableur de tous les élèves enregistré pour certains groupe d'étudiants, et vous dites, me donner la totalité de la première année qui ont enregistré pour notre groupe d'étudiants, ce qui votre collègue dans le groupe d'étudiants pourrait faire est qu'ils pourraient simplement la main vous toute la feuille de calcul. Cela revient à dire sélectionnez étoiles. Et il est un peu ennuyeux si vous ne vouliez la première année. Et donc, si vous dites à la place, Sélectionner la vedette de la table de base de données où l'année est égal à citation, freshman unquote, il est comme si votre ami dans le groupe d'étudiants littéralement mis en évidence et copiés uniquement les lignes de première année, les coller dans un nouveau Google Tableur ou un fichier Excel, et vous rendit le fichier résultant seulement. Voilà tout ce qui se passe sur le plan conceptuel ici. Donc à la fin, nous pouvons faire des choses assez de fantaisie en stockant des choses comme les noms d'utilisateur et les mots de passe et autres. Mais, il se trouve, nous devrions le faire un peu différemment que cela. Il est pas si intelligent pour ne stocker un nom d'utilisateur et un mot de passe. Quelqu'un plus tôt, je pense ici-bas, suggéré une ID. Maintenant, une pièce d'identité pourrait être comme un Harvard ID ou ID net de Yale, mais il pourrait être encore plus simple dans notre cas, de base de données. Et en effet, le cas commun est d'avoir une autre colonne. Et je vais aller de l'avant et modifier ma table. Et si vous jouez avec cette interface pour PSet7, vous verrez que vous pouvez vérifier ce bouton ici et ajouter un champ au début de la table. Et maintenant, si je clique sur OK, ça va de me donner une de ces formes à partir plus tôt. Je vais ajouter un champ appelé ID. Et je vais en faire un type numérique. Je dois tout un tas de valeurs pour des valeurs numériques. Je vais juste choisir un INT et ne vous inquiétez pas sur les tailles disparates. Je ne dois pas spécifier une longueur ou une valeur, parce que ça va être 32 bits, peu importe quoi. Attributs, nous ne voyions pas auparavant. Toute participation dans l'une de ces options de menu cette fois? Pour un INT? Qu'est-ce que vous proposez? Non? Faire aucune de ces sens? Ouais. Ouais, non signé, non? Généralement, si nous allons donner à chacun un numéro unique, qui est où cette histoire est aller, je veux vraiment que une personne d'avoir le nombre comme zéro et un et deux et trois et quatre. Je ne veux pas faire face avec des chiffres négatifs. Il semble juste comme une complexité excessive. Je veux quatre milliards de valeurs possibles, pas quatre milliards valeurs possibles, donc je viens doublé la la capacité de mon INT. En aparté, si vous voulez porter ce à quelque chose comme Facebook, Retour dans une sorte de ma journée quand Facebook premier est sorti, Je crois que ce qu'ils étaient en utilisant dans leur base de données MySQL pour stocker un utilisateur de identificateur, était juste un INT. Mais bien sûr, il ya beaucoup de vraies personnes dans le monde. Il ya beaucoup de faux Facebook comptes dans le monde. Et donc finalement, Facebook a débordé la taille d'un INT, un quatre milliards valeur. Ce qui explique pourquoi, si vous regardez autour et il ya des sites Web qui peut vous dire ce que votre ID unique est. Et si vous ne choisissez un nom d'utilisateur dans Facebook, vous verrez votre ID unique. Je pense qu'il est le profil PHP dot interrogation ID est égal à quelque chose. Voilà maintenant quelque chose comme un grand INT ou un long si vous voulez, qui est une valeur de 64 bits ou quelque chose de comparable. Ainsi, même dans le monde réel faire ces questions finalement parfois importance. Et il se trouve ici, si je suis donnant tous mes utilisateurs un identifiant unique, Je veux être super explicite et minimalement faire de ce domaine unique. Mais il se trouve il ya une morceau de nomenclature aujourd'hui aussi qui est une clé primaire. Si vous concevez une base de données table et vous savez à l'avance que l'une des colonnes de la table devrait et va identifier de manière unique les lignes dans le tableau, vous voulez spécifier et dire à la base de données, ceci est mon clé primaire. Il pourrait y avoir des doublons dans d'autres domaines, mais je dis la base de données que cette est mon premier, mon domaine le plus important, qui est assuré d'être unique. Maintenant, cela semble redondant. Je propose maintenant que nous ajouter, en cliquant sur Enregistrer ici, un called-- sur le terrain et je vais aller de l'avant et cliquez sur AI, nous y reviendrons dans un instant, Enregistrer. Je propose maintenant que ma table ressembler à ceci. Je dois un champ INT appelé ID, un champ CHAR appelé Nom d'utilisateur, un champ de VARCHAR appelé Nom, mais ID, si elle est primaire et donc unique, pourquoi ai-je perds tout introduisant ce est effectivement une deuxième uniques champ appelé ID qui est un INT? Nom d'utilisateur, le rappel, était déjà unique, nous l'avons dit. Il suffit donc logiquement, vous ne devez pas une expérience à la raison de base de données grâce à cela, pourquoi pourrais-je vous ai présenté INT comme mon identifiant unique ainsi? Quel est this-- disent à nouveau? AUDIENCE: [inaudible] DAVID MALAN: Random l'accès est plus facile, pourquoi? AUDIENCE: [inaudible] DAVID MALAN: Ouais, il est simplement accéder numéros. Donc, si vous pensez vraiment de cette est une table, comme un tableau, maintenant je dois identificateurs uniques que je peux sauter partout. Et mieux que cela est encore celle Quelle est la taille d'un INT va être à nouveau? 32 bits ou des octets. Quatre Quelle est la taille de mon nom d'utilisateur va être? Au maximum? 16 octets. Donc, si vous êtes vraiment se soucier les performances de votre code, repensez à PSet5, préféreriez-vous à rechercher une valeur de quatre octets ou un 16 valeur de l'octet, non? Il est vraiment aussi simple que cela. Vous avez à faire quatre fois plus de travail pour rechercher les noms d'utilisateurs, car ces sont 16 octets. Donc, vous avez littéralement comparer tous les 16 octets d'être que oui, cela est le nom d'utilisateur que je veux. Alors que pour une INT, vous pouvez le faire avec seulement quatre octets. Et comme un aparté pour ceux intéressé par le matériel informatique, il se trouve que vous pouvez adapter à quelque chose comme INT ou une valeur 32 bits dans quelque chose appelé un registre dans un ordinateur CPU, ce qui signifie qu'il est super, super rapide, même au plus bas niveau du matériel de l'ordinateur. Donc, il ya seulement des avantages tout autour. Qu'est-ce que cela signifie? En fait, lorsque vous concevez un table, presque tout le temps base de données allez-vous avoir pas seules les données que vous vous souciez, mais aussi quelque chose comme un identificateur unique parce que ce qui se passe à laissez-nous faire d'autres choses. Et nous allons trébucher sur un problème ici. Supposons que les utilisateurs disposent pas juste les noms d'utilisateur et les noms, mais ils ont aussi des choses comme villes et les États et les codes postaux, au moins ici aux États-Unis. Donc, je vais aller de l'avant et juste dire rapidement, me donner trois autres colonnes à la fin de la table. Et cela va être la ville, ce sera l'État, et cela va être Zip. Maintenant types City, quelles données ce devrait être, peut-être? VARCHAR? Je ne sais pas ce que le le plus long nom est. Quelque part en Amérique, il ya probablement certains ridiculement long mot, alors disons juste aller avec 255, un peu historiquement ou arbitraire. État, ce que vous voulez faire? Jugement appel, non? Ce qui est peut-être le plus efficace? Combien de caractères? Peut-être que deux, si nous le pouvons sortir avec faire juste, comme, MA pour le Massachusetts et ainsi de suite. Donc, je vais aller une valeur de CHAR de deux. Code postal est une question intéressante. Nous sommes ici à 02138, de sorte que suggère que nous devrions utiliser quoi? Il est un INT, non? INT, INT, courte? Court pourrait fonctionner. Non? CHAR ou cinq, mais je veux un INT. Pourquoi repousser sur un INT? Me persuader de cela. Quel est stupide au sujet d'un INT, mon idée? Ouais. AUDIENCE: Prendre plus de mémoire. DAVID MALAN: Prendre plus de mémoire. Quatre octets, mais vous êtes proposant un code postal que cinq octets ou quelqu'un était comme CHAR, qui se sent comme hein, qui est pas vraiment l'affaire. Eh bien, histoire amusante. Il ya des années, quand je l'habitude d'utiliser Microsoft Outlook pour mon e-mail, Je voulais éventuellement de passer à Gmail. Et donc, je exportés de mon contacts depuis Outlook dans un fichier CSV. Comma Separated Values, qui voulait juste dire que je eu tous mes noms d'amis et dernier noms et numéros de téléphone et codes postaux et tout cela. Et puis je fis la erreur de l'ouvrir dans Excel, qui est une tableur qui comprend des fichiers CSV que nous avons vu. Mais alors, je dois avoir frappé, comme, Commandement ou le contrôle S à un moment donné. Et Excel apparemment au moment eu une fonction pour laquelle chaque fois qu'il vu un certain nombre, il a essayé d'être utile. Et si ce nombre a commencé avec zéros, il serait tout simplement se débarrasser d'eux. Pourquoi avez-vous besoin leader zéros sur des entiers? Ils sont de sens, mathématiquement. Ils ne sont pas de sens dans le système postal américain. Donc, je l'ai eu pendant des années, à ce jour, je reste avoir des amis que lorsque le cas rare que je besoin de quelqu'un est répondre à ces jours, Je vais encore que je vois avoir un ami à Cambridge, Massachusetts 2138. Et il est ennuyeux si vous êtes essayer de trier de programmation générer des enveloppes ou tout simplement notez-le. Et cela est à cause de cette raison, Je choisi le mauvais type de données. Donc, je l'aime votre idée. Prenons un champ CHAR. Cinq personnages, à l'exception il ya un cas de coin. Si vous envoyez toujours courrier, parfois zip codes de ces jours, ils sont, comme, plus quatre. Donc, nous avons besoin d'un tiret, puis nous avons besoin de quatre autres numéros. Donc, pour être honnête, il pourrait aller de nombreuses façons différentes. Pour l'instant, je vais continuer à simple et je suis juste va dire qu'il est un cinq valeur de CHAR et nous sommes vais sauter tout le tableau de bord plus quatre. Mais ce sont les sortes de compromis. Et vous pouvez penser de la mêmes problèmes découlant avec numéros de téléphone ou d'autres domaines. Et maintenant, cela est effectivement une route folle de descendre. Supposons deux Rob et moi et Hannah et Maria et [? Davon?] Et Andy et d'autres sur le personnel vivent tous à Cambridge, Massachusetts, 02138. Ce fait sentir stupide que je suis ajouter à ma table d'utilisateurs, ville, état, et zip. Pourquoi? AUDIENCE: [inaudible] DAVID MALAN: Dites à nouveau? AUDIENCE: [inaudible] DAVID MALAN: Ils sont toujours va aller ensemble, non? Quand il se trouve, nous avons utilisé à penser ce fut le cas jusqu'à ce que nous exhaustive recherché l'ensemble des États-Unis, et il se trouve que certaines incohérences où plusieurs villes ont le même zip, ce qui est bizarre. Mais, si nous imposons pour l'instant que 02138 est toujours Cambridge, Massachusetts, Pourquoi dans le monde voudriez-vous stocker dans votre base de données et de Cambridge MA 02138 et pour moi et pour Hannah et pour Rob et pour [? Davon?] Et pour les autres qui vivent ici à Cambridge, il est parfaitement redondante. Nous devrions sortir avec juste stocker quoi? Juste le code postal. Mais alors, si nous stockons seulement le code postal, je ne veux, sans doute, pour mon site pour savoir où 02138 est. Donc, je dois une autre table. Et cela est OK. En fait, ceci est un des processus de conception de tables conception que vous ferez dans PSet7 ainsi lequel vous voulez factoriser données communes. Tout comme nous avons été hors affacturage code commun et l'affacturage hors commune styles de CSS, ici aussi dans la base, si je dois seulement 02138 à unique identifier la ville natale de quelqu'un, ne pas stocker Cambridge, Mass pour chaque utilisateur repriser dans votre table. Au lieu de cela, avoir un tableau distinct appelé Zips qui devrait avoir ce colonnes? Probablement un champ ID, juste parce que, pour les principes dont nous parlons maintenant. Probablement un champ postal pour 02138. Et puis sans doute ce que les autres colonnes? Ville et de l'Etat, mais avoir un seul ligne pour 02138, une ligne pour 02139, une ligne pour 90210. Et qui est littéralement tous les codes postaux je sais. Alors maintenant, que pouvez-vous faire? Cette situation est problématique, parce maintenant je dois deux tables. Donc, mes utilisateurs sont pour la plupart ici, mais leur informations d'état de la ville est ici. Donc, il se trouve avec SQL, il ya en fait une façon de joindre l'information, et vous verrez cela dans le PSet. Mais il se trouve que vous pouvez faire quelque chose comme ça. Étoiles SELECT FROM utilisateurs, REJOIGNEZ zips ON utilisateurs parsèment zip égale zips parsèment zip. Qui est un peu verbeux, certes, mais ce juste des moyens de sélection tout, de la processus de prise de ma table des utilisateurs et ma table de zips. Rejoignez-les sur une domaine qu'ils ont dans la colonne. Donc, en faisant littéralement quelque chose comme ça, et me donner en retour une nouvelle table temporaire qui est plus large, qui est plus grand, qui dispose de tous les des colonnes des deux d'entre eux. Et ce, tout simplement, serait la la syntaxe pour faire quelque chose comme ça. Donc, il ya cette avance, mais il va y à d'autres décisions de conception vous aurez avoir à faire, non seulement avec des index mais aussi se heurter à des défis. En fait, il ya un défi dans toute conception de base de données lequel parfois deux personnes pourraient vouloir d'accéder aux mêmes lignes de la base de données table. Donc, ceci est quelque chose que nous allons rencontrer dans PSet7 ainsi. Mais je pensais que je regarde un attaque qui est possible dans SQL. Quels sont certains des problèmes qui peuvent survenir? Donc, vous rencontrez ce dans PSet7. Et nous vous disons d'emblée ce que le solution codant pour ce problème est. Mais si vous prenez une classe de niveau supérieur, en particulier dans les systèmes d'exploitation, vous allez rencontrer une question d'atomicité, le problème d'essayer de faire plusieurs choses à la fois sans interruption. Et je pensais que je présente ce idée pour PSet7 par une métaphore que je me suis appris à Margo Les systèmes d'exploitation de CS164 de Seltzer années de classe Ago. Supposons que vous avez un de ces dortoir réfrigérateur dans votre chambre d'étudiant ou de la maison, et vous avez un vrai penchant pour le lait. Et oui, vous venez à la maison à partir de classes un jour, vous ouvrez le frigo. Oh, bon sang. Il n'y a pas de lait dans le réfrigérateur. Donc, vous fermez le réfrigérateur, verrouiller la porte, verrouillez votre dortoir, marcher autour du coin CVS, mettre en ligne, et commencer à vérifier pour un peu de lait. Et ça va prendre un certain temps, parce que ceux sacrément Self Checkout compteurs prennent une éternité à utiliser de toute façon. Alors en attendant, votre colocataire vient à la maison. Il ou elle aime vraiment le lait ainsi. Ils entrent dans la pièce de dortoir, ouvrir le réfrigérateur, oh, bon sang. Il n'y a pas plus de lait. Donc, il ou elle a aussi va autour du coin. Mais maintenant, car il est comme deux ou trois ou quatre CVSes proximité, ils se produisent pour aller à l'un des différentes ceux de la place. Et maintenant, quelques minutes plus tard, deux d'entre vous revenir à la maison et ugh, pire problème jamais. Maintenant, vous avez trop de lait parce que ça va aller aigre. Et vous aimez le lait, mais vous ne pas vraiment comme le lait. Alors maintenant, ce fut un coûteux erreur parce que vous deux pris une décision sur la base du état d'une variable que était en train de être changé par vous, l'initiateur d'aller chercher du lait. Donc, ce qui est peut-être un humain solution à ce problème? AUDIENCE: [inaudible] DAVID MALAN: Laisser une note, non? Toujours laisser une note, si vous êtes familier avec ce spectacle. Oui, il ya deux d'entre nous. Donc, il faut toujours laisser une note, ou verrouiller littéralement le réfrigérateur avec une sorte de cadenas ou quelque chose sur le dessus comme ça. Mais ce qui se passe réellement à être problème clé avec la conception de base de données, surtout quand vous pourriez avoir plusieurs navigateurs, plusieurs ordinateurs portables, plusieurs utilisateurs tout en essayant de mettre à jour l'information à la fois. Informations particulièrement sensibles comme l'information financière, lequel avec un stock trading site comme vous allez construire, que faire si vous voulez vérifier combien d'argent vous avez et puis si vous en avez assez, acheter des actions? Mais que faire si quelqu'un d'autre qui a un compte conjoint avec vous est essayant simultanément à acheter des actions? Donc, il ou elle est la vérification de la le solde du compte, à la fois de vous récupérer le même réponse, il n'y a pas de lait. Ou les deux de vous remettre la réponse, vous avez 100 $ dans le compte. Tous les deux vous essayer de faire la décision d'acquérir une action de certaines actions de la société. Et maintenant, qu'est-ce qui se passe? Vous avez deux actions? Vous avez pas d'actions? Problèmes de ce genre peuvent survenir. Donc, nous allons rencontrer que. Attaques par injection SQL, heureusement, sont quelque chose que nous allons vous aider avec, mais ceux-ci sont atrocement communes ces jours encore. Donc, ceci est juste un exemple. Je ne fais pas que les revendications Système Harvard PIN est vulnérable à cette attaque particulière. Nous avons essayé. Mais, vous savez que nous avoir un champ de ce type. Et Net ID de Yale a une semblable écran en regardant ces jours. Et il se trouve, que peut-être la Système d'axe est mis en oeuvre en PHP. Et si elle were-- il est pas-- qu'ils pourrait avoir le code qui ressemble à ceci. Ils ont deux variables. Donnez-moi le nom d'utilisateur et mot de passe de la variable globale Poster Super dont nous avons parlé plus tôt. Peut-être que Harvard a une requête comme étoiles SELECT FROM utilisateurs où username est égale à celle et le mot de passe est égale à celle. Et remarque que je suis juste de le brancher à l'aide la notation accolade de l'autre jour, ce qui signifie simplement brancher une valeur Ici. Je ne suis pas en utilisant le Aide à la recherche technique. Je ne ai pas toute seconde ou troisième arguments. Je suis juste littéralement la construction de la chaîne moi-même. Le problème, cependant, est que si quelqu'un aime un scroob, qui est une référence à un film, connecte avec quelque chose comme ça, et je l'ai enlevé les points qui couvrent habituellement mots de passe, ce qui si il est particulièrement malveillants et son mot de passe est peut-être 12345, par le film appelé "Spaceballs" mais il critique un types apostrophe après les cinq, alors littéralement le mot ou dans l'espace, puis devis, Ils ont dit l'un est égal à un devis, Mais remarquez qu'il a omis quoi? Il a omis la citation sur le droit et il a omis la citation sur la gauche. Parce que si un agresseur La présomption de scroob est que les gens qui ont écrit ce code PHP étaient pas si brillant, peut-être qu'ils ont juste un peu simple guillemets autour de l'interpolation d'une variable dans accolades? Et alors peut-être, il ne pouvait genre de compléter leur pensée pour eux, mais d'une manière qui va de le laisser piraté le système de code PIN. En d'autres termes, supposons ce qui est le code et nous branchons maintenant dans ce scroob tapé. Et il est rouge, parce qu'il est mauvais. Et le texte sous-jacent est ce qu'il a tapé dans, scroob pourrait tromper le serveur de Harvard dans la construction d'une requête SQL chaîne qui ressemble à ceci. Mot de passe est égale à 12345 ou un égale un. Le résultat de ce qui, logiquement, est que cela va se connecter scroob si son mot de passe est 12345 ou si une égaux une, ce qui est bien sûr toujours vrai, ce qui signifie scroob obtient toujours. Et donc, la façon de fixer Ici, comme dans beaucoup de cas, serait d'écrire davantage à la défense. Pour utiliser quelque chose comme notre fonction de la requête réelle, qui vous le verrez dans PSet7, où nous branchons quelque chose comme question marque ici. Et la beauté de la fonction d'interrogation que nous vous donner est qu'il défend contre ces soi-disant attaques par injection SQL, où quelqu'un incitant votre code dans injecter son propre code SQL. Parce que ce que la fonction de requête nous donnons vous allez réellement faire, si vous utilisez la syntaxe d'interrogation et un deuxième et un troisième argument ici, est ce que il ne ajouter à la entrée que l'utilisateur a fourni? Ceux barre oblique inverse cite. Ainsi, il échappe à toute potentiellement caractères dangereux. Cela ressemble bizarre maintenant, mais il est pas vulnérable parce qu'il ne changer la logique plus parce que tout le mot de passe est maintenant une seule citation qui est pas, En fait, le mot de passe scroob. Donc, il ya eu quelques blagues à ce sujet depuis des années. Alors, ce fut une photo prise de certains geek dans un parking par lequel vous savez peut-être que certaines villes et les Etats essaient de scanner votre licence plaque à vous ou à vous facturer billet si vous allez à travers sans, comme, la chose E-Z Pass. Donc, cette personne peut être présumé que les gens qui écrivent le système E-Z passe étaient pas si brillant, et peut-être qu'ils simplement concaténés une chaîne, afin qu'il ou elle ne pouvait pas l'intention de nuire pas seulement compléter leur pensée, mais en fait exécuter une mauvaise commande, que nous ne l'avons pas encore parlé, mais vous pouvez probablement le deviner. Cela, en plus de supprimer et insérer et mettre à jour et sélectionnez, il ya aussi un mot clé appelé goutte, qui supprime littéralement tout dans la base de données, qui est particulièrement mauvaise. Nous pouvons faire un zoom sur ce cas il est un peu difficile à voir. Ceci, maintenant, est un célèbre dessin animé qui est merveilleusement intelligent maintenant et compréhensible. [Rires] Ouais, cool. Type de geeking out. Donc, ce sont donc Attaques par injection SQL. Et ils sont si faciles à éviter en utilisant le bon code ou les bonnes bibliothèques. Et vous le verrez dans PSet7, qui est pourquoi nous vous donnons la fonction de requête. Ainsi, un couple de teasers que nous avons pensé vous donner ici, dans notre restante minutes ensemble. Alors, que vous vous souvenez de la semaine zéro, nous introduit ces deux ampoules qui sont belles, pas seulement parce que ils sont assez et sont colorés, mais parce qu'ils soutiennent quelque chose appelé une API, une application Programming Interface Et dans CS50 jusqu'à présent, nous avons surtout porté sur GET et POST, mais il se trouve il ya d'autres verbes HTTP comme PUT. Et en fait, ce fut une diapositive à partir de zéro la semaine laquelle, si vous écrivez du code qui envoie a la PSet6 Une requête HTTP ressemble à ceci avec ce morceau de texte en bas, qui est appelé JSON, ou JavaScript Object Notation que nous en parlerons la semaine prochaine, vous pouvez activer ou désactiver ou de changement la couleur des feux comme ceux. Donc, si CS50 a également, en plus de certaines de ces ampoules ici à New Haven si vous souhaitez emprunter pour des projets finaux, également certaines Microsoft Bandes, qui sont comme montres que vous portez autour de votre poignet qui ont une API similaire de sorte que vous peut écrire votre propre logiciel pour eux. Nous avons un compte avec Le code iOS d'Apple afin que si vous avez une montre Apple ou un iPhone ou un iPad ou un iPod, vous pouvez écrire du code qui fonctionne actuellement sur ceux-ci. Nous avons tout un tas de Arduinos, qui sont minuscules ordinateurs sans cas, essentiellement, que vous pouvez vous connecter via USB, généralement à votre propre Mac ou PC, écrire du code qui fonctionne sur ces physique dispositifs qui ont souvent des capteurs sur eux de sorte que vous pouvez interagir avec le monde réel. Nous avons tout un tas de dispositifs Leap Motion, qui sont des périphériques USB pour Mac et PC, ici et encore une fois, à New Haven. Et si vous le connectez à votre Mac, vous pouvez réellement contrôler votre ordinateur par un logiciel d'écriture que par l'intermédiaire de rayons infrarouges, Chiffres où vos mains humaines sont, même sans toucher votre clavier. Nous avons pensé partager un rapide entrevoir à cela, par exemple. [Jouer de la musique] Donc, nous avons un ensemble tas de ces choses, aussi, appelé brassards Myo que vous mettez sur votre avant-bras et puis vous pouvez contrôler le réel monde ou le monde virtuel comme celui-ci. [Jouer de la musique] Ou, nous avons aussi un certain Google Carton, qui est littéralement, comme, une boîte en carton, vous pouvez mettre sur votre visage, mais diapositive de votre téléphone en elle de sorte que vous mettez le verre de votre téléphone vraiment proche de vos yeux. Et Google est en carton jolie pas cher à 10 $ ou 20 $. Et il a de petites lentilles que légèrement hors changement l'image sur l'écran pour votre homme yeux pour vous donner une impression de profondeur de sorte que vous avez fait un 3D environnement en face de vous. Nous avons également quelques Samsung Gear, qui est la version la plus chère de cette, mais qui peut glisser de manière similaire dans un Téléphone Android et vous donner l'illusion de-- ou donner l'expérience de la réalité virtuelle. Et dans nos deux dernières minutes, nous avons pensé que nous pourrions essayer de le faire. Si je peux projeter ce que Colton a ici juste pour aiguiser votre appétit, laissez-moi aller de l'avant et jette sur le grand écran ici. Laissez-moi tuer les lumières. Colton, voulez-vous aller de l'avant et de mettre sur ton portable pendant un moment et de venir sur plus de la milieu de la scène? Et voulez-vous project-- voici ce que voit Colton. Maintenant, le Wi-Fi est ici pas si fort pour cet appareil que ce est super convaincante, mais Colton est littéralement dans ce lieu magique futuriste. Il ne voit qu'une image. Vous voyez son œil gauche et à droite que son cerveau sont assemblant dans une tridimensionnel environnement sur son visage. Il est juste choisi une option de menu ici. Et là encore, il porte ce casque avec un téléphone Samsung à ce que ce sans fil faisant saillie au-dessus de notre. Maintenant, vous êtes sur Mars, je pense? COLTON: Je pense que oui. Je ne sais pas [inaudible]. [Rires] DAVID MALAN: avère Mars possède ces menus. COLTON: [inaudible] une certaine fraîcheur endroits, si nous voulons aller to-- DAVID MALAN: Où voulons-nous aller? COLTON: [inaudible] DAVID MALAN: Et nous allons voir où Colton nous prendre maintenant. COLTON: [inaudible] DAVID MALAN: Donc, il ya tellement de des endroits différents, vous pouvez prendre vous-même. Il est FAPIS via laquelle vous pouvez écrire des jeux ou des interactions qui exécuter, en fin de compte, sur le téléphone. Donc, vous avez vraiment écrire une application de téléphone mobile. Mais grâce au logiciel et les capacités graphiques, maintenant Colton est dans ce minuscule chalet. Et au risque de nous accabler, Colton et je vais rester pour tandis qu'à la fin de la classe ici aujourd'hui si vous voulez venir et de jouer. Et nous allons leur apporter retour la semaine prochaine ainsi. Sans plus tarder Voilà pour aujourd'hui. Nous vous verrons la semaine prochaine. [MUSIQUE - RAGGA TWINS, "Bad Man"]