DAVID马兰:好吧。 这是CS50,这是 9周的结束。 它在被旋风 这几天。 与问题设置7,如果你的膝盖 深入到它,实现有相当多 位新这是在那里。 但是让我们看看如果我们不能拼凑 一切都聚集在这里简要地 在此之前尚未在关闭于水火之中 另一个方向,看到 还有什么地方可以去。 所以到目前为止,我们已经讨论过的HTML。 我们已经谈到的CSS。 我们已经谈了PHP的。 你开始体验到的SQL。 今天,我们就商量了一下 关于JavaScript。 但如何做所有这些不同的 语言结合在一起? 所以,我们上周谈到了 概念有一个服务器。 所以我们只绘制这个矩形 这里作为一个Web服务器。 和Web服务器提供一定的文件。 并且其中一些文件 可以是HTML文件。 这样的事情之一是一个Web服务器 可以吐出可能是一个文件,该文件 我们就得出这样的 包含一些HTML。 所以,通俗地说,是什么 没有HTML让你做? 观众:页面看起来不错。 DAVID MALAN:好,使一个页面看起来不错, 虽然我觉得我已经证明 ,否则。 因此,HTML的确让你铺陈页 结构上,它可以让你 排序的美学标记的页面, 标记静态内容,让你 然后,可以使用Web浏览器查看它。 但是,这是关键。 这是静态内容。 你写它,你保存它, 然后你发货。 和Web服务器,然后提供 它给您的访客。 但我们风格化使用不同的事情 语言完全。 我们开始使用一个style属性 对某些标签。 和style属性让我们设置 事情,比如字体大小和颜色。 而且你可能已经开始发现, 或者你很快就会进行最后的 项目可能的,但其他 属性,您可以在CSS中使用。 所以通俗地说,是什么 真的那么CSS的呢? 这些只是其实例。 是什么让你这样做的HTML 似乎没有从什么 我们已经看到了这样多远? 观众:你自己定义的样式。 DAVID马兰:定义样式 由你自己。 所以定义类的东西类作为你 可能都遇到过,还是唯一 识别文档中的节点,以便 你可以样式化它们。 但更确切地说,我想说的是CSS 真的可以让你把东西 最后一公里,并允许您指定多 更精确的美观性, 而HTML在大多数情况下可以 你组织你的页面。 而且即使有一些默认值, 就像我们看到的标签 一个标题标签,它粗略地讲 做事情的大和大胆。 这是一个非常通用的定义 标签的 - 大和大胆。 什么字号是什么? 是什么颜色的? 人有多大胆是什么? 和CSS使您可以更精细地 调类的东西。 以及布局,由于一些 你们都看到了。 坦率地说,CSS是有点 一片狼藉的语言。 这是非常强大的,你可以做 从字面上,你已经任何网站 今天看到在网络上与它,但 它是一种在颈部疼痛。 和你们有些人撞你的头 对墙壁已经只是做 一些愚蠢的中心像一个菜单 问题设置7,如果你已经得到了 这一点了。 但要意识到,那些事 得到随着时间的推移更加容易。 你开始注意到模式。 再次,谷歌将成为你的朋友 在其中你可以在各种方式 解决这类问题。 我敢说使用CSS和HTML更 通常,你可以解决的问题 所有这些都很多方法,很可能 还有是正确的,比你可以 在像C,甚至 现在的PHP或JavaScript。 只是有很多不同 方法奠定的事情了。 但是,这开始变得 凌乱的,我们说。 只是那种混入你的HTML和 你的CSS的样式属性是 有点草率。 所以我们不是说那种, 抽象地说,那你应该 至少开始的因素 出你的CSS可能。 不是你的风格属性,但至少 使用样式标签里面有什么 网页的一部分? 观众:头。 DAVID马兰:在头部。 到现在为止,我们只有标题了 在那里,但你也可以添加一个样式 标记,而且你可以把你的CSS大致 发言朝向页面的顶部。 但后来我们把事情一步 我们分解了更多 到一个单独的文件中。 所以这两个文件分别为 不知何故现在联系在一起。 而事实上它是 标签,这样做。 什么是总体的一个 动机分解出我们的CSS 更? 观众:可重用性。 DAVID马兰:可重用性。 对不对? 你可能已经看到在对设置7已经 ,很多的网页时, 购买页面,销售页面,该 投资组合页面,可能是 结构有些类似。 有一个CS50金融徽标上方 除非你已经决定去改变它。 有一个页脚在 页面底部。 和CSS允许,那么你在要素吧 成一个单独的文件,这样,如果 你想在全球范围内改变一些东西 在您的整个网站,你可真 只是改变它在一个地方。 但你可能会付出代价 由已分解出来的 CSS的从我的HTML文件到一个单独的 文件与引用它 标签,我们看到在周一。 什么可能的缺点是这个? 回想一周前,当我们 谈论HTTP和TCP / IP和如何 互联网的工作原理。 这里有什么事? 观众:它需要更多的时间。 DAVID马兰:这需要更多的时间。 为什么呢? 观众:[听不清]。 马兰大卫:是的。 因此,它可以说是需要多一点的时间。 因为之一,CSS是很明显 不在同一文件中。 所以,现在你必须做出不 一个,而是两个请求。 并且其中的每个请求,因为我们所看到的 铬在所谓的督察, 我们期待在网络选项卡,每个 这些文件都需要一个HTTP 的要求,我们需要看到 一定量的时间。 现在,也许它不是很多。 也许这是只有20毫秒。 也许这是200毫秒。 但仔细想想,如Facebook的页面, 或CNN,还是谷歌,这是多少 比我们的更大的示例 看着迄今。 这些网页可能有几十个文件, 其中每一个可能需要一个 一个文件的下载。 这样的事情,都可能导致 开始放缓。 尤其是这些天,当大家都 拥有移动电话在我们的口袋和 较慢的互联网连接,不必 等待几毫秒的时间,几 额外多毫秒 文件实际上可能会很慢。 延迟是描述字 这种等待,你有你 等待时遇到 一些信息。 但有它的好处。 所以它不是所有形式的 - 它实际上是一个位在这里一个跷跷板。 现在下行,但什么浏览器都可以做 如果他们是聪明的,以避免 不必请求相同的styles.css 文件又可以做什么呢? 缓存它。 因此,缓存 - C-A-C-H-E - 一般是指这里只是为了保存 提交您所要求的第一时间, 然后检查你的缓存它。 检查你的排序存储容器, 如果你已经有了一个 styles.css的副本,即使其他一些 在p-组,或任何网站页面, 再次请求它,只是为了给 用户相同的缓存副本。 不要打扰请​​求它。 下行那里,虽然,因为你们中的一些 已在p组绊倒。 如果你做出改变的服务器上, 你回去的浏览器,你 重新加载时,有时浏览器 你帮一个忙,不打扰 重新下载您的styles.css的文件 因为,来吧,什么是赔率 这些样式Facebook的使用 打算小时变更为小时或 一天一天? 这是相当低的。 他们可能会随时间而改变,但不 按分钟或一小时。 所以一招,只是FYI在做网页的时候 发展,往往是按住 比如Shift键,然后单击 重新加载在浏览器中,这将 通常是告诉浏览器重装 一切,即使你已经有 它在缓存中。 如此反复,积极以及不利的缺点, 但所有的人 最终设计决策。 所以,现在,我们并不只是 在这里结束的故事。 如果我现在回去,回去和背部 回来了,我们开始引进不只是 HTML,但是PHP。 所以,通俗地说,是什么 PHP确实让我们做什么? 观众:[听不清]。 马兰大卫:那是什么? 观众:介绍逻辑 入代码。 DAVID MALAN:是啊,介绍 逻辑到你的代码。 所以这是一个真正的编程语言 与循环,变量,和 功能,以及所有条件,并 我们一直在使用的方式回来的东西 因为刮的时候。 和PHP,我们已经看到,可以用 或者在命令行中 - 它 不必有什么关系 与Web,即使那是 它的真正起源和什么时候往往 是在良好的,有利于 - 但你可以使用PHP仅仅通过自然 的,它有一个印刷(这一事实) 功能和printf()函数, 或回波()函数。 有办法你一束 可以用PHP打印文本。 因此,您可以使用这个编程 语言准确地输出 什么我们之前谈论。 你可以动态地生成 您的HTML。 也许不是全部。 也许你硬编码的东西,像 头和尾,并且标识, 和你的样式表, 而所有这一切。 但对于像对设置7, 您要去哪里操纵股票和 显示用户的投资组合,这是 要动态地改变,你可以 当然使用PHP和它给人的逻辑 你作为一个编程语言 输出子集动态 页面。 所以,当你谈论动态网站, 或web编程,这是 你真正谈论。 使用PHP之类的语言,或事物 叫Python或Ruby或Java或 但其他语言,来查询数据库 通常,或另一台服务器, 然后动态吐出的HTML。 现在,最终的结果,顺便说一句,是 大多数网站的HTML, 包括你对设置7,可能是 将是一个巨大的烂摊子,如果 你看看源 在浏览器中的代码。 这不是什么大不了的事。 此时,当我们关心 式,我们关心的 你写的东西。 本公司不会在乎的东西 那你的代码输出。 所以不用担心缩进 在这里,如果是PHP的这 实际输出的东西。 毕竟,浏览器不会在意, 和人将不会被期待 在源反正。 我们的工作人员,例如,将 在看你的PHP。 所以让我给一个简单的例子现在 为什么其他人,这可能是有用的。 所以坦率地说,我不记得过去 一次我用C来解决问题 现实世界。 这可能是在读研究生的时候 我需要使用一种语言, 是相当低的水平,给我的 机会做一些事情非常高 执行真正挽救尽可能多的CPU 周期,尽我所能,在很大程度上 因为我是用庞大的数据集, 而每个CPU周期计数。 坦率地说,即使是在事情,比如手机 这些天,其他设备 在那里你不太有尽可能多的 内存和你不太有作为 大量的CPU,使用更快的语言 仍然有吸引力。 但在现实世界中,当你只是 想一起抛出一些程序 分析一些数据,或者你收集 对于一大堆的注册 并且要很有​​些学生组 快速自动发送电子邮件 逐一对每个其中的一个 注册者,你要达到的 一个更高层次的语言 比C可以这么说。 像PHP或Python或Ruby, 或半打其他人存在 这些天。 但是这3个可能 最时尚的现在。 而这是什么意思是,你可以打开 一个文本编辑器,例如gedit或 大多数别的,然后就开始 编写代码,而不必担心 有关编译,而无需 真担心内存管理, 牢记尽管这一点 草率最终会回来 咬你,如果数据集变 规模较大或问题变得大了。 但是,这是什么意思的 我们如下。 让我继续运行拼写检查 从问题设置6。 所以这是我的特里为基础实现 我用的大 板在那里我表现不太好。 我们会回来在一个星期的时间, 重温那些谁也结束了头顶上的 大板在我们的最后一次演讲。 但现在,让我继续前进,只是 运行我的解决方案文本,我们会做 国王詹姆斯圣经,在这里,我们走。 因此,这些都是所有的假想 拼写错误的单词的出 国王詹姆斯圣经。 和我的实现了 半秒钟的总和。 所以不会在这个太糟糕了 特定的计算机。 但想到多少 代码我不得不写。 想想你有多少代码编写。 想想你在多少小时内用完 D-大厅或你的宿舍或其它地方 实际上编码了该解决方案。 好吧,如果我真的有一个更高的水平 像PHP语言,请注意 我可以在这里做。 首先,假设这是代替 您的分发代码。 这是一个叫的拼写文件。 它可作为当今的一部分 分配的代码。 而且我要挥挥手最多 的细节,但是这实际上是 如何一个有趣的例子 你可能端口的语言 像C切换到PHP中。 我硬是开了两个文本窗口, 之一,speller.c我的C版本, 我刚开始翻译它在我 前往采用PHP和打字出来 最接近的等效功能。 所以,这些东西有些是不同的。 我们看到,PHP不使用最后一次 包括在以同样的方式。 它使用典型地需要,但 包括确实存在。 定义是有一点不同 #在C中定义,但是这 我们如何做一个常数。 $ ARGC原来存在于PHP, 所以我们在前面提到过。 这些仅仅是变量,所有的 它开始与美元的迹象。 回想这些都只是一堆 浮动点。 所以长话短说,欢迎您 翻阅这一点,如果好奇,这是 几乎是行换行转换 C版speller.c的到PHP。 ,你可以再次做到这一点 半打其他语言。 但有趣的是这个。 或什么是令人沮丧的坦然 是这样的。 让我继续前进,键入有关 dictionary.php,并声称我 要继续前进,并重新实现 问题组六在这里。 因此,让我们首先提出,在这 文件,这将在实施 PHP的,所以让我打开我的标签这样的。 让我给自己一个全球性的 变量$尺寸变零。 我想给 我是一个哈希表。 我将使用一个哈希表这个东西。 在PHP中我如何声明一个哈希表? Done(完成)。 确定。 所以,开括号右括号代表 怎样在PHP中,我们已经看到? 一个数组,而是一个数组,可以 是一个关联数组。 关联数组是 一个数据结构,它 与关联值的键。 现在,在数字索引的最简单 数组,这些键是什么? 零,一,二,三,对不对? 老派的东西从C回来,但它可以 也像foo,并且巴串, 或麦克斯韦,或任何该等字符串。 这样我就可以利用这 在短短的一瞬间。 让我继续前进,宣 就像一个功能 - 让我们做的load()第一。 所以函数load()方法。 和PHP是一个有点不同 你从字面上输入功能,但你 不要键入一个返回类型。 我要继续前进,说, load()函数应在 参数$词典,刚 像C版本一样。 我这样做,从内存中。 我建议,我 要做到这一点。 我只是要做的foreach。 我要调用一个调用的函数 文件(),传入的这个名字 文件,该文件是变量 $词典为$字。 然后在里面我的for循环在这里,我 要继续前进,并存储在我的 $表$词得到真实的。 完成。 哦,等等。 完成。 确定。 那就是load()函数 说在PHP。 现在,为什么这项工作? 样的,我欺骗在这里。 因此,一,的foreach我们看到 简要最后一次。 它只是意味着你可以遍历 没有与我打扰数组 n和加上加号,和所有的。 词典当然是文件名, 像大或小,这两个 我们的字典使用最后一次。 文件是打开了文本的函数 文件,按行读取它的路线, 你的双手背一个巨大的数组, 每个其元素是一个 线从该文件。 所以这是的FOPEN相结合, 用fread和while循环,和fclose的, 而所有这一切。 最后,词只是意味着这就是 可变我要去访问 在这个循环中每次迭代。 因此,在短期,在这里单行指 开拓其名称是在文件 字典,变量,迭代 但每次得到的时间逐行,和 一条线,存储在一个变量叫做字, 然后做一些事情的话。 我想要什么做的? 我希望把字到我的哈希表。 好了,我可以把东西在我 哈希表类似于C 使用方括号。 这是我的哈希表的名称。 我要索引的散列 表在这个位置。 所以不是零括起来,不括起来的。 支架报价引文的东西, 不管这个词是。 而且就像你可能在你的 哈希表的工作特里,你只是存储 实际上是一个布尔值,隐式 或明确。 完成。 我存储的值为true。 现在有几件事情 我就割这里的角落。 从技术上讲,有将是一个 恼人的新生产线,/ n在年底 这些字。 所以我也许应该调用PHP函数 所谓的印章(),这将 毫不夸张地砍了断。 而且我确实需要 做一件事。 我也许应该增加尺寸上的每个 迭代,所以我跟踪 它是什么全球。 坦率地说,这是一 PHP的愚蠢问题,如果你是 使用全局变量,你需要 明确地说,你是。 所以,我要实际键入全球 $规模,全球$表,现在 我的功能是完整的。 所以不是那么简单过,但 大概花了比C时间少 版本,也许? 确定。 所以,现在让我们做的检查()函数。 让我们来看看这至少拿了 几个小时就结束,它把我们的C。所以 让我继续前进,并宣布 检查的功能。 发生在说法的话,这是 从哪儿来的拼写。 而我只是要检查 下面的变量使用isset,表 字的支架用strtolower - 让我们来平衡我所有​​的括号 - 然后返回true。 其他 - 这是真正的硬 这项计划的一部分。 否则,返回false。 完成。 这是检查()。 现在,为什么这工作? 那么,一个我通过一个字, 它是一个字符串。 二,我检查的哈希里面 表,谁就是所谓的$表。 我迫使它通过调用为小写 一个函数的tolower()的非常相似 C,但这样做的整个单词, 不是一个单一的字符。 如果它被设置,也就是说有 是一个值设置,换言之, 如果这是真的,那么, 这是一个字。 因为我把它放在那里与负载()。 如果没有,我将返回false。 现在,其他人很容易。 功能尺寸(),我该怎么办呢? 我基本上是做回​​$大小。 但我在技术上需要 这样做讨厌的事。 而实际上听到了,我被切割 一个角落里太多了。 我真的需要做全局$表中。 但话虽如此,卸载)。 卸载()是惊人的。 功能卸载()。 我想得到怎样实现卸载()? 完成。 确定。 所以卸载(),内存管理是 完全采取为你照顾 像PHP和很多 的高级语言。 因此,这是惊人的。 像你到底为什么我们花了过去 八加周的C写的 显然很慢,真的时间 消费问题与数十小时 根据我们的皮带工作? 那么,对于一件事,这可能工作 精致的小程序。 这当然加速了我 开发时间。 但是,让我们看看会发生什么 在现实世界中。 让我进入这个目录 在终端窗口。 还有的拼写。 并注意顺便说一句,你可能会 已遇到问题该设置 六,问题设置7。 你不必严格到 结束的PHP文件与书籍。php。 如果把一条线一样,第一次以 极顶,这是一个特殊的行 语法,基本上意味着找到 叫PHP和使用它的程序 解释这个文件。 所以现在没有人真正知道, 我运行一个PHP程序。 我可以运行它,就好像它 被编译的东西在C 但这里的东西。 其实,让我们再次做到这一点。 Dropbox/pset6 /。 还有的拼写。 确定0.44秒。 它得到了更快的这段时间。 现在,让我们进入PHP版本。 很好的接触。 但只是觉得多少时间 我保存于办公时间。 确定。 所以3.59秒,这实际上 听起来并不准确要么。 那是因为长话短说, 当你打印出一个巨大的数额 东西到屏幕上,那 本身会减慢速度。 什么是真正把CPU中的 家电为3.59秒,在 相反,C,历时0.44 秒最近。 这是真正的命令 幅度不同。 那么,是这个价格来自哪里? 为什么这么慢得多? PHP为什么表现如此糟糕? 达尼埃尔? 观众:你不会是真的 使用一个哈希表。 DAVID马兰:我真的不 使用一个哈希表。 所以,我有种做。 所以这是一个关联数组。 最有可能的,如果人们在PHP都是 真的很聪明,他们用下面的 引擎盖实现一个实际的哈希表 在像C或C + +。 但是。 是啊。 观众:[听不清]。 马兰大卫:是的。 所以,每一个我现在写的功能 - 实际上,你可以说,一旦更多的是 大声一点好吗? 观众:每个函数 您收录了很多更全面 能力比 - 马兰大卫:所以这是非常真实的。 还有很多更多的开销,我们是 不是真的由只注重看 dictionary.php,我只是写。 与此相反,有一个整体解释器 将在后台进行。 事实上,当我运行这个程序时,它 没有运行编译零和壹 专为我的英特尔CPU。 相反,它是由线运行线路 PHP代码看起来完全 像我们键入它。 所以每当你使用 解释型语言,你 其实也付出这个代价。 这将需要一些时间来阅读 您的文件从上到下,从左 右,然后执行各 线连连。 现在在现实中,尤其是在网络上, 实际上你可以加速这一进程 通过缓存的结果 PHP代码被解释。 而这是有道理的在网络上,因为 如果你还没有一个用户喜欢 我在这里,但1,000或10,000个用户,然后 也许是第一次该文件是 访问它的缓慢,但此后 它的速度更快。 然而,这也再一次是一个权衡。 而对于一个类似的研究数据 设置,甚至一些大的像 这一点,你的用户将最终 开始觉得放缓。 因此,在短期,解释语言 非常流行,非常受欢迎, 坦率地说可能是你的语言 要达到解决问题的时 到CS50后续。 但要意识到你是多么真的 理所当然的引擎盖下 真的那些过去的​​几个星期中的散列 表和树,并尝试, 这是用来实际上最终 实现类的东西打开支架, 方括号,这是我们现在可以 感激地想当然。 因此,让我们来看看现在 在本网站范围内。 和我上次提到的有 在PHP中一堆超全局变量的 是不是真的有关 在命令行中。 他们是在上下文中更相关 用在web环境的PHP。 因此,为了在Web服务器上运行PHP 生成的东西,如HTML。 我们看了一眼$ _GET和$ _POST和 这就是自动用户 输入端起来简单,如果你提交 形成在结尾的文件。关于php的网页 服务器类的设备。 但是,让我们简要地看 $ _COOKIE和$ _SESSION。 通俗地说,什么是Cookie作为 你了解它的背景 使用网络? 观众:文件的计算机上。 马兰大卫:是的。 它是在用户的计算机上的文件 用任何网站栽 你碰巧访问。 所以当你去到Facebook,当你去 到bankofamerica.com,当你去 到google.com,当你去到几乎任何 网站在世界上的这些天, 包括cs50.net,一个cookie种植 您的计算机上,这是 无论是存储在RAM中的值的 计算机在您的浏览器的内存,或 有时确实是一个文件存储 在您的硬盘驱动器。 ,什么是通常存储在该文件中 是不是你的用户名,而不是你的 密码,通常不是 敏感,除非该网站是不是这样 用好他们的安全,而是 它是其中一个很大的唯一标识符 其他的事情。 这是一个大的随机数栽在您的 计算机,但你能想到的作为 有点像从虚拟邮戳 一个俱乐部或者一些游乐园的 使工作人员介绍,业主 服务,要记住你是谁。 因此,如果大的随机数是一样 12345678,尽管这显然 不要太随意,认为那是的 邮戳,当您访问 facebook.com首次,它们 邮票上的手数。 然后,因为你讲的HTTP,您 是一个浏览器,并因为Facebook 显然可以使用相同的网络 服务器,该协议的HTTP说, 任何时候你随后参观 facebook.com,无论是第二 以后,一个小时后,甚至在第二天, 所以只要你有没有明确 注销,其有效 就像洗手。 HTTP说,你应该出示您的 用手戳你每次 返回到该网站。 Facebook上有什么不那么它们是 看那个邮戳及 他们说,哦,123456789。 我不知道第一眼就这 是大卫·马兰在剑桥, 马萨诸塞州,但他们可以检查自己 数据库和说,哦,这个人 在其计算机上,我们种植123456789 是大卫·马兰剑桥, 马萨诸塞州。 让我们显示,用户随后他的个人资料 页面或他的新闻联播。 但是有一个问题就在这里,如果这 是如何在网上确实有效。 让我们来看看一个简单的例子。 让我们真正去说facebook.com。 但在此之前,我们可以去那里,让 我去进取,不断开拓Chrome的 检查到这里。 让我看看网络选项卡。 现在,让我们继续前进,键入 在https://facebook.com。 而且我这样做,让我们看不到 所有这些重定向和浪费 时间翻翻那些。 让我回车。 好的。 我们看到一大堆的请求。 有来自Facebook的。 还有一大堆的文件。 在这里,我每提 等待最后一次,这是 大量的HTTP请求。 但第一个可能是 最有趣的。 因此,让我们在这里向下滚动,并 我会放大,在第二。 这将是一种 一个烂摊子,但让我们来看看。 Facebook正在向我们发送 一大堆的东西。 但是,哇,有意思。 他们种植不是一个,而是四个 手邮票到这里我的手。 设置Cookie,设置Cookie,设置的cookie, 设置的cookie。 而且有一些功能在这里。 所有的人提一些 那种过期的。 它看起来像Facebook希望 记住我,直到2015年。 所以这是大概的时间由 我必须或注销他们就会 自动假设我 不回来了。 所以这实际上是一个体面的 量的时间。 另外还有一些其他的 事情怎么回事。 此cookie似乎是强行 说是在1970年到期删除 之前的cookie存在。 因此,浏览器只是将 假设好了,这就像 洗完手的邮票。 但现在,当我的浏览器,使 后续请求 - 让我继续前进,这样做 再次重装。 现在,让我向后滚动到 顶请求和下井 在这里,请求头。 注意到这一点。 所以,现在我下不响应头是, 但发现它说请求头。 并且发现我的浏览器的一部分 打重装后其请求有 至少发送以下 信息。 没有设置cookie的,但是饼干。 因此,这是该行,HTTP标头等等 可以说,在我的浏览器排序 无我知道它呈现 我的手对Facebook的检查。 所以,这些cookie可以 然后,用什么? 要记住你是谁,或记得如何 你去过很多次出现,或 真的什么。 因此,这里是counter.php。 让我放大字体。 而我每次重新加载该页面,通知时间 它的回忆多少次 我去过那儿。 嗯,这是不是所有的令人印象深刻。 让我们只需关闭该选项卡, 现在让我们回到 http://localhost/counter.php。 哦,这很有趣。 它仍然记得,即使 虽然我关闭的选项卡。 坦率地说,如果我关闭浏览器, 如果实施正确的方式,我 还记得,这是用户 他或她是谁是第一次,并且 只有一次我进入Chrome的菜单, 在这里在这里,去 历史,并点击清除浏览数据, 因为一些你可能在 过去,只有这样,你的cookies 实际上网络中被删除 发展。 所以,如果我们去 - 让我们在这里收起来的gedit。 如果我们现在去这个文件。 让我进入我们 虚拟主机/本地主机/大众,让我做 counter.php。 请注意,这是一个相当 简单的程序。 这是一个相当简单的网站。 这样的文件的顶部 只是意见。 但这里有一个新的行,你可以 已对设置7已经看到, 在session_start()。 这是一行PHP代码 主要用来告诉网络服务器,使 一定要杜绝的双手,使 一定要检查手的邮票。 这是所有行的作用,以及它 完成所有的过程我们。 然后注意到我刚刚拿到了 两个分支在这里。 如果这里面的关键计数器 所谓特殊的全局变量 $ _SESSION设置 - 换句话说, 如果有一定的价值存在 - 让我们得到它,并将其存储在本地 变量$计数器。 否则,让我们分配$计数器 的默认值0。 现在,这里是PHP的一个方面,这是 既是祝福,也是诅咒。 PHP是有点草率。 因此而在C中,会是什么 计数器的范围已经 无论是在这里还是在这里? 它会被限制 那些大括号。 你猜怎么着? 在PHP中,它的存在甚至外面的那些 大括号,在这里,在这里, 这里,这里,和 甚至楼下。 所以我说,这是在这个意义上的祝福 你不必想的那么 很难,因为我们做星期前。 但它也有点在诅咒 无论您在使用变量 PHP中,至少在这样的程序中, 它的全局访问 或好或坏。 所以,你必须记住,现在 您的变量不能是不确定的。 你可能已经在其他地方定义它们。 但我怎么做最终? 我要存储的全球内部 变量的值 计数器键的结果 做计数器加1。 所以这只是算术 该做 递增的计数器。 而事实上,我存储了 价值早在这里是指 数据库基本更新到 记住用户123456789已 这里两次。 当我下一次再这样做我 重新加载页面,它会检查 我的手印章,说,哦, 用户123456789已现 来过这里三次。 还等什么PHP和类似的语言 这样做对我们来说是他们盘算 如何以及在何处以及多长时间 存储在这个特殊值 超全局。 而这个超级全局下一次我 访问的页面是有点神奇 预填充,填充值 在那里你访问的最后时间, 这是否是在一秒钟前,一个星期 前,或在2013年,我们现在谈 大约在2015年。 PHP和Web服务器打理 的所有的给你。 观众:[听不清]。 DAVID马兰:PHP中的变量是 本质上始终是全局的,除非你 在函数中声明它们, 然后他们是本地的 该功能只。 但是因为我没有写任何 功能,他们现在有效 全球在我这里整个文件。 观众:是否有办法 让他们本地的? 马兰国宝:有没有 方法,使他们本地的? 只有通过包装成的功能。 这在最新版本的 PHP中,你可以用这个做 一个匿名函数。 但更多的,在 JavaScript的情况下。 但简单的答案是否定的。 较长的答案是肯定的。 尼斯。 良好的测验问题。 好的。 所以最后,页面本身是 其实很简单。 请注意,一旦我退出PHP模式,召回 所有的这些东西下来 下面只是要得到吐 出生到浏览器。 这是很好的,因为我也想送 一些HTML,但我确实希望用户 动态更新HTML。 我可以做到这一点的方法之一是进行排序 非常迅速回落到PHP 模式,采用开放式支架问号 等号,然后输出值 的计数器。 或者,如果这看起来有点神秘,这 等号,其实只是一些 语法糖这 的printf($计数器)。 但坦率地说,这只是一点点丑 和一点点讨厌的类型。 所以PHP的非常漂亮,提供此功能 在那里你可以说它更 简洁地以同样的方式。 那么什么是底下怎么回事 油烟机? 让我们来快速浏览一下网络 选项​​卡这里counter.php。 让我继续前进,第一 让我们来清理cookies。 因为让我们清除浏览数据 刚开始的时候。 现在,让我们回到了这里。 现在让我们来重新加载页面。 而我回到零。 因为我的手的邮票已经洗净, 我现在得到一个新的cookie。 事实上,如果我看网络选项卡, 看响应头,另行通知 该设备是给我 他的名字是有点一个cookie 随意但那种, 合理,PHPSESSID。 并且它送我这真的 大随机数。 这不是不少。 它不是相当的十六进制。 这是某种字母数字字符串, 但据推测这是随机的。 那就是邮戳所以 说话那我指的是。 同时,如果我重装一下,然后 看看这个第二行第二个我 要求,现在通知我的要求 头文件包含PHPSESSID等于这一点, 没有设置cookie的,但只是饼干。 这是我的浏览器的演示文稿 我手里的邮票。 所以,现在作为传情,我们将讨论更多 这在一个星期左右,但 以什么方式这使你 脆弱的,你的Facebook帐户 脆弱的,和其他类似 账户脆弱? 观众:如果有人有你的cookie。 DAVID MALAN:是啊,如果有人 有你的cookie。 我是说真的,就像你们中的一些 可能试图在像一个俱乐部或 游乐园,如果你尝试的东西 这样的复制邮票,虽然 倒退到另一个人的手, 然后他或她提出它作为 自己的,如果它实际上看起来确实 同样,123456789,那么网络 服务器显然只是要 相信,该用户就是你。 这确实是一个根本性的 威胁你使用cookies的任何时间 因为如果有人只是欺骗所以 说出你的cookie,计算出它是什么 是,无论是真正的将其复制 通过看你的电脑 和被喜欢,确定。 大卫的cookie是JJ3JIK等等, 然后他们够聪明,知道 怎么样的手动发送 从浏览器或一个cookie 计划他们写,他们可以完全 登录到一个网站,你。 它是不是很难假装 别人,除非我们重新对集 2,介绍什么? 观众:密码学。 DAVID马兰:有点 密码学位。 简单的密码系统,至少在 标准版,但加密 不过。 少。 所以,事实证明,如果你加密所有的 这些头文件使用的东西,你 现在可能知道作为SSL的详细亲切, 安全套接字层,或https://开头的URL, 那么所有的这些事情,我们一直 瞥了一眼实际上是加密的, 这意味着它就像你 无法读取邮戳。 只有facebook.com可以,或者google.com, 或者在这种情况下,该设备可以 阅读邮戳。 可悲的是,虽然,并再次,这是 太合适了NSA的东西 后期,甚至是SSL是易碎的。 它实际上并不难 即使破解了加密。 没那么通过破解加密了, 但通过欺骗的 浏览器到解密 数据过早。 但同样,我们会挑逗你 与之前长。 现在,只是害怕。 它是可悲的一种真实。 好的。 因此,如果没有这个现在离开我们呢? 那么,让我们做到这一点。 让我们继续前进,并采取快速 传情之前,我们休息一下。 我想我们会一直这样时间长一点 今天,但我们要潜入 一些全新的性感,这将 激起你的食欲,甚至更多。 所以这是玩笑话。 因此SQL,我们开始谈论 曾经如此短暂最后一次。 你会真正得到你的手脏 有一些它在对设置7。 和通俗地说,这是什么SQL - S-Q-L - 为你做点什么? 这是什么? 是啊。 观众:让您存取数据。 马兰大卫:是的。 它让你的数据访问 在数据库中。 结构化查询语言。 这实质上是一个 编程语言。 有它的功能, 我们不会在课堂上什至使用。 但是你可以有效地 定义函数。 他们被称为存储 在SQL过程。 但我们会保持它相当简单,只是 使用它的一些基本操作 如选择数据,插入数据, 更新数据和删除数据。 而你真的可以想到一个数据库, 就像一个SQL数据库,只需 即Microsoft Excel中。 因为SQL是指一个关系 数据库,其中 就只是意味着表。 行和列。 所以,只要你可以把电子表格 这样或谷歌文档, 你可以放入一个SQL数据库 通过声明一个表。 现在,你如何实际访问 这些信息? 那么,与命令或 查询是这样的。 SELECT,INSERT,UPDATE和DELETE。 并且在大多数情况下,这些都是 你需要到四只成份 做的东西很有力 在问题设置7。 现在又回到了一天,你居然会 在一个数据库交互 黑色和白色终端窗口 闪烁的提示是这样的。 而我们在运行数据库 器具被称为MySQL的,这是 自由和开放源码的数据库引擎。 如果谷歌和阅读维基百科 的文章,你就会知道这个名字是 对于一些有点过渡 Linux版本。 玛丽亚数据库实际上是一个 叉这么说的MySQL。 长话短说,甲骨文收购了MySQL。 甲骨文是一家大公司。 人们一直担心,它会 不再停留相当开源, 所以这是MySQL的只是一个副本,这是 还是免费的,还是开源的, 默认安装在Fedora Linux系统。 但是,这是一种在痛 脖子上结识一 数据库这种方式。 所以我们在CS50包括家电 一个免费的开源工具,称为 phpMyAdmin的。 仅仅是巧合 它是用PHP编写的。 有没有根本 需要为PHP在这里。 但是这仅仅是一个基于Web的工具, 我们免费下载,安装在 家电,这使我们能够有一个 与该图形用户界面 探索对集合7个数据库 要创建新的数据库, 说为自己最后的项目,如果你愿意 像,并最终创造 动态网站像CS50财经 使您可以查询数据和 动态更新数据。 你不会有只使用 一个简单的文本文件或CSV。 实际上,你可以使用智能资料库 程序使您可以执行更多 不仅仅是阅读复杂的查询 通过线性的一切。 因此,例如,这就是我们给 你对P-集合7个盒子。 这是显然的至少一个表 三列,其中之一是 用户名,其中一个是散, 而另一个是识别码。 但有趣的东西,只是为了 这里梳理出一个念头,用户名 大概是已经独一无二的,对不对? 我的意思是,几乎所有的网站,如果 你有一个用户名,有 不能由两个凯撒。 不能有两个malans。 不能有两个jharvards。 其独特的。 否则,他们不知道哪个 jharvard它实际上是。 所以,可能是什么动机也 具有在左边的第三列 还有所谓的ID,它看起来像一个 数字是同样独特之处? 感觉有点多余 我第一眼。 为什么它可能引人注目的有 不仅是唯一的用户名, 而且唯一的数字? 观众:他们可以有 相同的密码。 DAVID马兰:人们可能有 相同的密码,确保万无一失。 这可能完全发生。 但是,如果他们有这样的唯一的用户名,我 会说,其实并不 事,因为如果他们在键入他们的 用户名,我只需要检查他们的 密码,其自己的哈希值。 否则为什么? 观众:更快速的搜寻。 DAVID马兰:更快速的搜寻。 为什么呢? 观众:ID是只有一个。 DAVID马兰:ID是一个字符, 或者更确切地说,它是一个数字, 因此它可能是32位 或者类似的东西。 而用户名,显然杰森 赫塞豪恩的上升有几分 可笑的长,而且它要 带我去了很多时间转换为字符串 比较H-I-R-S-C-H-H-O-R-N,也许 一/ 0或类似的东西,为了 查找杰森,而不是仅仅 说给我的用户排名第二。 这是32位。 它是一个单一的诠释 你要比较。 事实上,这也正是为什么数据库 倾向于分配唯一的ID来 列在其中。 现在,还有什么其他的数据类型是有 除了INT和明显 像这样的字符串? 嗯,更正确, SQL数据库,如 MySQL中,有煤焦领域。 和char有点误导 不是单一的CHAR。 在MySQL数据库中的CHAR字段是 一个或多个字符,但它是一个 个字符的固定数目。 因此,举例来说,如果我去到 phpMyAdmin的,你可能已经或 很快将问题设置7,和我一起去 我的数据库,只是为了好玩, 让我们创建一个新的表称为 测试只有两列。 然后我就单击Go。 而这将成为相当熟悉, 尤其是当你鼓捣 围绕在你自己的。 在这里,我可以键入ID来创建 INT类型的新表。 但在这里我可以键入用户名 重新创建表的前面。 并注意我有一大堆 的类型可供选择。 而这也是为什么phpMyAdmin的 是种不错的。 这是一种自我的教学中,你 能正中下怀点,并单击, 看下拉菜单,并从推断 什么权力的SQL给你。 事实上,如果让我选择CHAR,然后我 必须指定长度,或如何 许多值,有多少个字符。 所以,很常见的值是一样的东西 255,但是这是一个有点长。 通常是八输入用户名。 但是,这是一个有点小的这些天。 因此,这是一个设计决策。 它是最多8个字符, 32,255,1,000? 这真的取决于你。 但一个CHAR字段是一个定数。 因此,选择太少,你是那种 如果你想有一个较长的用户名搞砸。 选择太多,什么是 坏处? 观众:[听不清]。 DAVID马兰:这是一种浪费。 就像在C,如果你有一个更大的 的内存块比你需要的,你 只是在浪费时间和浪费的空间。 因此,作为一种替代,存在着 VARCHAR,其通过解决了这个问题 治疗长度不为固定长度, 但作为一个最大长度,并使用 可变数目的char,然后 往往只使用尽可能多的在字符作为你 实际需要。 这听起来很完美。 我们为什么不摆脱 CHAR数据类型呢? 可能是什么的缺点 使用VARCHAR处理,这听起来 就像是一个不错的双赢? 是吗? 观众:[听不清]。 DAVID MALAN:好,好。 所以,如果所有的数据都是一样的 长,有什么顾虑? 观众:因为你在浪费 告诉他们所有数据。 马兰大卫:所以,如果您的所有数据是 相同的长度,不过,我认为 该指定的最大长度 在VARCHAR是没有不同 在指定的CHAR固定长度的,如果 你知道这个数字在前进。 但现在却是,我会有点 从答案中提取的现实 这还是有一个最大,这可能 是恼人的,特别是如果你 遇到一个人的名字那 特别长,你没 预期。 而且这也有点低效率 实际上在VARCHAR的搜索为 相对于搜索在字符,尤其是 对于有大量和长期的表 大量数据。 所以在这里也一样,主题又是 没有明显的选择。 所以才给你其他的感觉 可能会感兴趣的数据类型 无论是对设置7或 未来,还有诠释。 有BIGINT,这 就像很久很久。 它往往是64位。 有小数,你会看到在 问题集,这是一个非常 到清洁的问题,我们的答案 与浮动和浮动遇到 点不精确。 然后还有DATETIME。 有字面上,有一个数据类型 看起来就像是一年,一个月,一天, 和一个小时,分钟和秒。 但是,SQL数据库也有 东西我们称之为索引。 和索引的东西,你 指定创建表时 让搜索和其他操作 更有效。 具体来说,有一种叫 主索引,你可以 声明如下。 我们用这样做对你 用户表,我们给你。 但是请注意,如果我手动重新创建 用户表这里给 它的用户的名称。 我已经指定ID。 我指定的诠释。 我指定的用户名与 最多32个字符。 但是,如果我们继续滚动在这个相当 宽的窗口,通知有一个 一堆其他的东西,我可以指定。 一,我可以指定属性 就像,你知道吗,这 诠释应该是无符号的。 我不想负数, 所以我们让它无符号。 null是不是与此有关,因为 我也希望每个用户 有一个唯一的号码。 我不希望它为null。 但是,这是有趣的。 我可以指定ID是要么 该数据库的主键,或者它 独特的,或者它的索引或全文。 因此,对于今天的目的,很长的故事 总之,主要手段,这应 是从概念上和技术上 我们用来唯一领域 识别用户。 因此,当我们仰望的用户,这是排序 的承诺,主要是通过找一找 那唯一的标识符。 并且数据库将确保,如果你 有一个用户号码3,你不能 物理插入另一个用户 与相同数目3。 该数据库将刚刚拒绝 保存更改。 这是一件好事,因为你可以 保护自己免受自己。自我 另外,对于用户名。 因此,在第二排,召回, 是用户名字段。 所以在这里,第二行是用户名, 因为我们没有在最左边那里。 那么还有什么我可能要指定? 我不能,根据SQL语句, 指定两个主键。 您可以指定一个联合密钥,你 看着这两个领域,但他们不能 分别是主键。 所以这是不可能的。 所以,这可能我想选择? 好吧,独特的是在精神上有类似 在那里你指定这个主键 域应是唯一的,但它的 不会是一 我用所有的时间。 而且我们不打算使用这一个所有 时间为的是什么了吗? 它的速度较慢,如果可能 这是一个漫长的用户名。 这只是在浪费时间。 指数,同时,指定它的 不会是唯一的,但我想 你的工作你的魔法下的 油烟机,使其更快地为我 搜索这个领域。 因此,这可能不是与此有关。 对于用户名,我要说的却是 独特之处是一个很好的答案。 但是假设我们做了更多用户 不仅仅是用户名有意思, 哈希,和身份证号码。 如果我们给了人们充分的名字呢? 如果我们给他们的地址 以及关于它们的其他数据? 好吧,如果你指定了一个列 数据库建立索引,这意味着 的MySQL或Oracle,或者任何数据库 你使用,应该工作它的魔力 并使用某种奇特的数据 就像一棵树,或一个线索,或结构 哈希表,什么保证 当你使用搜索数据 选择在那个特定的领域 - 就像告诉我大家, 住在牛津街。 查询这样的。 如果事先已指定 你想在该领域中的指数, 搜索将是非常非常快。 如果不指定索引,最好 你可以做的是,如果一个线性搜索 它没有排序。 但如果指定索引,智能 人谁做的资料库 - 你这样的人谁知道现在树 并试图和哈希表 - 会自动建立这样一个数据 结构在RAM中,以确保 这些搜索速度更快。 FULLTEXT同时也是世界上精神相似, 但可以让你做通配符 搜索,就像告诉我大家, 住在开头的街道 字母O无论出于何种原因。 你可以做通配符搜索 这样的。 或者,像表演更引人注目的东西 我大家谁都有这个词 - 告诉我每个人都为名称开头 与一个特定的字母。 您可以搜索关键字 在这种方式。 好的。 因此,设计机会 可能有。 另外有一些人,我会 我挥动双手。 事实证明,你可以有 不同的存储引擎。 这是更神秘的比我们需要的 肯定是问题设置7。 默认情况下,你们正在使用 一些所谓的InnoDB。 你会看到提到这个地方在 phpMyAdmin的界面最有可能的。 但是要知道,还有其他的设计 这是潜在的决定 兴趣来最终项目是否 你做一些基于Web的。 但是,让我们做到这一点。 让我们继续前进,把这点 屏幕作为传情的故事 包括你,一个室友, 和一杯牛奶。 让我们在两分钟 左右突破这里。 如果你能留下来,让我们来 回来了,看起来有点多在SQL和 然后有点用的JavaScript 对设置在脑海8。 好的。 所以,让我们给你思考一个 可以非常容易出现极端状况 在使用数据库,或上下文 坦率地说,即使使用真实世界的事情 像自动取款机取钱。 所以这里有一个冰箱。 假设你已经有一个了 你的宿舍或者你的房子。 你已经得到了一个室友的都有,和 你真的喜欢牛奶的实例。 所以,你回家从类一天。 他或她还没有回来。 你打开冰箱。 你真的想要的一大杯牛奶。 有没有牛奶。 所以,你会怎么做? 你关闭了冰箱。 你抢你的钥匙。 你出去到广场。 而你在得到线在CVS的那些 自助结帐的东西,它总是 需要更长的时间比实际 有收银员。 总之。 那么,与此同时,小点小点小点,你的 室友回家,他或她 类似地具有一个渴望 对于一些牛奶。 于是,他或她打开冰箱, 看起来里面,哦,该死的。 没有牛奶。 于是,他或她领导了,偏偏去 到其它的CVS,只有这是一个 方框相差出于某种原因,他或 她会在网上买一些牛奶。 同时,你回家的时候,他或 她回家,和做什么 你最终有吗? 两倍的牛奶。 但你真的不喜欢 牛奶那么多。 所以,现在你有这么多的牛奶,现在 其中之一是刚准备去酸 最终。 所以这是一个非常糟糕的问题。 对吗? 所以,发生了什么事? 所以从根本上,这是一种 荒谬的例子。 但引擎盖下,我们已经有 在这里发生的是你们两个检查 某一段的状态 存储器,该冰箱。 你们俩检查状态 一些变量。 你们都画了一个结论, 那你再采取行动。 但不幸的是,当你的室友 是在商店,那状态 变变了,他或她回来 现在想改变状态,但 它已经被改变 他或她。 当然,他或她会不会有 去商店,如果他们知道 您已经在途中。 所以,在现实世界中,你怎么能这样 避免这个问题,假设你有 冰箱,你有一个室友, 而你居然喜欢牛奶? 观众:沟通。 DAVID马兰:沟通。 确定。 但如何可能你沟通? 观众:留一个便条。 DAVID马兰:留一个便条,对不对? 总是留下一张纸条,为 该节目的球迷。 好吧,所以总是留下一张纸条,或 把真正喜欢一个挂锁或某事 上,让您的冰箱 从检查的状态室友 该变量。 现在,为什么会这样有密切关系 问题设置7,或到自动取款机。 那么,想象在一个ATM的世界里 你也许可以去到一个ATM 机器在这里,并在这里另一个自动取款机。 而这经常​​发生。 并假设您有两个ATM卡, 这有可能获得。 和您登录到两台机器 同时有效,希望 虽然没有人在找。 然后你在你的PIN码输入 大致同时。 然后,你做一个查询余额 就看你有多少现金。 让我们说你有100元, 留在您的帐户。 所以基本上同时,你 说一,零,零,输入。 而你希望拿回一些钱。 但多少钱可能你回来? 现在在一天结束电脑, 特别是如果他们在跟谁说话 服务器,不一定做的事情 在该命令中的预期。 因此,假设会发生什么,因为, 无论网络速度问题有 是,或CPU的问题有,或 这样的事情,假设 第一台ATM检查您的平衡和 看,哦,这个人有100元。 但随后被分心,因为也许 备份正在发生,所以它的 放缓。 或者,也许在检查中,网络 连接有一点点慢,因为 这只是发生。 他们是物理设备。 如此同时,第二ATM是 问同样的问题。 多少钱,大卫有哪些? 100元的答案。 但是,因为第一个ATM尚未 发送的消息减去100元,两者 自动取款机已视察该银行的金库, 看到有100美元那里,而现在 两台机器都可能 要吐出一个答案。 现在,这是伟大的,你在某种意义上 如果银行做什么,最终 由量改变至负100 设置变量等于你 银行账户等于0,而不是 干嘛减去100。 现在,在最坏的情况下为银行 - 或者在最好的银行,同时, 他们给你200美元, 您的银行帐户现在显示负 100元,这确实不 有利于你的。 但问题是,这个比赛 条件两个室友越来越 牛奶,或两个自动取款机试图获得现金 和更改保管库的状态 在同一时间存在任何 时间,你有一个数据库。 现在,在问题设置7,本次发行 出现在这个意义上,如果你买了 股Facebook股票,然后对 比如你买的第二份额 Facebook股票,你需要做 决定作为编程器。 为了决定如何更新 数据库,赔率是你要 有一个行的股票,而这 是实现它的方法之一。 而你将有一股 FB,这是他们的股票代码 这个用户名,或该用户 ID,该唯一标识符。 但是,同样的故事可以发生在这里。 如果你做一个选择在SQL中,你会看到 在问题设置7,当你看到, 哦,大卫有一股 Facebook股票。 现在让我改变这是两股, 因为他想买一个 第二份额。 但是,假设大卫实际上有两个 浏览器窗口打开,或假设 它与夫妻双方联名账户, 和他们两人都试图执行 相同的操作,有,同样, 可能存在的决定是 基于以前提出 世界上的国家 - 该帐户拥有一股股份 - 并且两个人,或者两个服务器,现在 试试再说吧递增到两股。 但在这种情况下,您可能已落案起诉 我的钱为股份,但 增加只是一次。 所以,总之,最根本的问题 在这里,与笑话留下 注意,或把挂锁就可以了,是 如果两个人,或者两个线程 - 回想起刮 - 可以检查一些变量的状态 然后试图更改变量, 但这两件事情不要发生在 同一时间,但可以被打断 其他的事情发生,数据可 进入一个非常奇怪的状态。 而且你可以受益,也可以承受 在金钱例的意义。 因此,在问题设置7,我们给你 这一行代码,其中长 总而言之,解决了这个 问题在MySQL。 这个很长的指令不 甚至适合到上一行 屏幕在这里可以确保您的操作 是所谓的原子。 这一切都发生在一次,或者 它不会发生的。 这个很长的短语不能 得到部分中断。 和它做什么简直是 它说什么。 插入一些表如下 三场的那些特定的值, 但重复键, 不要做一个插入。 做一个更新。 因此,这就像做一个SELECT和 INSERT可以这么说在同一时间。 什么是关键这可能是 被引用到这里? 事实证明,你会看到在这个 问题设置7的规格,因为 我们已经宣布那里是一个唯一的密钥 这个特定的表上,使得 你不能有多个行 用于与相同的用户 同样一分钱的股票代码 - 在这里这个例子中,DVN.V是 一个愚蠢的仙股,我们 是指在规范中。 因为我们已经宣布它是唯一的, 这是什么意思是,如果你 尝试插入重复行,你 而不是去而不更新它 任何人有机会改变 世界上的任何国家。 因此,在短期,这确保 事情是原子的。 更一般地,虽然,数据库 如MySQL - 而你不需要这个功能的 对设置7,但请记住它的 未来 - 支持所谓的交易, 在那里你可以说 从字面上START TRANSACTION。 然后,您可以执行 两个SQL语句。 和一个SQL语句,你会看到 在对设置7,显得有些 这样的事情。 更新的表中调用帐户。 设置余额列等于什么 目前余额栏 是减去1,000,其中的数量, 帐户号码,如用户ID, 等于2,然后更新 账户点缀点点。 因此,在外行人的术语,什么这两个 查询似乎在做的 银行业的现实世界有意义吗? 观众:转移到储蓄。 DAVID马兰:没错。 从一个转移资金 向另一方。 这是另一个例子,你 真的想这两件事情发生 或不会发生。 你不想要的东西,得到的 他们中间,有可能陷入困境 算算,还是搞砸了多少 钱,你有,或有多少 钱的银行都有。 那么什么是真正好的关于交易 在MySQL的是,和 数据库更一般地,是它们 以及谁已经实现的聪明人 这些特性弄清楚如何使 确保两个的事情发生 或根本没有。 如果你是真正有志于做 这是由人使用的网站上 校园里,人们在现实世界中,做 东西在启动意义上说, 这些都是种 设计决策 变得比以往那么重要。 否则,你就开始失去数据,输 用户,或者在最坏的情况下为 我们在这里看到的,潜在的 赔钱。 如此反复,更多,在问题设置 7,还有可能对某些 你在最后的项目。 因此,让我们改变图片中我们有 刚才只是一种方式。 因此,让我能不能我居然看到 - 不,那已经走了。 在那里,它是。 所以这是我们离开最后一次。 而事实证明,我们要去折腾 一件事情到这里混 - 一个名为JavaScript语言。 所以,JavaScript实际上适合 进入这片 - 而且我也不太留有足够的空间, 所以这不是现在的规模。 OK,这是值得同情的。 好了,这就是JavaScript的。 好的。 我真的这样做了倒忙。 好的。 因此,JavaScript是另一种编程 语言和我们的最后,有没有什么帮助 放心,有没有什么更 的消防栓在这里。 这样的JavaScript也是一种解释 语言,这意味着你不 它编译成零和一。 你只要运行它。 但是,什么是有根本不同的 JavaScript的通常是你 不要在Web服务器上运行它。 它不会在运行 家电本身。 相反,它就会被用户下载 通过HTTP到他们的浏览器 - Chrome浏览器,Safari浏览器,IE浏览器, Firefox的,不管是谁 - 并且它是执行这个浏览器 特定的编程语言。 所以要清楚,PHP迄今已 无论是执行在命令行 我们的黑与白的窗口,在服务器上 像设备,计算机 喜欢该设备,或者它已经 由Web服务器执行 在计算机上运行。 但这里的主题是,PHP迄今 已被执行的服务器端,所以 用户和用户的浏览器 永远看不到一行PHP代码。 事实上,如果你曾经打开一个浏览器 您的网站或其他和你 实际看到的PHP代码在你的窗口, 有人搞砸了。 因为它并不意味着是 直接发送到一个浏览器。 它应该被执行转身 成类似HTML。 但JavaScript的本质 相反。 它的意思是典型的内部运行 的用户的浏览器窗口。 和使用什么类型的网站 然后,JavaScript的这些日子? 如同字面上每个受欢迎的网站。 每一个网站,你们大概 每天使用使用JavaScript的 最简单的,甚至 最性感的特点。 因此,像Fac​​ebook的 聊天,如果您使用。 如何实际工作? 以及迄今,所有的东西,我们已经 完成了HTML和PHP假定 你拉了一个网址,你敲回车, 和你看到一些HTML内容。 而你点击链接,即改变 网址,改变了页面,并重新加载 一些新的内容。 点击另一个URL或者提交一个表单,你 获得护送到另一个页面, 你看到了一些新的内容。 但使用类似Facebook的聊天, 或Gchat,或谷歌地图,很少 没有整个页面刷新,使得 你看到一个白色屏幕片刻, 然后新的内容。 更确切地说,网页今天是动态 再次得到更新 一次又一次的所有排序 幕后。 而事实证明,当你去 像Facebook或Gchat, 或Gmail和页面更新 无自动重装 整个屏幕上,发生的是, 您的浏览器已排序的秘密 额外的HTTP请求 - 不是整个网页,但只为 数据的小的块,如 即时消息,你的朋友刚刚 送你,或状态的更新, 刚刚有人送你,或鸣叫 有人刚刚发。 它只是让小请求 数据,然后使用JavaScript,这 编程语言,要改变什么 网页看起来像没有 服务器的帮助,无需服务器 生成的HTML。 所以,总之,可以使用JavaScript的再 不仅从获取新数据 无需重新加载整个服务器 页面或提交表单。 它也可以用来改变 所谓的DOM - 文档对象模型 - 这仅仅是看中方式 说的HTML的树 我们看到最后一次。 所以安抚,JavaScript是 所以语法类似于C为好。 有没有主函数。 你刚开始写代码 它会得到执行,或 更恰当的解释。 条件如下所示。 无异于C或 PHP为此事。 布尔表达式或 - 编在一起 看起来就像这样。 相与在一起看起来像这样。 交换机将看起来像这样。 for循环看起来会像这样。 while循环看起来会像这样。 做while循环看起来会像这样。 这是新的。 所以,JavaScript有没有一个foreach 构造本身,而是该构建 对于变量i的数组,和我在这 情况变成一个索引值。 因此,它是从一点点不同 的foreach,虽然新版本 JavaScript的是走出来的时候, 因此,即使这些语言特性 正在不断发展。 并顺便说一句,JavaScript的这些日子 也可以用一台服务器上一样 使用PHP名为Node.js的框架 一个CS50的转录因子,凯文,导致一 研讨会上的Node.js这是可在 cs50.net/seminars。 所以,如果你很好奇,知道你 可以在服务器端作为使用本 好了,但是这是一个相当新的趋势, 但一个强大的一个。 这是一个有点不同。 这是在JavaScript的数组。 什么打你不同 与C或PHP? 这里有几个简单的故事 我们可以在这里告诉。 现在缺少对PHP的? 观众:[听不清]。 DAVID马兰:怎么了? 对不起,再说一遍吗? 观众:不声明 变量的类型。 DAVID马兰:我们不会宣布 变量的类型。 所以,其实蛮喜欢PHP的,我们不是 指定该变量的类型。 相反,我们更一般 话说变种变量。 我们没有的PHP的滋扰 美元符号,这虽然繁琐 类型,并让更多的清楚, 什么是一个变量。 而在这里,我们是有点回 C'S方法只是通过调用 按我们想要的变量名称 给它,像数字。 也像PHP,我们有 方括号内为 该数组内的值。 在JavaScript中这样的变量也 可能是这样的。 注意这里,这是一个称为S字符串, 但同样有我们没有指定 这是一个字符串。 这里虽然是一种功能,不 存在于恰好在PHP中相同的方式, 但有点类似。 这是在JavaScript中的对象。 而对象是类的瑞士军刀 的数据结构中,你刀 可以将它们用于任何数量的东西。 在这里,例如,我们正在声明 一个变量名为报价。 该变量的类型 是一个对象。 你可以认为这是一个C结构 有键和值。 符号是一个关键。 FB是一个值,显然 股票代码。 逗号。 价格是另一个关键,它的值是 显然是浮点,或一个 更一般地在数字 的JavaScript49.26美元。 所以,PHP不具备 - 我们还没有看到PHP对象相当 像这样,但我们也看到一个模拟, 这是什么? 观众:[听不清]。 DAVID马兰:关联数组。 因此而PHP有关联数组 其语法是有史以来略等 不同的 - 我们看到了方括号。 我们看到了奇怪的箭头符号。 JavaScript有对象,但这是 大多是语义差异和 不同的同义词了。 不过,顺便说一句,PHP也有 在某种程度上对象的Java及其他 语言有对象 面向对象的编程。 但是我们将使用这些刚 数据类型现在。 对象和关联数组。 这其中可能使 更加清楚一点。 这也是为什么一个对象是非常有用的。 当你想声明一个学生, 像Zamyla,我们实际上可以 封装可以这么说那里面 使用花括号,就像反对 一大堆钥匙的前 在这里值。 我们有一个ID,一个房子,一个名字 Zamyla,后跟一个分号作为 通常在最后。 到这里也一样,这是稍微 不同,但也很强大 这些天。 下面是一个数组,我知道,因为 有一个方括号起来 顶部和方括号 在底部。 这就是数据的数组 在JavaScript显然键入? 这是它的外观的阵列 像三个物体。 我知道这只是一个对象 因为大括号。 并注意有大括号, 有些东西,右大括号,逗号, 然后一些,逗号, 然后一些。 所以,这三个参数 用两个逗号隔开。 因此,这是三个对象的数组。 并且其中的每个对象似乎是 一些学生或工作人员 排序,每一个ID, 房子,和名称。 但我已经叫这东西 所谓的JSON - JavaScript对象表示法。 这是一个数据格式,实际上 那么很受欢迎,在 时尚这些天,如果你写了一个 使用Facebook应用程序 API,Twitter的API,真的差点 任何API在那里这些天, 包括一些CS50自己的 你回来的数据是不是在 老同学CSV格式。 因为回想一下,CSV 超简单。 这仅仅是分开列 用逗号。 JSON数据给你更多的元数据。 它有关联的每个值一个键,以便 他们不必只是假设 第零列是一个数值,列 一个是另外一个,第二列是另一回事。 在这里的JSON对象一切都是排序 自我描述的,因为每一个 名字在这个文件中的一个具有字面 在它前面的名称为 带引号的字符串。 因此,让我们来看看一个 几个例子在这里。 让我去到设备。 让我进入我们的虚拟主机 目录进入公众。 让我进入 JavaScript的目录。 让我们去进取,不断开拓 DOM-0.html,其中的DOM只是意味着 文档对象模型。 这是树的东西到 我前面提到的。 让我提出以下建议。 下面是它的一个网页 身体是非常简单的。 所以这儿的底部, 注意到我有一个表格。 我们以前见过的那些。 它有两个输入端,其中一个具有一个 其中一个名称标识,有一种类型的 提交,并且所述第一 一个人的类型是text。 因此,这实际上听起来很简单。 让我们在这里。 让我们回到这个页面在这里。 让我们进入本地主机,并进入 我们的JavaScript目录,并转到 DOM-0,在这里,我们有这样的形式。 所以这是很明显 所有的页面一样。 它有一个名字字段 一个提交按钮。 但我不打算在这里使用PHP。 我将尽一切客户端 所以要如下在JavaScript中发言。 请注意,我确实赋予的名称 这个输入领域的独特 标识符,这实际上 救我一些时间在一个时刻。 并注意我介绍另一个标签 在我的网页的头部,  标记。 因此,它是在这个意义上说,JavaScript是 一个客户端编程语言。 在这种情况下,就像CSS,我已经把 它直接在我的HTML。 但请注意,我已经声明的函数 看起来有点像PHP 语法,但其实这是 JavaScript的,因为再次,它是 客户端在浏览器中。 并以此来猜测这是什么打算 这样做,即使有些语法 这里是新的。 观众:问好谁。 DAVID马兰:这是怎么回事打招呼 对谁访问这个页面。 那么,如何? 因此注意到,原来在JavaScript 有一个alert()函数。 这是一个非常可悲的排序功能, 真的只是往往惹恼用户。 这不是一个你真的应该使用 通常情况下,但它是一个快速和肮脏 这样的排序打印的东西 到的图形用户 接口,就像一个浏览器。 请注意,在这里,我已经有了一个 字符串中的单引号。 事实证明,与C,JavaScript的 其实可以有使用单 报价,坦白说这只是一种 当中的文体公约 JavaScript程序员 使用单引号。 PHP的,他们实际上有轻微 不同的意义。 但现在,只要知道 这是唯一的原因。 在JavaScript中的约定往往是 使用单引号,但我们可以用 两地双引号为好。 因此,这是有趣的。 记得最后一次,我们有这样的 图片,吸引了一棵树在屏幕上 在那里你有HTML节点, 头节点,身体节点 然后一些文本。 但是有在一个特殊的节点 极顶,我称为文档。 嗯,事实证明在JavaScript中,任何 时间你写在JavaScript程序 在浏览器中,您可以访问 一个特殊的全局变量。 类似的精神,PHP的超全局变量, 这个就是所谓的 全部小写的文件。 这就像一个结构,但这种结构 也有在其内部功能。 因此,一个C结构只是有数据通常。 但由于这是一个JavaScript对象 在技​​术上也有功能, 否则称为方法 里面的它。 而且你可以调用一个函数内 这个对象毫不夸张地做了 名,点,和然后的名称 的功能,或再次方法。 这只是一个代名词,真的。 而这是什么功能呢? 那种你可以从它的名字猜测。 通过ID获取元素。 因此,这是要搜索的网页, 搜索那棵树,寻找 任何节点,AKA元件,具有 的报价引文名唯一的ID。 然后我该怎么办? 我要得到里面的值 在树中的节点,我要去 以某种方式打招呼该名称。 所以采取了猜测,即使我们已经没有 看到了这一点,但什么加 符号的意思是在这里和这里可能呢? 观众:串联。 国宝马兰:串连。 没错,这些都只是 设计决定排序 人民年前。 在PHP中,串接 点的东西。 在C中,通过几个铁圈跳 像strcopy()或调用函数 的strcat()或其他类似的功能。 但在JavaScript中,您可以使用加号。 所以,这仅仅是串联 三根弦 - 你好,名称,然后 一个惊叹号。 所以,当这是为什么功能 虽然叫? 嗯,猜测 HTML的底部。 为什么迎接()调用,或什么时候? 显然,最好的,我可以告诉, 提交表单提交时, 我要为所欲为 这些引号内。 具体地说,我现在就打电话给 迎接(),则返回false。 好吧,让我们来看看网 这里是效果第一。 所以,让我继续前进,并键入 ,譬如说,罗兰,提交。 您好罗兰。 让我们来看看,也许这只是 一个幸运实施。 不。 因此,它的输入任何 命名其实我放在那里。 但是请注意,有什么不改变。 该网址仍是DOM-0.html。 有没有注册页面register.php。 有没有第二个文件。 有没有action属性。 那么,什么是返回false 大概是在做什么? 为什么我调用迎接(),然后 可能返回false? 通常会发生什么,当你点击 提交表单,甚至我们有 在过去一周内看到吗? 观众:[听不清]。 国宝MALAN:去某处,对不对? 去一些目标URL。 但我不希望这样的事情发生在这里。 我想我的网页是完全 如Gmail,一旦你的动态 在那里,你呆在那里。 网址不会改变的方式, 表示重新加载整个页面。 相反,我只是想改变一些东西 像打印出来的东西 这里的屏幕上。 那么,让我清洁 一点点。 让我开拓DOM-0,但 让我开了DOM-2。 只要你在这里看到一些语法。 事实证明,我们刚才 没有使用原始的JavaScript。 因此,这是真正的语言 的JavaScript。 你们中的一些人可能知道 图书馆称为jQuery的。 因此,jQuery是不一样的 如JavaScript的东西。 这只是一个图书馆,一个真正聪明 小伙写和推广等 几乎每个人都在世界上现在 使用jQuery使用JavaScript的时候。 乍一看,说实话, 看起来多了几分神秘。 但是你会发现,尤其是如果你去 有您的最终项目网站 发展,你会发现,这 做清理工作,并节省您相当 几行代码。 所以,我们就如何一目了然 这种形式的工作。 请注意,我怎么删除显然 从我的HTML? 有没有提交处理 可以这么说。 有没有属性。 因为你知道, 我真的不喜欢吗? 我觉得像我们下降 到旧习惯。 就像它已开始感觉邋遢 以交融两个CSS HTML,因为你是一种投掷 各地不同的语言 的地方,同样也开始觉得 像一个坏的道路下去 里面有我,我把JavaScript代码 HTML,而不是保出来。 因此,这里的教训。 在DOM-2.HTML,我保出来。 我做的事情略有 是不同的。 现在,我要挥挥手 这确实 引擎盖下。 但是,只是现在假设,首先 这个库中的代码线 所谓jQuery只是意味着,当 文件准备就绪,做到以下几点。 因为网页可以采取的 一段时间来加载。 你可能会在一个缓慢的互联网 连接,并且它可能是纺 和纺纱,最后它的加载。 这行代码只是说,等到 整页都准备好了,文件 准备就绪后,才执行该代码。 现在通知,这可能是 最有用的 从jQuery带走。 这里是此行的精神非常相似 这更长的行这里。 而在原料的JavaScript代码, 存在一个文件的全局对象 有getElementById()调用的函数, 谁写的人 jQuery的简化,只是说 美元符号,然后将里面的 括号把两个引号,然后 其次,把一个hash符号 你想抓住唯一的ID。 因此,这是相当于 的document.getElementById。 同时,提交只是意味着 提交你的任何形式 指的是在左边,去 提前执行。 但是,这是现在的好奇心。 什么有什么奇怪 我这里强调的吗? 它不仅是一种语法 新的,还缺少些什么。 观众:这只是调用的函数? 这不叫警报? DAVID马兰:是啊。 好了,所以提醒()跌 在这里,是公平的。 但有没有提及 名称,就像你知道的,foo或 这里的东西了。 的确,这是一个特点 JavaScript代码,这是相当 功能强大,但也颇具新意。 和PHP实际上有这一点。 让我继续做 一些真正的快速。 让我继续前进,在这里放了这一点。 让我这样做。 功能。 让我们把这个handler()的。 一个处理函数可以这么说。 一些处理一些操作。 让我清理我的压痕。 并把这个在这里。 并把在这里。 没错。 确定。 所以,现在我有一个调用的函数 处理程序(),我真的不知道 它做什么呢。 它只是仍然有这些东西。 哎呦。 花了太多。 让我们做到这一点。 好的。 抱歉。 好的。 让我这样做。 确定。 这看起来不错,直 现在转发。 让我这样做。 做到这一点。 和确定。 所以,现在,让我们把这个在这里。 在飞行中没有更多的规划。 确定。 所以,现在,让我们回到 那里的故事开始了。 此前,我说,这条线在这里 意味着,当文档准备好,去 进取,做到这一点。 我想要什么做的? 好吧具体地说,我想去 进取,做到以下几点。 执行下面这行代码,然后 我要你做的是调用这个 功能当表单被提交。 现在,这是很有趣。 这本身不是一个函数。 请注意,我不是把括号 这里以正常的方式。 我从字面上传递一个调用的函数 处理程序()到另一个函数 所谓的提交()作为参数的 虽然它就像一个变量。 这也是特征之一 JavaScript中,函数是自己 其实只是对象。 事实上,他们真的只是 某种类型的变量。 并且如果该函数的名称是 处理程序(),没有理由我不能 在把它作为这里的参数。 这意味着表单时 与演示的ID是 提交时,调用这个函数。 但现在,如果我撤消了这一切, 那为什么我也许做 这个刚才? 那么,这是一个匿名函数。 因为坦率地说,我才意识到我为什么 懒得浪费时间宣告 调用的函数句柄()只调用 它在一个且只有一个地方? 如果我不需要名字,我不 需要调用它不止一个地方, 我们只是执行函数 正确的,我需要它。 所以JavaScript和PHP的支持一下 被称为匿名函数, 让我做的正是这一点。 但我们只是表面文章。 让我们用挑逗只是一对夫妇 这里最后的例子。 如果我进入quote.php。 请注意,这实际上是一个PHP 函数,PHP程序,我写 该预计称为HTTP参数 符号,我可以通过在 喜欢FB的值。 如果我们真正看看源 代码,这个查询是一个免费网站 所谓雅虎财经,就像对集 7,和它返回给我 东西显然 已知的格式是JSON - JavaScript对象表示法。 这只是一个对象。 注意花括号,引号, 冒号和逗号。 现在,同时,这是很酷。 因为我也许可以使用编程 语言生成URL 看起来像这样动态的, 对不对? 我可以将其更改为谷歌 并取回谷歌的 股票价格为$ 1,017.55。 因此,让我们看看如果我们不能现在就用这个​​。 让我去的ajax-0在这里,这 如下所示。 这只是一个网站,有 一个按钮的表单。 让我在这里继续前进,键入YHOO 雅虎的股票代码,点击获取 报价单,现在发现我已经得到了 一个警报,32.86。 让我真正去票友版本 的这一页,第二版,并 输入比方说微软,MSFT。 获取报价。 现在发现,没有任何警报。 请注意,如果说价格 被确定的? 有最简单的例子 暗示了什么Gchat,和Facebook 聊天,和Gmail,以及其他类似 网站正在做通过实际 改变网页。 注意到这一点。 让我重新加载页面。 让我打开Chrome的督察。 让我去的元素 标签这儿吧。 现在请注意,如果我放大到这里和 打开这个了,请注意,这是我的 HTML DOM - 我的文档对象模型。 这是我的HTML。 但现在发现,即使它是怎么回事 是一个有点难以看到它在两个 在一次地方,如果我输入的FB 在这里,看底部 屏幕而已。 它实际上改变 我的HTML的飞行。 并且它在做这个很简单 通过做这样的事情。 如果我打开了AJAX-2,实施通知 什么是性感 如此,即使它很丑陋, 但由于复杂的,因为这 在功能上,它有一些 HTML在底部。 但是请注意,我用来标记。 我们还没有使用过,但是,这是 像,但它不会强迫 一切都迈上了一个新行。 它只是使一个矩形区域 在同一行上实质上。 请注意,我给了它价格的ID。 和原来通过使用相同的 JavaScript库,我有一个函数 所谓引号()这就是所谓的时 表单被提交。 而我在做什么是这样的。 我在JavaScript中声明一个变量 所谓的url,保存价值 quote.php?符号=。 换句话说,我自己也开始 准备一个HTTP请求,然后 我串连到了一个加号 任何与该ID的元素 的符号是,该通知是 文字栏位就在这里。 所以就像我们在过去曾形式。 然后事实证明在jQuery中,如果你 打电话。VAL(),调用一个val的 函数,数值函数,即得到 无论用户已输入的字词。 然后所有的网络流量 出现这种情况是这样的。 $。的getJSON。 而作为一个不谈,美元符号 只是一个速记符号。 这真是jQuery.getJSON。 让我到JSON从这个URL,而当 请求回来,称此 函数并传入作为参数 无论来自服​​务器返回。 所以,换句话说,如果我回去 浏览器了,我回去quote.php, 什么我的浏览器正在做的是越来越 这个块的数据。 当我去这个网页在这里, 注意,如果我们不是去网络 选项​​卡,然后清除它,然后键入 像歌谷歌和获取 引号,注意页没有改变。 但一个HTTP请求是,什么 回到这里,如果我们看一下 响应是一大堆的JSON 我们访问的最后用 这个简单的线条在这里。 数据是得到了 从服务器。 价格的名义 关键我在乎。 所以data.price给我的。 现在同时,与此 是最后一个例子。 你可以做了更多的页面。 实际上之一,还有两人。 我们可以带回 标记,如果你还记得这个。 这就是JavaScript的。 我们可以做到这一点。 非常令人兴奋的。 我们把这个作为一个悬念。 但更令人兴奋的是,你可以 做这样的事情。 如果我去的地理定位-1,它的出现 认为Chrome知道我们是在 纬度经度42.37,-71.10。 因此,有更多的有 在您的处置。 但更多的是在下周。 星期一见。