[音乐播放] DAVID J.马兰:好吧。 欢迎回来。 这是CS50。 这是8周结束。 如你所知,我们有漂亮 在几个正常办公时间 的食堂, 包括安嫩伯格。 而一些球队的好心 拍了些照片最近。 为了庆祝 万圣节,我们认为我们会 分享一个而被抓住了我们 惊喜在这里安嫩伯格厅刚刚 那天晚上。 你的同学雅各布合影 这张照片,但更有趣 是在Facebook上,随后 谈话发生之后。 

响应他的第一篇文章 他的照片是这样的。 几分钟后,他决定 来一补自己与此有关。 它接着说,然后去这个, 然后,甚至更可笑 是当他的妈妈在帮腔。 然后最终, 看来这只是 一个美妙的诡计了 玩这回事。 

所以,如果你想 看到雅各布和其他人, 其中辛西娅·孟,谁的 背后CS50区工作人员的场景, 前往这个网址,这戏在这里。 因此,事不宜迟,今天我们 继续这个看网络编程, 和节目的实际制作 没有你的命令行中运行, 而是在浏览器内运行。 

据推测,现在,还是挺 不久,你会 要在落实之中 自己的Web服务器, 从web编程不同。 在pset6 Web服务器是所有关于 编写软件,它知道如何采取 从浏览器的HTTP请求, 甚至从你,一个人, 有一个程序叫Telnet和 再响应这些请求要么 通过吐出一个HTML文件,或 JPEG或GIF,甚至是PHP文件。 

但是,与Web服务器,它不是 应该只是打开一个PHP文件, 东西.php结尾,并 然后吐出的内容。 它应该做的 什么该文件第一? 可以这么说。 不编译它,我们周一表示, 但rather--因此,解释它。 

PHP是一种解释型语言,所以 在你的网络的关键特征之一 服务器,尽管美国实施, 这种能力对于你的web服务器 要注意哦。 这是.php结尾的文件。 我不只是将其发送到 用户喜欢它的静态内容, 而是让我读它一行 线,从左到右,并解释它。 

而要做到,你 球员将主要 踢一个节目中的器具, 和对大量的计算机系统, 只是所谓的PHP。 这就是PHP的名 语言本身的解释。 所以,这一块我们实施 你和什么留给你, 最终,是一个数 件,其中 正在实施的支持 对于静态内容。 

但现在,与 问题设置7,你 要开始过渡到 实际编写PHP代码 这被解释 在谈及到后端 数据库,其存储的信息。 因此,让我们更好地了解第一 一对夫妇这些超全局变量 而到底有多少权力,你 获得开箱即用免费 与像PHP语言。 你做的事情没有 自己实现。 

所以,我们看到在周一$ _ GET, 这是一个超全局, 这是刚刚PHP代言的全球 变量,你可以在任何地方访问。 而且里面有什么的$ _GET? 什么是这里面 超全局,我们看到了什么? 当然,在统计上 至少有一个人知道。 什么是里面的$ _GET? 是吗? 

听众:这是变数 你把在查询字符串。 

DAVID J.马兰:完美。 这是你的变量 把在查询字符串。 所以,在我们的年长的例子 谷歌重新实现的时候,我们有 一个URL,然后问号, 其中划定HTTP的开始 参数,那么我们有Q等于 东西,像Q等于猫, 你会自动地往里走 那$ _GET超级全局适合你, 因为PHP的,是Q的一个关键, 和其价值的猫。 

换句话说,$ _GET和所有的 这些东西都是关联数组, 排序哈希表,即 存储键和值。 现在,早在pset5,哈希 表,你可能已经实现, 或者试试你可能 已经实施了,真的 是有效的关联 阵列,数据结构 由此可以联想 键与值。 

但在pset5,该值是微不足道的。 价值本质上是真的还是假的。 在字典中的字? 所以,当你散列像苹果字 看是否苹果是在词典, 你的检查功能想必 返回true或false。 所以,这是有效的 值,我们得到了。 

但是我们看到在周一 简单地说,你肯定能 联想更有趣 价值不仅仅是true或false 连键,就像苹果。 其实你可以返回 任意的字符串,而事实上, 这就是$ _ GET和这些 其他变量让你做。 

因此,$ _ POST是神似, 但如果你通过邮寄提交表单, 不同的HTTP方法是 用的东西像信用卡, 信息和私人信息,甚至 二进制信息,如照片, 这些事情最终的$ _ POST内。 而实际上的文件 像JPEG文件和诸如此类的东西, 甚至还有另一个不 在这里所谓的$ _FILES为好。 

因此,我们的服务器将不纠缠于太多 不多,但它可以让你访问 排序大约低级别的细节 您正在使用的服务器本身。 Cookie和会话,不过, 我们将切实看到了。 最后就是我们用来实现 一个购物车的概念。 一个超级简单的,但召回 我们有这样的例子在这里, 计算有多少次你 之前曾访问过这个页面。 

但今天,而不是仅仅看 这样的效果,让我们打开了 Chrome的检查, 这通常可以 做通过右键单击或控制 点击网页上的任何地方, 然后选择检查元素。 或者,你可以通过菜单 我们描述pset6的规范。 而我要去的网络标签 在这里,让我们观看了一会儿 在HTTP流量的 来回。 

首先,让我继续前进 和清晰的Chrome浏览器的缓存。 所以,有些人可能很熟悉 这种技术已经, 而我们要使用它 在这里调试。 现在我们电脑 科学家们将开始 这样做调试 的目的,从而 我们将清除缓存, 典型地,这样我们就 可以去掉的东西叫做饼干。 所以,你可能熟悉一般 用什么饼干,或至少 它们的存在,但有什么 你了解他们, 由于只是一个用户 计算机,什么是Cookie? 是啊。 

