PHP + MySQL 网站开发全攻略
本教程将遵循“理论 -> 实践 -> 项目”的路径,帮助你从零基础到能够独立开发动态网站。

第一部分:基础准备与环境搭建
在开始编码之前,我们需要搭建一个本地的开发环境,最简单的方式是使用集成环境包。
你需要准备什么?
- 一个代码编辑器: 推荐使用 Visual Studio Code (VS Code),免费、强大且插件丰富。
- 一个本地服务器环境: 我们使用 XAMPP 或 MAMP,它们都包含了我们需要的所有组件:
- X (Apache/Nginx): Web 服务器,用于解析和运行 PHP 文件。
- M (MySQL): 数据库管理系统,用于存储网站数据。
- P (PHP): 服务器端脚本语言,用于处理逻辑和与数据库交互。
- P (Perl): 另一种脚本语言,我们暂时不用。
- 一个 Web 浏览器: Chrome, Firefox, Edge 等。
安装和配置 XAMPP (以 Windows 为例)
- 下载: 访问 XAMPP 官网 下载适合你操作系统的版本。
- 安装: 运行安装程序,一路点击 "Next" 即可,建议安装到默认路径(如
C:\xampp)。 - 启动组件:
- 安装完成后,打开 XAMPP Control Panel。
- 点击 Apache 和 MySQL 模块旁边的 "Start" 按钮,你需要保持这两个服务在运行状态。
- 验证安装:
- 打开浏览器,访问
http://localhost或http://127.0.0.1,如果看到 XAMPP 的欢迎页面,说明 Apache 服务器运行成功。 - 点击左侧的 "phpMyAdmin" 链接,如果进入了数据库管理界面,说明 MySQL 也运行成功。
- 打开浏览器,访问
创建你的第一个项目文件夹

- 在 XAMPP 的安装目录下,找到
htdocs文件夹(这是 Apache 的网站根目录)。 - 在
htdocs文件夹中,创建一个新文件夹,命名为my_website,我们所有的项目文件都将放在这里。 - 在浏览器中访问
http://localhost/my_website/,你应该会看到一个页面,显示 "Index of /my_website/",这表示你的项目空间已经准备好了。
第二部分:PHP 基础知识
PHP 是一种在服务器端执行的脚本语言,它的代码嵌入在 HTML 中,由服务器执行后再将结果发送给浏览器。
PHP 语法入门
创建一个文件 index.php,放在 my_website 文件夹中,并写入以下代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">我的第一个 PHP 页面</title>
</head>
<body>
<h1>你好,世界!</h1>
<p>当前时间是:</p>
<?php
// 这是一个 PHP 代码块
echo date("Y-m-d H:i:s"); // echo 用于输出内容
?>
</body>
</html>
<?php ... ?>是 PHP 代码的标记。- 或 表示单行注释, 表示多行注释。
echo是一个语言结构,用于向浏览器输出字符串或变量。
在浏览器中访问 http://localhost/my_website/index.php,你应该会看到当前时间被动态地显示了出来。

