[Powered by Google Translate] [第9周]
[戴维·J·马兰 - 哈佛大学]
[这是CS50。 - CS50.TV]
好的。欢迎回来。这是CS50，这是第9周开始。
今天，我们特别侧重于设计，不再在C的背景下，
但在的背景下，PHP和SQL位和一些JavaScript，
特别是朝双方的pset 7月底，最终的项目。
事实上，在这一点上，如果你是在最终的项目
大概一个小时前，你至少开始给一些思考
最终的项目，你在想你想与1或2个同学，
如果你无法连接同学，
随意填写在cs50.net/partners/form。
它会问你你是谁，你在想的是什么样的项目，
你住的地方只是后勤方面的原因。
然后，如果你要留意在未来一周左右的电子表格URL，
然后，你可以看到一个只读版本的谷歌文档
我们正在收集这方面的信息。
所以，如果你想与别人，通过各种手段随时接触到人
通过这种机制。
但大多数人做的工作独奏。这是完全正常的。
所以，不要觉得这是不以任何方式强制性的。
上周五，这只是我和几个在这里的球队，
最空的影院。
有3个游客坐在上面，所以这是一个有点尴尬的。
我们谈的是数据库和我们谈到的pset一点点。
如果你没有碰巧赶上上的视频只是还没有，这是罚款。
我会尽力定义的任何条款，否则，我们会想当然地
根据上周五的演讲。
>> 但今天我们要尝试让大家给点意见
不只是能够做这样的事情的pset 7
但真正了解发生了什么事情引擎盖下的，
特别是一些抽象的functions.php文件中，我们将在
让你的生活更容易一点，但让你最终明白
所以，当训练车轮脱落，在几个星期后，你仍然可以生存
在现实世界中，没有任何的CS50的框架下你做这个东西。
这$ _SESSION，对于那些你熟悉的人
已经赶上了上周五的视频，是什么会议，让我们做
在一个基于PHP的Web应用程序？
这是一个超全局变量，这意味着它类似的精神GET和POST
和其他几个人，但是这是什么东西有用吗？
>> 什么是会议？是啊。 [学生]登录。
你说什么？ [学生]登录记录。的确，。
在pset中7，我们正在使用的这届超全局，以方便登录。
这个超全局的好处是，它是一个关联数组。
一个关联数组，召回，仅仅是一个数组，但其索引不再是数字
像012。它们可以是数字或它们甚至可以是字符串。
因此，如果你的pset 7跳入，你可能还记得，我们存储的关键ID
里面的这个关联数组的值是123 -
无论当前登录用户的ID。
这样做的动机是，即使用户访问了本地
或我的网站更一般的，然后他们记录中，
即使他们不点击一个链接或返回到我的网站，5分钟
或者甚至一个小时，甚至一天，但他们离开他们的浏览器窗口打开，
通过超全局，我记得他们登录。
>> 换句话说，它可以让我稍微长期什么我想知道的关于用户存储。
你也可以想起来真是一个购物车的化身。
像亚马逊这样的地方显然是让你把东西放进了购物车，
但HTTP，权力网络的协议是无状态的
在这个意义上，当你访问一个网站，
在大多数情况下，你也别有一番不间断的网络连接
您的浏览器和服务器之间。
只要你下载了HTML，JPEG和GIF文件和所有这一切，
连接消失，你只是有一个从服务器复制的HTML和诸如此类的东西。
但是，如果服务器要记住关于你的东西，
在服务器上记录这些信息的负担。
所以你的程序员谁控制服务器
可以把任何你最想在这个超全局关联数组
，这将是有下一次用户回来，
无论是分钟，甚至几天后，除非关闭浏览器窗口，
在这一点SESSION消失。
因此，它是短暂的存储，它的非持久的，它的意思走
只要用户关闭浏览器 - 不只是选项卡中，往往是整个的浏览器，
从而有效地注销用户。
所以，事情其实这是怎么实现的呢？
让我们快速浏览一下我们看一个简单的例子，在上周五。
对于那些不熟悉，它是像这样简单。
这是一个网页，其唯一目的就是要告诉我
多少次我曾参观过这个页面。
这是第一次来这里上周一，我曾经访问过这个网站，所以说0次。
>> 但是，如果我开始重新加载这个页面，它说1次，2，3，4，5，
，这最终将只是继续向上计数，起来，起​​来，起​​来，起​​来
其实我每次单击刷新就可以了。
所以，这是怎么工作的呢？让我进去，这个文件称为counter.php。
它的上半部分是蓝色的意见，但有趣的是在这里。
第13行，我们调用这个函数session_start的，
，这简直是所有你需要做的，如果你想要访问
这个特殊的超全局变量名为$ _SESSION。
这使得这一切成为可能，我们可以看到在某一时刻怎么说都是可能的。
在第16行通知，我在做什么。
如果“计数器”的键，调用计数器 - 换句话说，索引值 -
存在这个数组里面的所谓的会话，然后我在做什么与它下面的行吗？
第18行做什么？
>> [听不见的学生响应那是什么？ [学生]保存的价值。好。
它的值存储在会议现在在一个新的本地临时变量，
$计数器全部用小写。
请注意，PHP已经有点懒。
请注意，我们没有任何提及的整数或浮点数或字符串，或类似的东西，
因为PHP是弱类型，你没有指定类型的变量，
在这种情况下，在这里我还没有甚至宣称它。
我声明这些花括号内的，不像C，这其实是没关系的。
无论怎样深层嵌套的变量的声明是在PHP -
内部的，里面的大括号和大括号 -
在那一刻，它会在时间存在的程序的其余部分，
为更好或更坏。
因此，它立即成为全球性的，只要你定义它，因为我们在这里做的。
>> 否则，如果我没有发现有什么事，在SESSION超全局，
我似乎初始化这个变量的计数器为0，
只是假设该用户从未来过这里。
然后，这当然是递增计数器如何？
我里面的这个关联数组的值更新
通过设置它等于任何逆流+ 1。
如果我向下滚动的HTML页面，它其实很简单。
我在本页面身体，“你已经访问此网站和太次。”
这是一个PHP构造。
如果你这样做<=，有效地相当于什么功能？
这真是像printf的东西，我们已经见过很多次在C，
虽然你可能已经知道，从规范的pset 7，
打印也是一个函数，只是打印出一些东西，但它并没有实际使用的格式代码，
实际上，你可以说回声。
他们都是非常轻微的净影响是不同的，即使最终。
因此，使用等号只是一个优雅的方式做它
更简洁，否则你可能可以。
所以这是此网站。它打印出计数器的值。
这是怎么实际发生的事情吗？
您可能还记得一个星期前，我们开始寻找下面的罩
在网页如何使用该Inspector选项卡。
>> Chrome有Mac版本，Windows版本，甚至Linux版本，这两者
Firefox和IE浏览器也有类似的机制，让你有这样的内置调试器
的浏览器的内部。
让我们来看看下面的。
在这里，我们有一大堆的标签记得，最左边的一个元素，
不管如何godawful，HTML和JavaScript是在一个页面，
记得，与“元素”选项卡中，您实际上可以浏览HTML层次
漂亮和整齐。
所以，如果你想学习谷歌或Facebook这样的网站
还是真的任何网站，你可能会更好过
这样的源代码，而不是观看原始源，
它可以是一个烂摊子，我们已经看到了，特别是在谷歌的网站。
所以，如果我不是在这里点击“网络”选项卡，
让我们来看看发生了什么事情，就当我访问这个页面。
首先，让我清楚我的缓存。
我要进入​​Chrome浏览器中的设置，然后去历史
然后清除所有浏览数据。
你可能会用于其他目的，[笑声]
但是当它涉及到开发的网站，它实际上是有用的 -
如果你笑，你知道的。 [笑声]
它实际上是非常有用的网站开发时，因为现实的情况是
缓存缓存的HTML文件，JavaScript文件的事情，比如饼干之类的东西
实际上可以成为一个很头痛，因为如果无论出于何种原因
浏览器决定缓存一些文件，但你已经切换到文件服务器上的
但浏览器还没有真正认识到该文件已经修改
，因此不实际重新下载它，甚至当您单击Reload按钮，
最万无一失的方法之一，只是确保故障是不是与您的代码，
这是浏览器的行为，是要在您的浏览器
清除全部历史记录，以便有没有混淆。
>> 然后，如果你真的想成为偏执狂，退出浏览器，重新启动它，
然后确保所有工作。
因此，在短，清除缓存是做开发的时候。
所以，在这里，我们有“网络”选项卡。
我以前曾访问过的网站的9倍，但让我继续，并单击“重新加载”。
我是回落到0。
实际，让我们看看它是如何，这届超全局正在实施。
1 HTTP请求，我要点击，
这个调试窗口，让我看，里面的。
在这里，我看到的只是来自服务器的响应，这是不感兴趣的。
我已经看到了这在任何数量的方式。
但在技术上是有趣的标头。
如果我向下滚动，并专注于请求标头，然后单击“查看源文件”，
我要看到的是字面上的HTTP请求
刚去从我的浏览器到服务器，
GET是最重要的词和/ counter.php的文件名，
HTTP/1.1只是我的浏览器使用的HTTP版本。
这里是一个小小的提醒，从浏览器到服务器的服务器的名称是什么
它想聊得来。
那么剩下的这有时是有趣的，但现在不相关权利。
>> 这仅仅是种的好奇心。
隐秘，虽然这个字符串是在任何时候，您的浏览器访问一个网站
通知服务器你使用什么样的浏览器
你使用的是什么操作系统和什么版本上。
所以，如果你曾经想知道如何像CNN网站和诸如此类的东西
知道的百分比是在网络上，PC用户的Mac用户，
IE用户，Chrome用户之类的，这是因为我们所有的浏览器
告诉每一个单​​一的网站，在那里我们是什么。
这并不一定包含个人身份信息，
但它告诉服务器你的IP地址是与您使用的是什么浏览器和操作系统。
所以，在这个信息。
但是，什么是更有趣的，当涉及到这些会议是响应头。
让我单击“查看源文件”下的响应。
有趣的是几件事情。
1，我们回来的状态码为200。
我们从来没有看到此状态码，因为这意味着一切都很好。
它的字面意思是别的东西还好。
什么是数字，我们有时会看到这是不好的？ [学生] 404。
404，未找到文件，403你可能被绊在了，
这是被禁止的，这意味着你忘了属性的东西，最有可能的。
有一堆的人。
>> 在这里，这是一个有点疯狂。
我真的写了这个文件，几分钟前，将其粘贴到gedit的。
为什么这页在1981年之前到期，真的是一个网络？
这是怎么回事呢？
>> 听不见的学生响应时间戳记。但是，为什么呢？
这是有点武断，但实际上它是有用的。
这是在说我的浏览器，这是PHP文件，你只是要求已经过期。
事实上，30年前到期。
但到底是什么，究竟意味着什么？
这只是意味着，当用户下一次访问这个页面，
无论是重装或在地址栏输入URL，
确保您去获取新的副本。
这是清除缓存的一个例子，
一个愚蠢的字，仅仅表示试图阻止浏览器
从实际缓存HTML，从服务器发送
，这样你就没有不小心碰到重装，然后看到相同版本的文件。
事实上，你想向服务器发送一个新的副本。
因此，事实上，它的1981年只是意味着该设备的选择
任意一个过去的日期。
但是，真正的的多汁线是现在这一个。
即使在50与Cookie，你可能很熟悉。
截至目前，尤其是在那些不太舒服或在两者之间，
什么是Cookie在你的理解
即使我们即将让您了解更多的技术？
一个cookie是什么？是啊。
[学生]关于用户的信息，想，如果他们写自己的用户名或东西。
>> 好。这是关于用户的信息，是否已经输入自己的用户名。
Cookies是一种方式，使服务器可以记住用户的东西。
真的是一个cookie是一个文本文件或部分的字节序列
您的浏览器内的服务器的种植，
和内部的该文件或那些字节之间是一些标识符种。
也许这是从字面上您的用户名，但更多的时候，它的东西，看起来更神秘的
这样的事情在这里 - bo8dal3ct等等 - 这非常大的字母数字字符串
这真的只是意味着你是一个独特的标识符。
或者，你可以认为它排序的虚拟邮戳。
如果你去一些俱乐部或游乐园，要记住，你实际上已经支付
了，他们把你的手的某种红色的小标签上，
并提醒人们，在你已经支付的计数器
你可以来来去去，请你。
Cookies是精神，有点类似。
我第一次访问这个网站，我只是做了我的缓存清空后，
Web服务器，在的家电在这种情况下，把我的手一戳就
他的名字是PHPSESSID，会话ID，
它的值是这个很长的字母数字字符串。
>> 所以，现在排序的字样，下一次我打我的手，重新加载
或手动访问这个URL在浏览器中，
我的浏览器定义HTTP将展示邮戳
再次，一遍又一遍。
因此，即使服务器没有必要知道我是谁，
他们至少知道，我的相同的用户或者至少，更具体地，在同一个浏览器。
所以这是最终SESSION的超全局变量是如何实现的。
服务器不知道你是谁，当你重新审视一个网站，第二次或第三次
除非你提出这个邮戳。
只要你提出，邮戳，
基本上进入它自己的一个小数据库的Web服务器
和检查，还好，我刚才看到了邮戳的用户bo8dal3ct等等。
让我看看什么样的信息存储程序员
内关于该用户的超全局，
然后让我确保数据是再次里面的SESSION超全局
因此，程序员可以重新访问这些数据
即使它被设置一些前的几分钟或几小时。
所以，换句话说，饼干，得到了一个坏名声了一段时间
因为在浏览器中的不安全感，他们真的可以侵犯我们的隐私而所有这一切，
实际上，他们有很大的效用，因为没有他们
你将不停地登录到您所访问的每一个Facebook页面
或阅读，如果浏览器没有一些方法，记住每一个Gmail电子邮件
你已经通过认证。
>> 因此，以这种方式Cookie的跨线来回发送。
有关cookies的另一种好奇心，尤其是在这里，这是完全明文。
有没有加密，在这里任何，
事实上，我使用HTTP的时刻。
我们最喜欢的时刻之一，这是2年前，在CS50
是一个工具叫做Firesheep左右的时间就出来了。
这是一个免费的软件，是由一名安全研究人员
作为一个为社会敲响了警钟，说是多么残暴实施
在网络上的一些认证机制。
因此，一段时间后，Facebook是几乎完全通过HTTP，没有HTTPS。
而且，即使你不知道加密的工作原理，S是安全的
所以这意味着有至少涉及一些加密。
没有使用Facebook的用户名和密码进行加密，
但只要你看着你戳或您的邮件或新​​闻源，
所有这一切是未加密的。
所以，是的Gmail，直到一年或2年前。
您登录的任何时间，是的，他们使用安全的加密，
但此后他们没有。原因可能是什么？
为什么不直接使用加密算法的所有的时间，在这样的情况下使用呢？
那是什么？我觉得我听到的东西。 [学生]速度。
速度，对不对？有办法解决这个问题。
但是，如果你只是一种认为它在逻辑上，如果你加密的东西，
你有至少做一些更多的工作。
在pset中，当你实现凯撒或维琼内尔，甚至破解，
只是打印一个字符串是比较容易的。
加密，然后打印一个字符串至少需要多一点的工作。
>> 对于超受欢迎的网站，如谷歌和Facebook，
如果你必须为每个用户做更多的工作，为他们访问的每一个网页，
这只是需要更多的CPU时间。
如果您需要更多的CPU时间，你可能需要更多的服务器，
这意味着你可能需要更多的钱。
这么多年，这真的不是最好的做法。
人们会时，才需要使用SSL加密。
但事实证明，Firesheep这家伙超清晰，
当你们谁是目前在Facebook上 -
出于好奇，让我们来看看如果你能坦白。
如果你在Facebook上现在在一些标签，即使它的前景化，
您的网址是HTTP或HTTPS？
多个学生] S。S？ [笑声]
好吧。任何HTTP？仅有1？好吧。
所以，我们所有的人都可以破解，现在那家伙的Facebook帐户。
在大多数情况下，这已经成为默认打开的，至少在一些网站。
长话短说，如果你的网络流量是不加密的，
不仅HTML回去，来回的WiFis未加密的，
所以不要像饼干的东西晃来晃去，整个空气
没有任何形式的加密。
所以，如果你只是有点编程精明还是有点谷歌搜索技巧
找到免费的软件，这样做，所有你必须​​做的就是坐在星巴克
或坐在那里的机场一般未加密的WiFi
只是看等关键字的Set-Cookie：PHPSESSID
因为如果你的技术知识，只是看的WiFi
可用于所有这种模式的整个空气的比特流中，
然后，你可以说那家伙的的PHPSESSID发生是bo8dal等等。
然后，如果你是足够精通技术的或合适的工具，
然后，你可以只是重新配置自己的浏览器开始呈现，邮戳
Facebook.com，而Facebook只是要假设你是那家伙
因为他们知道是不是你是谁，但你有这样的唯一标识符。
所以，如果你偷，唯一的标识符，它作为自己的Web服务器，
他们只是要告诉你，人的新闻源
或该人的消息或戳。
>> 我想谷歌现在如何激活HTTPS的Facebook或许。
但它确实是那样简单。
因此，Facebook和谷歌之类的已经变得非常好，在此，
但随时留意您访问的网站不使用HTTP
有某种敏感信息，
无论是财政或个人等。
如果他们不利用这一点，很可能是这样的cookies是很容易被窃取，
然后伪造的，而这正是Firesheep做。
你没有成为一个程序员。
所有您需要做的是有一个互联网连接，下载这个免费的工具，
会怎样做是你登录，然后它会显示你的Facebook名称
每个人都在桑德斯，在这个特殊的示范，在你身边
和所有你需要做的就是点击他们的名字和过程自动化软件
嗅探到Facebook作为自己的，该cookie，
瞧，你正在登录。
因此，这是另外一个人“不这样做”，正式。
如果你有你自己的家庭网络，你想修改，通过各种手段，
但认识到这一点并在大学环境中交叉的行。
>> 但这里的目标是真正强调的不是如何做到这一点
但如何抵御这些事情的。
琐碎的解决方案，即使它本身是有缺陷的，
是真正降低使用任何网站，不使用HTTPS不断。
所以越来越多的网站，如Facebook和谷歌有复选框
在这里你可以选择这样的事情，
和银行这几年有类似的原因。
因此，只要一点点的恐惧因素，如果我们能。但就是这样的缩影。
这是，服务器如何记得你是谁。
只要他们能记住你是谁，他们可以记住任何关于你
程序员已经存放在里面的这个特殊的超全局变量名为$ _SESSION。
的pset 7，我们使用它的平凡，只需要记住一个int，
即独特的ID的用户登录，
所以我们知道他们曾经做过的那样。
然后在会话或饼干或类似的任何问题？
Firesheep并不能很好地工作了，
你必须把你的电脑变成一个特殊的混杂模式
所以其实你听，除了自己的流量。
所以，如果你正在下载Firesheep，知道这是不是很容易
因为它曾经是证明。
好的。不这样做，在桑德斯。在家里做。
数据库。
我们在很刻意的pset 7的事情之一
是我们给你一个示例数据库中的表，有一些用户ID的用户，
一些用户名和其中的一些加密的密码。
，你会看到，如果你还没有的话，你要一点点改变表。
你要到每个用户在该表中添加一些高速缓存，
你要添加另一个历史表中，一个投资组合表，
或也许调用别的东西。
但在思考如何做到这一点，让我们打开此工具
我们上周五，但如果不熟悉，该设备自带的工具
所谓的phpMyAdmin，这是巧合的是用PHP编写的，
但其目的在生活中，我在这里登录的jharvard与深红色后，
是给我一个用户友好的方式查看和更改我的数据库。
>> 我在设备上运行的数据库是MySQL的。
这是非常流行的，它是一个免费的开源的数据库，奇妙的易于使用的，
尤其是前端是这样的。
这个工具允许我做什么，例如，围坐在桌子旁打个招呼。
让我继续这样做。
上周五，我们创建了一个表叫学生是超级简单的。
它有3列 - ID，名称，与电子邮件 - 我手动插入一对夫妇的行
像大卫和迈克在这个特殊的例子。
让我们这一点，让我们假定我们要记住更多的
不仅仅是用户的姓名和电子邮件有关。
让我点击在顶部结构。
再次，在pset引导您完成必要的步骤，在这里，
所以不要担心，如果一些这方面是有点快。
然后，我要点击这里。
我要添加一些列后，电子邮件
因为我想补充的类似房子。
我忘了记录学生的家。
让我单击“Go”，现在我们有这种形式，不幸的是，由左到右宽一点，
但我现在就打电话给这个场子里的名称，
的类型，我现在必须做出选择。
因此，让我们有一个简短的不同类型在MySQL中聊天
而PHP是弱类型的戏剧快速和宽松的类型，
在一个数据库中，特别是它的超级重要的实际使用输入你的优势
因为一个能为你做的事情，MySQL和其他数据库引擎
是确保你不把假的数据插入到数据库。
这是一种错误检查，为您提供的免费。
>> 对于房子，我们显然不希望它是一个int，这是一个在MySQL中的32位值。
我们也想谈一谈有关数据类型为varchar（星期五），它代表的可变长度的字符。
这是什么？这允许你指定你想这是某种形式的字符串。
你真的不事先知道它有多长，
所以我们的房子的名字可以武断地说是255个字符，
但你可以去32，64 - 任何数量真的。
但使用的数据类型为varchar的一个​​字段名为字符的优势是什么？
如果我只是直观地向下滚动，发现有字符的数据类型为varchar。
varchar是可变长度的字符，字符是一个固定长度的字符。
因此，仅根据这一定义，这些有什么优势或劣势？
换句话说，谁在乎的区别，为什么要照顾你吗？
>> 是啊。 [学生] VARCHAR具有更大的灵活性，但占用更多的内存。
好。数据类型为varchar占用更多的 - 让我们来看看。我不知道，如果我听说过这一权利。
你能再说一次好吗？
[学生]我说的数据类型为varchar可能具有更大的灵活性，但它会占用更多的内存。
有趣的。好吧。数据类型为varchar可能给你更多的灵活性，但占用更多的内存。
后者不一定是正确的。
它依赖于上下文，但让我们回来。
>> [听不见学生的回答没错。
它实际上是字符的情况下，通常会使用更多的内存
因为一个字符，和C一样，就像是一个字符串，它是一个字符数组。
所以，如果你说一个char字段的长度为255，
数据库是从字面上去给你255个字符。
而如果房子是妈妈和6个字符总，
你这是在浪费超过200个字符。
>> 因此，一个数据类型为varchar有效地使用尽可能多的字符是必要的
至最大量。
但其实你付出的代价是性能，具有潜在的。
如果你事先知道所有的字符串都将是8个字符 -
举例来说，假设您所需要的密码长度为8 -
上攻使用一个char领域的场合，虽然不是经常，
指定一个固定长度的东西，就像一个密码
因为现在的数据库可以更聪明。
如果知道，每个char领域，每一个列中的字符串的长度相同，
你回来的随机存取功能。
您可以跳来跳去之间的各种字符字段在数据库表中
因为觉得一个数据库以行和列。
因此，如果每一个的字符串之一是相同的长度，
你知道，第一个字节是0，下一个字节8
然后16和24等等。
因此，如果所有的字符串均具有相同的长度，就可以跳来跳去更有效。
这样就可以在性能方面的好处，
但通常你没有提前知道的豪华，
所以一个varchar是要走的路。
下面是另外一个细节，甚至Facebook跑进最后。
诠释是伟大的，我们排序默认情况下，使用任何时候，我们希望有一个数字，
但它只有32位。
>> 而且尽管Facebook并没有完全有4十亿用户现在，
肯定有一些人在那里拥有多个帐户
或帐户已被打开，然后关闭，
因此Facebook本身，我相信几年前从int转换
，被形象地称为的BIGINT，这是64位，而不是。
因此，这是一个设计决策。
你会是幸运的，如果你的项目最终变成令人惊讶的启动，
有4亿美元和1个用户，给予或采取，
在这种情况下，使用int类型可能会有点短视。
但在现实中，你的用户表可能是罚款与int类型。
但对于类似的pset 7，喜欢你的历史记录表，
你可能有数以千计，数以百万计的用户如果演变成etrade.com。
所以，尽管你可能不会有超过4亿的用户，
随着时间的推移，你有可能这些用户有超过4亿的交易 -
购买和销售的东西在他们的历史。
所以，如果你预期 - 再次，这些都是很好的，如果你有这么多的数据的问题 -
如果你这样做预测数据的大小超过一个int，
类似BIGINT不够频繁通过设计师的方向
因为人的数字，不会是一个问题，
但这个简单的选择一些更大的比。
我们正在使用的十进制pset中，它指定了固定的精度
这样你才能避免浮点数和双精度实数和类似的问题。
>> 然后还有一些其他领域的。我们将挥动我们的手在一定程度上。
但是，日期，时间都在MySQL中规定的格式，
的优点是存储日期的日期，而不是​​VARCHAR处理
数据库可以格式化成不同的格式，
无论是美国格式或欧洲格式或类似的 - 但是你想要的 -
更有效地比，如果它只是一些通用的数据类型为varchar。
然后还有一些其他BINARY，VARBINARY，斑点。
这些都是二进制大对象，你也可以存储二进制数据
以及作为在一个数据库中的几何数据。
但对我们来说，我们通常会关心int和VARCHAR处理之类的。
让我们完成了这个例子的房子。
房子我要武断地说是255个字符。
默认值，我们可以做到这一点。
默认情况下，我们可以把每个人都在奥美楼，例如。
这就是我们如何可以指定该数据库
应确保有人总是有一个值。但我会离开即可。
事实上，住在校外，而不是在一个房子里的人，
也许我真的要指定为房子的默认值是NULL，
然后我需要选中此复选框，如果用户的房子是空的，也没关系，告诉数据库。
>> 再次，这是另一种防御机制，你可以把
所以你甚至不必一定把它放在你的PHP代码。
该数据库将确保事情是或不是NULL。
最后，属性。
这些都不是真正相关的。
这些二进制，无符号 - 没有为varchar有关。
指数。
有谁知道或记得有一个猜想指数是什么
类似的房子吗？
其实这也是一个重要的设计决策，也比较容易。
对于那些尚未看到了，上周五我们短暂交谈，有关主键。
在一个数据库表中，主键的字段或列
唯一标识表中的行。
因此，在当前表中，我们的ID，我们有姓名和电子邮件。
这些是最​​佳人选是一个主键，
其作用是唯一标识行吗？
也许ID。
可以说，我们也可以使用又有何干？
也许你可以使用电子邮件，因为在理论上，它的独特之处
除非人共享电子邮件帐户。
但现实情况是，如果您使用的是数字ID：1234，
只有32位，而一个电子邮件地址可能会是这样的的许多字节或指定的字节。
因此，在效率方面的独特标识符，
它往往是好的做法，只是使用int
即使你有一些的字符串的候选人，你可以说是使用。
>> 对于类似的房子，这不应该是一个主键
因为只有1人可以住在奥美和Currier和1人。
同样，这不应该是唯一的。
主要的区别和独特的是，在我们目前的情况下，表，
ID是主要的，但不是主要的原因，我们刚才提到的电子邮件是 -
性能 - 但它仍然应该是唯一的。
所以，你仍然可以强制执行唯一性，没有提出索赔要求
，这是一个超级重要的主要领域。
但是，这是非常有帮助的指数。
如果您知道您的最终项目提前，pset中7，一般，
这个场子里将是你搜索了很多
利用选择的关键字或别的东西，
那么你就可以先发制人地告诉数据库工作它的魔力
并确保在内存中，它创造了必要的任何花哨的数据结构
房子的基础上，以加快搜索。
也许它会使用一个哈希表，也许它会使用一个链表。
在现实中，往往使用一棵树，往往是一个结构，称为B-树 -
不是二进制树，但B-树 - 这是一个非常广泛的树
你可能会看到在一个类CS124，数据结构类。
但是，总之，你不必须担心​​，当使用智能数据库软件。
您只需告诉它，“索引字段，这样我就可以更有效地搜索就可以了。”
>> 如果你将其关闭，并你尝试搜索数据库中的每个人都住在奥美，
它会退化成线性搜索。
而且，如果你有6000的本科生都住在一些房子，
你要的全表搜索找到Matherites，
而如果你说的指数，希望它会是接近于对数搜索
找到这些类型的学生。
这仅仅是一个免费的功能打开，
即使它的价格是在一定的空间。
最后，自动递增，这人工智能领域，
这意味着，如果它是一个int，你不想负责递增它自己
每次有一个新的用户，请检查，
，被插入的每个用户将自动获得一个新的ID。
让我们单击“保存”，现在让我们找出故障，这种设计。
如果我进入浏览，通知，迈克和我的房子是NULL。
我可以使用phpMyAdmin来手动修改。
在这里我可以去和类型Mather中，然后按Enter键，
现在发现表是不同的。
但是请注意，我可以做别的事情。
大卫的ID为1，所以phpMyAdmin的再仅仅是一个管理工具;
这是不是您的用户会看到。
所以，如果我不是单击SQL选项卡往上顶 -
再次，pset中7为您介绍这些查询 -
我可以手动执行的SQL结构化查询语言命令
UPDATE房子='Pfoho'WHERE id = 1的用户设置。
这些SQL查询，精美的就够了，非常可读的由左到右。
更新用户表，设置字段称为房子Pfoho
在用户的编号是1。
或者，我什至可以做电子邮件='malan@harvard.edu'。
所以，只要是我唯一标识，这将正常工作。
但是，ID往往是更高的性能，让我们做到这一点。
让我们单击“转到”。好了，lecture.users不存在。什么是我的错误吗？
这里实际上是所谓的什么表？
这就是所谓的学生，只是因为这就是我们所做的，在左上角。
这就是所谓的学生，而不是用户。所以现在单击“Go”。
1行受影响。查询用时0.01秒。
如果现在我单击“浏览”，现在马兰生活在Pfoho。
所以这是另一种味道的SQL，但在pset将引导您完成更多一点。
>> 我已经在这里有一个愚蠢的决定。
我认为，这个数据库设计是低效的
因为更多的人，我想补充的学生表，
我们更多的我开始增加，我开始添加的TFS，
我们将开始看到此表中的冗余什么？
>> 是啊。 [学生]看到它的学生，我们使用的是相同的[听不清]
相同的 - 对，没错。
所以，如果400人住在奥美，给予或采取，
此表最终将有400行说：“奥美”，“奥美”
“奥美”，“奥美”，“奥美”。
我们浪费了所有的这些字节，那里有一对夫妇的外卖店。
1，角落里有疯狂的情况：如果有人花了很多钱
并重新命名奥美，现在我们要改变我们的整个数据库表。
这不会经常发生，但Pfoho一度被称为北楼15年前，
所以它发生。不过，这还不是全部，引人注目。
更引人注目的莫过于一个角落的情况，如需要更新大量的数据
的数据库就是为什么你存储MATHER一遍又一遍，一遍又一遍吗？
这是一个很大的字符，6个字符。
我们不能做，甚至比这更好，特别是对Pforzheimer？
当然，我们可以做的更好比许多字符。
为什么不直接关联一个唯一的标识符，每间房子
并存储为每个用户？所以，让我们来试试这个。
而不是只是学生使用表，让我去我的演讲数据库在左上角。
请注意，这里说创建表。
让我创建一​​个新的表称为房屋。
的列数为2。输入。
现在，我有2个字段。
我要叫这名字，这将是一个varchar的长度为255，
>> 但是，这是相当武断的。让我在这里公约。
因此，把一个ID在这里。让我们给每一个房子的唯一标识符。
让我们给每一个房子的名字。
让我们指定的标识符将是无符号的，只是按照惯例，只使用正数。
让我们先走，并把现在这是一个自动递增字段。
我们还需要什么别的吗？
让我们继续前进，并单击“保存”。
现在我有第二个表。
顺便说一句，这是稍微有点隐蔽的SQL命令
你将不得不手动键入，如果不使用的管理工具，像phpMyAdmin。
因此，另一个原因，我们使用它。
这是奇妙的有用的教学法，因为你可以按一下周围的
并找出是如何工作的，只是复制和粘贴的phpMyAdmin做什么。
但在CREATE TABLE命令是刚刚执行了，这里是我的表。
让我继续通过点击“插入”选项卡，并使用原始的SQL，而不是过于简单化。
让我做INSERT INTO房屋，
我说的房子是有一个价值的“奥美”的名称。
就是这样。这个语法是多了几分神秘。
这是我们要插入的字段的名称。
这是我们想要的值插入到这些领域。让我单击“Go”。
1插入的行花了0.02秒。让我现在单击“浏览”。
>> 请注意，如果我单击“浏览”，奥美，其ID是通过自动化的数字1。
让我做另一个。让我进入“SQL”选项卡上。
INSERT INTO的房子。的房子的名称是将有一个的Pfoho值等等。
去！我能保持这样了一次又一次。
或使用phpMyAdmin如果你觉得无聊，你可以直接使用“插入”选项卡
没有输入的原始的SQL。
例如，您可以一鼓作气更快速地打字，宿舍楼里，回车，
现在如果我们单击“浏览”，有宿舍楼里，一个ID为3。
因此，这就是我们所说的自动递增。
但现在我们必须解决学生的东西。
在学生，现在的房子领域的数据类型是什么？
它应该是一个int，对不对？
因此，这里的目标是分解出，否则被称为正常化，表
所以，我们不存储信息的冗余在我的表。
再次，我们在这里的路径是怎么说的奥美，奥美，
奥美，奥美，Pfoho，Pfoho，Pfoho，Pfoho，这是非常多余的
的浪费的字符。
所以，让我继续前进，点击结构改变这种情况，
让我继续前进，检查了房子，请单击“更改”，
现在，我要改变这是一个int。
255不再是相关的。
让我继续说，很好，如果它仍然是NULL。保存。
表学生已成功地改变，
再次注意到房子是一个int。
顺便说一句，忽略括号中的数字，当它涉及到整数。
>> 这是传统的原因。
早在一天当你没有图形用户界面，而不是有一个命令行环境中，
10和11分别指定多少个字符，你应该显示
在终端窗口中显示的字段。
它有没有做实际的字段的位长，所以，现在我们就忽略。
现在，我必须去到这个表中。
如果大卫住在奥美，房子不应该是0，
这是一个默认的int值最接近NULL。
他应该住在房子1。
让我们武断地说，迈克的生活在Pfoho，所以门牌号码2。
现在，我的表看起来多了几分神秘。
但考虑到效率。
我现在只用32位来标识的房子，
这意味着有规范的定义，我的房子马瑟和Pfoho的只有1
和的房子表中。
所以，如果我现在要重新加入这些表，它认为这种方式。
在这里，我有我的学生表，右手边有这些数字，1和2。
1奥美，2是Pfoho的。
我们有这个其他表中的那些相同的标号，这就是所谓的房屋，
1和2和图3为那些3房子。
我们现在想要做的是，PHP和SQL代码的能力，
排序的重新加入这些表，如果这些是学生，这些都是房屋，
我们希望以某种方式结合起来，使1行1，
2号线与2个，这样我们就可以计算出在大卫
迈克和其他人生活的地方。
要做到这一点，我们就可以像下面这样执行一个SQL查询。
SELECT * FROM学生参加房子 -
现在什么领域，我们想加入吗？
因此，students.house = houses.id。
>> 有点神秘，但是这部分是指从字面上创建一个新的临时表
这是参加的学生和房屋的结果。
你怎么想在这里结合我的手指的技巧吗？
将学生的家域的值等于房屋的ID字段。
如果我现在单击“Go”，我正是我希望的。
大卫在奥美，迈克是在Pfoho，我也看到了唯一的标识符。
但问题是，现在我有一个完整的表。
因此，这里的pset 7外卖或真正为最终的项目：
如果你发现你存储的任何信息冗余，
无论是房子，也许这是一个城市，州和ZIP
其中的ZIP可以通常但并不总是可以使用一个唯一的标识符，
干什么去了，然后通过行使精神上的东西，像phpMyAdmin
分解出来，常用的数据，因为尤其是当你的网站得到更多的使用
越来越流行，这是你如何确保这一切是超级快，
许多暗示的独特性可能给数据库。
这是一个很大。
有什么问题吗？好的。让我们有5分钟的休息时间和重组。
好的。
下面是一个例子，几年前，当我把CS161，
这是在大学的操作系统类
这被称为是惊人的，但一个疯狂的工作，
它真的在关注一些低级别的操作系统中出现的问题
甚至还可以在世界上的数据库。
>> 马戈舒尔茨，我的教授，当年的故事，被告知如下。
假设你有一个小宿舍里为你和你的室友冰箱
你真的喜欢牛奶。
所以，你回家一天的课堂上，你的室友尚未出现，
你打开冰箱，你会意识到，“哦，该死的，我们的牛奶。”
所以，你关闭的冰箱，你走马路对面的CVS
并获得越来越长的线，在CVS买一些牛奶。
同时，从他或她的课，你的室友回家
进了房间，打开冰箱真的想要一些牛奶，
打开冰箱，“妈的，没有牛奶。”
于是他或她关闭了冰箱，走出了门，并进入到ABP
或其他地方比CVS你不会互相碰撞
去得到一些牛奶。
当然，几分钟后，你回家
现在你有两倍多的牛奶，因为你其实是想。
牛奶，现在会走坏，因为你喜欢牛奶
但你真的不喜欢牛奶，所以现在你有太多的牛奶，所以它会变味。
这是一个可怕的，可怕的局面。
什么可能已经解决了这个困境，如果你是第一个室友回家吗？是。
[学生]您应该留了一张纸条。 [笑声]
好。你应该留了一张纸条。
您应该把后它说明或如说，“飘的牛奶”
，然后你的室友概念将被锁定，其实这样做。
或者，你可以去1步。
你可以从字面上某种挂锁锁的冰箱，
现在你的室友会从字面上锁定的冰箱。
如果我们概括编程，
你几乎可以认为冰箱某些类型的变量或结构，
某种信息的容器。
根本的问题是，你可以检查
或读取这样的数据结构的状态下，
但你看它在不同的时间，但你做了一个决定
基于对世界的状态，在这些不同的时刻。
所以，如果你锁定了冰箱，你会至少避免你的室友
从能够检查状态的世界，
这样他或她可能不会作出同样的决定。
因此，数据库，事实证明，这个问题不断。
>> 让我们来看看，如果我们可以构造一个场景。
假设，你的坏家伙，你去美国银行（Bank of America）
或在广场上，有一对夫妇的自动取款机并排的其他地方，
不知为何，你如何复制一个ATM卡 - 不是所有的努力。
这只是一个磁条。
所以你想尝试做的是玩这个游戏
一台机器，让你把卡，另一张卡到其他机器上，
你基本上要尝试去取钱同时，
因为想象这个故事如下。
机器左侧，把你的卡和PIN，
然后你说，“给我100美元。”
ATM编程，首先做一个选择的数据库或等值 -
它使用任何数据库 - 看看该用户是否拥有至少100元，在他或她的帐户？
如果是这样的话，然后吐出100美元，而其资产负债减去100元。
但是，当然，如果是多台机器在这里或多种方式的检查
这个世界的状态，银行金库，就看你有多少钱，
假设只是偶然的机器上左侧和右侧
问这个问题在大致相同的时刻。
>> 而这肯定会发生。自动取款机电脑这些天。
因此，如果机器左侧的说，“是的，你有至少100元。”
同时在机器上正确的说，“是的，你必须在至少100元，”
之后两人又继续完成他们的计划和实际吐出100美元
并说，“在此之前，你有200元。”
“让我更新的变量，现在是100元留在该帐户。”
但是，如果他们都已经检查您的帐户余额，发现它的$ 200
两个人都做数学题，说200 - 100，
机器有潜在的吐出两个100元的钞票在每一台机器，
但他们只更新和账户余额为100元。
换句话说，你已经采取了200元，但由于他们考察了世界的状态
同时，然后根据该值决定，
他们最终可能不会做的数学正确。
因此，在银行的情况，你真的希望有某种锁定
所以，只要你已经检查了一些变量的状态
这是非常重要的，像您的帐户余额，
不要让任何人作出决定的基础上，做你的事，直到你完成，
在这种情况下，你是在左边的ATM。
其他人锁定。
实际上，你可以在几种不同的方法来达到这样的效果。
>> 在MySQL中是一个最简单的方法，我们给你行的SQL
问题集规范长相酷似。
INSERT INTO表 - 无论它被称为 - 一个ID，一个符号，一个份额，股份数目，
下面的值，例如。
如果你还没有读过的规范，这是一个例子，你怎么去
购买了10股，这一分钱的股票总统Skroob，
其用户ID恰好是7号呢？
这表示插入到表下面的ID，符号及股数，
7，'DVN.V'，和10。
但是 - 但是，但是，但是 - 第二行是非常重要的一个。
DUPLICATE KEY UPDATE股的股​​数+的VALUES（股）。
因此，完全神秘的，乍看之下。
但事实证明，这个SQL查询，即使它包装到2号线，
是1个很长的查询，这意味着它的原子
在这个意义上，这个查询将被执行在一起，或没有在所有。
MySQL的定义，这就是他们实现这个查询。
它是由执行一次或根本不保证本手册的定义。
这样做的动机是如下。
如果在这种情况下，你想购买10股股票，
它是一种相同的故事牛奶，这是一种同样的故事，作为ATM。
>> 如果您不使用此语法错误的
而是选择从数据库中看到这一分钱的股票多少股
总统Skroob，并假设他有10股，
一些一瞬间后，你做一个UPDATE语句，
这是在SQL另一份声明中说，继续前进，增加10个股份
因此，在理想状态下，以他现在10的总数是20，
的问题是，因为在数据库中的系统，因为在今天的计算机上
你有多个处理器，多核心 -
换句话说，计算机可以从字面上可以做多件事情一次 -
有没有保证，在这种情况下，SELECT和UPDATE
将要发生背靠背。
因此，一个坏的情况是，你做的SELECT
看到这一分钱股票多少股份Skroob，
然后只是偶然另一个数据库中查询被执行 -
也许它Skroob试图在另一个浏览器窗口买10股
完全在另一个窗口，很像ATM -
想在SELECT和UPDATE之间的另一个查询得到。
可能的情况下，Skroob现在失去了一些股份数目
因为另一个进程正在检查他的世界的状态，
他得到了比他应该有更多的股票。
我们不会去的正是那些特别的故事线将进入详情
但问题是，如果你要检查一个变量的值，然后作出决定，
如果有别人做的东西，在这2条语​​句之间的风险，
这可以发生在多处理器系统中，在多核系统中，
做多件事情的能力，在一次与电脑，不好的事情都可能发生
如银行账户被扣除不正确的，买牛奶的两倍多，
在这种情况下，错误的股数。
但有一个更简单的方法来思考这个。
>> 事实证明，SQL也支持，如果你正确地配置你的表，
一些所谓的交易，我认为这实际上是更容易理解
比这个，但它不是一个班轮，所以它实际上是一个更复杂一点。
从字面上有一个名为START TRANSACTION语句在SQL。
就像有SELECT，UPDATE，INSERT，DELETE和JOIN和一帮的人，
有关键字，如START TRANSACTION。
你在pset中7的情况下做的 -
你没有做到这一点的pset 7，它是没有必要明确卸弃，
但最终的项目，它可以是有用的 -
如果你调用一个查询的START TRANSACTION，然后再查询
和然后另一个查询，然后另一个，另一个，和另一个
这些查询将不会实际执行，直到你调用的SQL语句COMMIT，
在这一点上，无论是陈述或20项，它们都将被执行一次，
这意味着没有人可以不小心买太多牛奶或借记太多的钱
或买太多的股票，因为所有的查询将执行
背靠背背靠背。
这是超级重要的，特别是当你做这样的事情。
这是一个任意的例子，说让我们更新银行账户
通过设置等于余额 - $ 1000的账户数为2的平衡。
然后第二个语句，现在让我们存入的$ 1000
进入别人的银行帐户，其帐户数为1。
>> 换句话说，这是一个很好的例子，在那里你要确保
这些语句都发生或根本不
因为否则的话客户会得到拧
你会拿自己的钱，而不是存放在其他地方，
或银行去你要去的地方，钱存得要命
但实际上没有从用户的帐户中减去它。
所以，你想他们两个一起执行。
因此进入世界交易。
所以，一定要记住，在你的脑海里，
没有那么多的目的，只是最后的项目，
但如果你想利用您的最终项目的地方，
如果你要启动它周围的一些公司，
如果你想在校园里一些学生的问题解决
，实际上有一个活的，活跃的网站，这些都是可能出现的那种微妙的错误
如果你不太想通过什么都有可能发生，如果2人
正在试图访问你的网站，在字面上的同一时刻，
据此，他们的查询，否则可能会交织在一起。
>> 准备好一些JavaScript，其捉弄人吗？
这是我们本学期的最后一种语言。好的。
值得庆幸的是，JavaScript会非常，非常，非常相似的语言，C和PHP，
到目前为止，我们已经做了的。
有没有任何JavaScript在pset中7，但它是一个非常有用的工具
当谈到做基于网络的最终项目还是真的只是网络编程更普遍的。
所以，简要概述了一种叫DOM。
这是一个超级简单的网页，其实只是说你好，世界
在标题和在体​​内。
由于缩进一段时间，一直建议
确实是有层次结构的网页。
我可以得出这样的HTML片段为一棵树，
回想起我们的讨论在C的数据结构，如下所示。
我有一些特殊的根称为文档节点的节点，
在短短的时刻，在JavaScript中，我们将看到模拟的。
第一个孩子，唯一的孩子，在这种情况下的HTML标签。
有没有直接映射的doctype。
这是一个特殊的事情，所以我们应该忽略它，当它涉及到这个DOM，
本文档对象模型树。
注意，我已经描绘为一个矩形任意的HTML标签，
有2个孩子：头部和身体。
>> 同样画成矩形。
它是有意义的图示，头是身体的左侧。
其含义是，在树头是第一位的。
因此，实际上是一个订货树当你画它是这样的，
即使是任意的形状和诸如此类的东西。
头同时还有一个孩子叫标题，
和标题其实有自己的孩子，这是“你好，世界”，
这我故意作为这里一个椭圆形，以使其能够稍微不同于矩形提请。
这些矩形元素，而您好，世界上真的有一个文本节点。
所以这是一个树中的节点，但它是一个不同类型的节点
所以我画了任意不同。
同样身体有一个孩子叫你好，世界好，
如此不同的节点，即使它们是巧合的是相同的文字，
但我画它使用相同的形状。那么，谁在乎呢？
那么，什么是好的关于HTML的是，它有这样的层次性。
什么是好的关于JavaScript，特别是库，可免费获得
和流行的如jQuery，您可以通过在树结构如此惊人的容易。
任何的东西，我们在C的指针和遍历树和递归的节点上
左子右孩子，突然之间，我们可以排序的授予
令人惊讶的启发，如果不是有点沮丧
但几乎没有一种有效的方式去编程。
因此，这些较高层次的语言如JavaScript
我们将能够更直观地浏览这个树。
>> 事实上，将是相当熟悉的语法。
如果你从来没有见过的Javascript之前，这是一个非常好的参考
从Mozilla人，谁的人让Firefox，
所以不要随意浏览，在您方便的。
你会发现 - 这些幻灯片是相同的，我们使用的是其他 -
同样地，主已经一去不复返了。
所以，当你写一个程序，在JavaScript中，没有任何主要功能。
你刚开始写代码。
但JavaScript和C和PHP之间的关键区别
，而C和PHP迄今已执行服务器端
在这种情况下，由器具，或更一般地由服务器
通常是由设计中的JavaScript的浏览器中执行。
换句话说，您可以编写JavaScript代码，我们，
服务器上的设备，但你有你的HTML之间，在你的CSS，
在您的GIF和PNG和JPEG文件
这样，当用户访问你的网页，如果你使用JavaScript，
JavaScript代码，从服务器到浏览器，
和它的实际执行的浏览器。
因此，这甚至是知识产权的有意义的影响。
这是一种愚蠢的，当它涉及到JavaScript代码，甚至想保护您的IP
因为性质的语言，它通常被执行浏览器端。
>> 您可以混淆它，这意味着你可以把它看疯了，丑陋的
没有空格，可怕的变量名，使人们更难窃取您的IP，
更关键的是，它是浏览器端执行。
即使顺便说一句，可使用JavaScript的服务器端，
最常见的情况，现在仍然是在浏览器上。
这里是什么样子。下面是一个if-else if-else结构就像C语言，就像PHP。
这里是一个布尔表达式，当你“或”两件事情。
是当你“和”两件事情。
这里是一个switch语句，这是类似于PHP
，你可以打开不同类型的值。
循环同样在这里，for循环的结构完全相同，这是我们见过的。
while循环，我们已经得到了while循环。
变量，以往任何时候都略有不同。
你声明的变量，比如你在PHP和C，
但同样是JavaScript的弱类型。
您不指定整数或浮点数或字符串或任何类似的通常。
您可以指定变种。
您不必指定变种，但它的意义，如果你不这样做。
通常，如果你省略VAR，你不小心创建一个全局变量，而不是本地。
因此，我建议，你几乎总是只说va​​r和当时的名称的变量。
这是不是一种类型，它只是var为变量。
这将是一个例子，无论是123或“你好，世界”。
数组是当前和语法上类似于PHP。
我会说VAR的数字，然后我再使用方括号来声明一个变量
，它的类型是数组，这些特殊的数字，以逗号分隔。
最后，这是唯一的一个真正看​​起来不同。
回想一下，在PHP中，我们将实现一个关联数组的学生
像Zamyla可能是这样的，其中的变量被称为学生。
方括号的意思来了一个数组。
>> 事实上，我没有使用数字指标，但字符串 - ID，房子，和名称 -
意味着这是一个关联数组，
这些箭头的等号和尖括号
也就是说，关键是“id”，值为1;
最关键的是“房子”，是温斯洛普楼;
最关键的是“名”，值是Zamyla陈。
因此，有3个按键，在这里面的关联数组，每一个都有其自身的价值。
我们已经看到，pset的，或你很快会在JavaScript中同样的想法，
但它会看起来像这样。
因此，VAR学生 - 没有美元符号的类型，也没有提及，但是变种 -
平等相待，然后打开在JavaScript中的花括号，因为当你有键值对，
你实际使用的一些所谓的对象。
你可能还记得谁没有采取的APCS或类似对象从Java
或类似的语言。
JavaScript是不是Java，首先。
这是一个经过深思熟虑的设计决策年前收工别的东西，很受欢迎，
它的名称，即使它具有Java本身没有根本的关系。
JavaScript中的对象，你创建它们的花括号符号。
JavaScript中的对象是几乎等同于关联数组在PHP
当涉及到他们的内部存储数据。
>> 但更有力地在JavaScript中，你可以关联很容易的功能
里面的对象，尽管你可以做到这一点在其他语言中，
这是一个相当普遍的范例，正如我们将看到的。
总之，这个对象代表一个学生，谁是特别Zamyla的，
在概念上，它是类似，只是语法不同。
让实际使用JavaScript在文件中。
原来有一个脚本标记。
我们已经看到了的风格标签和我们见过的其他HTML标签。
实际上脚本标签将包含一些JavaScript代码。
让我进入设备，我们有一些预先的源代码。
我还没有发布在网站上，但下课后，我会做到这一点。
让打开这个1，blink.html的。
早在20世纪90年代，简直是眨眼标签的HTML标签，
而这是一个在互联网上的最奇妙的过度使用的标签
让你访问一些20世纪90年代风格的网页，并开始看到这样的文字闪烁，
结果的侯爵标签，其中有这样的文字去。
其中，世界实际上已同意在Web标准的几十倍，
几年前，董事会每个人都杀了闪烁标签。
但是，我们可以复活它使用JavaScript作为一个示范的权力，你有
当你可以写一个程序内的网页。
首先，让我们略过的新东西，只注重老。
>> 在这个例子中是旧的东西。
我有一个HTML标签，头标签，标题标签。
然后我有一个body标签的div，召回只是一个矩形分割的页面
我的“问候”，任意指定一个唯一的ID，
只是让我有一个唯一提到它的方式，有一些非常简单的文本：
你好，世界。
现在让我向上滚动到顶部的这个文件，看看有什么新。
新往上顶的第一件事，是script标签，
和内部的脚本标记通知我声明一个函数。
声明一个函数在JavaScript中，很类似PHP，
您字面上写函数，则函数的名称，括号，
也许一些参数，如果需要。
然后，我得到了我的花括号像往常一样，现在我们有一些稍微新的代码，
但让我们来看看这是什么意思。
所以无功格，这也就意味着给我一个变量所谓息。
我可以把它叫做foo的，但我想它被称为股息
的原因，在第二，这将是清楚的。
事实证明，在JavaScript中 - 这是我的网页中嵌入的JavaScript代码 -
称为文档的各种有一个特殊的全局变量。
事实上，JavaScript是一种面向对象的语言。
我们不会进入细节，这是什么意思，在50
但现在知道对象是一个结构很像。
就像我们看到的遥想当年最早的一个问题设置
在一个结构，我们投入了大量的信息，
同样是文件的特殊结构，自带的浏览器，
任何网页。这不是我创建了。
本文件的结构里面，但是，你不仅数据
但你也具备的功能。
>> 任何时候你有一个函数的内部结构，里面的一个对象，
这就是所谓的一个方法。但是，同样的事情。
一个方法是一个函数，刚好是里面别的东西。
因此，这意味着，这个特殊的全局变量文件
有一个函数调用，基本上getElementById。
这将让你的DOM元素，文档对象模型树，
其ID是在这种情况下问候语。
换句话说，我们所有的时间花在数据结构来这里发挥作用。
这张照片的DOM，我们过会儿前，
即使是有点不同的，如果我有一个div在这幅画中，
什么样的document.getElementById返回我是一个指针
到的矩形在树中，树中的矩形的参考。
所以，这意味着什么实际调用这些功能之一。
在这种情况下，这又是一个div。这不是一个机构或一个标题。
因此，让我们来看看什么我现在做的这个div，我有这个变量称为格内。
原来你有能力动态调整您的网页的CSS与JavaScript。
到现在为止，所有的CSS，尽管是有限的，我们所做的是在样式属性，
或有什么地方我们把CSS？
我有点被宠坏的那一个。在风格标签在文件的顶部。
或第三位一直在吗？
>> 一个外部文件中，一些CSS。
因此，这些都是CSS迄今为止，我们已经做了3个地方，
但美中不足的是，我们已经硬编码。
你决定你一头扎进pset中7，我们决定在课前将我们的CSS。
但是如果你想改变你的CSS，你可以真正做到这一点
一旦你有一个实际的编程语言。
CSS，HTML - 不是编程语言。 JavaScript是。
因此，原来，一旦你有这些矩形树
所谓的DOM，它本身它里面的一些数据。
所以，我刚拿到的div从树上有什么，我们会打电话给它里面的一个属性
称为风格，样式属性本身也是一个属性叫的知名度。
我也知道这只是寻找一个CSS用户手册。
原来有一个可见性CSS属性，它做什么它说。
这使得一些可见的或不可见或不可见。
而如何做到这一点是这样的。
我问的编程方式，如果这个div隐藏的知名度，
我该怎么改变？可见。
否则，如果这个页面是不是隐藏的知名度，在逻辑上我隐藏它。
我不知道为什么它是可见的和隐藏的和不可见的和不可见的。
这是一个糟糕的设计决定的方式。
但是，这些是对立的CSS可见的和隐藏。
所有这一切都没有是不是就意味着改变我的CSS文件和关闭，开启和关闭
为特定的分区。
但是，这是一个函数调用的闪烁。当闪烁功能叫什么名字？
事实证明，有一个特殊的全局变量称为窗口，
类似的文件精神，而文件是指您的网页，
像你的HTML DOM树，从服务器发送，
窗口是指在它的周围，镀铬的地址栏，标题栏，
所有的东西在你的网页。
>> 而事实证明，在窗口对象有一个特殊的功能，它里面叫的setInterval
做什么它说。
将设置的时间间隔 - 在这种情况下，每500毫秒 -
，可以猜，什么会做的每500毫秒？
这将执行该函数闪烁。
很高兴在这里，我们可以这样做，即使我们从来没有在C。
C也有被调用的函数指针的东西，在这里你可以通过功能左右
作为参数。
同样，在JavaScript中，你可以传递到另一个函数的函数的名称。
注意到我在做什么。我没有这样做。
如果我把括号后的闪烁，这意味着呼吁闪烁功能。
如果我忽略它们，在这里的意思是闪烁功能
这样的setInterval可以把它每隔500毫秒。
因此，最终的结果是残酷的，但是，如果我进入本地和blink.html去，
我现在有这种情况发生了一次又一次。
如果我真的检查的元素，让我们看看我们可以看到这一点。
让我检查元素，让我向下滚动，只需要一点点，
让我选择在这里的元素，并注意Chrome浏览器的DOM里面督察。
它的字面来回变化，每500毫秒。
如果我们去我们的朋友内特，
，如果你以往任何时候都想知道这是如何的工作的，类似的的的想法与一个时间间隔，
但内特 - 实际上是非常有效地利用颜色在这种特殊情况下在这里。
所以，我们还有什么可以做呢？
让我们打开另一个例子试试
这是通过编程更加有用的事情闪烁。
让我今天进入我们的表格目录，进入FORM0。
这是我能想出的最丑陋的形式，
让我告诉你什么是它看起来像在浏览器中。
>> 让我进入本地主机/形式，这是FORM0的。
这是一个超级难看的HTML表格，有几个字段，电子邮件，密码，
密码，然后一点点的复选框，同意某些条款和条件。
美中不足的是，如果我访问的形式，我不想给你我的电子邮件地址，
我不想同意的条款和条件也许，我可以单击“注册”
它让我通过了。
发生这种情况向一个愚蠢的PHP称为dump.php的文件。
它的作用是打印出来的内容只是用于诊断目的的$ _GET。
这是由用户提交的只是现在。
但是，假设我们要验证用户的表单提交。
让我进入第1版。
这是form1.html。它看起来美观一样糟糕，但要注意它是如何的花哨。
如果没有合作，我请单击“注册”我被骂。
“您必须提供您的电子邮件地址。”
好的。所以，让我来试试。所以malan@harvard.edu。我并不需要一个密码。
注册。 “你必须提供一个密码。”好的。
因此，我将提供深红色的密码。注册。
“密码不匹配”。我现在必须输入深红色这里。
我不小心检查。注册。
“您必须同意的条款和条件。”好的。同意。注册。
现在，它让我看到那边的诊断输出。
>> 所以，刚刚发生了什么？
我们有这个能力来验证表单提交。
事实上，如果你没有潜入的pset 7，有一个歉意的功能
这使得它很容易在用户屏幕上的一条消息，大喊大叫。
我使用了一个略微不同的机制，报警功能，
这是不是一个函数的笑了，因为它非常丑陋的用户信息。
但是让我们看看我在这里做什么。
这是form1.html的，请注意，我有一些非常熟悉的语法：
body标签，表单标签，action属性，属性的方法。
但是请注意，我已经给了我一个独特的ID为方便。
然后我收到一封电子邮件，其类型为文本字段，
一个密码字段，它的类型是密码，确认字段，它的类型是密码，
一个复选框，然后在这里他的名字是协议类型为复选框。
然后我有一个提交按钮。
但是请注意，在上面更何况我有。
首先，有一个使用的脚本标记。
如果你有一些JavaScript代码，在另一个文件中，就像CSS，你可以将其包含。
你用脚本源代码，然后通知我连接显然
很长的路径，但其文件名googleapis.com在jquery.min结束
最小的。js。
jQuery是一个超级流行的，只是使JavaScript的JavaScript库
更方便用户的使用。
它实际上成为了事实上的标准。
因此，即使你将要看到的是不是纯JavaScript本身，
它是很像CS50库之上的JavaScript库是一层
在顶部的低级别的C代码，现实的情况是，几乎每个人都在互联网上使用它。
因此，这些都是没有培训车轮。这是最好的练习，这些天。
现在注意下面的是我自己的脚本标签，并注意我在这里所做的。
事实证明，，jQuery也有点花哨的东西。
JavaScript有货币符号，但他们是没有意义的。
>> 他们就像字母A或B或C。
jQuery没有简单地采用公约或下岗的要求这样的事实：
，将是他们的特殊符号。
因此，只要你加载这个全球性的JavaScript文件的脚本标签，
您可以访问一个特殊的全局变量，这就是所谓的$。
它更恰当地称为jQuery的，但看上去不性感$。
但没有特殊的意义。在PHP中，它有特殊的意义。
你必须有它前面的变量。
这仅仅是一个性感的事情，他们就。
这到底是怎么回事呢？
请注意，我通过我的jQuery功能全局变量文件
然后我打电话。准备好了。
什么jQuery基本上的作用是它可以让你采取一些普通的JavaScript的东西
像文档对象，window对象，
而如果你把它传递到jQuery函数 -
再次，要清楚，这是一个函数调用jQuery的 -
它是什么，它​​会返回给你一个特殊版本的文件
具有更多的功能，与它相关联的。
因此，在原始JavaScript有没有现成的函数，
但如果你通过文件的jQuery功能，
它返回给你一个特殊版本的文档对象
有更多花哨的功能。
这就是为什么人们喜欢它的原因。它只是使事情变得更容易的事，因为我们将要看到的。
那么，是什么这行代码是什么意思？
这行代码在这里是指当文件准备 -
换句话说，一旦浏览器完成读取此文件从上到下 -
继续执行以下功能。
什么是真正有趣的JavaScript - PHP以及 -
匿名函数。
在JavaScript中，你可以声明没有名字，但他们有一个身体的功能。
请注意，这里发生了什么。
>> 这是一个函数调用的准备，它只是意味着执行以下操作
当整个网页是准备好了，当这些都被读出在从服务器。
你想要做什么？我想执行的代码块。
请注意，我们不希望马上执行这些代码。
如果我忽略了这一点，这将意味着立即开始执行这些代码行。
但事实上，我说，不，不，不，包在一个匿名函数，这样
表示不执行它，把它最终。
我们看到刚才我们在以前的表格的例子。
什么样的功能，我们称之为最终，500毫秒后呢？闪烁。
所以同样的想法。
再次，即使这看起来有点怪异，只是现在信仰
，这就是所谓的最终声明一个匿名函数，
只要简单的写函数（）{
所以我们要什么样的代码最终执行吗？以下。
这也显得有些新的，但在这里的意思是jQuery的功能，
，这是一条捷径。
下面这段HTML在屏幕的底部，当然有一些树表示。
它不是这个。此页面是更有趣的比这个Hello World例子。
但还有一些树，对应于这个HTML。
这将是一个痛苦在脖子上不得不实行某种递归函数
开始的根节点，然后找到该节点的ID注册。
那么，什么jQuery，我们这简直是超级容易。
来吧，让我无论div或任何形式，任何HTML元素
有一个ID的登记。
这是相当于的document.getElementById（“注册”）。
>> 人们为什么喜欢jQuery？
因为它是更短的输入。但是，这一切是。这是同样的想法。
我的标签的ID注册。
而当该标签，这恰好是一个形式，提交，
继续执行该代码。
因此，让我们现在看我们如何做表单验证。
语法在第一，但无可否认，神秘的是怎么回事呢？
如果这行代码是真实的，我要骂的用户提供他或她的电子邮件地址。
那么，这行代码是什么？
$ jQuery的。我们注意到这一点。
这是一种像CSS。
如果你跳入CSS，你就会知道，这意味着该元素的ID注册。
空间意味着找到一个孩子或一个登记的后裔，他的名字是输入。
那么这件事情在方括号中是一个小的过滤器。
而且，即使这个看起来很神秘的，这也就意味着去的形式，其ID的注册，
到输入元素内，他的名字是电子邮件，
然后得到它的价值，无论它的值恰好是 -
航空自卫队这是我类型或malan@harvard.edu的，如果这是我所输入的。
因此，如果窗体的电子邮件领域==没什么，骂的用户。
否则，如果密码字段中的值的==什么都没有，骂的用户。
>> 否则，如果的密码字段的值不等于确认字段的值，
这是另一种形式的元素，在用户嚷嚷。
最后 - 而这其中也有它自己的一些新的语法，
但一旦你看到它，它至少更合理一点 -
否则，如果是注册ID的形式，其有一个输入元素，其名称是协议
和检查，继续前进，大声嚷嚷的用户。
所以，我承认，乍看之下，这完全是压倒性的。
这是一个很多新的语法。但是，所有的jQuery如下这些种模式。
说实话，我不知道这存在，直到几分钟前。
我用Google搜索，“你怎么检查，如果一个复选框被选中，在jQuery吗？”
这是语法，因为有不同的方法做这件事
与实际原始JavaScript代码。
因此，作为第一页习题集7所强调的，
pset中7是非常行使自己的引导
我们提供了希望，一个概念性的框架，以解决在pset。
>> 但往往是网页设计的情况下，这是给你真正闲逛，
只要你引用它们包含的代码片段和例子从Web
每上，第一页的条款，
并认识到，学习HTML，CSS，JavaScript和SQL
真正的意思是在家里工作，我们已开始采取这些训练车轮。
并实现也有那么多的事情可以做的浏览器。
这些元素里面还有其他的东西称为事件处理程序。
即使我们只是看着那些被称为的onsubmit和onready，
你可以做这样的事情的OnKeyDown，调用onKeyUp，
喜欢当用户触摸键时，你可以听，键向上。
Gmail有键盘快捷键。
如何实现快捷键，例如C组成？
侦听事件，因为他们是所谓的，喜欢的OnKeyPress或onKeyUp和聚焦的。
如果你曾经在一些菜单选项悬停你的鼠标
突然，瞧，出现一个菜单或图形的颜色会发生变化，
他们是如何做呢？
而不是听的onready或的onsubmit，你听的onmouseover或鑻。
>> 因此，在短，这些非常简单的基础知识，我们已经开始触及问题的表面今日
，我们将深入进一步周三，你有越来越多的
实施种的东西，你已经很熟悉了。
因此，让我们的结束，我们将继续在周三。
>> [CS50.TV]