🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【PHP入门】连接PHP与数据库(SQL)以列表形式显示的基础知识

在之前的文章中,我们学习了PHP的数组、循环、函数等基本语法。但是,在实际的网站中,通知或商品列表等数据通常不是直接写在PHP文件里,而是在一个名为数据库的专用保险库中进行管理。

“如何将PHP与数据库连接起来?”、“如何将在网页上显示通过SQL获取的数据?”这是许多Web制作者都会遇到的一个主要障碍。本文将为您解答这些疑问。让我们通过一个可以复制粘贴即可运行的完整代码,来体验从PHP连接到数据库,再用`foreach`循环将通过SQL获取的数据以表格形式显示的整个流程吧。一旦您体验到PHP与SQL成功连接那一刻的激动,您肯定也会想用自己的数据来尝试一下的!

要准备运行PHP(开发环境),如果还没有搭建XAMPP的朋友,请参考【PHP入门】XAMPP下载及安装方法完全解析!。 安装后,将PHP文件放置在指定文件夹(如 `htdocs`)中,准备工作就完成了!

1. PHP与数据库连接的3个步骤

PHP与数据库交互的流程,大致可以分为以下三个步骤:

  1. 连接 (Connect): PHP向数据库打招呼说“你好,可以聊聊吗?”,并建立连接。
  2. 命令 (Execute Query): PHP使用一种名为SQL的语言向数据库发出命令,说“请从这张表中,把这些数据给我”。
  3. 显示 (Display Results): PHP将从数据库接收到的数据转换为HTML,并显示在网页上。

这次,我们将使用一种名为PDO (PHP Data Objects)的机制,来安全且现代地实现这三个步骤。PDO是PHP的一个标准功能,能够支持多种类型的数据库,并且在安全方面表现出色,因此是当前PHP开发中必备的知识。

2. 实践!从数据库显示商品列表

那么,让我们实际编写代码,从数据库获取并显示商品列表吧。

步骤A:准备数据库和数据表

首先,需要准备一个用于存储数据的表。请在phpMyAdmin等数据库管理工具中,执行以下的SQL语句,创建`products`表,并注册3条示例数据。

CREATE TABLE products (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  price INT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO products (name, price) VALUES
('高性能笔记本电脑', 120000),
('无线耳机', 15000),
('4K显示器', 45000);

步骤B:用PHP获取并显示数据

数据表准备好后,就轮到PHP出场了。以下代码是一个完整的示例,包含了从连接数据库、获取数据到用HTML显示的所有内容。将此文件上传到服务器后,就可以在浏览器中确认结果。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>商品列表</title>
    <style>
        body { font-family: sans-serif; padding: 20px; }
        h1 { border-bottom: 2px solid #0056b3; }
        .product-table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        .product-table th, .product-table td { border: 1px solid #ddd; padding: 12px; text-align: left; }
        .product-table th { background-color: #f2f2f2; }
        .product-table tr:nth-child(even) { background-color: #f9f9f9; }
        .error-message { color: red; font-weight: bold; border: 1px solid red; padding: 10px; }
    </style>
</head>
<body>
    <h1>商品列表</h1>

    <?php
    // --- 1. 连接到数据库 ---
    $db_host = 'localhost';          // 数据库服务器主机名
    $db_name = 'your_database_name'; // 数据库名
    $db_user = 'your_username';      // 数据库用户名
    $db_pass = 'your_password';      // 数据库密码

    try {
        // 创建PDO对象以连接到数据库
        $pdo = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_user, $db_pass);
        // 设置错误模式为抛出异常
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // --- 2. 执行SQL ---
        // 从products表获取所有数据的查询
        $stmt = $pdo->prepare("SELECT id, name, price FROM products ORDER BY id");
        $stmt->execute();

        // --- 3. 获取并显示结果 ---
        // 以关联数组形式获取所有数据
        $products = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if ($products) {
            echo '<table class="product-table">';
            echo '<tr><th>商品ID</th><th>商品名称</th><th>价格</th></tr>';
            
            // 用foreach进行循环处理
            foreach ($products as $product) {
                echo '<tr>';
                echo '<td>' . htmlspecialchars($product['id']) . '</td>';
                echo '<td>' . htmlspecialchars($product['name']) . '</td>';
                echo '<td>¥' . number_format($product['price']) . '</td>';
                echo '</tr>';
            }
            echo '</table>';
        } else {
            echo '<p>未找到商品数据。</p>';
        }

    } catch (PDOException $e) {
        // 发生连接错误或查询错误时的处理
        echo '<div class="error-message">数据库错误: ' . htmlspecialchars($e->getMessage()) . '</div>';
    }
    ?>
</body>
</html>

重要:在运行上述代码之前,请务必将`your_database_name`、`your_username`、`your_password`部分,修改为您自己环境的设置。

在浏览器中访问此文件,如果表格中成功显示了商品列表,那就成功了!这就是PHP与数据库对话,并动态生成HTML结果的瞬间。

3. 注意事项

数据库连接功能非常强大,但也有几点需要注意。特别是安全和错误处理非常重要。

错误处理 (try...catch语法)

如果数据库密码错误,或者SQL语法有误,程序会因错误而停止。通过使用`try...catch`语法将整个处理过程包围起来,即使发生错误,网站也不会白屏,而是可以捕获错误并显示自定义的错误消息。

<?php
try {
    // 连接数据库并获取数据的处理
    // 如果在此过程中发生错误...
    $pdo = new PDO("mysql:host=localhost;dbname=wrong_db;charset=utf8", "user", "pass");

} catch (PDOException $e) {
    // ...这里的处理将被执行
    echo "发生了错误: " . $e->getMessage();
    // 在实际的网站中,通常只向用户显示简单的消息,
    // 而将错误的详细信息记录到日志文件中。
    // exit(); // 中断处理
}
?>

通过这种机制,即使发生意外错误,也不会让用户感到困惑,同时也便于开发者确定错误原因。

SQL注入对策

如果基于用户的输入(如搜索关键词)来构建SQL语句,可能会遭受一种名为**SQL注入**的非常危险的攻击。这是一种通过注入恶意的SQL语句来非法操作数据库的攻击。

PDO的**预处理语句**(使用`prepare()`和`execute()`的方法)是针对SQL注入的最有效对策。即使这次没有用户输入,也应该养成总是使用这种方法的习惯。

4. 总结

这次,我们使用PDO一口气学习了连接PHP与数据库的三个基本步骤(连接、命令、显示)。能够从像数据库这样的外部存储库中动态获取并显示数据,而不再是直接在PHP文件中硬编码数据,这是Web应用开发中的一大步。

掌握了这个基本形式后,就可以进行各种应用,比如添加`WHERE`子句来按特定条件筛选数据,或者与表单结合使用`INSERT`语句来注册数据。请务必用自己创建的表和数据进行各种尝试!