变量与数据类型
PHP 中变量以 符号开头。
<?php
$name = "张三"; // 字符串
$age = 25; // 整数
$price = 99.99; // 浮点数
$is_student = true; // 布尔值
echo "我的名字是:" . $name . "<br>"; // . 是字符串连接符
echo "我的年龄是:" . $age . "<br>";
echo "价格是:" . $price . "<br>";
echo "我是学生吗?" . ($is_student ? "是" : "否"); // 使用三元运算符
?>
条件语句
<?php
$score = 85;
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 80) {
echo "良好";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
?>
循环语句
<?php
// for 循环
echo "<h3>For 循环:</h3>";
for ($i = 1; $i <= 5; $i++) {
echo "数字是:$i <br>";
}
// foreach 循环 (常用于遍历数组)
echo "<h3>Foreach 循环:</h3>";
$fruits = ["苹果", "香蕉", "橙子"];
foreach ($fruits as $fruit) {
echo "我喜欢吃:$fruit <br>";
}
?>
函数
<?php
// 定义一个函数
function greet($username) {
return "你好," . $username . "!欢迎来到我们的网站。";
}
// 调用函数并输出结果
echo greet("李四");
?>
第三部分:MySQL 数据库基础
数据库是存储网站数据的地方,比如用户信息、文章、商品等。
创建数据库和表
- 通过浏览器访问
http://localhost/phpmyadmin。 - 在首页的 "创建数据库" 输入框中,输入
my_blog,然后点击 "创建"。 - 在左侧选择
my_blog数据库。 - 点击顶部的 "SQL" 选项卡,在文本框中输入以下 SQL 语句来创建一个
posts(文章) 表:
CREATE TABLE `posts` ( `id` INT(11) NOT NULL AUTO_INCREMENT, VARCHAR(255) NOT NULL, `content` TEXT NOT NULL, `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 点击 "执行"。
id: 自增主键,每篇文章的唯一标识。title: 文章标题,最大长度255字符。content: 文章内容,使用TEXT类型可以存储长文本。created_at: 文章创建时间,默认为当前时间。
基本的 SQL 操作
- 插入数据:
INSERT INTO `posts` (`title`, `content`) VALUES ('我的第一篇博客', '这是我的第一篇博客文章,内容很丰富。'); INSERT INTO `posts` (`title`, `content`) VALUES ('PHP 学习心得', '学习 PHP 是一件很有趣的事情。'); - 查询数据:
SELECT * FROM `posts`; -- 查询所有文章 SELECT * FROM `posts` WHERE `id` = 1; -- 查询 ID 为 1 的文章
- 更新数据:
UPDATE `posts` SET `title` = '更新后的标题' WHERE `id` = 1;
- 删除数据:
DELETE FROM `posts` WHERE `id` = 1;
第四部分:PHP 与 MySQL 交互
这是最核心的部分,我们将使用 PHP 来连接数据库,并对数据进行增删改查。
连接到数据库
创建一个 config.php 文件,用于保存数据库连接信息,这是一种良好的编程习惯。
<?php
// 数据库配置信息
$db_host = 'localhost'; // 数据库主机
$db_user = 'root'; // 数据库用户名
$db_pass = ''; // 数据库密码 (XAMPP默认为空)
$db_name = 'my_blog'; // 数据库名
// 创建连接
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 设置字符集,防止中文乱码
$conn->set_charset("utf8mb4");
echo "数据库连接成功!";
?>
在浏览器中访问 http://localhost/my_website/config.php,如果看到 "数据库连接成功!",说明连接没问题,连接成功后,你可以删除这行 echo 语句。
从数据库读取数据
创建一个 read_posts.php 文件:
<?php
// 引入数据库连接文件
require_once 'config.php';
// SQL 查询语句
$sql = "SELECT * FROM posts ORDER BY created_at DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出每条数据
while($row = $result->fetch_assoc()) {
echo "<h2>" . htmlspecialchars($row["title"]) . "</h2>";
echo "<p>" . nl2br(htmlspecialchars($row["content"])) . "</p>";
echo "<hr>";
}
} else {
echo "暂无文章";
}
// 关闭连接
$conn->close();
?>
require_once 'config.php';包含我们的数据库连接文件。$conn->query($sql)执行 SQL 查询。fetch_assoc()将结果集作为关联数组获取。htmlspecialchars()是一个非常重要的安全函数,可以防止 XSS (跨站脚本) 攻击。nl2br()将换行符<br>转换为 HTML 换行标签。
向数据库插入数据
创建一个 create_post.php 文件,并准备一个 HTML 表单 create_form.html。
create_form.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">发表新文章</title>
</head>
<body>
<h1>发表新文章</h1>
<form action="create_post.php" method="post">
<label for="title">标题:</label><br>
<input type="text" id="title" name="title" required><br><br>
<label for="content">内容:</label><br>
<textarea id="content" name="content" rows="10" required></textarea><br><br>
<input type="submit" value="发布">
</form>
</body>
</html>
create_post.php
<?php
// 检查表单是否通过 POST 方法提交
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 引入数据库连接文件
require_once 'config.php';
// 获取并过滤表单数据
$title = $conn->real_escape_string($_POST['title']);
$content = $conn->real_escape_string($_POST['content']);
// SQL 插入语句
$sql = "INSERT INTO posts (title, content) VALUES ('$title', '$content')";
if ($conn->query($sql) === TRUE) {
echo "新文章发布成功!";
// 跳转到文章列表页
header("Location: read_posts.php");
exit();
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
} else {
// 如果不是 POST 请求,则重定向到表单页面
header("Location: create_form.html");
exit();
}
?>
$_POST是一个 PHP 超全局变量,用于收集通过 POST 方法提交的表单数据。$conn->real_escape_string()用于对用户输入进行转义,防止 SQL 注入攻击。header("Location: ...")用于页面重定向。- 注意:
real_escape_string可以提供基本防护,但更推荐使用 预处理语句 来防止 SQL 注入,这是更安全、更现代的做法。
第五部分:安全最佳实践
开发网站,安全是第一位的。
防止 SQL 注入 - 使用预处理语句
上面 create_post.php 的例子可以改进为使用预处理语句,这是目前推荐的、最安全的做法。
改进后的 create_post.php (使用预处理语句)
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
require_once 'config.php';
// 使用预处理语句
$stmt = $conn->prepare("INSERT INTO posts (title, content) VALUES (?, ?)");
// "ss" 表示两个参数都是字符串
$stmt->bind_param("ss", $title, $content);
// 从表单获取数据
$title = $_POST['title'];
$content = $_POST['content'];
if ($stmt->execute()) {
echo "新文章发布成功!";
header("Location: read_posts.php");
exit();
} else {
echo "Error: " . $stmt->error;
}
$stmt->close();
$conn->close();
} else {
header("Location: create_form.html");
exit();
}
?>
预处理语句会先将 SQL 模板发送给数据库,然后数据库再分别绑定参数执行,从根本上杜绝了 SQL 注入的可能。
密码安全 - 永远不要明文存储密码
当用户注册时,不要直接将密码存入数据库,应该使用哈希算法(如 password_hash())进行加密。
// 注册时
$password = $_POST['password'];
$hashed_password = password_hash($password, PASSWORD_DEFAULT); // 哈希密码
// 存储到数据库...
$sql = "INSERT INTO users (username, password) VALUES (?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $username, $hashed_password);
$stmt->execute();
// 登录时验证
$user_password_from_db = "从数据库获取的哈希密码";
$input_password = $_POST['password'];
if (password_verify($input_password, $user_password_from_db)) {
// 密码正确,登录成功
} else {
// 密码错误
}
第六部分:项目实战 - 简单博客系统
让我们把学到的知识整合起来,构建一个简单的博客系统。
功能列表:
- 发表文章: 通过表单提交标题和内容,存入数据库。
- 文章列表: 从数据库读取所有文章,并按时间倒序显示。
- 查看文章详情: 点击文章标题,进入单独页面查看完整内容。
- 删除文章: 在文章详情页提供删除按钮。
文件结构:
my_website/
├── config.php // 数据库配置
├── create_form.html // 发表文章的表单
├── create_post.php // 处理表单提交,插入数据
├── index.php // 首页,显示文章列表
├── post.php // 显示单篇文章详情
└── delete_post.php // 处理删除文章的逻辑
步骤 1: 首页 (index.php) - 显示文章列表和之前的 read_posts.php 基本一样,但要把链接指向 post.php。
<?php require_once 'config.php'; ?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">我的博客</title>
<style>
body { font-family: sans-serif; line-height: 1.6; margin: 2em; }
.post h2 { color: #333; }
.post a { text-decoration: none; color: #007bff; }
.post a:hover { text-decoration: underline; }
.post-meta { color: #666; font-size: 0.9em; }
</style>
</head>
<body>
<h1>我的博客</h1>
<a href="create_form.html">发表新文章</a>
<hr>
<?php
$sql = "SELECT * FROM posts ORDER BY created_at DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo '<div class="post">';
echo '<h2><a href="post.php?id=' . $row["id"] . '">' . htmlspecialchars($row["title"]) . '</a></h2>';
echo '<div class="post-meta">' . $row["created_at"] . '</div>';
echo '<p>' . substr(htmlspecialchars($row["content"]), 0, 200) . '...</p>';
echo '</div>';
echo '<hr>';
}
} else {
echo "暂无文章";
}
$conn->close();
?>
</body>
</html>
步骤 2: 文章详情页 (post.php)
<?php require_once 'config.php'; ?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">文章详情</title>
</head>
<body>
<a href="index.php">返回首页</a>
<hr>
<?php
if (isset($_GET['id'])) {
$id = $_GET['id'];
$stmt = $conn->prepare("SELECT * FROM posts WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
echo "<h1>" . htmlspecialchars($row["title"]) . "</h1>";
echo "<p><small>发布时间:" . $row["created_at"] . "</small></p>";
echo "<div>" . nl2br(htmlspecialchars($row["content"])) . "</div>";
} else {
echo "文章不存在";
}
$stmt->close();
} else {
echo "无效的请求";
}
$conn->close();
?>
<hr>
<a href="delete_post.php?id=<?php echo $id; ?>" onclick="return confirm('确定要删除这篇文章吗?');">删除文章</a>
</body>
</html>
步骤 3: 删除文章 (delete_post.php)
<?php
if (isset($_GET['id'])) {
require_once 'config.php';
$id = $_GET['id'];
// 使用预处理语句删除
$stmt = $conn->prepare("DELETE FROM posts WHERE id = ?");
$stmt->bind_param("i", $id);
if ($stmt->execute()) {
echo "文章删除成功!";
header("Location: index.php");
exit();
} else {
echo "删除失败: " . $stmt->error;
}
$stmt->close();
$conn->close();
} else {
header("Location: index.php");
exit();
}
?>
你的简单博客系统已经可以运行了!你可以访问 index.php 来查看效果。
第七部分:进阶与学习资源
当你掌握了以上内容后,可以继续学习以下方向来提升自己:
- MVC 架构: 学习更高级的代码组织方式,如 Model-View-Controller,它能让你的代码更清晰、更易于维护,现代 PHP 框架(如 Laravel, Symfony)都基于此。
- 使用框架: Laravel 是目前最流行的 PHP 框架之一,它提供了路由、ORM (Eloquent)、模板引擎、认证系统等强大功能,能极大加速开发。
- 前端技术: 学习 HTML5, CSS3, JavaScript (ES6+),以及 Vue.js 或 React 等前端框架,打造更现代化的用户界面。
- RESTful API: 学习如何构建 API,让你的网站能为移动 App 或其他服务提供数据。
- 部署: 学习如何将你的本地项目部署到云服务器(如阿里云、腾讯云、Vultr、DigitalOcean)上,让全世界的人都能访问。
推荐学习资源:
- PHP 官方文档: https://www.php.net/manual/zh/ (最权威的资料)
- MDN Web Docs (PHP 部分): https://developer.mozilla.org/zh-CN/docs/Web/PHP (非常好的入门教程)
- W3Schools PHP 教程: https://www.w3schools.com/php/ (简单易懂,适合快速查询)
- Laravel 官方文档: https://learnku.com/docs/laravel (中文社区文档非常棒)
祝你学习愉快,早日成为 PHP 开发高手!