听众:这是一个有点of--好,不 在计算机科学中的一个术语位。 它是一个数据块,一个 网址发送给您,以便 要能够对你记录统计。 DAVID J.马兰:好,好。 所以它是一个数据块,一个 服务器,使您的计算机上, 让我们甚至概括它 更多的,它是一个关键的value--好, 这是越来越精确。 它是一块 信息,一个数据片, 该服务器能够 把你的计算机上 而很多时候,服务器做 这使要记住你是谁。 因此,例如,比值 你很可能 登录到网站,如Facebook, 或Gmail或其它前, 你在你的登录 用户名和密码, 再后,对某些数 几分钟或几小时甚至几天的, 服务器记住 你是,事实上,已登录。 现在,如何是实际发生的事情? 因为你肯定不会重新输入 您的用户名和密码,每次 您导航到 不同的页面在Facebook上。 因此,原来的 饼干的答案。 

一个cookie,你可以想到的是, 有点像,数字手 邮票,你可能会在游 公园或俱乐部,基本上 表示你一直在这里 之前,你已经过 显示你的ID的保镖,对于 实例,该俱乐部或公园 现在应该假设你 已通过身份验证。 你已经确定了。 

所以考虑到这一点, 让我们在这里开辟专柜。 让我先走,我只是做了, 并清除所有的我的饼干。 现在我什么都做的是 按住Shift,只为​​好措施, 强行重新加载页面。 按住Shift键,只要确保 没有什么被缓存。 而这里的请求 这又来回。 所以,在这里我们有一个请求,让 我放大到这里,和大量的本 是有点无趣的细节 现在,浏览器会自动有 发送,但让我们点击查看 来源看原始头。 

如果你已经潜入pset6不已, 你一定会认识到的东西 这样,也许有些 这里的这些线, 但更有趣的今天 如果我向下滚动,而不是请求 但所谓的反应, 这条线可能看起来很熟悉。 这是一件好事 当你看到一个200 OK。 显然,这是 日期和时间,在服务器上 这里面的一堆东西。 哦,这是有趣的。 

原来,当你使用 PHP的,至少在这台服务器, 服务器吐出什么 PHP版本你使用。 其中,实际上,为了安全 目的,是不是一件好事。 但是,我们会回来的 其他时间也许吧。 但是,现在这是多汁行的今天, 我们简要地看到了其中的一些, 我想我的时候,我们戳 各地督察在那个时候, 设置cookie是什么种植 那个小资料片 到您的计算机。 

这是一个HTTP头 这是有效的 告诉你的浏览器, Chrome浏览器,IE浏览器,不管, 在用户的浏览器哎商店 硬盘驱动器,或在用户的RAM中, 一个叫做PHPSESSID键,这是一个 速记符号的会话ID, 并给它的值 0vlk8t,点,点,点。 一个很长的假 随机的字母数字字符串。 这只是一个非常大的数字,但 它的编码字母和数字 使得它的尺寸可以 甚至比单纯的数字更大。 然后,通过该方式,路径= /,即 只是表示这个cookie应 与相关联的 该网站的全部, 不只是一个特定 页面整个事情。 因此,这是虚拟的邮戳。 这是因为,虽然服务器,脸谱, 或者在我们的例子家电, 有字面上写0vlk8t 等等,在你的手。 注意一下服务器的, 不这样做是不是 保存我的用户名,当然 不存储密码。 

相反,它似乎是 存储伪随机信息 所以没有人能猜到 什么我的手邮票。 在服务器端, 同时,服务器 是要记住,大概 在数据库什么的, 该用户,谁在未来 呈现0vlk8t的邮戳,点, 点,斑点,应与此相关的 特别是购物车,可以这么说。 换句话说,如果我现在去 回到这里,然后刷新页面, 如何在服务器知道 我参观了一次? 

或者,如果我再这样做,如何做服务器 知道,我已经访问过它两次? 好吧,如果我去到这个 最近的请求,这 现在是第三次,我已经发 总体而言,现在看到我的要求。 还有这个 请在这里,同 和以前一样,还是有一大堆 的东西,我们忽略了和以前一样, 但在最后头,这 一次,因为我以前来过这里, 是演示文稿的 这个虚拟的邮戳。 

因此这条线在这里,没有设置的cookie 但饼干结肠PHPSESSI = 0vlk8t, 这只是我的浏览器的自动 演示这个邮戳,这样的 现在的服务器,只要它实现, 哦,这是用户0vlk8t点,点,点, 我现在还记得他或她是谁 和与该用户重新关联的任何 信息我想,所有的 这些信息可以通过你存储, 程序员在$ _SESSION。 

所以要清楚,如果我打开了真正的快 在gedit中的实际文件,counter.php, 在我的本地主机的公共目录 和以前一样,请注意,事实上, 我最终存储在 $ _SESSION报价引文结束“反” 在前面的计数器的值,该值 我从这些线爬起来在这里,我们 看着最后一次加一。 因此,引擎盖下方, 这是所有的饼干。 这数字只是那种 用手戳来回, 坦白地说,如果你打开​​Chrome的 督察在任何网站上 你今天拜访,与 超高概率, 你会看到也许有, 也许半打饼干 被记住你。 

而更糟糕的是,如果这些 网站你访问 所有有广告,这 肯定是相当普遍的今天, 如果这些广告的未来 一些中央党,有人 像谷歌或AdWords,因为他们 称自己的产品之一 或其它这样的供应商那 卖广告,什么是有趣的, 坦率地说什么是一个小 令人担忧的,如何HTTP工作, 是,如果你有一个内嵌广告 在Facebook.com和Google.com, 和Harvard.edu,任何数量 的网站,所以它是这样 ,有一个中间人谁是服务 了广告所有这三个网站, 事实证明,在 Cookies是每个域。 

所以,如果你有一个广告的未来 同一家公司在不同的网站, 该公司能够有效地跟踪谁 你是在所有这些网站。 哈佛可能不知道 您正在访问的Facebook。 Facebook的可能不知道 您正在访问的哈佛。 但无论广告服务 他们使用的是如果该域名 存在于两个Harvard.edu幅 页面和Facebook.com网页, 这个中间人一定会知道你是谁 因为被共享这些cookie 对面,或者更确切地说于, 那个所谓的中间人。 

因此,我们会回来这 安全隐患物, 但有大量的信息 随时存储你你 请访问几乎所有的网页 互联网,它真的 降低到这个非常简单的机构。 会发生什么,那么,如果 你是超级偏执狂 而你决定进入Chrome或IE浏览器 或什么的,然后关闭你的cookies? 会发生什么? 是吗? 你really--你这样做对吗? 行。 不,请便。 

