>> R.J.阿基诺：让刚上手。
因此，这是测验1。
下面是一些高层次的信息。
在关于页面的测验是在这个 的URL，不再CS50.net，尽管这
仍然可以工作。
这是CS50.harvard.edu/quizzes/2013/1。
这是很大的关于页面，告诉你 何时何地，也就是下周三
在一堆室。
并通过下周三，我 意味着从现在开始两天。
所有这些信息是存在的。
但它是累积的。
>> 所以一切从第一的一半 今年是潜在的测验，
因为你不能真正做到先进 事情在C无，如果条件和
for循环等。
但会有一重 材料，因为测验0覆盖，
首先是结构和文件 I / O。这是典型的多
比测验0有挑战性。
平均得分通常较低。
努力学习。
>> 当你在学习时，一定要使用 CS50/discuss张贴您的问题
和阅读其他人的问题。
所以，如果你没有任何问题， 登录并阅读
您的朋友的问题。
他们很可能好问题。
并采取实践测验。
我们已经给测验的 七八年了。
他们在网上的所有。
未来的问题是相似的 老问题。
这就是我们如何让他们。
>> 测验还不存在。
我们没有看到它。
但它看起来像 以前的测验。
对于这种审查会议，这是不 专题的详尽清单。
你不能只是出席本，然后 是完全准备好测验。
否则，它不会是 太大的测验。
这也是不一定 你需要知道的任何一切
给定的主题。
它的意思是暴露你的东西 我们已经介绍了，提醒你我们
覆盖，并在途中 我们覆盖它。
但是你将不得不更进一步， 更深层次的，当你学习到仔细检查
你知道一切关于任何给定的 主题，你已经填写
一切是那样的角落 涵盖讲座。
>> 测验笔记告诉你去 抄写笔记，观看讲座视频。
这是一个很好的方式，以确保你已经 涵盖了所有你的基地。
所以起步，当我做这些 幻灯片中，我试图把在那里我发现
信息。
因此，对于文件I / O，例如，第7周， 周一的演讲和张贴
第6条和习题集都有 有关文件信息的I / O。我已经做了
这对每一个议题。
因此，那些标题幻灯片可能 对你有所帮助。
>> 所以在这里我们有文件I / O。请记住，在 习题集5，我们使用的fopen，fclose的，
FWRITE，用fread和fseek的。
经回收30ish JPEG和 经调整大小和混乱
位图，你应该很熟悉 这些功能
以及它们如何工作。
如果你不再熟悉， 绝对检讨。
并确保您了解什么 不同的论点是，
当他们使用。
>> 但共同文件相关的错误 你可能会问 -
好吧，如果你忘了检查 FOPEN实际工作之前，你去
修改文件。
这可能是坏的。
如果你忘了FCLOSE文件 你已经fopened，这是类似于
内存泄漏。
这是非常糟糕的。
而忘记检查，如果你已经 之前你到达了文件的末尾
开始写吧。
>> 所以，如果你说，嘿，我在 该文件的末尾。
给我5个字节。
嗯，这可能不会 计算出你所期望的方式。
这真的是对文件I / O， 因为我们做了这么多了
这个问题设定。
因此，如果你明白发生了什么事情 在习题集5，记得bitmats
和JPEG文件，那么你很可能所有 为文件设置I / O。如果这是一个有点
模糊，进行检讨这个问题 置和相关材料。
>> 结构都认为是对的话题 0测验测验和1之间的线。
并没有引起太大的削减测验0。
所以他们一定会放在 测验1，第7周，周一。
什么是结构？
这里我们给出一个结构。
这就像一个新类型。
这就像一个容器 为多个字段。
>> 在这种情况下，我们声明一个struct 学生有两个字段 -
我们正在调用一个字符串名称和 我们正在调用的年龄为int。
所以，当我通过各地的学生或I 修改学生，我就可以
访问他们的名字和他们的年龄。
让我们来看看一些代码的。
在这里，我们可以看到，我已经声明 一个学生的，就像
我声明任何变量 -
诠释十，诠释y，等等。
>> 这里的学生的。
他开始没有在他的领域。
因此，让我们设置它们。
你设置点一个struct的领域。
所以，我在这里说s.name = RJ。
和s.age = 21。
您也可以更新字段 你会更新以同样的方式
一个变量的值。
所以我想从RJ改变我的名字与 无期限至R.J.拼写
正确的做法。
这将是s.name = RJ，同样 正如我们所说的它最初。
然后你就可以访问它们。
>> 因此，我们已经设置它们。
我们已经更新了他们。
您也可以访问它们 在非常相同的方式。
所以在这里，我打印出 R.J.是21岁。
而且我访问这些值 与s.name和s.age。
所以这存取结构 用点符号。
是的，问题吗？
>> 观众：有没有对一个原因 前一张幻灯片，你没有把
学生在顶行，像的typedef 结构的学生，然后
学生在结束了吗？
>> R.J.阿基诺：所以现在的问题是，在 这张幻灯片，我们通常看到的
typedef结构节点，然后 该结构的字段和
然后字节点。
以及如何来到这里我就不说了，的typedef 结构的学生，然后
的结构，然后学生的领域？
原因是，我不需要 该结构的内部访问它。
所以，它的确定要离开它没有名字。
我只能把它作为 匿名结构。
>> 我们这样做是对链表和原因 事情是因为你内心需要
引用一个结构节点明星。
因此，该结构必须有一个名字， 所以你以后可以访问它。
这是一个小细节。
但你通常会看到typedef结构 大括号，如果你不需要
的名称和typedef结构部分名称 其次是大括号，如果你愿意
所需要的名字。
所以这是一个很好的问题。
>> 而在这一点上，我们倾向于修改 结构，并通过周围结构由
引用，而不是价值。
所以我们只指针传递给周围 结构，而不是在绕过
结构本身。
所以你很频繁将是 使用，在这种情况下，学生*或
结构*节点或节点，而不是* 培养出来的学生或节点。
所以在这里，我已经说过了，OK，变量PTR 将是s的地址。
这将是指针 向学生R.J.
>> 因此，我们可以在这些领域得到 因为我们得到什么一样。
首先，身份证引用指针 得到的结构。
这就是* PTR，然后 一个点和年龄。
因此，要访问字段，我已经更新 现在到22，因为，让我们
说，这是我的生日。
有一个快捷方式语法 这里使用的箭头。
所以PTR箭头年龄只是 一样* ptr.age。
现在，这件事情你必须 背诵和记忆。
>> 你用了很多的pset6， 在拼写检查pset中。
但其实这是怎么回事 在发动机罩的下面。
它取消引用指针 然后访问它。
问题？
>> 观众：[听不清]。
>> R.J.阿基诺：那么，为什么我们使用 指针作为结构代替
结构本身？
究其原因是，如果你传递 一个结构体给一个函数，你可能
要绕过只是4左右 表示指针的字节，作为
相对于潜在的30或 40字节属于结构。
所以传递的东西给一个函数 是容易当的东西
在短较小。
问题？
>> 观众：你可能会提到这 在开始的时候，但在那里
其他幻灯片上[听不清]？
>> R.J.阿基诺：这些幻灯片将 了审查会议之后。
我们将张贴在网站上。
因此，在移动和移动上略有 快，我们要谈的数据
结构。
也有很多。
我们覆盖的一群人。
这里是你应该了解 关于数据结构。
>> 你应该明白在一个较高的 每级结构是什么。
你可以用英语解释给你 这并没有采取CS50朋友如何
我们组织我们的数据，以及我们为什么会 可以使用的东西以这种方式？
这就是事情之一。
东西两，理解 的实施。
因此，了解如何使用这些东西 在C中，我们会去在这。
>> 然后三件事会被知道 运行时间和的局限性
你使用各种结构。
所以，理解你为什么会用 哈希表，而不是一个数组。
了解如何快速，平均而言， 访问一个哈希表。
了解操作速度快什么 链表但对数组慢，
反之亦然。
因此，要理解这一点，你就必须 了解大O符号只知道
如何谈论这些 各种各样的东西。
我们会谈论。
>> 所以第一件事情，链表。
这里是一个高层次的图像 的一个链表。
我们发现这在课堂上。
我们通常有10人 站在舞台上。
但我们有一系列节点，其中每个 节点有一定的价值和指针
它的下一个值。
因此，为了从一个节点到下一个，你 只是说，给我的下一个节点。
您有节点。
给我的下一个节点。
您有节点。
给我的下一个节点等 直到没有节点的左边。
>> 所以继续谈 它在一个较高的水平。
这是很容易插入的东西 成一个链表。
如果你不关心顺序， 你能把它
权利开头。
这是恒定的时间。
但很难找到一个值。
如果你要问， 是在我的名单7？
你必须要经过 每一个值。
这是7？
一遍又一遍。
这就是为O（n）。
因此，研究在答题时， 使用数组进行比较。
>> 这样可以吗？
灯灭暗淡。
确定。
当是一个链表更好？
如果是一个数组更好？
因此，让我们来看看一些代码。
这里是一个可能的节点。
这是一个结构。
它有一个int n，它 将是我们的价值。
它有一个结构节点*未来，这 是我们的指针到下一个节点。
所以在这里，我们可以看到，我们发生了 已经把一个int在我们​​的节点。
但如果这是字符的链表 星或漂浮的链表，我们
完全可以做到这一点。
>> 记得在pset6，你可能有一个 焦炭星或只是链表
静态字符数组。
让我们来看看在这里的操作。
因此，我们要插入一个新的 n为进我们的链表。
我们有一个头指针是开始了 一个指向该节点具有
的n值和一个下一个指针的那 指向这个节点是一个值
n和下一个空的，因为 它的最后一个节点。
因此，在时间的关系，我会 把所有的代码在屏幕上。
我们将通过它走 几行的时间。
>> 因此，这里的代码。
我希望它是可读的。
我们做的第一件事是 我们用malloc一个新的节点。
因此，它使一个指针到一个新的节点 不太有什么设置
在它。
我们检查，以确保 新节点不为null。
否则，我们不得不放弃。
因此，检查了这一点，我们现在 在节点中设置的值。
所以我们把新的N到我们的n场。
我们设置下一个指针指向 原来的头，这样我们就可以
现在已插入此 节点进入我们的名单。
>> 最后，我们有全球主管点 我们的新节点，所以，如果我们要
在开始的头，我们将在此 新的第一个节点，而不是
旧的第一个节点。
当这个函数退出时， 变量新的节点不再存在，
因为它是本地的功能。
因此，这是世界的状态。
我们的全球头指向我们的新 第一结点，它指向了
原来的第一个节点，这点 到后，该节点。
>> 这是插入。
我希望这是相对 简单的跟随。
如有疑问，画一幅画。
所以，我觉得谈论 链表和看
代码是非常无益的。
而在寻找的链接图片 列表可以让我觉得，哦，所以
我有这个节点在这里。
但是，如果我更新指针， 它结束了断开。
我已经忘了在那里 节点去。
和代码退出。
和你有多个节点 被断开。
而你不结了 你想要的名单。
>> 所以，如果你画的图画和做 一步一步，希望，你会看到
事情来讲的正确顺序 更新指针，以确保
该列表走到一起。
插入相对比较简单。
更复杂的是 插入到排序的列表。
一个更复杂的功能是删除 和发现，所以期待通过列表
看看是否有出现。
也许你在pset6这样做，当你 钻进你的哈希表和你说了，
好，这个词的苹果 在我的链接列表？
>> 所以，你可能已经做到了这一点。
但可以肯定，刷新你的记忆 并尝试重新实现查找和
重写删除一个链表。
有趣的旁注，也有双重链接 列表，在那里你必须
指向正向和指针 落后的，这样你可以去
下一个节点，并以前面的节点。
而且是在去年的一个问题 测验该类型的，会说话
关于双链表。
>> 现在，这是你的结构 比较熟悉的，因为大多数
你可能使用它们pset6。
这里有一个有点不太熟悉。
作为一个方面说明，我认为测验1 主要测验比0更难，因为
你在做什么，你的东西 没有做一样多。
把那个另一种方式，对于测验0， 你已经写了很多C的我们
问你下
>> 对于测验1，我们要问你 PHP和JavaScript，您
没有写一样的。
我们要问你的C代码的 你还没有写成多少，
这个先进的C的东西。
所以肯定，实践的东西，我们 演讲中谈到，你
并不一定做 关于这个问题集。
>> 说到这，你有没有写 一个堆栈上的一个问题集。
但它是在课堂上。
这里有一个高层次的画面 栈，我们表明，每年。
它的托盘堆叠中 在奥美食堂。
在较高的水平，栈是最后的 入先出的数据结构。
这意味着你要去 把东西 -
1，3，7，12，14，负0。
有一件事我不能有 说 - 负3，0。
你把所有这些东西英寸
，最后一个你把是第一 一个的走出来。
>> 所以，你有两个操作 -
压入和弹出。
所有投入，我是 手势像这样的推动。
然后当我在抢达到 东西或顶部到达抢
什么东西，这就是流行。
所以，我们要实现堆栈。
而且我们发现他们在讲座 使用数组。
但你可以做他们 使用链表。
栈是一种概念上的数据 结构，不喜欢的
特定实现的。
>> 那么，什么将是什么样子？
它看起来有点像这样。
你必须为整数的大小。
而且你已经有了值的数组 我们调用托盘，因为这是
图片是什么 我们 - INT托盘 -
然后一些最大容量。
那么，什么将推动样子？
那么，如果我们有一个堆栈s，则推 东西到的，相信我们会得到
s的大小。
而这将是下一个 我们的数组的空位。
所以，如果我们有三个东西在我们的协议栈， 然后盘3将是下一个
开放的现场，因为0，1，和 2顷已经填满。
>> 所以我们把值放入 s.trays [s.size]，第三位。
然后我们增加s.size说， 哎，我们之前有三件事情。
现在，我们有四个。
因此，下一次你推，你 打算把东西放到4。
或者下一次你弹出，你会 来看看3而不是4或什么的。
然后我们将返回true 比方说，嘿，我们成功了。
这个工作。
作为一个经验法则，如果一个函数是 应该返回true或
假的总是返回true，则可能 做错事。
所以做这项工作？
>> 好吧，它工作正常1，和 2，和3和4，和5。
但是，让我们说我达到我的能力。
然后，我遇到了一个问题，因为 如果大小是一样的能力，我
现在试图把东西放到一个 数组，其中我没有空间。
所以简单的检查，以解决这个问题。
如果s.size ==容量，返回false。
否则，去做我们所做的事情。
那么，我们还有什么可以问 有关栈？
还有什么你应该学习？
还有什么你应该练习？
>> 好吧，实施弹出。
我们已经做了推送。
我会解决这个问题。
非数组实现，其中 你用一个链表，也许。
非整数实现。
我们做了整型这里。
但它可能是花车。
我本来是字符串。
它可能是字符明星。
看看以往测验的种类 问题我们已经问栈。
>> 我会说，我们周围覆盖栈 正如我们已经讨论了他们在同一个
过去几年。
因此，问答题应 是一个很好的迹象。
展望未来更快，排队。
他们就像栈。
但他们是先入先出。
如果你是英国人，字队列 大概做了很多有意义的你。
否则，你可能有 听说它作为一条线。
他们的工作就像行 在苹果商店。
的第一人出现在3:00 早晨是第一
人买他的iPad。
>> 因此，我们有两个操作 -
入队和出队。
排队的人把在该行。
出列拉第一 人断了线。
同样，我们可以实现 这同一个数组。
那么，什么是结构我们 在演讲显示？
它是这一个。
再次，数字。
再次，大小和这个新事物面前。
为什么会出现一些所谓的面前？
它的下一个索引 元素出列。
这只是内部保持跟踪 第一个人展现出来，让大家
可以拉出来的时候，我们需要。
>> 一定要看看讲义，并尝试 实施入队和出队
攻读测验时。
重要的事情要思考的问题。
环绕着，如果前面加上 大小最终大于能力。
同样，如果你的结构是完整的， 你将有问题。
哈希你以前见过的表。
大多数时候，你可能实现 这些对pset6。
这是一个结构，其目的是为O（1） 固定时间的插入和O（1）
恒定的时间查找。
>> 在CS50，我们实施这个作为 链表的数组。
关键部件到一个哈希表 是散列函数。
所以它转换成你的输入，让我们说， 字典中的词，变成一个数字，
这将是我们的索引。
我们将使用该索引 进入我们的数组。
所以这里有一个可爱的小图片 从study.50.net。
我们扔掉所有的话到 我们的哈希函数。
和散列函数告诉我们 在哪里把这些话。
>> 这是所有伟大的土地上 这里只有一个用于每个时隙字。
但是当你从pset6记得，有 比插槽更多的单词。
所以会发生什么，当你 得到一个碰撞？
相反，在存储一个值 让我们说，哈希表3，你
存储一个链表。
并因此而不必哈密瓜 在这里，你将有一个链表，
其中的第一个节点是香瓜。
和下一个节点是猫。
和第三节点是碰撞，让我们 说，因为所有的这些词开始
与C
>> 所以，你最该做的pset6。
如果你没有做一个哈希表上pset6 而您试图像
一个线索，进行检讨哈希表。
如果你确实这样做了就pset6，绝对 检查哈希表。
如果你做到了对pset6才没有 制定出完全正确，你
有很多麻烦吧，绝对 检查哈希表。
所以，真正的教训肯定是 检查哈希表。
>> 你试过广大少数民族 出试穿pset6。
高层次的图片。
它是这样的，其中每个 节点有一组儿童，其中每个
孩子对应一个字母。
并且每个节点还表示， 哎，我是一个字。
所以在这种情况下，字麦克斯韦 如果你按照M来了A到
X-W-E-L-L，然后按照它多。
你会得到这个符号，三角形，这 我们要表明的意思是这是一个词。
因此，麦克斯韦是一个词。
这些增量在整个符号化 这东西的话，哪些
东西都没有。
>> 所以在pset6，数据存储我们 沿着我们的任何节点是“我是一个
一句话。“而关于尝试的很酷的事情 是他们表现出的插入和
查找在O（一个字的长度）。
因此，只要打通麦克斯韦，它的 M-A-X-W-E-L-L。所以，七，八 -
我不能指望 -
步骤到达终点 并检查出来的东西。
这么快实现这里。
罗布通过链接去 列出在他死后。
因此，检查了这一点。
抱歉。
通过他死后一个线索去了。
因此，检查了这一点。
>> 但你基本上每个节点有27个 指针到下一个节点和一个
布尔对我是一个字。
退房Rob的死后如何 这实际上是落实。
我们的最终结构，我们的树 和二叉搜索树。
所以，看着这些，这些被覆盖 最近8周，周一。
树是类似于特里，除了你 不一定必须在27个节点
每个点。
而你没有在每一个有这种数据 一步，标志着是否 -
路径无所谓。
而一个线索，该路径从顶部到 底，麦克斯韦，重要的是我们。
>> 但每个节点有多个 孩子，也许。
我们有更多的词汇。
树的根 是在最高层。
而我们说的很底层 有没有节点
孩子是树叶。
所以，像特里，一棵树是 节点的结构。
树，我们要去一个常见类型 谈的是一个二叉树，其中
每个节点没有子节点或 一个孩子或两个孩子。
所以，这幅画在这里就不 一个二叉树，因为
节点3有三个孩子。
>> 但如果我们忽视这些，剩下的 它是一个二叉树，因为它
表明每个节点的属性 具有零个，一个或两个孩子。
所以，我们怎么能表达这种代码？
我们可以有一个节点，其中每个节点有 在它的内部的一个整数，以及
作为指向左侧的树 和一个指向上的树
对，所以这两个孩子。
这是怎么有用吗？
那么，如果我们做出有关规定，我们 把节点，我们可以使搜索更快。
>> 所以这是一个二分查找的概念 树，在那里上的所有节点
左子树有一个较小的值 比节点，我们正在寻找。
和右子树的所有节点 有一个更大的价值
比根节点。
现在，看起来像很多的话。
我打算把它的内部双 报价和展示你的照片。
因此，这里是一个例子 二叉搜索树。
看到我们开始10。
一切向左侧 图10是比它小。
和我的一切的权利 大于它。
>> 但更重要的是，在每个节点 树表示这个属性。
所以，节点7具有3到 左和9到右侧。
因此，所有这些都小于10。
但看着眼前这些时，有7 3到它的左和9在它的右边。
同样在右侧，15有14个 到它的左和50在其右侧。
所以那边的三个节点，15，14， 和50，也是一个有效的二进制树
或有效的二叉搜索树。
而且他们都大于10。
因此，他们被允许为 就在那里。
有没有问题？
>> 观众：你如何处理时， 你有两个七人榄球赛？
>> R.J.阿基诺：是啊。
你如何处理与两个值 这是一样的吗？
一些二叉搜索树说，你 忽略重复的，因为我们的目标是
只是说，我见过 这些事情至今。
一些二叉搜索树，你可以说 有节点的内部计数。
其他人可能会说，一切以 左边是小于或等于。
和我的一切的权利 大于。
>> 这只是取决于什么 问题是你正在解决。
因此，在一个字典，例如，你 不会在乎重复。
你会扔出来。
但其他一些问题，你可能会在乎。
>> 观众：是否有可能有 一个1到15的左侧，而
小于10？
>> R.J.阿基诺：号
如果这里的14是一个1，这将 不是一个有效的二叉搜索树，
因为一切的权利 10必须是大于它。
我们就会明白为什么。
如果在搜索的土地我的目标是 找到14，我从根开始。
所以我期待。
确定。
我们打​​算从根开始。
看10。
>> 好了，14，我们的目标， 大于10。
因此它必须是在右侧。
这是非常相似的整个电话 本书的事情，我们所做的，二进制
搜索那里。
但是，而不是二进制搜索 在阵列中，我们的二进制
在搜索这棵树。
因此，我们仍然在寻找14。
以及，图14是小于15。
所以，如果它在我们的树，它必须 在这个区域在这里。
它必须向右侧 10和15的左侧。
>> 因此，我们检查这个节点。
和耶，我们发现有14条。
我不打算走过它。
但这里的代码。
它实际上是相对 简单，
因为这是递归的。
还有什么比我们要求你做一个小测验？
我们可以要求你写这段代码。
我们可以请你看看这个代码 并修改这个代码，并解释
它在干什么。
是啊。
问题？
>> 观众：难道这些幻灯片将是 提供，因为他们是最后一次？
>> R.J.阿基诺：是的。
所以，这些幻灯片肯定会 发布。
>> 观众：他们实际上张贴 现在在网站上。
大卫只是做了。
>> R.J.阿基诺：该幻灯片 现在在网站上。
我可能会修补了几个 错别字我注意到和解决这些问题。
但是有一个电流 版本在网站上。
其他的事情，我们可以要求你做 -
写插件。
写一个迭代版本的 递归函数，我们刚才给你看
或谈论这些事情，就像在 段落，文字，句子。
比较运行时间，并解释 你想使用二进制什么
供，而不是一个搜索树 哈希表，例如。
>> 因此，了解这些结构 在一个相当深的程度。
了解如何编写它们，如何 使用它们，如何谈论他们。
，你会被所有的设置。
问题？
>> 观众：当你写的 二叉搜索树，你怎么了
确定什么样的价值，以 把它作为根？
>> R.J.阿基诺：所以现在的问题是，是什么 值做才能让你以root？
根据你的代码，你 可能有一个全球性的根源。
所以，你可能已经可能在过 pset6一个全球性的哈希表。
或者你可以通过根 作为一个参数。
所以这个搜索功能在这里 需要一个参数，一个节点*。
所以任何节点你碰巧是 看到的是你对待一个
作为你的根，当你通过它。
和我都准备好。
这些都是我的幻灯片。
旁边的人可以来交换 在一台笔记本电脑和麦克风。
>> ROB BOWDEN：我想我可能有 不同的解释这个问题。
但我把它理解成，如果你有 数字1，2和3，我们如何
知道要2根 相对于1或3？
如果我们让2根，那么它的好听 1和3的左侧和右侧。
但是，如果1是根，那么它的1到 顶，2右，3到右侧。
因此默认情况下，你不知道 怎样弄根。
而对于任何算法，我们正在期待 给你，只是你首先
插入将是根。
或者，我们会给您一个二进制树 已存在有一个根。
但其他的算法存在，使得 根将更新，所以，如果
结束的情况下，其中它的1，2， 3，它会自动更新到
使2新根，使 它还是很好的平衡。
>> 安琪拉李：酷。
嘿，伙计们。
我是安吉拉。
我要去干掉我们的C 然后进入我们的一些网页
技术 -
HTTP，HTML和CSS。
所以，第一件事就是缓冲 溢出攻击。
因此，让我们来看看这段代码。
这是很简单的。
有一个函数foo。
它不返回任何东西。
但它需要在一个指针 一个叫巴字符串。
>> 并且它要声明这个 缓冲器，它是一个字符
阵列有12个插槽。
它使用的memcpy，这仅仅是一个 函数，从一个地址拷贝
到另一个。
因此，这是试图复制到 我们无论从任何缓冲
酒吧指向。
所以任何想法什么是错的 与此代码？
>> 观众：如果酒吧是长于 C，它们将覆盖。
>> 安琪拉李：是的，没错。
我们不能保证吧 将是小于12。
我们只是做了一些任意数量的12。
和我们一样，让我们​​希望， 我们的用户输入小于
12个字符长。
因此，在一个理想的世界，如果我们的输入是 总是不如预期，那么我们会得到
类似的东西，你好。
这是少于12个字符。
它被读入字符角
然后我们用它做什么。
这其实并不重要。
>> 但是恶意的人可以做 更多的东西像这样，他们在那里
给我们什么吧指向， 它会指向这个巨大的数组
只是A的。
这是比12路更长。
所以它会一路走下去 到这里，以那里的回报
地址曾经是。
所以我们可以说这个功能 被叫做foo。
也许富被称为由其他 功能，这是由主程序调用的。
因此，当foo的运行，它需要 知道在哪里返回。
>> 如果foo调用一些函数命名 巴兹，它必须知道它的
得回去巴兹。
而这正是这个返回地址 这儿告诉我们。
但是，如果我们覆盖它与其他一些 地址，在这种情况下，这是一个
在地址的表示 最开始这个缓冲区，然后
什么实际将要发生的是， 而不是返回回巴兹，
这被称为我们的函数，它只是 要去这段代码的前面。
>> 如果这是因为有一个 恶意黑客的家伙来了，
注射这一点，那么也许这个数额 A的实际上不是的。
它实际上只是代码的休息 你的电脑什么的。
因此，为了防守这类型的 首先，你必须永远不能假定
用户输入是在一定 数目的字符。
例如，当你在做 拼写检查，你被告知的话是
只有将是40个字符 长的最大值。
那是不错的。
>> 但如果没有，那么你就必须 请务必阅读只是在45
字符的时间。
否则，你可能会覆盖 您的缓冲区。
上的任何问题。
是啊。
>> 观众：你能不能谈谈 多一点关于这些？
>> 安琪拉李：对不起。
是。
>> 观众：麦克只是视频。
我会尽量和项目。
嗨，伙计们。
燮？
所以，让我们在不多的事在 CS50库，你一直在使用这
所有学期，主要是 获取用户输入。
如你所知，你包括CS50 只是在做CS50.h，图书馆，
包含了所有的原型 功能，您可以使用，像
GetString和调用getInt，并 GetFloat和等等。
还有的这一行中的CS50 库，它定义了一个字符串，它
你们都知道了吧 仅仅是一个char *。
>> 但是，让我们看一下在 GetString的是如何工作的。
这是一个非常删节版。
你可以拉起CS50库文件 从，我认为，manuals.CS50.net。
而且你可以通过阅读 实际的功能。
但是，这涉及一些 的重要组成部分。
因此，我们已经创造了一些缓冲 有一些能力。
而我们做的是我们得到一个字符 从标准的N时间。
这就是用户输入 在文本控制台。
>> 所以我们要读入 字符，只要它不是一个新的
行，它不是最终的文件，其中 是标准输入的结束。
为此，我们在阅读每一个字， 如果该字符结束了加入
到的字符数，我们读过 在那超过我们的能力，
那么我们做的是我们刚刚调整了 缓冲区，以便它的两倍长。
如此反复，这样可以防止缓存 溢出攻击，因为你读的
一个字符的时间。
如果在任何时候你在阅读过 许多人来说，你只是扩大你的缓冲区。
你乘以2。
然后你有更多的空间。
>> 否则，你只需要添加 一个字符缓冲区。
和你读过的所有后 字符，它会收缩缓冲
回落到正常大小，加 null结束，然后返回。
现在，让我们来看看调用getInt。
你们可以看吗？
我可以在一个位放大。
我不知道怎么的计算机。
没关系。
我不能放大正常。
>> 这真的很难。
对不起。
就让我们看看这个。
那么，什么调用getInt所做的是它首先读取 从GetString的，一个字符串，它
我们之前已经实现。
和重要组成部分，这里要注意 如果是这种共享，它结束了
阅读是像也不是一个字符串， 那么我们就返回到INT_MAX
代表失败。
为什么我们返回INT_MAX而不是 负1或1？
任何想法？
>> 观众：[听不清] 负1的之一。
>> 安琪拉李：是的，没错。
所以你的方式更可能只是想 输入1或负1时提示
为第n个和第n个什么马克塞斯。
这是巨大的。
你可能不打算使用它。
因此，这就像一个设计决定 确保你不小心
返回一个错误或你不回 1，可能被解析
作为一个正确的答案。
因此，如果一个行不存在，则 我们返回INT-MAX。
否则，我们使用sscanf的， 这就好比scanf函数。
但它读取一个字符串。
>> 我们有这样的格式化 字符串，是我％％C。
我们尝试和匹配，与 无论用户给我们。
我们要的东西相匹配的数量 为1，这意味着我们只
确实想匹配一个整数 由也许包围的白色
空间，也许不是。
在这种情况下，如果你把东西 像酒吧，酒吧不匹配可言，
因为需要有 在开始的整数。
所以sscan从来没有把0。
这样你就不会返回。
>> 另外，如果你把东西 如1，2，3，A，B，C，那场比赛
无论是整数，但也 后的字符。
这样的sscanf会返回2，这 也并不理想。
你不想1，2，3，A， B，C是有效的int。
这样也不起作用。
但是，说你把喜欢的东西50。
我就要匹配％，这意味着 它会读成n。
而现在，正将包含数50。
然后你就可以返回。
>> 否则，你打重试。
然后它只是一次又一次，直到 您从用户得到正确的输入。
上有问题吗？
>> 观众：所以，如果你要打印出 调用getInt在[听不清]的值
会是公正的整数和最大？
>> 安琪拉李：是啊。
所以，如果你使用调用getInt，你应该假设 你不希望第n为最大
是一个有效的输入，因为你会 假设这是不好的。
>> 观众：如果我们没有字符c和 有人把在1，2，3，山姆，它会
1，2，3还有效吗？
>> 安琪拉李：我觉得这是可行的。
但你不想123Sam到 是有效的由用户输入的。
这是不是一个真正的整数。
因此，它似乎不公平 解析它作为一个int。
确定。
在这种情况下，让我们继续前进 上到互联网。
因此，HTTP是不是一种语言。
HTTP是只是一组标准 你如何从客户端发送的东西，
这就是你，给服务器。
这是其他人在网络上。
>> 所以HTTP代表超文本 传输协议。
它的心脏和灵魂 整个网络的。
超文本只是部分 指的是HTML。
转移是像客户端 您将请求发送到
服务器，这给反应。
而协议只是，怎么办 你期望一个服务器的行为？
怎么是你应该表现 这样，您可以简化这个
沟通过程？
>> 所以HTTP请求看起来很像这个。
GET是请求的类型。
你们已经看到的GET请求 和POST请求。
这第二件事情有，/我来说，这 只是URI或您所在的URL
要在主机内去。
因此，这要求是要求有 页，像www.facebook.com /我。
这是一个GET请求。
然后这个HTTP/1.1，这只是 HTTP的你正在使用的版本。
它几乎总是1.1。
>> 然后有一堆 其他的东西了。
实际上，你可以看到这些，如果你 打开你的控制台，当你
浏览网页。
反应看起来 更多同类产品。
顶部的部分是，一遍， 您正在使用HTTP的类型
其次是状态代码。
所以200 OK是一切工作。
这里是您的内容。
您的内容将会随之而来。
然后它会告诉你什么样的 的内容和其他东西太多。
>> 该状态码，也有少数 重要的是你应该知道。
200 OK是像一切的金色。
一切正常。
403禁止。
这一点，你可能已经看到了，如果你忘了 正确搭配chmod东西。
这意味着，你不必 正确的权限
访问该服务器上。
这就像，不，你不能看到它。
404指的事情不存在。
没有找到。
你可能已经看到了很多。
>> 500内部服务器错误通常是 好像出事了就在身边
服务器。
所以，当你正在实施pset7， 如果你有PHP错误，你可以
其实去的网页，看到一个 一大堆的PHP的错误的东西。
但是，这并不常发生， 因为网站并不真的想
告诉你为什么他们的网站被打破。
他们可能会只返回一个 500内部服务器错误。
>> 再有就是418我是一个茶壶。
有大约原委 为什么这是一个事。
但你可以阅读有关 在你自己的时间。
还有一大堆的 其他状态码了。
但这些是那些 你应该知道。
因此，让我们来谈谈HTML。
HTML，记住，不是 编程语言。
这是一种标记语言。
这意味着它描述的内容。
它会告诉你什么是HTML文档看起来 喜欢与否是什么样子
但它是如何构成的。
>> 因此它定义了一个结构和 网页的语义。
这就像，这是一个段落。
这是一个有序列表。
这就像我的网页的一部分。
这里的标题。
它类似的东西。
它没有任何样式的，由于 这就是你在CSS中做。
它看起来像一个系列 嵌套标签。
因此，要使用的一个非常基本的一个例子 HTML页面，您可以在DOCTYPE
声明那里。
>> 这DOCTYPE声明 说，我们正在使用HTML5。
那么你有很大的HTML标签。
它包含一个头部和主体。
里面的头，你的标题。
这就是所发生的称号 巴您的浏览器。
我们有一个链接一个链接标签 在外部的样式表。
然后我们有一个拉一个脚本 从外部JavaScript以及。
>> 然后我们的身体里面实际上是 什么被显示在页面上。
我们已经有了一个段落，然后一个 像那款内。
这一个是小猫的图片。
请注意，该图像 标签关闭本身。
所以不是开口与图像 然后做一套/图像，你
只是有这个小斜线 在这里，它会关闭它。
和图像标签也有这个键 value属性称为ALT。
这就是替代文本 当你悬停发生。
>> 大多数HTML元素有一定的键值 的东西，你可以给它，各种
定制。
是啊。
>> 观众：[听不清]。
>> 安琪拉李：嗯，所以它是一个 标签的属性。
所以，如果你使用jQuery，你可以 做选择image.getAttribute。
然后你就可以搜索 得到的alt属性。
它会给你的小猫。
如果你还记得的形式在HTML中，输入 元素将名称属性。
而这正是PHP使用发​​送 当表单被提交请求。
>> 观众：你提的东西 有关如何如果你使用kittens.jpg或
一些有缺失 文件夹或其他文件？
>> 安琪拉李：是的。
因此，这是什么所谓的相对 路径，因为我不会放弃
您的完整路径。
这就像当以C，如果你做的fopen 一些文件，如果你的fopen hi.txt，那
hi.txt预计是在同一 目录，除非你给它一个更
复杂的路径。
>> 观众：所以，你可以指定 该文件夹[听不清]？
>> 安琪拉李：是啊。
并且你可以看看该怎么做。
但是，如果我想获得kittens.jpg出 父目录的，我会做
。/ kittens.jpg。
是啊。
抱歉。
是啊。
哦，天哪，我忘了这个问题。
究竟是什么问题？
呵呵，问题是就是，kittens.jpg 预计将在同一目录下？
在这种情况下，它是。
但你也可以给它一定的路径 例如，它不必须是。
好？
>> CSS。
这样的CSS，HTML一样，是不是 一种编程语言。
CSS是只是一系列的样式规则。
它代表了层叠样式表。
和你一起使用 使用HTML样式的页面。
因此，有三种方式 你可以包含它。
你可以做到这一点的方法之一是在头部 你的HTML的一部分，你可以只
打开一个风格标签，然后坚持 一些CSS规则在里面。
这是非常确定。
是啊。
>> 观众：你能不能把那些 风格标签之间，让我们
比方说，身体和/身体。
然后你会造型 只有在身体。
>> 安琪拉李：你能。
它会工作。
但你不应该，因为造型 一种元数据，应该在去
您的文档的头部。
身体真的应该只包含 什么是究竟要
显示您的网页上。
>> 观众：所以你把风格 在你的脑袋样式化
整个网页，对不对？
>> 安琪拉李：是啊。
所以把这里的风格，这些CSS规则 将适用于基于整个页面
他们的选择。
所以更好的方式来做到这一点是不是 具有在你的脑袋风格标签，
你有这样的链接到一个外部的样式 表像我在向您展示
前面的例子。
这里做的事情是它尝试并找到 文件style.css文件，然后拉它
中，并将其用作本 样式的页面。
和你的style.css会 只是看起来像这样。
这纯粹是一堆的CSS。
>> 最后，还有另一种方式，你 可以包括CSS，真的你
不应该永远做。
这是调用内联样式。
所以任何HTML元素也可以 取样式属性。
然后在该样式属性， 你可以给它的CSS规则。
因此，在这种情况下，我是什么格 定义就在这里，它要
有一个黑色的背景和 白色的文字颜色。
但你不应该这样做，因为什么 但这是它把你的造型
在你的HTML。
>> 我知道，我们一直在谈论的HTML 是结构和CSS是样式。
如果你这样做，它混合 它们连接在一起。
它不是很干净。
所以不要做。
使用CSS的一个例子，在那里，我们 只需选择HTML的身体
纪录片。
和我们一样，一切都 将是Comic Sans字体。
我也不建议。
但你能做到这一点。
>> 第二条规则就在这里，这是怎么回事 选择的元素
页面ID为主要。
所以，无论HTML元素，我说的ID =主，我要去给一个
20像素的边距和对齐的一切， 所有的文字，到中心。
过去的事情由CSS类选择。
所以，在页面上，我给任何元素 一节课，我要使它
淡蓝色的背景色。
没错。
这就是我的一切。
问题？
>> 观众：什么包括hashtag 之前主要做什么？
>> 安琪拉李：现在的问题是有哪些呢 之前主要做这个标签？
在这种情况下，在哈希 CSS是指通过ID选择。
所以，如果我有一些HTML元素，如 DIVID =主，这个CSS规则选择
东西用的ID为主。
类似地，在周期中的前 部分是通过CSS类选择或
通过HTML类选择。
>> 观众：为什么会出现一个有前 在背景颜色6？
>> 安琪拉李：是啊。
所以，问题是，为什么会出现 6前一个哈希？
这是比散列不同。
这意味着，你给 一个十六进制颜色。
所以十六进制的颜色，这只是 代表色。
你还记得的RGB三元组时， 你做了取证PSET？
这是类似的。
前两个数字代表 多少是红色的颜色。
后两个代表 多少绿色。
和第三指 多少蓝。
和散列这是怎么回事 来表示一种颜色。
>> 所以从0，0，0，0，0，0的任何 高达F，F，F，F，F，F是有效的。
这是一些有效的颜色，可以 您的浏览器显示。
问题？
>> 观众：什么是之间的区别 利用ID和类？
>> 安琪拉李：现在的问题是什么 之间的差
利用ID和类？
你只能有一个一个元素 具有给定的ID的HTML文档。
所以只有一件事在我的网页 允许有ID为主。
所以你使用它，这是头。
这是导航。
这是页脚。
类是不同的，因为你可以 应用类，以尽可能多的HTML元素
只要你想。
>> 因此，举例来说，我做了类部分， 因为有可能不止一个
部分在我的网页。
你只是允许有多达 用相同的页面上的元素
类，但只有一个具有一定标识。
>> 观众：所以圆点代表 类？
>> 安琪拉李：是啊。
一个点代表一个类。
凉爽。
这就是我的一切，伙计们。
谢谢。
>> [掌声]
>> ZAMYLA陈：嗨，大家好。
我Zamyla。
我将要覆盖的PHP， MVC和SQL今天。
很多，我会的材料 覆盖将是相当多
右出pset7的。
好的。
那么，什么是PHP？
PHP代表PHP超文本 预处理器。
所以，本身是一个递归 命名，这是很酷。
PHP是一种服务器端脚本语言， 和它所提供的后端
和逻辑基础 我们的网站。
>> 所以安吉拉谈了很多有关HTML 和CSS，这将使结构
本网站。
但是，如果你想改变什么 动态或者如果它的内容各不相同
基于用户或 一定条件下？
这就是PHP的用武之地。
现在，通常情况下，PHP可能需要几分钟 少来实现同样的事情线
在C这是因为PHP处理内存 管理的程序员，
而不是我们不得不的malloc 自由，这样的事情。
>> 但是，由于PHP是一种解释 语言，典型地，它可能执行
比C多一点缓慢，这 是编译型语言。
因为我们正在规划 语言，让我们来看看如何
语法将有所不同。
让我们必须非常小心，不要 感到困惑与此有关。
综上所述，使用PHP语法，无论你是 嵌入你的PHP的HTML里面
文件或在。php文件本身，你 需要附上代码开放
PHP和封闭的PHP标签像 如下，喜欢在屏幕上。
>> PHP中的变量。
每一个变量将开始 $符号后面的名字
您的变量。
现在，在PHP中的变量松散类型， 这意味着你不需要
要说明什么数据类型 是当你声明它。
然而，这并不意味着它们 不具有任何类型的。
所以，如果我声明了一个变量，只设置 它等于1，然后我声明
另一个变量，将其设置为“1” 然后另外一个1.0，好了，
根据平等的类型 运营商我用，如果我想比较
在所有类型，然后 他们将是平等的。
但是，如果我想确保了 类型相同，PHP还可以做
如此，即使我们并不表明 它是什么类型时，我们
先使文件。
>> 现在，在PHP中，即使我们 从编程切换
在C语言中，我们仍然有我们的 值得信赖的if条件，就是这样。
我们仍然有我们的while循环，只 这样，你把你的
状态，然后在 体循环。
然后我们也有我们的for循环， 通常看起来像这样。
所以，如果我想遍历所有 9 pset和提交，并调用
功能submitPset，那么我就可以做到这一点 在这里，这你们都
由这点做的。
恭喜，顺便说一句。
>> 对于摄像头，人 说，谢谢你。
现在，如果你不想只是用这个 for循环，那么PHP居然还
有东西叫做foreach循环。
所以，如果我有一个整数数组，0 通过8中，存储在阵列的pset，
然后我可以有一个foreach循环， 遍历在pset中的每一个数字。
然后我可以调用相同 功能8倍，
就像我以前那样。
因此，这对每个回路是好的，因为 你不必，如果你不知道
阵列的确切长度，你 有，然后使用这个foreach循环
将采取照顾你。
>> 所以我做的pset为一个数组。
让我们来看看这个。
在PHP数组通常是一样的 我们已经在C中，那些地方
你可以声明一个数组。
在这里，我可以声明一个空数组 然后动态地使用建立
指数为整数。
所以索引0，我要存储 一个整数命名1。
在我的清单索引1，我要去 存储值2。
以及第三索引，但在 第二个数字，我要去
储存号码12。
>> 现在，这是罚款，这 工作效果很好。
但说是我的问题 什么每个索引保存。
对于我来说，索引0表示如何 许多猫我有。
和索引1表示如何 许多猫头鹰我。
和下一个意思有多少狗。
好吧，那么它来指定，而不是 不必记住0涉及
猫和1至猫头鹰，我可以使用 关联数组，表示
而不是整数作为我的指标， 其实我可以使用字符串。
>> 所以这是非常有用的。
你已经基本上只是更换 整数与字符串。
有你有一个 关联数组。
是啊。
>> 观众：还有一个原因为什么有 下划线第二
的一部分，因为我的列表中有数组。
>> ZAMYLA陈：现在的问题是，现在是 还有一个原因是有一个
我和列表之间的底线？
号
这只是我如何命名 我的变量。
>> 观众：在第一 线，它的一个字。
>> ZAMYLA陈：我的道歉。
我会解决这个问题。
是啊。
他们应该是相同的变量名。
良好的渔获物。
确定。
所以，让我们继续为字符串 串联。
如果我想采取两个字符串， 然后我就可以将它们串联
用点操作符。
所以，如果我有米洛的名字 与香蕉作为姓氏，然后
与点运算符和串联 然后把一个空间之间
将包含米洛的字符串 香蕉，我就可以回显或，
相反，打印出来。
>> 说到回声，让我们来谈谈 约了几个有用的 -
哎呀。
对不起。
一些有用的PHP函数。
所以，我们有 -
技术上的困难。
一秒钟。
我送它。
PowerPoint中的问题。
我们回来了PHP函数。
>> 因此，我们需要的函数，其中 如果你传递一个文件，这里的只是
一个文件的一个例子是 我可能会传递英寸
然后，将包含PHP代码 从该文件中，我指出。
它会评估，在。
那么我们也有回音，这 是一个平行的printf。
退出是一个平行的断裂， 其中出口的块
你是英寸代码
然后空检查是否给定的 变量就像是null或零或
无论是等同于为空。
是啊。
>> 观众：对于字符串连接 点运算符之一，在PHP中，就是
相同的JavaScript那里它使用 点串联的意思加？
因此，对于全名，你可以有美元 签署第一+，然后+持续多久？
>> ZAMYLA陈：是的。
所以现在的问题是，是否在PHP中，我们 可以使用相同的字符串连接
如在JavaScript中的加号。
约瑟将进入的后来。
我想他对一个幻灯片。
其实，这是不同的。
所以在JavaScript中，你需要使用 加来连接字符串。
而在PHP中，你必须 使用点运算符。
因此，它们是不同的。
>> 确定。
所以，现在我们已经涵盖了所有 这个PHP，它在哪里
真正派上用场？
那么，它派上用场的时候，我们 可以与我们的HTML相结合。
所以，我们的PHP会给我们的力量 改变页面的HTML内容之前，
它的加载。
这样根据不同的条件， 通常在特定的用户那
登录后，我们就可以显示 不同的信息。
琳达，你有问题吗？
>> 观众：你能串连 一个整数也？
>> ZAMYLA陈：是的，可以。
所以现在的问题是，如果你能 串连整数或其他
variable.s现在，我们进入到MVC，这 的是，我们在使用一个范例
pset7和很多网页设计者使用 组织代码中的文件
在他们的网站。
M代表模型。
基本上，模型文件将处理 与数据库交互。
查看文件，它们涉及到了 本网站的美观性。
和控制器处理 用户请求，解析
数据，做其他的逻辑。
>> 在pset7，我们结合模型 和控制器。
我们只是叫他们和控制器 把它们放在公共目录。
和视图文件，我们把它们作为 模板中的模板目录。
所以这里这个图也代表 与同类型的划分
模型和紫色控制器 这里在左边和
右边的图。
因此，这是一个示意图，是你们中的一些 可能已经看到在办公时间或
我们被绘制为您图解 是搞清楚你的​​pset中。
>> 因此，这里，在一个给定的控制器，一个模型 控制器，我们有功能
这涉及到查询的SQL 数据库，PHP的执行逻辑。
也许你会抬头 在雅虎股票
财务。
或许，你只是要检查 看看用户是否提交了一份
有之前就已经形成 访问你的页面。
然后你会渲染 一个形成在这里。
已提交的表单后曾 由用户，这是动作
在表单的HTML标记指定 将指示该页面，它
返回的数据。
>> 因此，所有这些信息将 发送回您的控制器。
那么你可能会做多一点 在这一逻辑，也许执行了几个
在SQL数据库的详细查询和 然后，终于，想出了一个很好的
包装组信息，你会 传递到一些其他的模板
所显示的信息。
现在，我们到底怎么打包 这些信息呢？
好了，我们有一个叫做渲染功能 那是在functions.php文件
pset7，在那里你传递的名义 一个文件，一个模板的名称。
>> 然后你也传递 一个关联数组。
并且使关联数组表示 不同的信息
要传递英寸
现在，将是在不断的 这些例子是，钥匙，或
而是，关联的键 数组，这些都是正在发生的事情是
预期由模板常数， 因为它知道它需要
一些所谓的消息 或者叫名字。
然后在右边的东西，在 实际值，所以在这种情况下，谁的
一个好男孩和米洛，那些打算 是正在改变的值
该控制器每一次改变 或基于某一条件和
将传递英寸
>> 所以在这里在模板中，我们看到我们 使用HTML特殊字符，
这只是基本上意味着我们要 得到同行的字符串，该
用户放进去。
我们想替换 在那里的消息。
所以后来当我们真正看到 该文件，该特定
信息传入
请注意，关键是如何呈现的作品是 该缔合的键
数组，这些成为变量 名字在这里。
所以在该键的值 关联数组，然后成为
该变量的值。
>> 现在，让我们进入到SQL。
它代表结构 查询语言。
所以这只是一个编程 语言设计
用于管理数据库。
它派上了用场，我们在 我们pset7财经网站。
从本质上讲，它只是一个简单的方法来 跟踪和管理对象和表
并将其链接到对方。
现在，想想你的SQL数据库中 基本上作为一个Excel文件，或许，
多标签页。
>> 所以，你可以有多个表， 也许，彼此连接。
而就像Excel中，我们有很多的 我们想要的功能。
例如，我们可以选择 某些行。
我们可以插入信息。
我们可以更新的行。
而且我们还可以删除的东西。
>> 通过选择行的SQL选择作品 或行从一个指定的列
数据库匹配有一定 标准，你指出。
所以，在这里，当我看到选择*从 巫师那里的房子=拉文克劳，然后
我选择*，这意味着我 在选择每一个列
从奇才表，但只有当排 房子列等于拉文克劳。
现在，这是纯粹的或SQL。
所以，如果我进入phpMyAdmin的，这是 我们使用管理的具体办法
我们的SQL数据库，那么我可以插入 即进入phpMyAdmin的网站。
并且将执行。
>> 但我们真正想要做的 这在PHP端。
那么，如何才能做到这一点？
好了，我们使用查询功能， 基本上执行的SQL查询。
使用？
作为一个占位符，我们可以通过在某些 值，以我们的字符串，我们
要更换。
所以也许我存储不同 在curr_house值，这
代表了目前房子 我正在经历的一切。
这样我就可以把它传递作为占位符 与问号。
然后我就基本上执行 同样的事情，我做之前，除
现在，我在PHP。
>> 和查询将返回一个 关联数组。
我要去把它存储在列。
现在，查询可以总是失败。
也许SQL查询不能执行 因为表不存在。
或者，该列中不存在。
出事了。
那么，在这种情况下，你会希望 确保您检查是否
查询返回false。
这就是使用三 等于操作有。
>> 然后我道歉，这是另一种 CS50函数，传递一个消息。
如果你看看道歉，这一切 确实是呈现apology.php。
是啊。
>> 观众：你能解释一下是什么 选择并从恒星之间呢​​？
>> ZAMYLA陈：是的，绝对。
因此，在选择和之间的明星 也就是说，我要选择整个
从我的桌子整行。
我可能已经表示选择 名称，年份，房子。
而我只得到这三个 列在我的表。
但如果我说选择*，然后我会 得到一切在该列中。
然后我会去你 在后面的第一个。
>> 观众：所以这仍然是 在SQL中，对不对？
这是查询还是这个PHP？
>> ZAMYLA陈：我们正处在一个查询中。
所以这是在PHP。
因此，使用PHP函数查询， 我们正在执行一个SQL查询。
>> 观众：是在SQL什么 区分大小写，如选择
或向导或房子？
>> ZAMYLA陈：是什么 在SQL区分大小写？
我相信是这样，是的。
我相信，选择和 和WHERE是区分大小写的。
没有？
>> ROB BOWDEN：所以，这是相反的。
列名和表的手段， 所有这些都是区分大小写的。
但任何MySQL的关键词，如 SELECT，FROM和WHERE，这些都不是
区分大小写。
确定。
所以，我说的是相反的。
因此，所有的MySQL的关键字 -
选择从，在那里 - 那些 不区分大小写。
但一切是。
确定。
你在前面。
>> 观众：如果我有$来讲行 多行，意思是
只是变成一个关联数组？
>> ZAMYLA陈：所以现在的问题是，如果行 有一个以上的列在其中，并
它成为一个关联数组？
因此它是可结合的阵列 阵列了。
所以，即使只有一个行 回来了，那么你必须去
这一结果的索引为0。
然后你就会有第一行。
是的，贝琳达？
>> 观众：当你使用=​​==， 这是唯一的实例？
还是有其他人呢？
>> ZAMYLA陈：所以在这种情况下，=== 是跨类型的比较。
抱歉。 ===是一个比较 用于比较的类型。
然后==在所有类型的比较。
>> 观众：你能解释一下 行是在这种情况呢？
它是一行数据？
>> ZAMYLA陈：在接下来的幻灯片，我 将解释什么是行。
所以，如果你不介意持有 关上了。
然后你在后面？
>> 观众：对于像查询功能， 渲染和道歉[听不清]？
>> ZAMYLA陈：现在的问题是，是否 这些功能 - 查询，道歉，
和渲染 -
是通用的PHP。
这些都是那些CS50 写了pset7。
和杰伊？
>> 观众：当你需要说 $ _SESSION，是只为ID吗？
或者可能你说过吗？
>> ZAMYLA陈：所以现在的问题是，当 我们使用$ _SESSION，这是一个特定的
我们正在使用的全局变量。
在这里，这个变量将 是本地的我们的函数。
所以，我们只是声明 一个新的变量。
>> 观众：如何道歉 实施？
>> ZAMYLA陈：现在的问题是， 是如何实现的道歉？
我认为这实际上是一个非常 好习惯为你们进入
在functions.php的部分和看 道歉，看看你可以有
做你自己。
所以，我可以留给你，但只是 说，如果你道歉，
那么它需要的信息是，你 提交道歉，然后将其
呈现该消息。
还有什么问题吗？
我爱的问题。
所以回头率。
>> 观众：[听不清]
echo或print那里？
>> ZAMYLA陈：现在的问题是， 我们不能只是已经把
echo或print那里。
让会做什么 略有不同。
那将打印出来的查询 没成 -
好了，现在，我们实际上 在我们的控制器。
所以我们实际上没有 HTML设在这里。
通过渲染apologize.php道歉 实际上将您重定向到apology.php。
确定。
>> 所以，现在，让我们去解决 从早期的问题是关于什么
真的是行。
那么，查询将返回 列的阵列。
而每一行代表 通过一个关联数组。
所以，如果我执行一些SQL查询， 我已经存储的结果行，然后
使用foreach循环，那么阵列 名字是有第一个 - 行。
然后我要去打电话 每一行中有$行。
>> 这样遍历了，然后我就可以 访问给定行的名称列，
年柱，和房子列。
请注意，我不会已经能够 做这个行，因为行的索引
名称不存在。
行是只是一个数组 关联数组。
所以，你有两个层面存在。
一旦你有行的数组， 你必须去那个。
然后你就可以访问该列。
这是否说清楚？
是啊，在前面？
>> 观众：[听不清]打开 括号内为[听不清]？
>> ZAMYLA陈：请原谅我吗？
>> 观众：开括号。
>> ZAMYLA陈：这些吗？
这让我有 该变量。
是啊。
>> 观众：当您打印，是您 打印到的HTML代码？
>> ZAMYLA陈：是的。
当我打印，这在这里是内 我的模板，因此
我的看法MVC的方法。
所以我打印到HTML。
>> 观众：所以，如果我们走进开发商 运行此工具后，我们可以
实际上在代码中？
>> ZAMYLA陈：这是一个伟大的 的问题，是的。
所以，如果你走进了开发者工具 使用Firebug的或Firefox中
Chrome浏览器，那么是的，你可以 请参阅特定的HTML。
所以它不会显示$行[“名称”]。
它会显示为准 名字是该行。
>> 观众：只是一个一般性的问题， 什么是TR和TD定义为？
为什么我们[听不清]？
>> ZAMYLA陈：表列TR， 表，然后TD列。
确定。
>> 观众：是的，这是表中的数据。
>> ZAMYLA陈：表数据。
是啊。
>> 观众：这是一个排在其中 行被视为一个列？
>> ZAMYLA陈：对不起。
你能再说一遍吗？
>> 观众：你将如何 可视化行？
>> ZAMYLA陈：你将如何显现 以什么样的方式行？
你说的是这些 这里的行或TR行？
>> 观众：该行。
>> ZAMYLA陈：这里这些行？
我会想象这是 我执行我的查询。
它说，好吧，我是0到n 符合条件的行的金额
你曾质疑。
所以，我有行的某个数字。
所以行时，$行，每个门店 1阵列中的那些行。
因此，即使它只是其中之一，它的 还是它相匹配的行的数组。
>> 是这样，那么，举例来说，这是 类似的，当你取出
从用户的缓存。
与标准有地方 ID等于会话ID。
真的只能是一行 可能匹配。
但仍行刚刚返回一行。
所以你必须去行， 指数为0，索引缓存到
实际进行缓存。
>> 观众：是对打印功能 在呼应同样的事情？
>> ZAMYLA陈：是的。
是。
打印相同的回声。
>> 观众：是对foreach循环的 只有这样，才能索引行？
>> ZAMYLA陈：是foreach循环 唯一的办法，你可以
通过行迭代？
号
您也可以使用for循环，提供 你知道的长度
行的数组。
>> 观众：你能访问它 使用行为[听不清]？
>> ZAMYLA陈：所以你不能访问它 只是使用行，如果你没有一个
foreach循环条件是 您还没有宣布一行。
是。
是啊，在白色的。
>> 听众：那TR和TD呢？
>> ZAMYLA陈：所以tr和 TD是HTML标签。
TR表示开始 的表行。
而每个TD表示 新表中的数据列。
>> 观众：对于一个视觉的东西一排 很喜欢，只是想象中的SQL语句，如何
它们具有一排。
[听不清]。
>> ZAMYLA陈：是的。
这是一个很大的问题。
你可以想像行作为刚 像在Excel表中，只
的行的列表。
确定。
好的。
所以，现在我们已经讨论了选择，如果 不会有任何问题，我们将
在去到插入。
所以，如果我想插入一些 表并插入某些列
价值观，我可以自己插入 进入拉文克劳的7年。
但有时可能会有重复的 价值观，正如我们在pset7看到，当我们
更新了我们的产品组合。
>> 因此，在这种情况下，我们希望使用开启 重复键更新，让我们不
存储多个行具有相同 珍惜而是对其进行更新。
那么我们其实有更新， 这不是一个插入。
它只是在那里你更新的更新 在一定的表与一个给定
条件，然后，最后，删除 这确实一个非常类似的事情。
>> 您能否简要：观众 走在重复键？
>> ZAMYLA陈：是的。
从本质上讲这里，我有INSERT INTO 古灵阁，是，帆船，这些值。
但ID，想必，是一个独特的关键 值设置在MySQL表。
所以，如果我已经有了这个ID设置， 然后我不能插入新行。
因此，如果它不存在，则 那我也来更新它。
在白色的中间。
>> 观众：所以插入，更新，删除， 和选择，是那些所有可用
当地[听不清]？
>> ZAMYLA陈：所以插入， 更新，删除和
选择是所有的SQL查询。
所以每当你使用SQL， 你有那些可用。
>> 观众：回到过去的测验 -
有一个问题，处理 如果你有一个表，并希望
插入测试成绩中的一个，你插入 你的名字，所以它不会让你
[听不清]你的朋友的测试成绩。
你会怎么做，与插入？
>> ZAMYLA陈：所以现在的问题是关于 前一期中的问题。
我不知道其中的 一方面，这是现在。
因此，也许以后，如果你想 上来，告诉我，然后我就可以
肯定给你提示。
但讲的东西插入，像 走别人的分数，当你
不应该，让我们来谈谈 SQL注入攻击。
因此，SQL注入攻击本质上是 如果有人需要
优势的低安全性 你正在服用的数据的方式。
>> 所以在这里，就像在CS50金融， 当我们登录的，我们可以在输入
用户名的登录表单， 第一个文本框，
然后在密码输入。
也许我们的PHP代码看起来可能 这样的事情，$ username的
是后数据的用户名和密码 是后数据的密码。
然后，我们只是执行我们的查询，比如， 好了，好了，我们的查询是要
从我们的用户选择，其中 用户名是
一个他们提交。
而密码是密码， 这意味着口令匹配。
>> 现在，如果不是实际 提交一个实际的密码，如
12345和猜测叉，上面写着 密码，并试图破解他们的
帐户，如果有什么，而不是 他们提交了这一点。
他们可以键入也许 一个猜测的密码。
然后，他们将完成 报价然后输入或1 = 1。
这将直接踱步到SQL 查询到是这个样子。
从用户选择其中的username =插脚和密码
等于百合或1 = 1。
>> 因此，无论密码有 为正确或1 = 1，
这始终是真实的。
所以在这种情况下，基本上，使用者可 利用这一优势，只要登录
自己在和黑客 别人的账户。
所以这就是为什么我们要避免 有人不得不这样做。
但幸运的是，通过查询功能 通过在占位符会
这种照顾你。
此外，你通常会永远都不想 实际提交的密码
他们自己。
这就是为什么我们散列或加密 他们在CS50融资。
>> 观众：过去谈到测验 关于MySQL的转义字符串。
我们要担心？
>> ZAMYLA陈：这是一个很好的问题。
MySQL的转义字符串肯定是一个 函数是在我们的查询中使用。
但一定要看看那。
我会说这是公平的游戏知道 那你需要调用
功能上的绳子。
是啊，贝琳达？
>> 观众：你怎么知道什么时候 单引号或双引号？
而且，我觉得自己像在课堂上你 提及有关没有
在[听不清]或某事或 在结束第二个单引号。
我觉得他指出，在该演讲 你应该有撇号1
再没有撇号 什么的。
>> 观众：[听不清]。
>> 观众：事情是最后一个 报价有在第二个框
不应该存在。
[听不清]
因为当你把去年单 引述出来，匹配这些内容
其中的密码，如果你有 查询中，有在一个单引号
结束了。
你要使用单引号 作为面向1所述一个
[听不清]。
那么什么是真正的文本 盒子不应该有。
>> ZAMYLA陈：我会改变这种状况。
确定。
如果没有任何问题，然后我会 将它传递给约瑟夫谈
有关JavaScript的，等等。
>> [掌声]
>> 王阳：所以我们正在运行 有点落后。
所以，如果你要离开，那也无妨。
但我们要求你保持你的头向下 如果你是在中间，所以你
不要挡住相机，并使用 如果你有到后面退出。
我是约瑟夫的方式。
你好。
测试，测试。
丹，是好？
凉爽。
>> 因此视频也将发布 网上的那些
现在不得不离开。
别扭。
确定。
所以测验复习。
这是一只猫。
现在，JavaScript中，这也许是不 作为AWW一些你们的。
确定。
所以这是第一次，记得Zamyla。
请记住，PHP是 在服务器上运行。
和很多次，你们写循环 在PHP中打印出来的HTML，对不对？
所以一旦该代码执行，即 你打印出HTML输出
被发送给用户。
而一旦出现这种情况，没有更多的PHP可以 运行的，除非你重新加载页面，
当然，这重新执行PHP的。
但是，一旦你打印出的HTML， 你不能去任何地方。
>> 使得HTML被发送给用户， 这是浏览器在这里，在这里
高粱是使用计算机。
和这么好，有几件事情 一旦我们发送HTML给用户。
有时候，我们想这样做 当你点击的东西，我们要
弹出，那些各种各样的警告框 相互作用，当您按下喜欢
键，当您单击上的东西 页，我想要的东西发生。
嗯，你可以不重新执行PHP 一旦代码的HTML设置。
那么，你如何做到这一点？
>> 我们引入了一个新的语言称为 JavaScript中，它运行在浏览器中
可以让你做的事情 您收到后为HTML
他们从服务器。
这就是为什么我们称之为客户端 编程语言。
它可以在电脑上 -
客户端。
有关迄今有问题吗？
这种格局是有道理的人呢？
确定。
好。
好的。
所以，首先要注意 是JavaScript是不是PHP。
>> 他们有一些不同的语法， 我们将去成。
和他们有很不同的用途。
JavaScript中，再次为您 浏览器，用于客户端。
服务器在某处运行在别人的 计算机发送信息
对你，对不对？
因此，如果我们要求你写PHP代码 关于考试的问题，不写
JavaScript的，反之亦然。
你只失分， 它不会是正确的。
>> 所以，让我们来看看一些 语法差异 -
JavaScript的左侧 而右边的PHP。
你会注意到的第一件事情 JavaScript中，我们声明变量
var关键字 -
V-A-R。 PHP中的美元符号， 作为Zamyla前面所讨论的。
如果你想声明一个关联 数组，我们看到了熟悉的语法上
右侧用PHP。
在左边，而不是 您使用大括号。
然后你的钥匙是在左边。
那么你有一个冒号。
然后你有值 你想要的。
>> 因此，这是你将如何做到这一点在PHP 在右侧与该第二
，在米洛启动线。
那就是你将如何做到这一点的 左侧在JavaScript中，如果你想
我们所说的对象。
而在JavaScript中的对象是 只是关联数组。
所以，如果您要访问的字段，在 PHP中使用这种支架的语法。
而这样一来，您可以重新分配 这个所有者字段劳伦。
>> 那么，在JavaScript中，如果一个人想 访问一个字段并改变它，你可以
使用点语法。
您也可以使用括号语法。
但你无法使用 点语法在PHP。
这是行不通的。
它仅适用于PHP的。
最后，要打印的东西到 控制台，您可以使用console.log的，这
你们在pset8使用了很多。
您可以CONSOLE.LOG的。
>> 如果你想在打印一个数组 PHP中，你必须使用打印河
而在右边，你看我哈希 字符串串联那边。
早些时候有人问。
我在JavaScript中使用一个加号。
如果我想的东西串连 在PHP中，我使用点。
这些是不同的。
如果你正在编写PHP代码， 不要用一个加号。
如果你正在编写的JavaScript 代码，不写一个点。
这将是错误的。
，你会伤心。
>> 所以语法的差异。
了解你的语法，因为如果你有 写一个问题，你用语法
从错误的语言， 它不会工作。
这将是错误的。
因此，让我们来谈谈一些控制 流的差异，你如何使用
循环在他们每个人。
Zamyla走到右边。
东西的右侧 应该很熟悉。
让我们来看看在左侧。
>> 当您使用在JavaScriptÑ环， 你的循环变量，变种我在那边，
遍历数组的键。
所以你看名字，房子和作用。
如果我CONSOLE.LOG我，我得到 名称，门牌和作用。
这些是密​​钥。
在JavaScript中，foreach循环进入 在这个数组的值。
那么，你注意到他们俩都是我。
但在这里在PHP端，它打印 出米洛，CS50，和吉祥物。
这些都是在PHP中的值。
>> 因此，这些都是怎么这两个是不同的 在不同的语言。
所以，如果你正在使用一个foreach 循环，不要以为它
给你钥匙。
如果您使用的是n个循环，不 假设它可以让你的价值观。
这是否有道理这么远吗？
下一张幻灯片是要告诉你 您如何访问在对面
他们每个人。
>> 好吧，如果你有钥匙在JavaScript 和你想要的值了，
你只是索引到 数组这一点。
所以我米洛将让你什么 你想要的 - 值。
有一个在PHP中，这不同的语法。
如果你真的想知道的话，我不 认为我们已经把它拿给你呢。
但是，如果你有兴趣，你可以使用 右边这个附加的语法
侧，实际上将让你的 当你使用PHP的一键
foreach循环。
琐事所以只是一点点 如果你有兴趣。
>> 所以，这只是为了演示 这两个循环之间的差异。
不要混淆起来，当你 编程的问题。
有关的任何问题。
凉爽。
好的。
JavaScript对象。
我谈到了他们。
他们就像关联数组。
有一件事我想请你注意 这里是在关联的值
数组可以在JavaScript的任何东西。
>> 它甚至可以是一个函数， 就像那边。
我有一个函数， 是一个关键的值。
如果我想调用该函数， 我刚刚接触树皮。
然后我把括号 后。
并且工作。
因此，任何问题吗？
没有？
确定。
好。
JavaScript中，如PHP， 是弱类型。
这是什么意思？
>> 它也有类型。
但是，当你声明一个JavaScript 变量，你说我变种。
你不用说了吧。
这不是一个东西。
你刚才说这是一个变量。
然后用JavaScript处理 引擎盖为你种下的。
我们之间自由转换 类型，因为这个原因。
所以我开始了作为一个数 在这种情况下。
然后，我有一个字符串。
而我想补充我给它。
我重新分配它放回我。
>> 因此，在首行， i是数量。
在第二行，我现在变成了 字符串后，我做了重新分配。
在这里，我只是串连 该数字到字符串。
所以你看，即使我是一个 在第一部分的整数，它的排序
像被转换为 字符串，然后被添加
到那个打招呼的字符串。
所以这就是我的意思 由松散打字。
这就是你转换之间 类型变得非常容易。
而且它不会抛出警告 在你如同C那样。
>> 所以我现在包含打招呼 123的字符串。
下一步。
我们还可以比较自如 类型之间。
所以，如果你只是用==，很 像在PHP中，JavaScript的
做了类似的事情。
字符串123是相同的数 123，当你使用双等号。
当使用三重等号，但也 要确保
的类型是一样的。
所以，因为这是一个字符串，这是 一个数字，尽管它们都是
123，当你使用三 等于，你会得到错误的。
在双相等的情况下，你会得到真正的， 因为双等于没有
在乎的类型。
三重等号并不关心类型。
有问题吗？
确定。
>> 而关于JavaScript的另一件事是 范围是一种全球除非你
中的函数。
它的工作原理相同 方法在PHP实际上。
所以，让我们通过这个例子。
我设置我999。
然后，我进入这个循环。
所以，如果我打印我在此对 环，我希望0，1，2，3，4。
我得到到i = 4。
它增加我现在到5日 在fo​​r循环的结束。
然后它打破跳出循环， 因为它不符合
调理了。
>> 什么你认为你未来 的console.log打印出来？
所以，这就是它会做在C在C中， 因为如果你有一个像我变种外
和你有一个循环内变种我，像一个 for循环，那么它使得如
它的范围内的，两 我的是不同的。
在JavaScript中，它只是 把它当作同一个我。
我得到5，因为那是价值 后退出圈外。
因此，那些我的是一样的我。
这是否有道理？
>> 嗯，这是有道理的 一个JavaScript的立场。
但是，同样的模式不 结转到下他们有
不同的作用域规则。
是。
>> 观众：[听不清]
在函数外[听不清]？
>> 王阳：所以外面哪个函数？
所以，我会得到，在短短一秒钟。
所以我们调用foo（i）条。
这传递我到foo中，增量 它，然后记录它。
所以这是5。
因此它成为6。
但我说的是 我在该函数。
因为它是一个参数，它的 作用域的函数。
所以一旦我真正摆脱这 功能，它现在打算去
回到旧我。
我只是因为范围 它是在一个函数。
我们有范围和职能。
但我们没有范围 在JavaScript函数。
这是否有道理？
是。
问题。
>> 观众：同[听不清]？
>> 王阳：所以呀。
在PHP中，这是同样的类型的东西。
有一个轻微的微妙实际。
但是你可以问我 该复查。
你并不真正需要知道的 这微妙的测验。
对于所有意图和目的，如 变量，全局和PHP，除非
他们是在一个函数，同一 在JavaScript中的事情。
是。
>> 观众：这是为什么在允许 JavaScript和没有别的地方？
>> 王阳：那么，为什么它让 在JavaScript中，而不是C语言？
这只是谁想出了 JavaScript的决定，这是在确定
JavaScript的。
所以，它就像一门编程语言 约定我们会说。
是。
>> 观众：那么，为什么 他走6至5？
>> 王阳：所以从6到5， 因为当我通过我到foo中，该
我的foo里面，现在范围为foo， 因为范围存在于功能
JavaScript的。
但是，一旦我离开这里，因为它 在作用域的功能，我只是
使用常规的我这是内 控制流的其余部分。
有意义吗？
我可以继续前进？
好的。
凉爽。
>> 这样做的接受对象是 通过引用传递。
你知道当你通过 一个数组转换成C你可以
其实修改数组？
这是在JavaScript中同样的事情。
如果我通过一个对象，在这种情况下，我 米洛传递到这个catify功能。
米洛开始了。
他的名字叫米洛香蕉。
我通过该对象到一个函数 因为它是一个对象，一个关联
数组中的JavaScript。
>> 当我执行一个操作 在该函数中，它会
真正改变的对象。
因此，这只会发生的对象 在JavaScript中，就像它发生
为C。所以米罗的名字里面阵列 实际上将变成猫了。
这是否有道理？
因此，这仅适用于对象。
对象是通过引用传递。
是。
>> 观众：所以你说 相反，变量i。
>> 王阳：是啊。
其中变量i只是 一个数字，对不对？
这就像C语言，当你传递一个 一个整数，它使一个副本。
而当你传递一个数组，它实际上 改变了实际的数组
C.同样的事情发生与 中的JavaScript这种情况。
好的。
而接下来，米洛是可悲的，因为 他现在是一只猫。
这实际上米洛后 一些一趟兽医。
>> 那么，我们如何使用JavaScript 在一个网页？
我们可以将其包含。
这是与带标签的HTML代码。
所以，我必须带标签存在。
然后我把一些JavaScript 脚本标签中的代码。
然后执行此。
当我只是不喜欢这样，它的 所谓内联JavaScript。
这有点凌乱，因为 JavaScript是实际上在HTML。
>> 一个更好的方法来做到这一点，更漂亮， 是写在你的JavaScript
外部文件，然后提供 脚本标记与源。
这将转到该JavaScript文件 和读取JavaScript代码
该文件来代替。
而这样一来，你没有很多的 JavaScript的在你的开始
HTML文件，这使得 它非常的混乱。
你只要把它在其他地方。
然后它会从那里读取它。
这样做是有道理的？
>> 安置事宜。
在这种特殊情况下， 剧本是身体。
所以，当我执行了，有 没有在身体呢。
也许这会让多一点点 当我告诉这下一部分的感觉。
在这种情况下，脚本 自带的分区之后。
因此，格实际上出现 在第一页上。
在这里，在这个小小的红色圆圈， 你看到显示的文本。
然后警报显示出来。
>> 在第一种情况中，因为脚本 是格前，
警报显示第一。
然后在div后显示出来 您关闭了对话框。
所以执行事项。
因此，我们将记住这一点。
这将是非常重要 在一点点。
确定。
这么好，你怎么等到 加载那么在你整个页面
执行一些代码？
我们将进入这个有点 位以后了。
但只要保持这个位置 记事项时，我们
走到另一张幻灯片。
>> 所以我们得到的DOM现在。
什么是DOM？
所以，如果你看一下HTML代码，它只是 一群在屏幕上的文字。
那么，如何的JavaScript知道 这是一个HTML元素？
因此，我们必须有一些记忆 这种表示法
结构，我们有。
每当我们有这个在内存中 在JavaScript中表示，我们称之为
该DOM。
它只是一种方式，人们决定 我们应该代表这
HTML结构。
>> 而这是什么DOM的样子？
那么，在内存中的表示， 我们把这个文本。
我们把它变成记忆 表示。
因此，这是HTML。
所以，我们首先发现，每 DOM树中有一个文件。
它看起来像一棵树。
并且文档包含HTML 标签，其实一切
在这里面，现在。
HTML标记有两个孩子。
它有一个脑袋。
这头，如果你看一下缩进 那边怎么它的结构
结束标签之间， 头上有一个孩子。
孩子是冠军。
没错。
>> 现在，我们有一个身体的孩子。
然后是身体有 孩子所谓的家庭。
而且家里有三个孩子 -
最古老的，中间和最年轻的。
所以，你应该知道如何画一个图 这样，当我们问你怎么
画一个图，当我们给 您左方的HTML。
知道如何生产的DOM树。
而这些东西在里面，但只是 一些文字，我已经代表
作为小盒子。
>> 这是否DOM树结构，使 感和DOM是什么？
那么，在p代表什么？
在这里，在p那边 在该标签代表一个
段落标记在HTML中。
所以，你可以看看它。
但它只是意味着它的一些 空间的一些文字。
它有一些默认的CSS样式， 因为它是一个段落标记。
但真的不担心 该部分太多。
只知道它是一个占位符 对于一些文字。
是。
问题？
是。
>> 观众：你刚才提到的CSS。
哈希家庭和散列 所有的东西基本上是
即在CSS中的ID？
>> 王阳：是的，没错。
我会得到什么这些哈希 是指在一秒钟。
当安吉拉走过去的CSS，她 谈到CSS选择器。
这些是CSS选择器的 她在说什么。
是的，罗布？
>> ROB BOWDEN：我也想发表评论 标题标签里面的DOM
也是一个文本节点。
>> 王阳：对。
所以标题标签里面， 我有一些文字的DOM。
因此，其实，这个称号应该有一个像 小箱脱落的它。
但它其实并不重要 在这种情况下，太多。
我们真的不关心文本节点， 当我们打电话给他们，太多了。
OK，我们做的。
显然，我们做的。
我会解决，当 我再次上​​传。
这是否有道理？
>> 那么，我们如何使用DOM工作？
每当你处理DOM中 JavaScript中，有两个步骤。
你选择一个DOM元素。
然后你做的东西出来。
因此，在这种情况下，抽象的，我 选择的中间元素。
然后做的东西的一个例子 它会改变的文本。
曾经是鲍勃。
现在，我所做的是我改变 鲍勃米洛在这种情况下。
>> 那么，我们实际上做如何？
我们如何做选择？
我们如何做的做的东西 事情一旦我们去的吗？
嗯，顺便你们已经学会了 在这个类是通过使用我们的东西
所谓的jQuery。
那么，什么是jQuery的？
jQuery是一个库，它使得 JavaScript的更容易编写。
所以有人花时间 并写了jQuery的。
>> jQuery的实际写入 在JavaScript中。
然后，因为他们现在这样做，我们 有一大堆的函数，
我们可以使用，使我们的 生活真的很容易。
那么，什么是一些 它的东西呢？
这使得选择的元素更容易。
这使得改变的HTML， 添加类更容易。
它使阿贾克斯更容易。
我们会得到，在第二。
>> 而且它类似于C库。
所以，你有string.h中， 你得到strlen的。
你得到的strcpy，所有这些事情。
当你有jQuery的，你会得到很好的 方式选择要素的变化
活动，等等。
你会得到额外的功能， JavaScript不给你。
所以jQuery的JavaScript不。
jQuery是那是写在库 的JavaScript，使JavaScript的
更容易编写。
>> 所以，jQuery是不是一种编程 语言。
但JavaScript。
做。
确保你正确的术语。
有问题吗？
是。
那是一个问题吗？
好的。
那么，你如何使用jQuery？
那么，当你在写一些 JavaScript代码和你有一个
jQuery的在您的文件的顶部为 脚本文件，可以使用美元符号
现在可以访问jQuery的。
这是从不同的 美元符号在PHP。
>> 这是相同的符号，你 输入您的键盘上。
但他们的意思非常不同的事情。
在PHP中美元符号表示该 是我声明一个变量。
在JavaScript中，当你拍了 jQuery的，它代表的jQuery。
所以记住这一点。
那么，如何可能，我们选择DOM元素？
那么，当你这样做的丑陋的JavaScript 这样，您访问
记录全局变量。
然后你通过ID家人得到元素。
这真是漫长而罗嗦 而且不是很好。
>> 或者，你可以得到所有元素 这是一个p标签。
这在JavaScript中工作过。
但我们从来没有真正表现出 你的语法太多。
我们向您展示了jQuery的。
使整个选择了那里， 有人在JavaScript中只是得到
浓缩至这个很不错的美元 签署包括hashtag家庭。
和$ P，只是它是这样的。
如果你想选择所有p标签 一个家庭里面，我们把空间
两者之间。
而现在，我们得到所有的p 标记一个家庭里面。
>> 和看起来很熟悉？
那么，安吉拉谈到 CSS选择器。
给我一秒钟。
因此，为了选择一个元素， 你只需要使用同样的事情，你
会做一个CSS选择器。
如果你把一个哈希在前面 它，它会选择通过ID。
一个点按类选择。
如果你只是有一点不 哈希或点，它选择这些标签。
的问题。
是吗？
>> 观众：当我们使用点在我们的 HTML，是不jQuery的？
>> 王阳：点在我们的HTML 是一个JavaScript的事情。
这不是一个jQuery的事情。
你们学会了它的方式 jQuery是使用。HTML。
然后你通过它的任何 在HTML将是。
所以，我会得到，在刚刚 第二个实际上。
那么，我们如何做的东西到元 一旦我们选择了它？
所以这是一个例子 选择一个元素。
所以，现在，我们想要做的东西给它。
>> 因此，在这种情况下，让我回去 到上一张幻灯片。
之前，它是鲍勃。
我想改变这种状况 里面的HTML米洛。
所以，我所说的HTML功能 从元素。
该HTML功能 元件的方法。
然后我给它什么 我想在HTML的人。
它只是取代了什么里面 该标签与任何我给它。
是。
问题？
>> 观众：这个标签是用来 只对jQuery的。
[听不清]
我们不会使用它。
>> 王阳：是的，没错。
不过不要太担心 关于纯JavaScript。
我只是想让你们把重点放在如何 会做它用jQuery，因为
这将是重要的 部分的测验。
右。
没错。
所以你看到，包括hashtag，使 对应于与选择元件
因为该主题标签的ID中。
包括hashtag指证。
而这种元素具有中等的ID。
所以这是我们选择的元素。
>> 观众：[听不清]。
美元符号包括hashtag [听不清]？
>> 王阳：因此，没有。
现在的问题是，您可以使用。值。
和。值仅适用于元素 是输入。
在jQuery中，这将是 ，缬氨酸，不是。价值。
所以，我会得到一个小例子， 演示这一切组合
在第二个。
但我认为这提供一个小片段 有意义的人为止。
要更改HTML， 调用HTML的方法。
是。
>> 观众：你能解释一下 再次的方法？
>> 王阳：所以一个方法仅仅是一个 功能属于1，在该
情况下，这些DOM元素之一， 因为你看到我
第一个选择的元素。
其实，让我用鼠标。
我选择的第一个元素。
然后我打电话给这个HTML 功能，它有。
而且由于该功能属于 这件事情，我们把它的方法。
这是因为它只是一个花哨的名字。
再说一遍。
所以请记住，我们选择 现在的元素。
我们已经把它的内部 元素变量。
正确吗？
>> 因此，当我们想改变的HTML上 在里面，因为它是鲍勃之前，您
希望该文本更改为米洛。
所以我们称之为的HTML。
我们告诉它什么是HTML中 该元素应该是现在。
所以它改变它米洛， 因为我给它米洛。
>> 观众：所以他们一起工作。
[听不清]
>> 王阳：是啊，是啊。
他们一起工作。
所以，他们中的一个选择 该元素。
和第二个不 什么东西。
是。
>> 观众：[听不清]。
如果此方法是从不同的HTML 你有法等于实际。
>> 王阳：是啊。
这是一种不同的方法。
我们可以覆盖，在短短一秒钟 当我们到达一个例子。
我想确保我们加快 因为我们的时间不多了。
但是我们现在运行的方式随着时间的推移。
确定。
凉爽。
所以，如果你想添加一个类，有 还有一个附加的类方法。
这是什么只是一个例子 你可以使用jQuery做。
这只是增加了一个类。
>> 如果你想删除它， 你可以调用删除。
这只是另一件你可以做的。
因此，更多的例子可以做的事。
所以，我可以只把它放在 像这样的顶部？
老三删除。
如果我只是执行的JavaScript在 我的文件的顶部，将这项工作？
右。
因为中间不存在。
因此，这是行不通的。
执行顺序。
它去顶第一。
什么？
>> 观众：老三不存在了吗？
>> 王阳：是啊。
年龄最小的还不存在。
没错。
>> 观众：你说中间。
>> 王阳：对不起。
年龄最小的还不存在。
而另一件事是我没有 包含了jQuery
文件要求脚本的src。
所以这是行不通的。
其实，我并没有这样做，在 下一张幻灯片，这是
应该解决，要么。
但我们这样做的方式是JavaScript的 是事件驱动的。
所以，我们做的是我们使用一个事件 处理程序来实现这一目标。
所以，我选择文档 设置第一。
我说好，当文档 准备好了，让我运行一个函数。
所以，这是所有的语法手段。
>> 我选择的文件。
现在，当该文件是 准备好后，运行该函数。
所以在这里当文档 准备好了，这意味着所有的HTML有
装，然后我运行功能 去除该元素。
所以现在，当我运行这个功能 我传递给准备好了，我
保证在所有的HTML 页面会先存在。
是。
问题？
>> 观众：什么是事件关键字 中的函数？
>> 王阳：所以在该事件关键字 功能仅仅是一个参数，
被传递给函数 对于任何事件。
这只是一些 你得到免费的。
当您在使用密钥句柄 pset8，该事件可以告诉你，对
你压上的例子，其中的关键。
在这种情况下，一个准备好的情况下， 它实际上不是超级有用。
但是，对于一个键按下的事件，它更 有用的，因为你知道哪些
关键你通过访问键按下 代码关闭该事件的对象。
正确吗？
这是否有道理？
确定。
是。
问题？
>> 观众：所以你能放 脚本标记低了下去？
>> 王阳：所以呀。
你可以把脚本 标记低了下去。
但当时它只是变得非常凌乱。
我们想集中所有 我们在一个地方的代码。
这将使我们能够做到这一点。
还记得前面我说，有一个更好的 这样才能保证元素
在页面上你执行代码之前？
而这仅仅是一个很好的方式 你会做到这一点。
>> 观众：[听不清]。
>> 王阳：是啊。
您仍然必须，对不对？
因为记得，你包括 文件在页面的顶部。
所以它会之前，先执行 你到了页面底部。
确定。
所以你也可以添加不同的 类型的事件处理程序。
这其中只是处理点击。
当我点击老三，然后 它会弹出一个警告。
这仅仅是一个不同的 类型的事件。
相对于ready事件，你现在 使用click事件，当您收到
点击一个元素。
>> 所以在这种情况下，请记住，点击 处理程序附加到最小。
因此，它只能发生在 我点击最小。
而在另一篇ready事件 被附加到文档。
所以它会等待该文件 要准备好。
有意义吗？
我想我可以继续前进。
是。
问题？
>> 观众：[听不清]。
在这种情况下，你使用[听不清]。
>> 王阳：哦，是的，因为在这个 情况下，我必须等待最年轻的
元素出现在屏幕上第一 之前，我可以附加一个单击处理程序
它，这就是为什么我把它放在里面 的文件准备好。
确定。
而接下来的，所以这是一个很大的例子 你将如何结合起来的一切。
这仅仅是一个表单验证的例子 你已经看到了讲座。
因此，需要一步一步来的 你通过这个。
这将是完全确定。
刚读它从上到下。
>> 我有一个窗体底部。
当文档准备好了，我附上 提交处理程序的形式，这样，
当我提交表单，我得到的值 里面每个这些投入。
我检查它是否为空。
如果是空白的，我返回false，因为 我并不想提交表单，
因为形式是错误的。
如果密码为空或者它的不足 超过八个字符，不提交
的形式，因为这也是错误的。
而返回false只是防止 从提交和表单
去到一个新的页面。
>> 并希望，这是有道理的。
我想你们应该走通 这段代码一步你自己的一步。
一旦你明白什么叫做选择 元素和做的东西给它
实际上涉及，这将使 很多道理给你。
是吗？
>> 观众：什么的 名称=用户名是什么意思？
>> 王阳：所以名=用户名和 名=密码只是意味着看
不论属性 你选择。
再有相匹配。
所以我们进入注册。
然后我们来看看所有输入 和登记。
然后我们挑了一个地方的名字 属性等于用户名。
因此，首先选择只有选择 用户名输入。
而这第二个选择只选择 密码之一，因为那些有
他们的名字属性设置为什么 他们应该是。
问题？
>> 观众：在提交，请问该怎么做 底部化解顶部？
>> 王阳：所以，这是因为 事件处理程序。
所以，我们正在等待提交事件 任何从形式发射。
而这一切都是服从。
为什么我打电话提交了那里？
它说，当提交表单时， 我得到一个提交事件。
所以我只截取和 然后运行此代码来代替。
是吗？
>> 观众：你为什么有 有功能的事件？
为什么你就不能[听不清]？
>> 王阳：因为在JavaScript中，你 要声明的函数。
这就是它是如何工作的 在JavaScript中。
你不得不说这是怎么回事 运行一个函数。
所以，你告诉它你 期待一个函数在这里，而不是
只是大括号。
>> 观众：和函数 是什么如下？
>> 王阳：是啊。
该功能是什么在里面 后花括号
该函数的关键字。
是吗？
>> 观众：[听不清]。
>> 王阳：对于提交？
>> 观众：不，对于功能 没有事件。
>> 王阳：是啊。
因此，如果没有的情况下， 你可以有。
如果你并不需要的情况下， 那么你可以忽略它。
但如果这样做，那么你 只是把它放在那里。
是。
快速的问题？
>> 观众：[听不清]。
>> 王阳：是啊。
因为你需要做的 的document.ready只是说等待所有
在页面上的HTML来首先加载。
通常，你希望你的元素 在地方，你运行任何代码之前。
好的。
我们必须让阿贾克斯。
我们没有多少时间了。
所以利弊。
JavaScript是比较容易的尝试 写与jQuery。
但jQuery是一种缓慢。
>> 这就像PHP是比C慢， 因为它的解释。
和jQuery是不是有点慢 JavaScript的，因为它做了很多
引擎盖下的东西。
所以，如果你正在使用jQuery，它是 不只是一点点慢
JavaScript的，尽管它 为您提供了很好的优雅。
最后，阿贾克斯。
因此，与阿贾克斯远，你没见过的Ajax 在pset7的词条，因为
当你这样做，你提交 一种形式的报价。
它加载一个新的页面。
所以，你得到这个大的白色闪光 在页面上，而
第二个页面加载时，是否正确？
>> 这将是非常好的，如果你 没有这个闪光灯。
像Facebook，如果你只是滚动到 底部，它增加了新的内容
而无需刷新整个页面。
因此，像这样就好了。
这是JavaScript代码 在左侧。
你得到的是输入的内部。
你从雅虎股票信息
然后你犯了一个很大的字符串， 说，OK，这是我要留言
显示在屏幕上。
然后你把这个信息里面 这得到了一些HTML元素
显示在屏幕上。
>> 所以，这一切发生的事情在这里。
所以基本上，因为这是所有 JavaScript和你不需要运行
了PHP的，这将确保 该页面不刷新。
所以这只是一个抽象的概念 我是说这里现在。
抽象的想法是，如果你这样做 所有在JavaScript中，你没有一个
页面刷新。
但你如何真正做到这一点？
>> 嗯，事实上，让我们来谈谈 一个问题，这第一。
一个问题是在JavaScript中， 执行是同步的。
所以，你必须等待一个 行前，你完成
执行下一行。
而如果我要去了雅虎， 和他们的服务器是很慢，和
他们花三秒钟 给我回该股票的信息？
当我打的价格线，如果 执行是同步的，因为它是由
默认情况下，它只是要做的是 您的浏览器会拖延
三秒钟。
而且你不会是能够做到 任何事情，而它得到的数据。
这将被冻结。
>> 这就是坏的。
你不希望用户 具有冷冻网页。
正确吗？
这只是坏。
每个人都同意？
如果你在浏览Facebook和它 冻结，你不能做任何事情，你
得到真正沮丧。
所以，解决的办法是我们做什么 异步代替。
因此，所有这种异步的事情说 是，我要问这个
的URL的一些数据。
然后我会坚持下去。
我只是要保持执行 不管那是以后的代码。
>> 然后每当该数据已准备就绪， 然后，我会处理它。
这就是它在说什么。
>> 观众：阿贾克斯只是使 代码异步？
>> 王阳：这是一个异步 取数据的方法。
所以，关于Ajax的第一件事 是它让我得到的数据
从外部网站。
第二件事是它可以确保 我的页面不熄火，而我
取该数据。
这就是它的异步的一部分。
因为它熄灭别的地方， 因为我说我坚持去做，而
它读取该数据，即 使得异步的。
我一直在执行。
>> 因此，保持异步 心里有数。
我会告诉你什么是 所不同的是。
同步版本 是在左边。
异步版本 是在右侧。
看数字，看哪个 步骤对应于哪
执行在每一行。
那边，警报显示第一。
因为得到股票信息从雅虎
需要三秒钟，停转 三秒钟。
然后它会提醒价格 那些在三秒钟后。
>> 所以，现在，该警报显示 向上当时 -
3秒英寸
再后，提醒了。
所以它只是一步一步来。
这就像你们什么 会接受，是否正确？
与异步执行， 你第一次提醒。
然后你去上这个网址。
和你说，我要去 只要求该数据。
然后我要去 以后再处理它。
所以它会立即执行 接下来之后，我做这行
异步请求。
>> 所以0.001秒，你看到警报喜。
执行该功能，警报再见。
因为我做了一个承诺，我 以后会处理数据，有什么
发生时的数据回来 三秒钟后，然后我运行
功能，我有在那里。
是吗？
>> 观众：你可以指定或 澄清一下Ajax的意思吗？
>> 王阳：那么Ajax是一种方式，如果我 需要数据时，我在一个网站，我
不想刷新页面，则 我使用名为Ajax的这种技术。
这本质上只是手段，去获取 从其他网站的数据。
而做到这一点的方式，只是 不熄火我的网页。
>> 观众：所以是一种内在的 JavaScript或jQuery的一部分吗？
>> 王阳：所以有人写了一个方法来做到 这在JavaScript中很长一段时间以前。
在一个点上，它是不存在的。
于是有人发明了这种技术 让人们请求此数据
以这种方式。
他们写了一些东西 要为你做它。
和jQuery只是给你这个 很不错的办法做到这一点
与此$。get函数。
问题？
我可以回答有关问题 阿贾克斯之后了。
我会在这里。
>> 所以，让我们我们获取数据而不 刷新页面。
它让我们在这样做 异步方式
不冻结的页面。
太长了，没看过，如果是 解释是太长了你。
所以最后，跨站点 脚本攻击。
我们认为这与Zamyla。
如果我的数据库有人有这个名字， 这是这个脚本标记，而我
有我的网页上一些代码，打印 出人的一排名字，或者我有
中插入JavaScript代码 这个名字到页面中，
什么Html获取产生的？
好吧，我打印出来的HTML标记。
我打印出所有这些标签。
>> 我去哪里，我打印的部分 和朋友们聚会。
我打印出来劳伦。
它打印出来米洛。
然后我在数据库名称 是剧本后
直言不讳的Facebook状态。
因为我这个插入到页面 因为它看起来像JavaScript中，当
当前页被发送给用户， 它被执行为JavaScript。
所以这就是我们所说的 跨站点脚本攻击。
有人把恶意信息 您可能对应于数据库
一些额外的字符串或 一些JavaScript字符串。
>> 而当它被打印出来的 以这种方式页面，那么什么
发生的情况是不好的代码被执行 我没打算
它得到执行。
而这一切，一个跨站点 脚本攻击。
和你周围的路 这就像Zamyla说。
你只是包装的东西 HTML特殊字符。
与此HTML特殊字符是一个PHP 功能，以防止这种
从发生在你身上的事情 如果你有一个恶意的
字符串在数据库中。
它只是逃脱它，所以它不 得到解释为HTML。
它取代了小括号 我们所说的实体。
于是我们过了这个讲座中也。
所以，我想你们应该有 把握好这一点。
有问题吗？
是。
>> 观众：那么，如何将 在[听不清]？
>> 王阳：再说了。
>> 观众：如何将显示器 -
>> 王阳：对。
所以，你有什么事情，说，当 我注册，输入我的名字。
我只需键入在这一领域，我的名字是 剥后直言不讳的Facebook
状态密切的脚本标记。
而这只是被放入 数据库，因为我不能说别人
在世界上没有一个名字 用左箭头，或在
在它的字的脚本。
这并没有真正意义。
所以，我只是要确保我 消毒的东西之前，我打印出来
出到页面中。
>> 观众：所以HTML特殊卡 防止脚本标签？
>> 王阳：是啊。
所以它不会阻止脚本标记。
它只是可以确保 script标签没有得到
解释为HTML或 -
是的。
它只是出来作为什么 它实际上是。
好的。
所以这是测验检讨。
凉爽。
>> [掌声]