PHP + MySQL 网站开发全攻略

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

php mysql网站开发教程
(图片来源网络,侵删)

第一部分:基础准备与环境搭建

在开始编码之前,我们需要搭建一个本地的开发环境,最简单的方式是使用集成环境包。

你需要准备什么?

  • 一个代码编辑器: 推荐使用 Visual Studio Code (VS Code),免费、强大且插件丰富。
  • 一个本地服务器环境: 我们使用 XAMPPMAMP,它们都包含了我们需要的所有组件:
    • X (Apache/Nginx): Web 服务器,用于解析和运行 PHP 文件。
    • M (MySQL): 数据库管理系统,用于存储网站数据。
    • P (PHP): 服务器端脚本语言,用于处理逻辑和与数据库交互。
    • P (Perl): 另一种脚本语言,我们暂时不用。
  • 一个 Web 浏览器: Chrome, Firefox, Edge 等。

安装和配置 XAMPP (以 Windows 为例)

  1. 下载: 访问 XAMPP 官网 下载适合你操作系统的版本。
  2. 安装: 运行安装程序,一路点击 "Next" 即可,建议安装到默认路径(如 C:\xampp)。
  3. 启动组件:
    • 安装完成后,打开 XAMPP Control Panel。
    • 点击 ApacheMySQL 模块旁边的 "Start" 按钮,你需要保持这两个服务在运行状态。
  4. 验证安装:
    • 打开浏览器,访问 http://localhosthttp://127.0.0.1,如果看到 XAMPP 的欢迎页面,说明 Apache 服务器运行成功。
    • 点击左侧的 "phpMyAdmin" 链接,如果进入了数据库管理界面,说明 MySQL 也运行成功。

创建你的第一个项目文件夹

php 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 mysql网站开发教程
(图片来源网络,侵删)

变量与数据类型

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 {
    // 密码错误
}

第六部分:项目实战 - 简单博客系统

让我们把学到的知识整合起来,构建一个简单的博客系统。

功能列表:

  1. 发表文章: 通过表单提交标题和内容,存入数据库。
  2. 文章列表: 从数据库读取所有文章,并按时间倒序显示。
  3. 查看文章详情: 点击文章标题,进入单独页面查看完整内容。
  4. 删除文章: 在文章详情页提供删除按钮。

文件结构:

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 来查看效果。


第七部分:进阶与学习资源

当你掌握了以上内容后,可以继续学习以下方向来提升自己:

  1. MVC 架构: 学习更高级的代码组织方式,如 Model-View-Controller,它能让你的代码更清晰、更易于维护,现代 PHP 框架(如 Laravel, Symfony)都基于此。
  2. 使用框架: Laravel 是目前最流行的 PHP 框架之一,它提供了路由、ORM (Eloquent)、模板引擎、认证系统等强大功能,能极大加速开发。
  3. 前端技术: 学习 HTML5, CSS3, JavaScript (ES6+),以及 Vue.jsReact 等前端框架,打造更现代化的用户界面。
  4. RESTful API: 学习如何构建 API,让你的网站能为移动 App 或其他服务提供数据。
  5. 部署: 学习如何将你的本地项目部署到云服务器(如阿里云、腾讯云、Vultr、DigitalOcean)上,让全世界的人都能访问。

推荐学习资源:

祝你学习愉快,早日成为 PHP 开发高手!