听众:某些网站没有 没有它的功能像Facebook的。 DAVID J.马兰:是啊! 因此,某些网站 只是停止工作。 而在大多数网站这几天 从根本上依赖于饼干, 特别是如果他们有登录 在,他们只是要打破。 由于考虑 替代方案中,如果网站 有没有办法记住你是谁, 因此,您的浏览器不 表示与每个HTTP 该邮戳的要求, 有效的网站 像Facebook是怎么回事 不得不提示你 每一次缝补一次登录 更改网页,或点击一个链接,该链接 肯定不是一个特别好的用户 的经验。 

所以,有,也就是 之间的权衡。 因此,事不宜迟,让我们 想当然地认为web编程, 像PHP语言,你可以记住 在问题这样的设置信息 当你实现自己的7 E * TRADE样的网站,用以购买 而卖出股票,你会记得很清楚 什么样的用户已经购买和出售 他或她是谁 通过本次会议的方式。 但是,我们将需要 比电子邮件鸽友方式 开始围绕保持信息。 对不对? 

周一,我们谈到了即时的新生 如何在版本一个网站, 几年前,所有我们所做的是 通过电子邮件发送普罗克特谁的 负责校内体育 节目,名称,性别, 而无论他们是否是一个队长, 和别人的宿舍是谁的 注册为校内运动。 因此,它不坏,但他或她再 不得不巨魔通过他们的电子邮件, 创建一个电子表格或类似的东西 即,把一切都安排。 所以我们肯定程序员 可以为监考官做到这一点。 和SQL这样进入, 结构化查询语言, 这是会好看 不同于C和PHP, 你会在潜水得多手 PHP和问题设置7,而且SQL, 或SQL,这是一种语言 你用跟一个数据库。 

但是,什么是数据库? 那么你想想 数据库,至少在目前, 刚才是像一个Excel文件,或 如果你是一个Mac用户一个数字文件, 或者如果你是一个谷歌企业应用套件 用户谷歌电子表格, 它实际上是一个数据库,还是真的 具体的关系数据库。 关系数据库是刚刚 一些具有行和列, 你可以存储任何类型的 在这些行或列的信息。 

但是,什么是好的关于SQL和 关于实际的数据库,而不是 电子表格或谷歌电子表格, 是,你可以用一种语言 实际执行查询 插入数据,删除数据, 寻找数据,甚至 最重要的是,和你 不必相当手动使用它 正如你可能通常一个谷歌 电子表格是这样的。 

因此,在SQL中,有一堆 基本陈述或片 功能内置的。 没有什么比这更多的, 但你可以去一个巨大的距离 只是知道 这种语言称为 SQL有至少四个 语句,你可以利用。 

删除,用于去除数据, 插入,添加行, 更新时,用于改变 行和选择, 为取回行 这确实是SQL做什么。 它的工作完全是靠行,以便 当你插入或删除, 或更新,或选择你是什么 取回作为一个所谓的结果集, 象行的阵列。 从表一帮行。 

因此,早在一天, 甚至到今天, 你可以用互动 数据库使用命令行, 但它不是特别有趣的使用 这种黑白风格的窗口 而实际执行的命令 戳在你的数据库。 图形用户界面或GUI, 是更可取的,可以说, 所以我们推荐工具 预装你在设备上 被称为phpMyAdmin的。 这是一个总的巧合, 这个东西的名字有PHP中呢, 它只是意味着人 谁写了这个程序本身 在PHP写的。 

但它的最终目的是管理 数据库服务器,如MySQL服务器 你可能有,因为你 这样做,在CS50设备。 因此,有更详细的在这里比 我们需要关心的今天, 但什么是关键的是,在左边 手侧的数据库的列表 您有您的计算机上, 您CS50家电, 或来最终的项目,你可能会 对第三方公司的 网站或网络服务器,即 你可能会付出空间。 这样,左边的是 的数据库,其中的一个 是pset7这是我从旁边借来的 周pset中,然后在顶 有注意到有一个 一堆标签,其中一 是数据库,SQL,地位, 用户,出口等等。 所以,你可以走很长 方法只是实现 大多数的用户界面 在顶部左边的列 和横跨右上方那里。 那么,我们能不能​​用这个做什么? 好吧,让我们开始创建 信息位如下。 

假设下面是这种情况, 这将是在短短的几天里, 你想实现一个 网站名为CS50金融, 这个网站可以让你买 引用引文结束和出售股票。 而且它要弄清楚 这些股票的价格, 最终,你会看到, 通过交谈,雅虎财经。 其中,奇妙,有一个免费服务 因此,你可以通过在股票行情 就像歌为谷歌,它会 给你回谷歌目前的股票 过去的价格范围内 至少几分钟。 

所以你使用的是,最终, 假装为用户 购买和出售实际 使用虚拟货币的股票, 但第一件事 用户会看到 这是登录界面,询问他们 为自己的用户名和密码。 因此,第一之一 在pset7你挑战 将是实现后端 数据库,电子表格,如果你愿意, 这是怎么回事存储 用户名和密码 最终他们拥有的股票, 有多少,多少钱他们有, 所以在一堆其他的东西 其他表或电子表格。 

因此,让我们来看看如何 可能出现的第一眼。 我要回去 家电和我 打算去这个网址在这里 phpMyAdmin的本地主机/ phpmyadmin的 你会看到它 带我到一个接口 正是因为我们看到的 屏幕截图,在这里我 有一个附加的数据库 所谓讲座今天 让我继续前进 首先,点击pset7。 

我似乎有几个选项, 1为新的,用于创建一个新的表, 和一个链接到用户,这 是我已经创建了一个表。 那么什么是表? 所以,如果你使用Excel中 以前,如果你已经 使用数字或谷歌 电子表格,你打开一个窗口 你会得到一大堆 行和列, 但你通常工作表 在底部,或者单独的标签。 你能想到的每一个 工作表作为表 使得数据库,最终是 的一个或多个表的组合,1 或多个工作表,在 世界上正常的电子表格。 因此,让我继续前进, 点击此工作表上 我预制,叫用户,亦称 数据库表。 如果我在这里向下滚动, 让我缩小了一点, 这是phpMyAdmin的告诉 我们是这个表里面现在。 这是一个有点混乱,在第一 一目了然因为UI不是 最漂亮的东西在世界上,但 有趣的是这部分在这里。 ID,用户名和哈希值。 

