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