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? 这是7? 这是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函数。 因此,我们需要的函数,其中 如果你传递一个文件,这里的只是 一个文件的一个例子是 我可能会传递英寸 然后,将包含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或 - 是的。 它只是出来作为什么 它实际上是。 好的。 所以这是测验检讨。 凉爽。 [掌声]