1 一句话答案
在 PHP 中从数据库获取数据,推荐使用 PDO 连接 MySQL,先创建连接,再执行 SELECT 查询,最后用 fetch()、fetchAll() 或 fetchColumn() 读取结果。
如果你搜索的是 php get data from database,本页的核心答案就是:连接 MySQL、执行安全的 SELECT、按结果形态选择正确的 fetch 方法。
最小流程
- 准备 MySQL DSN:数据库地址、库名、字符集。
- 创建
PDO连接并开启异常模式。 - 使用
prepare()和execute()执行查询。 - 根据场景选择
fetch()、fetchAll()或fetchColumn()。
2 创建测试表
下面的示例使用一个简单的 users 表,适合演示 PHP get data from database 的完整过程。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(200) NOT NULL UNIQUE,
status VARCHAR(20) NOT NULL DEFAULT 'active',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3 PHP 连接 MySQL 数据库
解释 database connectivity in PHP with reference to MySQL 时,最重要的是理解 DSN、账号密码和 PDO 选项。DSN 告诉 PHP 连接哪个 MySQL 主机、哪个数据库,以及使用什么字符集。
<?php
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=myapp;charset=utf8mb4';
$username = 'app_user';
$password = 'change_this_password';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
error_log('MySQL connection failed: ' . $e->getMessage());
exit('Database connection failed.');
}
DSN
包含 host、port、dbname、charset,决定连接目标。
错误模式
ERRMODE_EXCEPTION 让连接或查询失败时抛出异常,便于统一处理。
字符集
使用 utf8mb4 能正确保存中文、emoji 和完整 Unicode 字符。
4 获取一条、多条和单列数据
获取一条记录:fetch()
$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE id = :id');
$stmt->execute(['id' => 1]);
$user = $stmt->fetch();
if ($user) {
echo $user['name'] . ' - ' . $user['email'];
}
获取多条记录:fetchAll()
$stmt = $pdo->prepare(
'SELECT id, name, email FROM users WHERE status = :status ORDER BY created_at DESC'
);
$stmt->execute(['status' => 'active']);
$users = $stmt->fetchAll();
foreach ($users as $user) {
echo "{$user['id']}: {$user['name']} ({$user['email']})\n";
}
获取单个值:fetchColumn()
$stmt = $pdo->prepare('SELECT COUNT(*) FROM users WHERE status = :status');
$stmt->execute(['status' => 'active']);
$activeCount = (int) $stmt->fetchColumn();
echo "Active users: {$activeCount}";
5 可复用的数据库连接文件
实际项目中,不要在每个页面重复写连接代码。可以把连接逻辑放进单独文件,业务页面只负责查询。
<?php
// database.php
function db(): PDO
{
static $pdo = null;
if ($pdo === null) {
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=myapp;charset=utf8mb4',
'app_user',
'change_this_password',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
}
return $pdo;
}
<?php
// users.php
require __DIR__ . '/database.php';
$stmt = db()->prepare('SELECT id, name, email FROM users ORDER BY id DESC LIMIT 20');
$stmt->execute();
$users = $stmt->fetchAll();
6 常见问题排查
could not find driver
PHP 没有安装或启用 pdo_mysql 扩展。检查 php -m,并在服务器 PHP 配置中启用 MySQL PDO 驱动。
Access denied for user
用户名、密码或主机权限不正确。确认 MySQL 用户拥有目标数据库的最小必要权限。
乱码或 emoji 保存失败
DSN、数据库、表和字段都应使用 utf8mb4,不要只依赖页面的 HTML 编码。
7 FAQ
PHP get data from database 最推荐的方式是什么?
推荐 PDO + 预处理语句。它比直接拼接 SQL 更安全,也比把连接逻辑散落在页面里更容易维护。
fetch 和 fetchAll 有什么区别?
fetch() 读取一行,适合按 id 查询详情;fetchAll() 读取所有结果,适合列表页,但大数据量时要配合分页。
mysqli 可以连接 MySQL 吗?
可以,但 PDO 的 API 更统一,未来切换 PostgreSQL 或 SQLite 时改动更少。新项目通常优先选择 PDO。
评论加载中...