【PHP入门】连接PHP与数据库(SQL)以列表形式显示的基础知识
在之前的文章中,我们学习了PHP的数组、循环、函数等基本语法。但是,在实际的网站中,通知或商品列表等数据通常不是直接写在PHP文件里,而是在一个名为数据库的专用保险库中进行管理。
“如何将PHP与数据库连接起来?”、“如何将在网页上显示通过SQL获取的数据?”这是许多Web制作者都会遇到的一个主要障碍。本文将为您解答这些疑问。让我们通过一个可以复制粘贴即可运行的完整代码,来体验从PHP连接到数据库,再用`foreach`循环将通过SQL获取的数据以表格形式显示的整个流程吧。一旦您体验到PHP与SQL成功连接那一刻的激动,您肯定也会想用自己的数据来尝试一下的!
要准备运行PHP(开发环境),如果还没有搭建XAMPP的朋友,请参考【PHP入门】XAMPP下载及安装方法完全解析!。 安装后,将PHP文件放置在指定文件夹(如 `htdocs`)中,准备工作就完成了!
1. PHP与数据库连接的3个步骤
PHP与数据库交互的流程,大致可以分为以下三个步骤:
- 连接 (Connect): PHP向数据库打招呼说“你好,可以聊聊吗?”,并建立连接。
- 命令 (Execute Query): PHP使用一种名为SQL的语言向数据库发出命令,说“请从这张表中,把这些数据给我”。
- 显示 (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`语句来注册数据。请务必用自己创建的表和数据进行各种尝试!