在前进,你会交到 在这个问题集7, 我们为您提供包含超级文件 小型数据库表,居然借 从黑客版 问题设置两个, 这里面有六排。 一个是贝琳达所有 一路下跌到一个用于Zamyla, 并注意对那些左 用户名就像一个唯一的ID, 两个,三个,四个,五个,六个,整体, 然后向右是哈希值。 

如果,赔率是,你没做 黑客版的问题设置两个, 但是哈希就像一个加密 密码有几个注意事项。 所以,你在这里看到什么 所有六个的加密版本 我们从问题的密码 设置两个的黑客版。 现在左边是只是一些GUI的东西, 编辑此行,复制该行, 删除此行。 

但是,什么是有趣的 现如下。 其实我可以开始 尝试用此表。 所以,如果我去,然后单击SQL 选项​​卡中,我得到这个大文本框。 这不是我们如何去 这样做在实际编写代码。 需要明确的是,phpMyAdmin的 仅仅是一个工具,它是 打算让我们拨开围绕数据库 让我们尝试查询。 

因此,例如,假设 我执行的正是这一点。 选择,这是其中之一 关键字我前面提到的,明星, 它代表所有 列在表中。 从什么表? 那么,用户。 并注意有这 奇怪的约定,SQL 在这里你实际使用 背面蜱,通常, 不是单引号,而不是双引号 当你谈论的表名, 所以后面的报价是对​​的事 键盘的左上角最 有可能。 

所以,现在让我继续前进 而刚刚离开,仅 向下滚动并单击Go,我们 究竟要看到同样的事情。 我们刚刚执行的SQL查询 他说选择明星的一切 从表称为用户, 你得到的回复是这样。 最终,我们将能够 做同样的事情在代码中, 但现在我想说的 确实是看到它在我的浏览器。 好吧,让我们做一些事情 有一点不同。 让我回到了SQL选项卡, 让我们只想说,什么? Zamyla已经失去了她所有的 钱,因此,它是 时间让我们删除了她作为一个用户。 她不再登录。 

所以我要说删除from-- 好,维护资本 为了保持一致性,删除 从用户那里。 因此,我们可以有这些 谓词,或者这些 预选赛,在我发言结束 在那里,我怎么能删除Zamyla? 她的名字Zamyla,所以 列,其中一列 被命名的,所以其中name =“Zamyla”。 在这里,我使用双 引号或单引号, 你只用背蜱时 谈论的名称,例如, 的表或字段。 让我点击转到这里。 而现在,网页是 作为一个小紧张。 

或者,你真的要执行删除 从用户那里名称等于Zamyla? 是。 所以,现在,如果我们回到我的表 通过点击用户,请注意,哼。 我疯玩。 而事实上样的,我 点击走这么快 你甚至不看 红色的错误消息,也许吧。 我做了什么错? 听众:你没必要 要利用她的名字。 DAVID J.马兰:是的,我 大写她的名字, 但她的username--其实我 做了几个错误,对吧? 其中,她的用户名是 zamyla,小写字母Z, 并且列名是用户名, 没有名字,所以让我们再次做到这一点。 让我继续前进, 从用户那里删除 用户名等于报价引文结束“Zamyla”。 行? 因此,这看起来好一点,让 我去向下滚动并单击Go。 它仍然会 骂我是肯定的。 我点击是的,现在我们看到, 坦率地说这事,真的 快,不到一 第二当然,这 正是得到执行的查询。 为了确认,让我点击用户 而事实上,现在Zamyla走了。 现在,让我们做的正好相反。 假设加布希望 注册该网站。 什么是SQL查询,有什么 命令我可以键入要添加加布? 那么它是相当简单的。 插入到用户,而现在 它变得有点神秘。 我需要指定给所述服务器, 哪些领域我想分配。 我真的不关心什么Gabe的ID 数字是多少,所以我打算跳过。 我不是要说 用户名,散列,然后 值我想把 那里将是加布。 然后他的散列,我不知道。 所以现在,我要去 离开,作为一个大的事情。 我们会回来 在这个问题集 规范,如何你真正做到这一点。 

所以注意,再次,语法。 插入到表名,然后 字段括号的列表中, 你想要的列添加 值,然后就 完全相同的顺序从左 对你要添加的值, 它只是因为包装 文字是有点长。 所以,现在让我单击Go。 一行插入。 而现在,如果我回去 用户,有什么有趣的 是,不仅是加布现在在 数据库,什么是显然他的身份证? 

那么它的七人。 为什么7时,我没加吗? 所以这也就是一 功能,你可获得的数据库。 很多内置功能。 事实证明,当 在该表中, 我预先配置是自动 以这样的方式分配一个编号 它递增。 所以,如果你曾经戳左右, 看着你的Facebook的ID 数字是多少,这些天它不是真的 一个事情,但Facebook作为一个API, 应用程序编程接口, 因此,你可以拿回 约一大堆数据 你自己,你的朋友, 和你联系。 而曾经被认为是一种 性凉,早在一天, 是仰视你的 Facebook的ID号了。 马克·扎克伯格的, 例如,为三 因为他是该网站的作者。 而随着剧情的推移,他创造 两个测试帐号,用户一和二, 他随后被删除。 因此,扎克,这是他的用户名 在Facebook上,是ID号3, 我们大家都有数多 大于3的这些日子。 事实上,在某些时候 Facebook的离开 即使从使用int,这 是一个32位的值,以使用 下一步骤时, 基本上是一个很长很长这样 它们能够容纳 甚至更多的用户注册。 因此,一个有趣的小历史事实。 

