← 返回目录

PHP MySQL Database Connectivity

PHP 从数据库获取数据:MySQL 连接与查询完整示例

用 PDO 解释 PHP 如何连接 MySQL,并安全地读取查询结果

1 一句话答案

在 PHP 中从数据库获取数据,推荐使用 PDO 连接 MySQL,先创建连接,再执行 SELECT 查询,最后用 fetch()fetchAll()fetchColumn() 读取结果。

如果你搜索的是 php get data from database,本页的核心答案就是:连接 MySQL、执行安全的 SELECT、按结果形态选择正确的 fetch 方法。

最小流程

  1. 准备 MySQL DSN:数据库地址、库名、字符集。
  2. 创建 PDO 连接并开启异常模式。
  3. 使用 prepare()execute() 执行查询。
  4. 根据场景选择 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

包含 hostportdbnamecharset,决定连接目标。

错误模式

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。

评论加载中...