[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]