所以,这只是 基本语法与 我们可能会执行几个 查询,但我们实际上可以 做了一堆更多的事情与SQL。 你会看到,最终, 在问题设置7 你必须做出一个 的设计决定数, 其中将是 使用什么样的数据类型。 所以,就像在C,有数据 在一个数据库类型,如MySQL, 并且数据类型,你必须选择 从这里包括这些领域。 CHAR,VARCHAR,INT,大整型,小数 和日期的时间,以及其他许多。 因此,让我们真正做到这一点。 让我们假装我们没 一方面你这个用户的表 让我继续前进,创造,为 我在讲课数据库 -  居然让我继续前进,删除 表我在这里已经 这样我们就可以真正创造这一点。 哎呦。 我要放弃这一 表,现在我 打算再次去了 讲课的数据库在这里, 我要创建一个表 所谓的用户,让我们 只是做三列 最初,然后单击Go。 

现在,在大多数情况下, 再次,这仅仅是 使用这个所谓的图形化工具 phpMyAdmin的,我们正在做什么,现在 在创建表。 因此,这又仿佛文件,新建, 并创建一个新的Excel文件。 所以它问我几 题,从左至右, 什么是第一列的名称, 然后将第二列的名称, 和第三的名称。 因此,让我们重新创建。 ID,然后用户名是1, 然后哈希是另一回事。 那么,如果数据类型 现在可以像ID的字段? 

这里是数据类型的整个列表 在数据库中提供给你, 而现在就让我们一起去整型。 32位的值,我不知道 认为现实的我 将有超过4十亿 用户在我的帐户,我的服务, 所以我要继续前进 到下一个问题。 我不打算指定 长度或值, 它不适用 这里的int本身。 现在我可以指定, 显然,一个缺省 值,这我不会指定。 排序规则,我不知道那是什么。 一个属性。 现在我们实际上做 有一个设计决定。 因此,有几场在这里,并不是所有的 它们都是适用的,但无符号 仅仅意味着什么? 该整数必须是? 只是非负的。 所以它必须是0上起来。 不,我不会去检查,因为 我希望每个用户都拥有一个ID, 它不能为空。 然后,我们得到了一些更 有趣的设计决策是这样的。 我们会回来的这一刻, 数据库但另一特点 是,是,你可以告诉 数据库服务器继续 并优化自己,你的 内存和硬盘空间, 使选择和插入, 删除和更新都非常快。 与pset5对比这一点。 

如果你想查找的东西 在哈希表,该表 你觉得作为一个数据库, 谁必须做所有的 为使您的哈希表的快速工作。 这就像,很明显,你。 对不对? 你必须把所有的时间精 调整外,获得一个散列函数 没错,搞清楚如何 许多水桶有。 

但是,什么是好的,再次, 关于数据库 你刚才踢所有的 这对其它人 谁曾想到这 通过对你来说,什么 我要在这里说下 索引是我的ID字段 将是的主要方式 识别用户在该数据库中。 我不会想 Zamyla为Zamyla的, 我会想 她为数字6。 

为什么,或许,更好的 直观地想和型号 每个使用您的个人行 一个数,而不是其他 像字符串,象Zamyla 或者加布或更长的字符串还是? 是吗? 

听众:一个ID是唯一的? DAVID J.马兰:再说一遍吗? 听众:一个ID是唯一的? DAVID J.马兰:一个ID 是唯一的,但suppose-- 如在一般的情况下 与用户名,假设 我也说只能有1 Zamyla在世界上,只有一个加布。 我可以并处的独特性 约束对字符串也一样,如果我想要的。 所以不是一个糟糕的想法。 

听众:更安全。 

DAVID J.马兰:更安全,为什么呢? 听众:你不能分辨出哪 是,如在该用户。 DAVID J.马兰:OK,你 不能告诉用户哪些 是所以有 隐私方面的, 特别是如果该标识可能 出现的URL。 这么肯定,那可能这种工作了。 其他的想法? 是吗? 

听众:它更容易 在一个int执行操作。 DAVID J.马兰:这是真正的踢球者。 这只是更有效率, 或更容易为计算机, 对整数进行操作。 对不对? 一个int是保证 是32位,而Zamyla 是几个字符长,加布里埃尔 是几个字符, 达文波特是很长的,所以它的 没有特别有效的是使用 要比较的字符串值,并期待 对于字段,更新领域, 如果你能逃脱 只用一个整数。 只有32位。 这样的用户名,也通过这种方式, 不必是唯一的, 虽然他们也许应该 是,甚至在这种方式也 用户可以被允许 改变他或她的用户名。 

现在让我们离开这个作为 识别用户的主要手段。 这是告诉数据库 继续优化自己 等等的ID查找窗口是超级快。 AI,可怕的命名,只是 指自动递增, 这是校验 框,我们需要检查 指定的ID字段 自动更新对我来说, 然后我要去 滚动到这里权 坦白说,我真的没有兴趣 在任意多个域。 当然不是今天。 

所以,我要回去在这里, 到第一列,其中 我需要指定用户名 和散列,让我们 至少集中于 第二个现在​​。 INT可能不是正确的判罚, 还等什么更有意义吧? 

听众:文本。 DAVID J.马兰:再说一遍吗? 听众:文本。 DAVID J.马兰:文本? OK,我听到的文字。 还有什么? 样的,我们有一大堆的选择 这是文字上的。 所以,什么时候,为什么,做 你使用其中的一些? 好吧CHAR,相反你可能会 想,是不是一个单一的字符。 它的字符的特定数目。 因此,如果我们知道,所有的用户名 必须像八个字, 作为用于在年龄较大的共同 电脑系统,我可以说的char 然后我可以在这里说,8。 这时候,第三列变 适用的创建表的时候。 

但是,这是一种烦人 因为有些人可能 希望有一个较长的用户名 超过八个字符, 有些人可能会想 具有更短的用户名, 那么,为什么自己奉献 到一个特定号码? 为什么不能有一个变量 字符数量和公正 说,一个名称的最大长度 是的,我不知道,像64个字符。 我想不出任何朋友谁 有超过64个字符的名称, 即使那是太短,你可以 当然碰到它随意。 

