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