[Powered by Google Translate] [8周,续] [戴维·J·马兰] [哈佛大学] 这是CS50。[CS50.TV] 这是CS50,所以这是在这里的第8周结束。 当然,我们也有一个位的飓风本周早些时候, 所以,现在真的是只有你和我在此讲学厅, 但今天,我们继续我们的谈话,关于PHP 关于Web编程,我们还引进的想法 数据库,特别是一个叫MySQL,这是非常流行的这些天, 这在很大程度上是因为它的可扩展性,以及因为它是自由和开放源码。 但首先,看看我们离开的最后一次。 回想一下,我们正在寻找在几个大一IMS的例子, 这是可怕的形式,我想出了一些15 +年前 为了让学生在校园内寄存器大一学生校内体育 而其实不必长途跋涉了穿过院子到威格尔斯沃的 滑动物理一张纸,下面的一些监考的大门。 相反,我们提出了网上,但做到这一点,我们需要利用 一些技术,所以,我们需要HTML超文本标记语言, 而这又是与您的标记语言,使网页结构。 使用CSS位,这些天,级联样式表, 据此,我们使用的语法稍有不同使用风格化的网页, 而HTML是所有关于其结构。 我们还需要引进一种Web编程语言。 在这种情况下,我们将使用PHP,PHP是怎么回事,让我们 动态输出内容以及编程的东西,如 发送电​​子邮件的情况下,就说明我们留下上周。 回想一下,这个代码是在2份。 一,我们有froshims3.php的, 这主要是标记与HTML表单里面的, 这里的CSS样式属性一点点 这样的形式本身就可以在页面上居中,但除此之外, 我们有一些有代表性的形式输入,文本字段,复选框, 一些单选按钮,选择菜单,和一个提交按钮。 通过这种形式,我们提交的文件,显然是被称为register3.php, 这本身看起来有点像这样。 现在,大多数的代码,召回,register3.php的是所有有关电子邮件。 的形式提交,以确保它没有一点点的验证 的字段实际上是提供了预期。 然后,我们调用一些PHP的功能,稍微使用新的语法, 即使它借用C. 箭头操作符使我们能够利用一些所谓的面向对象的编程。 我们不会进入任何详细说明,但现在知道 它是一种与对象相关的功能, 这是一种特殊类型的结构,因为我们看到在C. 但现在,只需要信仰,这是使用正确的语法 当使用一个库,这样PHPMailer的图书馆。 然后由这个文件的结尾,我们动态生成的电子邮件 发送到了我的jharvard@cs50.net帐户 从我的jharvard@cs50.net帐户, 并通知用户,因此,他们已经注册了这项运动。 这是相当多的大一IMS网站所有这些年前 当我实现它,当然,在不同的语言, 但它显示了你的权力,你有可能 现在,你不仅可以表达自己的编程方式 在较低水平的语言,如C,但在​​一个更高的水平 与这些非常现实世界的应用,如电子邮件,真正解决 一些现实世界的问题。 现在,当然,即使我使用这个脚本来生成一些 从jharvard@cs50.net,这确实是一个帐户的电子邮件动态 我有机会,千万要相当小心,发送 邮寄,实际上是你自己的帐户, 以免事情让你在生活中一点点热水。 随着中说,现在,让我们过渡到完全不同的问题解决了, 保持状态。 现在,这究竟是什么意思? 该超文本传输​​协议HTTP, 实际上是一个无状态的协议,这是什么意思, 当你拉起来像Google.com,然后按下回车键 通常,您的浏览器有一些种旋转图标,然后 结果在某些网页的下载, 那个小图标,然后停止转动,确实建议 HTTP已经完成了某种连接到服务器,这就是它。 HTTP是无状态的,在这个意义上,它并不能维持 持久连接到服务器以同样的方式Skype的不 或Gchat确实因为与​​HTTP 假设是,一旦你获取一个网页就是这样。 现在,在现实中,这些天,如Facebook和谷歌地图的网站上 和Twitter一样有很多更多的活力,即 后该图标停止转动,你其实可以得到更多的更新 从服务器,更多的鸣叫,更在Facebook上的状态更新和喜欢。 但即使是使用的技术,我们将谈谈在一两个星期 被称为称为JavaScript的Ajax使用的语言, 但在一天结束时,HTTP是无状态的。 但如果你想以某种方式记住用户的事情 即使他们已经从服务器断开连接 PHP不起你这样做的手段 因为,我们看到了最后的时间,PHP有一些超全局变量, 和一个超全局变量,同样,一个特殊的全局变量 交给你的Web服务器和PHP本身。 你不必做任何事情,把它的值, 迄今为止,我们已经看到了超全局的get和post。 这是表单字段自动为您, 以及一对夫妇的人,我们还没有看到。 里面的$ _SERVER是服务器本身的一些特殊变量。 什么是IP地址,协议,HTTP或HTTPS使用, 你是什​​么样的请求方法之类的,所以有一些有趣的, 有趣的细节的服务器,而事实上,用户,以及在那里。 $ _COOKIE,这是这些东西叫做Cookie的存储。 我们不会花时间对饼干本身的今天, 但要知道,现在,Cookie是一小块的信息 在Web浏览器,Web服务器可以种植 在打开的RAM或电脑的硬盘驱动器 来存储有关用户的信息,例如,他们的用户名 因此,他们不必键入它每次登录或一些 该用户的唯一的数字或标识符 这样你就不必纠缠他们的同种问题 在未来的偏好,但大多数的利益 现在是$ _SESSION。 这,和其他人一样,就交给你了自动PHP的超全局, 当你编写基于PHP的网站 可以存储任何你想要的,字符串,整数, 浮动点值,数组,对象, 什么,你想要的,它可以让你以这样的方式将其存储 即使用户访问你现在,然后 回来一分钟或5分钟车程,因为现在 他们把自己的时间,然后再点击一些其他的链接 PHP将确保无论你把该会话中的超全局变量 一分钟或5分钟前仍然会在那里当用户返回。 和下方的罩超全局方式实行 这些东西叫做cookies,但就目前而言,它只是一个抽象的概念 据此,这是一种在程序上等同的购物车。 无论你作为程序员,摆在那 超全局关联数组将有一些分钟后, 直到你删除它,或直到用户完全退出他或她的浏览器。 让我们来看看这件事是如何实际使用的例子。 今天的代码块之间在counter.php 我们有以下行。 在这个文件开始的,我们一堆蓝色的意见,这是无趣的,现在。 但在第13行,我们有一个新的生产线, 在session_start,这其实也正是它说。 它启动会话。 它使您能够使用,大超全局变量$ _SESSION,它是那样简单。 现在,如果我们继续看第16行,让我们揣摩这是什么网页也会做。 如果(使用isset($ _SESSION [“反”])然后继续前进 并存储在计数器变量,小写计数器, $ _SESSION [“反击”。 这似乎是声明一个局部变量称为计数器 里面,它把一个副本,无论是内部的超全局 称为会话的位置“计数器”。 品,显然,这个小的局部变量计数器被初始化为0。 但那么几行之后,在26通知会话的复制计数器, 其关键,有一个新的值赋给这是它的当前值加1。 总之,这个文件似乎被更新 一个计数器,存放在里面的会话超全局 通过递增1,但它首先保留先前的值的副本 通过将其存储在局部变量名为$计数器, 然后在这里让我们来看看还有什么。 原来,这是非常简单,只是HTML。 在这个页面的底部,我们可以看到,我已经在第37行访问此网站 计数器的次数,所以有一对夫妇有趣的功能。 之一,这显然是一个变量,但它并不足够,只是把 $计数器在你的HTML,因为身体的过程 如果它只是中间的HTML PHP是要承担这只是HTML。 你从字面上要计数器的显示在屏幕上。 而是由下降到PHP模式 这一块的语法,我们可以动态插入的值 非常相似的精神,我们所做的最后一次 将值转换为字符串。 事实上,这只是说这样的事情简直一个速记符号, 打印(柜),即使是像printf(%s,计数器), 甚至,你可能已经看到在网上或在教科书中, 有一个函数在PHP称为回声 做同样的事情,而所有这些都只是不再啰嗦的方式 说<=。 在这个情况下,你不需要把 字PHP后的问号。 这是速记符号,再次,我们刚才也看到了 这是呼应一定的价值。 让我们来看看最终的结果,这实际上是。 让我到我们counter.php文件, 我们将看到,大卫犯了一个错误的代码播放。 让我们去解决,无论他搞砸了, 错误似乎是存在的,走了,上线37。 根据这个页面的顶部,我曾访问此网站的0次。 好吧,让我们继续前进,现在,在浏览器的顶部点击 重新加载图标,然后单击“重新加载, 现在我访问过的站点1次,2,3,4,5,6,7,8。 事实上,如果我们看一下实际的源代码在此页面的源码是变化的, 并注意到完全没有任何PHP,这是因为 评价或解释PHP代码的服务器端, 因此,这意味着PHP脚本的输出是什么,最终发送到浏览器, 在这种情况下,一些原始的HTML和一些原始文本。 这是怎么回事呢? 好了,有了几行代码,我能够存储 坚持几秒钟的过程,或者如果我们等待了足够长的时间, 分钟,甚至几个小时,一些价值的方式,使HTTP 似乎有状态的,就好像我们保留 连接到服务器,它只是记住什么,我告诉它最后一次, 但在现实中,有一大堆的复杂性,引擎盖下的 涉及饼干,让PHP给我这个错觉 这个购物车类似的功能。 现在,一个简单的例子,我们只是存储一个整数, 但该功能会回来的,是很有价值的 当我们开始谈论更复杂的项目, 其中问题7。 这是你的最后一个问题,在CS50。 我知道,它是如此难过,但你会发现的是,我们要总结 这学期的实际过渡 从C的背景下,一定要PHP的背景下, 但同时使用了同样的基本面 我们已经讨论了一段时间。 pset中7的目标是实现CS50金融, 这是你自己的版本的雅虎财经,谷歌财经 甚至是Etrade.com,让你有能力 查阅股票价格对于给定的符号,但比这更 你有能力来“买”和“卖”股票 在不同的证券交易所上市交易的,因为本网页 在这里建议,这是真的,我们已经开始在何种程度上 问题集给你,你有一个登录表单的用户名和密码的要求。 它有一个提交按钮,但此后,我们最终会看到, 有没有什么打算,因为它引擎盖下的 保持你实现注册新用户的能力, 买入股票,卖出股票, 其实看看目前的股票价格。 事实上,这是因为现实世界是可能的,因为我们做了 包括了一些代码,可以让你与一个单一的功能 雅虎财经,奇妙提供免费的数据查询 用于查找的股票代码或股票代码股票价格的基础上, 你回来的日子目前的股票价格。 其实你看到的数据将在这个特殊的pset 因为现实世界,因为它可以使你实际上接口 与现实世界的股票,真正的世界价格, 我们将看到多少钱,你也许可以 在接下来的几天里,玩了你自己的问题。 但首先让我们如何设计的东西,当然,更复杂的阶段 比counter.php,这是迄今比任何的大一IMS例子更复杂, 让我们在这里介绍几个范例,让我们 为pset的,也许最终的项目,如果你做一些基于Web的 让你的代码,良好的组织,以保持自己的理智, 并采取一步步走向合作,无论在CS50的最后项目 或超越,如果你继续在未来编程的东西。 这个一般设计范式 在计算机科学和软件开发 被称为MVC模型视图控制器, 这是一个愚蠢的缩写,描述了一个非常好的主意, 这是一个程序的不同方面的分离, 特别是保持独立的逻辑或业务逻辑的一个网站 所以这样的话,任何涉及 调用函数和查询数据库和 发生了不属于你的HTML 而是在单独的文件中,确实有这样的一个文件 通常,你叫控制器 这就是真正的大脑后面的操作中,我们将看到一个例子 这只是一瞬间。 有一个代码编程模型,它 谈论到您的数据库,雅虎财经和说话, 然后有MVC中的V的意见, 所有的相关的东西,美学,实际包含的文件 您的HTML,也许你的CSS等。 这里的想法,作为这张照片表明,是控制器 是的文件,我们很快就会看到,你会特别的pset 7, 世界谈判,以通过他们的网络浏览器。 这是在公共互联网上的文件,该文件被访问的, 但控制器的谈话可能是一个模型, 这是包含的代码相关的数据的一个或多个其它文件, 数据库和等相关代码,然后它说话 控制器的一个或多个其它文件称为视图, 这是一个网页的美观性,各种模板, 可能需要一些数据作为输入,但在一天结束时 唯一的内部逻辑的观点应该是渲染的数据, 迭代循环,实际上吐出一些 其基于HTML的翻译,甚至像一个PDF。 什么是不错的关于MVC的是,你可以有不同的看法 的设备的类型的基础上,基于类型的文件格式,你实际上 要显示给用户。 让我们来看看一些越来越复杂和精心设计的例子 第一个版本0在这里开始。 让我去进取,不断开拓今天在我们的MVC目录 一个名为index.php的文件目录0。 请注意,这是一个超级简单的,很给人留下深刻印象的网站 这是排序的网页版本0 CS50, 看到我们如何有一个链接,在演讲中,我们有一个链接到课程, 如果我按照的链接的URL讲座通知 往上顶改变lectures.php。 如果我然后按照链接到第1周通知的URL改变week1.php。 似乎是一个非常简单的分层结构。 让我们快速浏览一下这是如何规定的引擎盖下, 而事实上,如果我看的index.php这是很简单的。 事实上,即使我称这是一个PHP文件,没有实际的编程代码。 有一个评论,我在这里写PHP,使用户不会看到它。 当然,像以前一样,在PHP标签之间的任何 将会被解释为,即使这是一个注释,解释评论 意味着只是在一天结束的时候把它扔掉,而不是真正 发送到浏览器,所以在这里的一切只是美学。 如果我打开同样lectures.php的,这也只是一个硬编码的文件。 它发生在被称为PHP的, 但它确实是公正的。html,并week1.php,week2.php的 同样是标记,因此有一堆这种设计的缺点。 一,这是一个巨大的复制/粘贴。 即使在这些文件中唯一的变化是无序列表, li标签,我仍然有doc文件,HTML,头部, 标题,靠近身体,密切的HTML和更多 在每一个文件,这意味着如果我想调整 这的网页或restylize它我必须去改变 所有这些文件手动或使用一些大规模的查找和替换。 让我们一步步走向一个更聪明,不再想在这里第1版设计 据此,作为每读我说,我们提供了这样您就可以一起玩 这些悠闲地在家里通知,我们这里有 本网站中的文件的摘要版本1, 似乎我已经采取了根据自己的因素 一些常见的代码,header.php和footer.php。 那么,让我们来看看里面有什么第一。 header.php文件看起来很熟悉, 但要注意,切断? 右后19行,所以这是共同的一切 从文件的index.php,lectures.php, 第一周和week2.php从前面的例子。 我所做的就是复制和剪切一切所有这些文件是共同的, 把它放在一个单独的头文件,同样在footer.php的 我采用同样的原则,即唯一有趣的线 在fo​​oter.php的是这两个,靠近身体和密切的HTML。 但是这意味着什么,现在是在新版本 多么简单的index.php通知可以得到的。 当然,多一点神秘的期待,少一些直观的 按照从上到下,但我的上帝,所有的冗余已经不复存在了。 我们需要使用字面上称为一个PHP函数需要往上顶, 这很容易让人想起,回忆,C的#include机制。 我们需要的header.php在顶部。 我们需要footer.php的底部,唯一不同的 有关此文件或特殊的意思是它独有的内容。 然后,如果我去,说,lectures.php,同样的原则也适用。 同样,一些意见往上顶,但我需要的头,要求页脚, 在两者之间,它的唯一的内容,实际上改变了。 如果我们看着周1周和2,我们会看到 ,同样的原则已在此应用。 嗯,我们不完全完成。 让我们来看看第2版,也有类似的结构, 但要注意现在我已经介绍了别的东西。 在第10行中,我介绍了helpers.php, 这显然​​包含辅助功能。 一个辅助函数通常是一个相对短的功能 你写来帮助你在不同的地方, 让我们来看看里面有什么,helpers.php。 在这种情况下,它看起来像它有2个功能。 还记得,有一天与我们的立方体的例子 你可以定义你自己的函数在PHP中,和我现在所做的,是我已经 定义功能称为渲染页脚,使头, 其中第一个参数,称为数据, 其默认值是一个空数组,建议有, ,我们其实可以写更简洁的最新版本的PHP 说左方括号,方括号封闭。 这意味着一个空数组的大小为0,但仍然阵列。 这种提取物的功能是有点特殊的, 它是什么,它​​的参数是一个关联数组 有0个或多个键值对,如果你有一个关键的foo 酒吧提取物功能和值 创建一个情况中,现在,作为第11行, 你有一个局部变量$ foo的值是酒吧。 如果你有更多的数据数组中的键和值, 同样,他们会被解压缩到本地范围内的 或名称空间,使footer.php文件和 同样的想法在这里,这样的header.php 对这些变量的访问。 事实上,让我再次打开header.php文件 并提请注意在这个版本是什么样子。 而不是硬编码CS50为每一个页面的标题 注意到这是可能的,现在的活力。 在第5行,我呼应了标题变量, 但首先,我要传递,的标题变量来调用的函数进行htmlspecialchars。 一个愚蠢的名字的函数,只要它是,但它确实它说什么。 它可确保任何特殊字符 在字符串中,已通过正确转义HTML。 这其实是一种方式,避免一些所谓的跨站点脚本攻击 据此,有人恶意或意外 注入自己的HTML到您的网站 通过粘贴到某种形式的,例如, 什么,你是不是很期待,尤其是JavaScript代码, 我们将讨论大约在一个星期或两个的时间。 现在这header.php文件,这是一个视图 在这个意义上,它可以让你查​​看美观一些数据集的内容。 但是,更具体地,它是一个模板。 这是现在我们希望每一个页面的标题看起来像什么样的蓝图, 但有一些活力,我们要动态地插入标题 根据标题变量 提取时,我们再次呼吁, 渲染头功能。 现在,如果我们看到在渲染页脚,实际上是没有多大用处的,正确的现在 因为在footer.php文件有任何没有活力。 有可能,但此刻的标签,这是一个硬编码的列表, 但同样的想法适用的,因此实际上说明了为什么 我们浪费时间了,有一个渲染的头和渲染页脚功能? 让我去,而不是现在已进入第3版, 3佣工版本,我决定简化甚至更多。 让我有一个渲染功能。 让我有另一种说法,这段时间称为模板, 是指为模板的名称, 然后,我将连接振振有词。PHP该变量的值, 然后如果它存在foo.php的,bar.php或header.php和footer.php, 然后,我要继续前进,提取变量数据 然后要求这条道路。 换句话说,现在,如果我打开index.php文件 请注意,我不调用render头了。 我只需要调用渲染,但我通过在报头值的 明确的模板,其实我是想加载。 然后在这里发现我在做什么。 我是通过动态的一个关键的标题, CS50值,这一点,正如我们之前看到的, 在最新版本的PHP,能够更简洁 在这里我可以取代用方括号的数组函数, 我的建议是更可读的,当然 一个小更容易输入。 当然,与渲染底部的页脚呼叫, 我们不通过关联数组中的第二个参数,没有打扰, 因为没有什么动态,页脚里面的。 这只是一些关闭的标签为HTML。 好,我们正在采取步骤实现真正清洁的东西在这里, 但让我开了2最后的例子。 这其中,4号,请注意,我现在做了一个明智的决定 在前面的例子中,最后用一些我的文件层次结构,以改善。 请注意,在此总结,在此我读,我已经介绍 包括目录和模板目录 其内容将是我想要的东西,包括 和模板,我想,分别呈现。 这的确是我的肛门,并试图保持整洁, 相关的文件,但最终的结果 是,我们现在有一个稍微整齐的设置,但现在我们必须记住 在,例如,的index.php 当我们需要的文件helpers.php的时 我们现在需要通过包括/ helpers.php 而不是仅仅说helpers.php的,因为现在它实际上是在一个子目录。 现在,顺便说一句,你会看到在这些例子和其他一些 功能,如需要,一旦需要。 实际上,有一个函数本身叫做包括,他们都具有略微不同的行为。 在这里,我说需要一次超清晰,我只希望那些 佣工,包括一次在我的项目。 但是,如果我小心,如果我想通过我的逻辑正确 它应该足够了,也只是说需要往上顶 只要我自己不意外需要其他地方相同的文件。 其实,这是一种更有效的方式做的事情,然后使用 再次要求,所以我将只需要修剪下来。 让我们又进了一步。 第5版,现在这最后一个例子,有一个更清洁的文件夹层次结构。 请注意我在这里所做的每读我在这最后的版本 现在,我有我的HTML目录,我已经有这么长的时间, 但里面的有现在是的index.php,lectures.php, week1.php和week2.php。 包括目录现在住在旁边的HTML目录, 在同级别的兄弟姐妹,可以这么说。 那么,模板文件夹。 这里的关键特点是,我已经介绍了一点点的结构, 但现在的主要特征是,只有文件 需要通过网络访问,公开寻址 在公共互联网上的URL是在我的HTML目录。 与此同时,其他的文件,helpers.php,footer.php的, header.php文件,也许可以说是更敏感, 也许佣工实际上有一些用户名和密码或部分知识产权 我的财产,我真的不希望让全世界都看到,即使不小心的功能。 这是很好的做法,保持了公众的HTML目录 不需要任何文件本身是公开的。 所有您需要做时,在这种情况下,例如, HTML目录的index.php文件, 注意到当需要时,我们只是要更加小心一点 再次要求该文件。 我首先需要做的..去的父目录, 然后你/ / helpers.php 潜回得到的文件,我关心。 然后在MVC的任何问题 这个相对简单的化身吗? 让我明确表示,我们集中相当多的 V这里的意见,并分解出这些模板。 我们还没有真正区分M的Ç只是还没有。 事实上,真的有没有M在这里,和我们的C, 控制器,是不是真的做所有的东西,但你会得到更 熟悉从MVC这2个字母, 或者说,你会得到更加熟悉的C 在MVC的问题集,所以有更多的地平线上。 有问题吗? 实际上,有没有人在这里。 好吧,让我们现在进入今天的第二个也是最后一个主题。 这是引进的数据库。 直到此时,我们已经有一些数据存储方式。 我们使用的变量。 回到我们的C文件,I / O的讨论,我们开始使用文本文件 和使用的文件,如fprintf,然后我们甚至还没有开始 一点点谈论CSV文件,逗号分隔值, 因此,所有这些让我们有数据存储 要么不持续或持久。 但是,即使CSV文件是不是真的有利于搜索 并插入和删除。 这真的只是一个愚蠢的用逗号分隔的文本文件 一行一行一行一行地,所以如果你想 搜索该文件真的是最好的,你可以做线性搜索。 你必须开始在该文件的顶部,读了整个事情中, 寻找一些价值的利益。 如果你想插入到它,你必须做同样的事情, 遍历它,并插入一个特别的地方, 而事实上,你需要做的所有的搜索逻辑自己。 你不能这样做聪明的模式匹配一​​个CSV文件,除非你自己写的代码。 你不能做一个CSV文件的过滤 除非你自己写的代码。 那岂不是很好,如果有人把所有的努力都 真正让搜索方便,插入容易 删除和更新等等? 那到底什么是数据库。 SQL结构化查询语言,又是另一种语言 我们引入今天在这里,但也相当接近, 我们真正要做的只是摘下了它的一些最显着的 特性,使的pset 7,如果你做一些基于Web的, 您的最后一个项目,你有自己的表达能力 在数据查询。 有本事你存储大量的数据 在一个更结构化的方式,将在一天结束时 让您的生活更容易,因为与SQL中,你可以表达自己 更精确,更有条不紊,以 从更多的语料数据,一些数据子集。 你能想到的数据库,在这种情况下,SQL数据库,真的很喜欢Excel中 或数字,它是一个电子表格, 或可能多个电子表格,电子表格,当然, 有行和列,这是因为 在这个意义上,SQL数据库是关系,关系 它们存储在这些表中的数据, 行和列。 他们是性能更高的类似电子表格, 和一个电子表格是指由一个人使用。 是指由程序员使用一个数据库 对编写代码,这样一个数据库的化身 是命令行。 其中最流行的关系数据库在那里,再次,MySQL和 奇妙的是免费的,非常高的性能,这是什么 Facebook的使用很早就在一定程度上仍然是当今 存储大量的数据,我们可以看到在某一时刻 ,使用相对简单的命令 我们可以选择数据,插入数据,更新数据, 删除数据之类的,但幸运的是,有一个更友好的用户界面 比打字黑色和白色的提示。 我们将使用的pset 7和一个免费工具phpMyAdmin的。 这个名字是偶然的。 该工具恰好是在PHP中实现, 但是,这是根本不相干的。 什么是非常有用的关于phpMyAdmin的是,它是一个基于Web的工具。 我们已经预先安装它为您在家电, 有了它,你可以创建数据库中的表, 你可以插入数据,删除数据,并通常会看到 你的数据在一个相当友好的用户环境。 你的用户不会使用phpMyAdmin。 这是真的只是一个的行政或开发人员的工具 看,捅在你的数据,并找出如何构建它, 就像你自己可能会使用Excel或数字, 但它的将是一个伟大的方式可视化的引擎盖下这是怎么回事 使您可以专注于一个有趣的问题解决,而不是这么多 在神秘的命令。 让我们来看看一个例子的数据可能存储扁平 在关系数据库中。 下面是一个例子。 现在,不幸的是,phpMyAdmin的错误侧抛的方式太多的话 在你的图形,但如果你只是在磨练 ID列,“用户名”列,和哈希列, 这实际上是一个电子表格,但它正好是一个片段 器具的表里面 使用的文件,我们为您提供问题集7。 特别是,我们给你一个文件,该文件表示 用户的表,所以具有3列的电子表格包含用户, 其中之一是从1开始的递增之后的一个唯一的ID。 第二列是用户名,和那些你们谁做黑客, 黑客版的pset 2,可能认识一些至少这些用户名。 在右手边的密码,但他们不是字面的密码。 他们哈希上,所以它原来 存储在数据库中的密码是一个非常糟糕的主意。 你都可能在某些时候的一些网站阅读 或受到损害,一些公司的数据库,那么你必须 更改你的密码,你需要的东西拿到退款 因为一些坏家伙居然闯进您的帐户的结果。 在数据库中以明文形式存储密码,加密的 完全是愚蠢的,但它大大有趣 然后读一些非常有名的公司 有时在记者的数据库被攻破, 这部分是不好笑,但加密数据库包含的事实, 密码是荒谬的,因为从字面上一行代码 你可以防止特定的威胁,这就是我们在这里所做的。 即使是假的小CS50财经版 密码进行加密的好措施,而事实上, 所有这些密码启动$ 1 $仅仅是一个惯例。 这只是意味着,他们是加密的,还是真的进行散列, 这是一个单向加密功能 让你无法扭转其与一种叫做MD5的影响。 一个事实,即图50是后表示的盐值 50除了所有这些密码哈希。 矿,当然,你可以在这里看到,HA, 使用不同的盐,所以你得到了稍微绊倒了 也许在黑客2,有可能的结果,我们利用 比别人​​因为我的密码是不同的散列实际上是相同的 作为其他一些用户那里。 事实上,如果你一直在等待这几个星期来找出 这些密码,这里的密码,你的挑战 在黑客破解版的问题集,所以没有太棘手。 事实上,默兰的相同jharvard, 但如果我们回去,他们显得与众不同。 专注于jharvard深红色,因为他们腌制不同。 该算法是一种方式,扰动 哈希值,看起来有点不同的加密值 因为输入略有不同,但引擎盖下的密码 最终还是绯红。 现在,谁关心这个? 好了,我们为您提供的样本用户,用户名样本 和他们的密码的哈希,所以你确实有一些 客户CS50金融时您首先下车地面您的代码。 你必须要实现更多的表在MySQL内部,里面的数据库。 你必须创造出更多的电子表格,有效的,但我们决定给你这个 让你开始,你会看到这个问题集规范 引导您通过导入此表的过程中, 也解释的一些特征是什么, 你还可以看到,我们为您提供的代码 处理这些密​​码的哈希或加密, 所以你不必过于担心什么MD5或类似的实际上是所有关于。 因此,SQL结构化查询语言。 这是很简单的语言,我们即将开始使用的pset 7 也许以后要求一些数据库中的数据。 再次,数据,存储扁平这些关系的表,列和行, 但使用delete等一些相对简单的语法, 插入,更新和选择,我们可以这样做。 我们可以从数据库中删除,插入, 更新数据,以及选择,那就是从数据库中检索数据。 我们如何去这样做呢? 让我提前进入设备。 让我拉起来http://localhost的, 这,又是当地的家电本身。 这是它的默认昵称。 让我去/ phpMyAdmin的。 这恰好是一个特殊的URL,该设备是预先设定的了解 立即提示我输入用户名和密码。 像往常一样,我会,输入jharvard和深红色的, 但认识到,在计算机上的管理员帐户。 这只是一个巧合,也有一个jharvard为CS50财务注册的。 Jharvard,深红色,请输入给我的,我们看到的用户界面, 一瞥的时刻,这是一个有点势不可挡的第一, 不过请放心,你永远不会有点击的链接在此工具中。 你会使用一小部分是超级有帮助, 第一个是数据库。 如果我去到数据库,请注意,系统提示我创建一个数据库。 这是创建一个新的Excel文件,有效。 我要继续前进,并调用这个演讲,我只是忽略该字段有,整理。 它具有数据的代表性,其中, 我点击“创建”,现在通知我放手的创建 左手侧上说,没有数据库 我应尽快请参阅的演讲资料库。 如果我现在点击左侧,演讲数据库, 请注意我的标签改变一点点。 我有结构,SQL,出口,进口和其他一些东西。 结构几乎是空白。 没有表在数据库中找到,这里说的, 让我们创建一个表,让我们继续前进,并创建一个表 喜欢的学生,我们要多少列? 让我们保持这种简单,让我们为每一个学生的记录 一个ID号码,姓名和电子邮件地址。 我们将继续这样的简单,所以3列,走了。 您在这里看到的是现在的形式有点凌乱,而且势不可挡, 但是我们必须去通过它行的行,所以真的很快,让我们给 这个数据库中的第一列的名称的唯一标识符ID。 这将是一个整数。其实我可以忽略的长度和值。 将是一个int是32位,不管你输入在那里,让我们留空白。 默认值,我可以让它空的定义。 我要离开,仅此一点。让我们不要担心默认值。 让我们滚动的权利,属性。 这是有趣的。 让我们继续前进,有些武断地说,ID必须是无符号的。 让我们不要浪费任何负数。 让我们0至4亿美元,给予或采取, 然后让我们不要只是还没有触及这些领域的那边, 然后让我输入名称,在这里, 然后其他的电子邮件,所以美中不足的是电子邮件 和名称,显然不是整数,所以让我们改变这些不同的领域。 事实证明,可变长度的字符数据类型为varchar 就像是一个SQL数据库中的字符串 但可变长度的,你必须告诉它提前 最大长度的字符串,所以我会有点随意 按照惯例,类型255个字符。 我完全可以说32。我可以说1000。 你有种根据自己的需要决定您的人口统计数据是什么 最长的学生的名字,这个数字还是有点大, 但一个varchar的好处是,它不会浪费 255个字节的每一个学生的名字。 如果它是国宝,它不会使用整个255字节, 但这是一个上限,所以只是按照惯例,我会去255, 但我们可以辩论,是一些较低的值,和电子邮件地址 是一致的255,但同样,我们可以有同样的辩论。 但我在这里要做的另一件事情上的右手边。 一个数据库的强大的是,它可以做很多繁重 或复杂的工作。 ,我真的不关心我的学生的ID号码是什么。 在数据库中,它只是一个唯一的标识符 所以我有一个32位的简洁表示,学生 所以,我有一些方法的唯一标识 以免有2戴维斯,比如,在一个类。 事实上,我要检查这的AI箱,自动递增, 这样的数据库,MySQL,计算出 每个新插入的学生的ID将是。 我什至不关心,在我的代码, 我也要去选择的索引菜单下的东西。 该指数降下来,这里主要的,独特的, 索引和全文。 你也许可以猜测这些东西是一对夫妇, 但事实证明,在关系数据库中 你的程序员或数据库管理员抢先 提示到数据库中,哪些领域 在一个表中,有一点特别。 例如,在这种情况下,我会说,ID 将是一个主索引,否则被称为主键。 这意味着什么的定义是ID今后 唯一标识此表中的学生。 没有一个学生都会有相同的ID,因为我实施这项限制或该指数​​。 此外,这会为我做的是,它会告诉 MySQL的ID是特殊的。 我关心的,特别是关于ID,所以继续做你的幻想数据结构的魔法, 建立某种树。 通常情况下,它的一些所谓的B-树,这是我们没有看周前, 但它的另一个类似的精神这样的数据结构的二叉树 和尝试,我们看了看,但它会说 数据库领域是非常重要的,我可能 要是能够搜索就可以了,继续前进,建立一些花哨的 在内存中的数据结构,因此,在理想状态下,以加快搜索 他们是恒定的时间,或者至少是接近,尽可能 因此,它不退化为线性搜索,这不会是 最高端的执行方法。 与此相反,电子邮件地址可能是一个主键。 从理论上讲,每个人的电子邮件地址是唯一的,除非你分享一些帐户, 但它通常不是很好用的东西像一串串 作为主键,因为在生活中,如果它的目的是为了唯一标识 表中的数据没有任何理由最大限度地使用255字节 唯一标识一个人,如果你能摆脱只用4个字节 或一个32位的整数。 在一般情况下,主键应该是短而简洁 理想的东西,如一个整数或一个大的整数,这恰好是64位。 但是一个电子邮件地址应该是唯一的,和一个数据库的功能之一的太 对我来说是强制执行唯一性。 通过选择独特的电子邮件,即使电子邮件本身 滚动在屏幕上,我说的数据库 不相信我。 不要让我插入到数据库中 两次相同的电子邮件地址,即使我是个白痴,我不 非常好,我如果和别人的IFS和实际的PHP代码 我不小心让用户与现有的电子邮件地址注册 数据库是另一层次的防御的正确性 重复的电子邮件地址,以确保在表中并没有结束。 现在,相比之下,名称,你可能不希望使这一独特的 因为这时就永远也不会2戴维斯或2麦克史密斯,例如, 在你的数据库中,这样一个我们就独自离开。 我要继续前进,并在右下角单击“保存”, 一切都看起来不错,但注意到在这里 这是一个部分,现在我们不会花太多时间 因为语法是有点复杂,我们不必创建表 这一切的时候,但SQL本身是一种语言, 的语法是正确的,在这里,我已经强调了。 phpMyAdmin的确实是它为你创建一个基于Web的GUI 您可以节省时间,不必手动输入 这样的一个相当长的SQL查询。 换句话说,如果你想手动创建该表, 无论是在那个黑白色的提示,甚至在phpMyAdmin的 SQL选项卡使用此选项卡,在那里你可以输入任何SQL查询 坦率地说,你想,这一切都我一分钟 记得整个语法,即使到那时,我可能会 取得了一些拼写错误,所以这个工具是有用的,这样的事情,这也是启发。 您就可以开始推断的语法是什么 只是漂亮的颜色编码,phpMyAdmin的加入 我们的直观方便。 但现在让我们做到这一点,而不是。 让我去顶部插入“选项卡,并让我继续前进,例如插入 让我们的ID说,其实我不在乎。 这将自动增加。我打算让数据库处理。 但我是大卫,和我的电子邮件应该是malan@harvard.edu的。 让我们继续在这里和麦克·史密斯为另一个。 我给自己的姓氏, 我们将已他是smith@example.com,, 然后我在哪里呢? 嗯,它看起来像走的是按钮,按一下,瞧。 请注意,在插入2行。 这是实际的SQL查询。 这是对我的phpMyAdmin工具执行, 但最终的结果,通知,如果我现在去浏览“选项卡, 看到2本表中的行,很容易让人想起美观 表中我们在前面看到的pset 7,为我们的用户 其中一人是大卫·马兰,其中一人是麦克·史密斯。 但仅仅是明确的,我并不需要使用phpMyAdmin, 而事实上,你会很快写代码的pset 7 它可以自动添加行,删除行,行和更新的过程中, 所以让我,而不是去“SQL”选项卡,在这里 和类型中选择*从学生那里 电子邮件=的“malan@harvard.edu。” 换句话说,假设你现在有 一些HTML的形式,在他们的电子邮件地址和用户类型,在其他领域, 现在的目标是在PHP的后端代码 查找该用户的其他细节。 您的全名是什么?您的身份证号码是什么? 你可以写一个这样的SQL查询,SELECT * FROM学生 在这里,电子邮件=的“malan@harvard.edu。” 而且,如果我再单击“Go”,请注意,我确实我做什么,回来一排。 迈克被省略此结果集的行的集合, 通常被称为,因为他并没有因为我拥有相同的电子邮件地址。 现在,再次,这里的pset 7你会使用phpMyAdmin作为一种管理工具 学习方式和教学工具 在世界各地的SQL,但在一天结束时 你要编写这些查询里面实际的PHP代码, ,敬请关注Zamyla的演练中,特别是 这个问题集,你会得到一个参观的分布代码 我们给你的不仅是美学的登录页面 和漂亮的性感的标志,说CS50财务,但是我们也给你 一堆的功能,这将让您的生活更容易一点。 我们也为你写的pset中的一部分, 特别是在登录部分,给你一个有代表性的设计感 实际使用一个控制器,例如,的index.php login.php的之类的,然后你会看到在pset也有一个模板目录 有你的观点,所有的美学。 因此,整个工作流程中的pset 7将是该 您的用户访问控制器通过一个URL在浏览器中。 该控制器包含PHP代码是你写的,而且里面的PHP代码 可能有一些行的SQL嵌套在双引号之间 传递给函数,我们写查询 这将有助于你的数据库,而无需使用类似 一个管理工具,像phpMyAdmin。 您就可以在PHP代码中写SQL语句 一个PHP数组的结果集, 该查询匹配的行。 同样的,你才能够执行插入或删除 或更新,或类似的,这是相当相似的语法, 你会看到一些网上的引用,从分配代码 在pset收拾自己究竟该如何去这样做。 最终实现我们真的只是表面的SQL 和MySQL的,但它的力量真的是,它使您 把重点放在你想解决的问题,使用的情况下,你想实现 而不必担心那么多了,至少在初期, 在哪里以及如何存储和检索的数据库, 这是毫不夸张地说,Facebook本身开始了其 使用MySQL,然后使用多个MySQL服务器,然后多个MySQL服务器 前长,直到他们真正开始努力思考如何 存储数据,如何更有效地存储的东西, 因此,即使我们会认为是理所当然的事实,索引和唯一性约束 等等工作,有一个非常有趣的谈话 ,这可能最终都导致,所以认识到,我们只是表面 是什么最终可能会为您或您的项目成为相当多的大数据。 随着中说,让我们在这里结束,我们会看到你下周。 [CS50.TV]