这样的varchar是可变 字符数。 文字是不是一个坏的本能,和 排序坦言,做什么它说, 但一个文本字段可以是 像65000字节最少。 这可能是矫枉过正了 场,而事实上,是的,65,535。 这可能是矫枉过正了 名字,所以我们会坚持,通常情况下, 用VARCHAR处理的文本 场和哈希,太。 哈希,事实证明,我们可以做一个 VARCHAR以及之类的东西, 但我们今天不会集中在 加密那里和数字 我们实际上可能 要使用它的长度。 

但让我失望向右滚动。 你只能有一个 为表主索引, 但我想申请任何这些, 现在,用户名,你会说什么? 什么用户名应该是基于一个模糊 这四个选项的理解? 只是他们的名字? 

听众:独特的。 

DAVID J.马兰:所以唯一的,对不对? 所以,事实证明,不仅可以 你告诉一个数据库,提前, 这是主要的方式 的识别领域。 你也可以说这是 将是一个唯一的字段。 它不会是 我依靠的东西, 但我想数据库 基本上有,如果条件下,使 如果我曾经试图注册 两个用户具有相同的名称, 数据库平出 不会让我。 我可能有一些额外的代码 在PHP中,防止为多, 但数据库也可以确保 这是永远不会发生的。 

现在,作为一个在旁边,特别是作为 你想想最后的项目, 记住它索引而进行全 文字实际上是相当有用的。 如果你有一个更大的数据库,而不是用 几十个,但与数百或数千 甚至上百万的领域,你可以 还提前告知数据库 这是一场我要去 要搜索了很多。 也许它的用户名, 也许它的生物,如果你 做一个类似Facebook的网站, 具有该用户的允许的段落 保存,如果你想 提前告知数据库 我将要寻找在这个领域 很多,但它不一定是唯一的, 您可以指定我创建一个索引。 或者,你也可以说让我做 排序的任意搜查的命令一样 或控制楼喜欢你 可能在文字处理, 所以你可以看任意字符串 和子在这个领域。 换句话说,我们得到 在学期点 在这里你不必担心 如何高效实现的事情。 你只需要了解什么 设计决策做出让你 使用了正确的工具 贸易,以充分利用功能 其他人都为你打造的。 所以要回顾一下,主要应该只 有一个,你只能有一个, 它就是你承诺的东西 用来识别领域唯一。 独特的是在精神上刚相似,但 你可能只是偶尔使用它, 但你希望数据库强加于人。 指数只是手段抢先 加快速度,在未来 这样我可以搜索 物在该区域。 然后全文一般是 段落或短文,或大机构 在那里,你的文字 也可能希望 通配符像明星的等价物。 右。 

所以这是一种 很多的一次。 让我们来看看,如果我们不能提取 这样的一些特征 然后建立一些 相当简单,但功能强大。 所以其中的其他 你的设计决策 最终将会有沿 存储引擎的线条。 而让我补提这个 在期待最后的项目, 与期待让我们 say--没有让我们做到这一点。 让我们来打造这个小 应用程序第一次。 我要进入​​我的终端 窗口,并在这里不 只有counter.php,这是我们现在要 摆脱为不再有密切关系, 但我们有一大堆 目录和这个的 将是在精神上非常相似 什么,你会在看到问题设置7。 

因此,我们有三个目录 包括公共和模板, 也正是我们离开的 我们的整个MVC模式(星期一)。 并回顾一下,在公众还将会持续下去 我希望用户在任何文件实际 V能够参观 通过URL浏览器。 模板。 我们没有把模板是什么? 什么样的东西? 没有太多,但一对夫妇 至少在星期一的文件。 是啊。 

听众:页眉和页脚? 

DAVID J.马兰:页眉和页脚。 所以,我们今天类似的东西了。 我们有几个文件,但 页脚我明白了,头喔, 然后一堆其他文件。 因此,这是等价 在V MVC视图,其中, 再次,将是一个多一点 明确在问题设置7, 但是这仅仅是一个文件夹,我 投入了很多我的美学。 我的很多的HTML,我的很多形式。 同时,包括,是另一 有这三个文件目录 让我们来快速浏览一下这些。 

我要继续前进 开放config.php文件。 事实证明,很多 就像前面的名词, 你犀利包括 CS50点h行驶pset7。 在今天的例子,你会 做的是,等效 有需要声明 有效地 包括以下几行。 所以要清楚,这是 一个名为config.php文件。 并注意它在做什么。 它显然是在做什么 神秘,打开错误信息 所以,你可以看到他们在浏览器中。 它,那么,显然 需要其他两个文件 所以这是像的#include在C中, 然后这一块我们也看到, 我们已经依靠,这开启 该购物车一样的功能。 

这意味着cookie将 可以来回发送。 那么,为什么这很有趣? 那么,如果我们回到这个 目录并打开,例如 constance.php。 请注意,PHP不支持常量, 它不是很喜欢的#define在C. 相反,你从字面上 说的定义,并通知 我已经预先存储 四个常数在这个文件中。 一个是今天的数据库,为 我的密码,我的用户名, 和服务器的名称。 因此,这些实际上将是 在问题非常相似设置7。 最后,这就是我 会得到一些不错的功能 从工作人员,在functions.php文件 是一串代码,我们已经写了, 我偷了一些这方面的 从问题设置7 今天,是做了一堆东西 让我们只看其中一个 特别是。 此功能在这里, 查询时,将是 我们调用PHP函数 为了执行SQL。 刚才我们使用 phpMyAdmin的,但是这只是 对于那种学习的目的 和诊断目的 而忘记了你的数据库集。 当你真正使用 数据库,你的人, 显然不会 被拔了网 页面每次有人注册。 你会写代码, 插入和删除用户的需求, 而我们要做到这一点 由查询功能的方式。 如果我现在向下滚动,有 将是一些更多的功能。 重定向是要 是我们写了一个函数 为您,让您 向用户发送到另一个URL, 和渲染是一个函数,很喜欢 我们看到在周一,实际呈现 一个模板,但更多关于这些的 形式pset7自己的穿行。 现在,让我们继续前进,做到这一点。 

