如何使用 PHP 建立物件導向的博客
在這篇文章中,我們將透過建立一個簡單的部落格來進一步擴展我們對 PHP 和 MySQL 的知識。雖然市場上有無數優秀的免費部落格平台,但本教學的目的是探索創建部落格網站的過程,以學習高級資料庫結構技術以及如何利用 PHP 中的物件導向程式設計更有效地使用資料。
對於本教學課程,我假設您對 PHP、MySQL 和 XHTML 有一些基本的了解。
瀏覽資料庫結構
在我們進入 MySQL 用戶端並開始建立表格之前,我們應該在部落格中列出我們想要的內容。我們需要包含的明顯內容是部落格文章,每個貼文都應包含標題、貼文本身、作者以及發布日期。
現在,我們只需建立一個表格來保存該訊息,並且很可能成功建立一個基本部落格。然而,如果只有一張表,我們對資料的控制就沒有那麼多。例如,我們可以將作者的姓名儲存在與部落格文章相同的表中,但如果我們還想儲存作者的電子郵件怎麼辦?在我們的表中新增另一個欄位將是顯而易見的解決方案。
當您以後想要更改該作者的電子郵件地址時,就會出現問題。現在,您必須為該人創建的每一篇部落格文章更改它。
因此,我們要做的是創建一個名為 people
的單獨表,其中可以存儲有關作者的所有信息,例如電子郵件、URL、姓名和唯一 ID。然後,在我們的 blog_posts
表中,我們將透過該人的唯一 ID 來引用該人。該 ID 稱為外鍵,people
表和 blog_posts
表之間的關係稱為一對多關係,因為同一個人可以建立多個部落格文章。
除此之外,我們還希望提供為每篇部落格文章附加標籤的功能。一篇部落格文章可以附加多個標籤,因此這是一對多的關係。為此,我們需要建立另一個表,其名稱可以類似於 blog_post_tags
。此表將包含兩個外鍵:一個用於部落格文章的 ID,另一個用於與部落格文章關聯的標籤的 ID。透過這種方式,我們可以為部落格文章分配任意數量的標籤,並且仍然能夠使用簡單的 MySQL 查詢在所有帖子中編輯有關該特定標籤的資訊。當然,我們還需要 tags
表,它保存實際的標籤,它有兩個欄位:id 和 name。
現在我們已經概述了資料庫結構應該是什麼樣子,讓我們繼續創建它。我將使用 PhpMyAdmin,因為它是使用最廣泛的 MySQL 管理用戶端並且易於使用。建立資料庫、表格和欄位名稱時可以使用幾種不同的命名約定。我喜歡使用所有小寫字母和底線來代替空格。您應該避免使用大寫字符,因為這被認為是最佳實踐之一。
如果您的系統或可以運行它們的伺服器上沒有 PHP 和 MySQL,我建議您下載 Apache、PHP 和 MySQL 的獨立安裝。 MAMP 適用於 Mac,WAMP 適用於 PC。
建立資料庫和表格
在本節中,我們將繼續為我們的部落格網站建立資料庫和必要的表格。
讓我們繼續建立一個名為 code_tutsplus_blog
的新資料庫。您可以使用 PhpMyAdmin 或 MySQL CLI 中的以下 MySQL 指令來建立新資料庫:
CREATE DATABASE code_tutsplus_blog;
建立資料庫後,我們就可以繼續建立必要的表。
建立 blog_posts
表
繼續執行以下命令來建立 blog_posts
表。
CREATE TABLE blog_posts ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255), post TEXT, author_id INT, date_posted DATE );
blog_posts
表有五個欄位:id
、title
、post
、author_id
和date_posted
。
我們創建了 id
欄位作為主鍵並將其設定為自動遞增。它將為每個條目產生一個唯一的識別碼。每當我們新增新貼文時,它都會分配一個序號,從 1 開始,並隨著每個後續貼文的增加而遞增。
接下來,我們還需要定義每個欄位的資料類型。 id
欄位設定為 INT
(整數的縮寫)類型,因為它應該只儲存數值,並且我們將最大長度設為 11。 title
欄位定義為 VARCHAR
類型,最大長度為255。 post
欄位定義為 TEXT
類型。 author_id
欄位與 id
欄位具有相同的資料類型。最後,date_posted
欄位被定義為 DATE
類型。
创建 people
表
让我们继续创建下一个表,名为 people
。我们不称其为作者,因为将来我们可能希望创建注册和发表评论的功能,而这些人不会被视为作者。
继续运行以下命令来创建 people
表。
CREATE TABLE people ( id INT PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(255), last_name VARCHAR(255), url VARCHAR(255), email VARCHAR(255) );
id
字段定义为INT
,设置为主键,并配置为自增,类似于blog_posts
表中的id
字段。 first_name
、last_name
、url
、email
字段设置为VARCHAR
,最大长度为255。
创建 tags
表
继续运行以下命令来创建 tags
表。
CREATE TABLE tags ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) );
和之前一样,id
字段定义为INT
,设置为主键,并配置为自增。 name
字段定义为 VARCHAR
,最大长度为 255。
创建 blog_post_tags
表
继续运行以下命令来创建 blog_post_tags
表。
CREATE TABLE blog_post_tags ( blog_post_id INT, tag_id INT );
两个字段都定义为 INT
类型。
这就是创建数据库和表的过程。从下一节开始,我们将开始使用 PHP 实现我们的博客网站。
对象如何在 PHP OOP 中工作
在本节中,我们将简要讨论 PHP 中的 OOP。
面向对象的编程(通常称为 OOP)是一种帮助您以易于长期扩展和维护的方式开发复杂应用程序的方法。在 OOP 的世界中,现实世界的实体(例如 Person
、Car
或 Animal
)被视为对象。在面向对象的编程中,您通过使用对象与应用程序交互。这与过程式编程形成鲜明对比,在过程式编程中,您主要与函数和全局变量交互。
在 OOP 中,有类的概念,它用于将现实世界的实体建模或映射到数据(属性)和功能(< em>方法)。 对象是类的实例,您可以创建同一类的多个实例。例如,有一个 Person
类,但许多 person 对象可以是该类的实例 — dan
, zainab
, hector
等
该类定义属性。例如,对于 Person
类,我们可能有 name
、age
和 phoneNumber
。然后,每个 person 对象都会有自己的这些属性值。
您还可以在类中定义方法,以允许您操纵对象属性的值并对对象执行操作。例如,您可以定义 save
方法,将对象信息保存到数据库中。
在深入研究 PHP 代码之前,我们需要建立文件和文件夹结构。在本教程中,我们将在根文件夹中创建一个 index.php 文件。此外,我们将创建一个 includes 文件夹来存储 CSS 样式表、JavaScript 文件、connection.php 文件和 blogpost.php 文件。
创建 BlogPost
类
在本节中,我们将创建 BlogPost
类,它是我们博客应用程序的支柱。
继续并在 includes 文件夹中创建包含以下内容的 blogpost.php 文件。
<?php class BlogPost { private $conn; public function __construct($conn) { $this->conn = $conn; } public function getBlogPosts() { $query = "SELECT blog_posts.id, blog_posts.title, blog_posts.post, people.first_name, people.last_name, blog_posts.date_posted FROM blog_posts INNER JOIN people ON blog_posts.author_id = people.id"; $result = $this->conn->query($query); $blogPosts = $result->fetch_all(MYSQLI_ASSOC); return $blogPosts; } public function getTagsForBlogPost($blogPostId) { $query = "SELECT tags.name FROM tags INNER JOIN blog_post_tags ON tags.id = blog_post_tags.tag_id WHERE blog_post_tags.blog_post_id = ?"; $stmt = $this->conn->prepare($query); $stmt->bind_param('i', $blogPostId); $stmt->execute(); $result = $stmt->get_result(); $tags = []; while ($row = $result->fetch_assoc()) { $tags[] = $row['name']; } return $tags; } public function getBlogPostById($blogPostId) { $query = "SELECT blog_posts.id, blog_posts.title, blog_posts.post, people.first_name, people.last_name, blog_posts.date_posted FROM blog_posts INNER JOIN people ON blog_posts.author_id = people.id WHERE blog_posts.id = ?"; $stmt = $this->conn->prepare($query); $stmt->bind_param('i', $blogPostId); $stmt->execute(); $result = $stmt->get_result(); $blogPost = $result->fetch_assoc(); return $blogPost; } } ?>
在本课程中,我们将使用 mysqli
扩展来连接 MySQL 数据库,稍后我们将看到该扩展。构造函数需要一个 mysqli
连接对象。 __construct
方法称为构造函数,每当我们创建 BlogPost
对象的新实例时,都会自动调用它。接下来,我们为不同的目的定义了一些方法。
getBlogPosts
方法从 blog_posts
表中检索所有博客文章,加入 people
表以检索作者信息。
getTagsForBlogPost
方法检索与特定博客文章关联的标签,使用准备好的语句和参数绑定来防止 SQL 注入。
最后,getBlogPostById
方法允许您通过 ID 检索特定博客文章。它使用附加的 WHERE
子句扩展了现有的 blog_posts
和 people
表连接查询,以根据提供的 $blogPostId
过滤结果。
因此,我们创建了 BlogPost
类,我们可以使用它从数据库中检索博客文章并显示它,这就是我们下一节的内容。
显示博客文章
设置数据库连接
继续并在 includes 文件夹中创建包含以下内容的 connection.php 文件。
<?php $servername = "localhost"; $username = "your_username"; $password = "your_password"; $database = "your_database"; $conn = new mysqli($servername, $username, $password, $database); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
将 localhost
、your_username
、your_password
和 your_database
替换为您的实际数据库凭据。它建立与 MySQL 服务器的连接并将其存储在 $conn
对象中。
创建 index.php
文件
继续创建包含以下内容的 index.php 文件。
<?php require "includes/connection.php"; require "includes/blogpost.php"; $objBlogPost = new BlogPost($conn); $arrPosts = $objBlogPost->getBlogPosts(); ?> <div id="main"> <h1>My Simple Blog</h1> <div id="blogPosts"> <?php if (count($arrPosts)) { foreach ($arrPosts as $post) { $tags = implode(",", $objBlogPost->getTagsForBlogPost($post['id'])); echo "<div class='post'>"; echo "<h1>" . $post['title'] . "</h1>"; echo "<p>" . $post['post'] . "</h1>"; echo "<span class='footer'>Posted By: " . $post['first_name'] . " Posted On: " . $post['date_posted'] . " Tags: " . $tags . "</span>"; echo "</div>"; } } ?> </div> </div>
首先,我们使用 require
语句添加两个必需的文件,connection.php 和 blogpost.php。
然后,我们通过传递 $conn
对象(数据库连接)作为参数来创建 BlogPost
类的实例。它允许我们使用 BlogPost
类中定义的方法与博客文章数据进行交互。
接下来,我们使用了 BlogPost
类的 getBlogPosts
方法,该方法从数据库中获取博客文章并将其作为关联数组返回。
最后,我们使用 foreach
构造迭代数组记录,并通过使用 XHTML 格式化记录来显示记录。
这就是如何在 BlogPost
类的帮助下构建列表页面。
以上是如何使用 PHP 建立物件導向的博客的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

在PHP中,include,require,include_once,require_once的區別在於:1)include產生警告並繼續執行,2)require產生致命錯誤並停止執行,3)include_once和require_once防止重複包含。這些函數的選擇取決於文件的重要性和是否需要防止重複包含,合理使用可以提高代碼的可讀性和可維護性。

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
