在這篇文章中,我們將透過建立一個簡單的部落格來進一步擴展我們對 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。
面向对象的编程(通常称为 OOP)是一种帮助您以易于长期扩展和维护的方式开发复杂应用程序的方法。在 OOP 的世界中,现实世界的实体(例如 Person
、Car
或 Animal
)被视为对象。在面向对象的编程中,您通过使用对象与应用程序交互。这与过程式编程形成鲜明对比,在过程式编程中,您主要与函数和全局变量交互。
在 OOP 中,有类的概念,它用于将现实世界的实体建模或映射到数据(属性)和功能(方法)。 对象是类的实例,您可以创建同一类的多个实例。例如,有一个 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中文網其他相關文章!