让我进入我的演讲表 看到有目前没有 在这里,只是还没有,让我也去 进入我的公开目录,其中 这里只有一个文件,index.php文件。 这个文件看起来是超级简单 此刻,它看起来就像这样。 很像我们如何 周一不放过。 我需要这个文件, config.php中,这是在 一个包括目录,该目录 在点点,我的父母, 然后它只是呈现这个文件。 所以,这是什么文件? 

让我们在我的模板中打开 form.php的,我们会看到这一点。 超级简单的,显然这种形式是 要通过$ _GET或$ _POST提交。 快速完整性检查。 从字面上直观地搜索文件。 方法等于职位。 因此,它不会使用的URL,如 谷歌确实,这将排序隐藏 背后的信息 场景和它的 要提交到 所谓register.php文件, 这就是文件 我们还没有写 但是,这是怎么回事 样子是这样的。 

如果我去到一个单独的页面,这是 哪些本地主机/ index.php的样子。 又一次,在服务器的 只是假设的index.php。 输入。 所以这就是我们 在和我想要做的 是能够键入东西 像大卫,然后 我的电话号码,这会说 617-555-1212现在,注册 现在找不到register.php。 所以,我需要实现这一点。 因此,让我们迅速掀起 这样的事情了。 让我进入我的公开目录 做register.php的gedit中, 现在我要继续前进, 启动PHP模式,就像我们在周一, 并关闭PHP的标签,并 让我们做一些事情。 

所以一个,我知道,从 写过这种形式, 我要检查以下几点。 如果是空的,无论用户 键入的名称字段中,然后 我会说些什么 像道歉失踪的名字。 道歉,同时, 没有一个内置的PHP的东西, 这是我们写了一个函数 在functions.php中的pset7 这样您就可以访问它。 否则,如果其他领域 为空,数,那么我 要道歉 用户说缺数。 保存该文件。 

现在,让我们回到我的浏览器, 回到论坛再试一次。 注册。 行。 什么都没有发生,这是很好的。 我没有得到一个错误信息。 但如果相反,让我们重新加载此 页面,并且不提供任何东西。 该死的。 做到这一点。 注册。 我做了什么错? 如果为空,$ _ POST名。 再说一遍? 

哦,当然。 我忘了最重要的部分,它 是需要(“../包括/ config.php文件”)。 我需要有访问 抱歉功能, 所以,什么也没有发生。 该功能实际上并不存在。 因此,让我们试试这个了。 让我们重新加载页面,点击注册。 行。 它就在那里。 因此,输出我们 这里看到的是结果 中调用一个道歉 功能,超级简单, 它只是打印出什么 我把它作为一个参数。 

好吧,让我们的合作。 让我们来为我的名字 像大卫,注册, 失踪人数确定让我们 提供这一点。 617-555-1212。 注册。 行。 所以,一切都很好了,只是没有 有趣的事情正在发生。 所以,现在让我们做更多的东西 有趣的发生是这样的。 让我进入phpMyAdmin的,让我们 其实创建一个名为users表, 我要去给它3 列,我会很快 创建ID,然后 名字,然后数, 和ID字段我 要离开为int。 名称字段我要去 离开为varchar, 我们会说64,有些武断。 我要去数 做,你知道吗? 我们正在进入 支持美国的数字在这里, 所以我打算做的事 像焦炭,然后10个字符 最大的区号 然后七位数。 然后在这里,我要 指定自动增加这个领域, 使之成为一个主键, 我要继续前进,不 检查任何其他的盒子。 

所以,当我现在终于单击保存, 我回到我的用户表, 这是什么样子,如果我 现在点击新标签结构。 所以这一点,要清楚, 仅仅是phpMyAdmin的的方法 说法数据库表 有一个ID,名字,和一个数 这些特定的配置 我们会忽略其余字段 还有现在。 

所以,现在我该怎么想呢? 所以,如果我现在去到我 源代码,如果一切正常 我想请执行以下查询。 插入,而我正好可以 用户说我不严格 需要那些背蜱,如果是 不是一个危险的词像用户。 我要说的名字, 号,然后在这里我 不会硬编码 数字值的呢。 我打算把两个问号。 这是一个约定 在许多语言 如果你想拥有其中 占位符的字符串 你要使用的问题 商标,其原因我们将 再来聊聊 安全性,并且在这里 我要通过这些 两个字段的名称后, 然后发布号, 现在保存文件。 

而现在我要去 再往这里是一个超级 简单地说rendersuccess.php,这 将是另一个模板。 我要创造非常快。 Geditsuccess.php,我只是去 说H1的成功在该文件中。 行。 所以,现在,让我们回到 浏览器,在那里我参观之前。 让我们继续前进,并确认我写的 大卫,我写了一个电话号码, 注册。 该死的。 我做了什么错? 所以,我看到一个错误在这里,你 在您的SQL语法错误。 让我跳回到gedit中,让 我回去register.php, 并没有我忽略了什么 重要的是最后一次? 我需要这个。 你想知道比其他 拜读过,但我需要这个。 

所以,现在让我们回去,这 是要看到在浏览器有用 这就是为什么在config.php 我们吐出的错误。 让我们继续前进,刷新, 点击继续,取得成功。 所以,现在让我去到我 这里的数据库,然后单击用户, 和浏览,而现在通知我 有大卫在我的数据库在这里。 现在,技术上这个网站是 还没有在公共互联网上, 所以我不能有其他 人们把这里 但如果我现在想,对于 举例来说,给自己发送了一条短信。 让我们去上肢体这里 看看这个实际工作。 我要继续前进 并删除该行 我们将这种模糊 出在视频购买 所以我们没有 整个互联网发短信我, 我们现在会去到 浏览器,我们就去了演讲 我们会输入不同 数字在这里,注册,取得成功。 

所以,现在,我自己的号码是大概在 数据库中,现在最有趣的部分。 让我们实际使用PHP做 编程的东西, 无论是从命令 行或从其他地方, 而现在我只是 要保持简单 而我要进入我的 在此目录中,并做到以下几点。 gedit中的脚本让我们说,我们将 把它叫做文本,#!/用户/斌/ env的PHP, 就像我们看到的最后一次。 PHP。 

现在我该怎么办要求 包括config.php文件, 但这样做可能 导致一定的误差。 现在我要继续前进,说 行查询,从用户选择的明星, 现在在这里,我会做一个技术 从最后一次为每行的行。 而我要做的事情很简单。 printf的假设名字是这样的, 和数量是这样的,反斜线ñ。 而现在,我要通过 行引用引文结束的名字, 和行报价引文结束数, 现在让我们继续 和我的终端窗口 CHMOD此一+ X,使 这个脚本调用可执行文件的文本。 现在,让我们运行文本。 

好了,进步。 所以,我现在已经写了 命令行脚本, 在一个名为PHP,即语言, 由于需要线 可以访问所有这些配置 我指定的常量。 数据库等的名称。 其实,只是要清楚 这不是侥幸, 让我继续前进,登记, 真快,别人喜欢抢 并给他的555-1212号。 

而现在,如果我运行脚本 再次,注意电源 是我们正在做的数据库。 现在我马上看到什么 另外两行是在我的数据库。 所以,现在让我们尝试做一些事情 甚至里面票友, 这是我们的一部分 事先没有测试, 所以我最后一次这样做 事情发生了可怕的出错, 我们有视频的效果。 

事实上,是的,搞笑的一边。 所以最后一次,在一个 讲课就像两年前, 我们决定,我决定了,要 这一切都将是一个伟大的想法 动态生成的电子邮件 类,使用整个数据库CS50 学生,谁给了我们他们的数字 和他们的手机运营商,你 可能还记得pset0, 怎么讲道理,事实证明 我在我的程序中有一个小错误,并 在2012年做了几个错误,我想。 

由此,一个我曾经for循环 究竟做了这种事情, 遍历数据库, 从数据库中获取的名称, 从数据库的名称,然后在每个 该循环迭代我发了封电子邮件。 而不是发送一个电子邮件,但是,我 发送一个电子邮件的第一次迭代, 和两个邮件第二次迭代,发 三封邮件,第二次迭代,这 你可能还记得我们 渐近符号的讨论 不好这个大O,如:n的平方 为我发送了多少短信, 但它甚至没有电子邮件 这是短信。 

如你所知,上座率不 超级朝着结束的学期高 所以我认为这将是可爱的 的时候说,“你为什么不上课吗?” 在短信我 发送给全班同学, 而这是有趣的喜欢的50% 类,但另外50%,其中一些人 吓坏了,我送难以置信 歉意的甜蜜音符 工作人员道歉 已经错过了刚刚的演讲 这一次,对不对? 

这样就会可怕地歪。 因此,在这样的精神,让我们试试这个 再次,只是用我的电话号码。 事先,在functions.php中, 我在这里写了这个功能。 这就是所谓的文本,它 需要三个参数。 一个数字,载体,并发送信息。 

我使用一个switch语句,其 奇妙的PHP取字符串,不只是 整数,而我并没有实现 这所有的一切支持, 我刚刚做了AT&T和Verizon。 因为事实证明 与这些运营商 他们有邮件短信网关, 让你可以确实 发送电​​子邮件到一个地址 就像在vtext.com电话号码 而如果用户还没有被阻止 消息,它会通过 是一条短信。 

现在要做到这一点,我将要加 一个字段的真快,以我的数据库。 我要进入 我的结构,我 要继续前进,并添加 字段在表的末端。 让我们单击Go,我 要调用这个载体 而现在我要去 离开这个作为一个栏文本, 但我们可以在未来的票友。 我要赶紧去 进入我的表,我 要摆脱抢的, 因为这是一个假的号码, 我要进入​​编辑在这里和我 要手动更改我的运营商 是Verizon公司,它 是的,现在在这里。 

让我们做一个快速的完整性检查。 让我们打开了我们的文字脚本,该脚本 看起来是这样,运营商为%s。 我们做了很多的错误 检查比我在2012年,运营商。 而现在,我要去 前进,重新运行该脚本。 行。 开利公司是Verizon公司,这意味着 现在希望我可以做这个。 正确今年以来, 但愿,我们开始吧。 

所以这个循环里面,我 将不仅有这个的printf, 我还打算叫文字和 这个函数调用的用法 是它需要一个数字,一个 载体,并发送信息。 所以,让我们来看看,数量要 是行报价引文结束“号,” 行报价引文结束“航母” 最后一个是消息。 不要搞砸了,今年分号。 

行。 手指交叉。 让我们来看看,如果这个工程。 好吧,就这样。 开始了。 让我们来解锁手机, 用你的手指,该死的。 未定义的变量可 - 哦 等待,等待,等待,真正的快速。 真正的快,真正的快速。 这是完全值得的。 让我抢,我抢,嗯,哦。 谢谢你的文字有 从别人开始。 让我继续前进,真正的开放 快速,dropbox.php /邮件在了这里。 待机。 完全值得的。 下载。 OK,源src8m。 行。 

在这里需要多一个线。 哦,还有这是,这是在的新生 即时消息,它在寄存器中的三个。 哦,你好,马戈,非常感谢你。 OK,我在这里失踪的这条线。 所以让我赶紧抢 这行代码, 其中包括邮件或库 其实我是想用, 我要赶紧 返回到功能, 我要去的这顶 文件并要求该文件为好, 现在我要真正过我 当我回去的命令手指 行脚本,这是内部 今天的本地主机目录。 运行文本。 输入。 邮件。 待机。 待机。 邮件。 哦,好吧。 开始了。 

邮件获取新的PHP邮件。 难道我这样做对吗? 该死的。 To--哦,等待,等待,等待。 支持。 我保证,这是 将是太值了。 地址。 这就是为什么我不做了 课前右例子。 唉。 下列收件人失败。 让我们尝试最后一件事。 从SMTP,添加地址设置, 地址的确是。 让我们尝试在地址的最后一部分。 唉,我真的很伤心,现在。 谢谢。 不过,我真的很感激所有 文本你已经发送。 你有这个大卫。 你吹吧。 让我们离开它那里, 我们将解决在星期一。 到时候见。 

DAVEN FARNHAM:现在深 思考了Daven法纳姆。 如果一个二进制树倒在森林中和 周围没有人到C它 -  [笑着]。