PHP 与 MySQL 详解实战入门(1)

PHP 与 MySQL 详解实战入门(1)

前言

在 Web 开发领域,PHP 与 MySQL 的组合一直是构建动态网站和后端系统的经典搭配。随着 PHP 8 + 的普及,其在性能、类型安全和错误处理上的优化让这一组合更加高效可靠。

对于刚接触后端开发的新手,或需要更新知识体系的开发者来说,从数据库连接到数据操作的每一步都充满细节:如何安全连接 MySQL?如何创建数据库和表结构?如何避免 SQL 注入风险?如何高效插入数据并追踪记录?

本文基于 PHP 8 + 环境,系统讲解 MySQLi(过程式 / 面向对象)与 PDO 两种连接方式,从数据库创建、表结构设计,到单条 / 批量数据插入,再到预处理语句的安全实践和最后插入 ID 的获取,手把手带你掌握 PHP 操作 MySQL 的核心流程。无论你是零基础入门,还是需要规范代码风格,这份指南都能帮你打好基础。


PHP与MYSQL

(1)PHP MySQL 连接

1.通过 PHP 连接到 MySQL 的方法

为了存储或访问 MySQL 数据库中的数据,您首先需要连接到 MySQL 数据库服务器。PHP 8 + 提供两种连接方式:

  • MySQLi(改进的 MySQL):仅支持 MySQL 数据库,提供面向对象和过程式两种 API
  • PDO(PHP 数据对象):支持多数据库,仅提供面向对象 API

提示:MySQLi 适合 MySQL 专属项目,PDO 适合跨数据库场景。PHP 8 + 中 MySQLi 在性能和 MySQL 特有功能支持上更具优势,推荐优先使用。

a.语法:MySQLi,程序化方式
php 复制代码
$link = mysqli_connect("hostname", "username", "password", "database");
// PHP 8+ 必须显式设置字符集
mysqli_set_charset($link, "utf8mb4");
b.语法:MySQLi,面向对象的方式
php 复制代码
$mysqli = new mysqli("hostname", "username", "password", "database");
// PHP 8+ 连接失败会自动抛出mysqli_sql_exception
$mysqli->set_charset("utf8mb4");
c.语法:PHP 数据对象 (PDO) 方式
php 复制代码
$pdo = new PDO("mysql:host=hostname;dbname=database;charset=utf8mb4", "username", "password");
// PHP 8+ 推荐设置异常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

参数说明:

  • hostname:MySQL 服务器地址(通常为localhost
  • username/password:数据库访问凭据(PHP 8 + 环境强制要求设置密码)
  • database:默认使用的数据库名
  • utf8mb4:PHP 8 + 强制推荐的字符集(支持 Emoji 和完整 Unicode)
特性 MySQLi 程序化方式 MySQLi 面向对象方式 PDO 方式
API 风格 函数式(如mysqli_connect() 对象方法(如$mysqli->connect() 纯面向对象(如$pdo->query()
数据库支持 仅支持 MySQL 仅支持 MySQL 支持 12 + 数据库(MySQL、PostgreSQL 等)
错误处理 需手动检查错误(如mysqli_error() PHP 8 + 自动抛出mysqli_sql_exception 可设置抛出PDOException
预处理语句占位符 仅支持问号占位符(? 仅支持问号占位符(? 支持命名占位符(:name)和问号
扩展性 较弱,依赖函数调用 较强,面向对象设计 最强,抽象层支持自定义驱动
适用场景 小型 MySQL 项目,偏好过程式编程 中大型 MySQL 项目,面向对象架构 跨数据库项目,需统一接口
2.在线示例
a.MySQLi 程序化方式
php 复制代码
<?php
/* 尝试MySQL服务器连接(PHP 8+ 标准) */
$link = mysqli_connect("localhost", "db_user", "secure_pass", "demo");
 
// 检查连接
if (!$link) {
    throw new mysqli_sql_exception("错误:无法连接。" . mysqli_connect_error());
}
// 设置字符集
if (!mysqli_set_charset($link, "utf8mb4")) {
    throw new mysqli_sql_exception("字符集设置失败:" . mysqli_error($link));
}
 
// 打印主机信息
echo "连接成功。主机信息: " . mysqli_get_host_info($link);
?>
b.MySQLi 面向对象方式
php 复制代码
<?php
/* 尝试MySQL服务器连接(PHP 8+ 面向对象方式) */
try {
    $mysqli = new mysqli("localhost", "db_user", "secure_pass", "demo");
    // 连接失败会自动抛出异常,无需手动检查false
    
    // 设置字符集
    if (!$mysqli->set_charset("utf8mb4")) {
        throw new mysqli_sql_exception("字符集设置失败:" . $mysqli->error);
    }
    
    // 打印主机信息
    echo "连接成功。主机信息:" . $mysqli->host_info;
} catch (mysqli_sql_exception $e) {
    die("错误:无法连接。" . $e->getMessage());
}
?>
c.PDO 方式
php 复制代码
<?php
/* 尝试MySQL服务器连接(PHP 8+ PDO方式) */
try {
    // DSN中直接指定字符集(PHP 8+ 推荐)
    $pdo = new PDO("mysql:host=localhost;dbname=demo;charset=utf8mb4", "db_user", "secure_pass");
    
    // 设置错误模式为异常(PHP 8+ 调试友好)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 打印主机信息
    echo "连接成功。主机信息:" . $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS);
} catch (PDOException $e) {
    die("错误:无法连接。 " . $e->getMessage());
}
?>

注意:

  • PHP 8 + 环境中,禁止使用空密码和root用户直接连接数据库
  • 生产环境应创建专用数据库账户并限制权限
  • utf8mb4是唯一推荐的字符集,避免使用utf8(存在字符支持不全问题)
3.关闭 MySQL 数据库服务器连接

脚本执行结束后连接会自动关闭,如需提前关闭,PHP 8 + 提供以下方式:

1.MySQLi 程序化方式
php 复制代码
<?php
$link = mysqli_connect("localhost", "db_user", "secure_pass", "demo");
if (!$link) {
    throw new mysqli_sql_exception("错误:无法连接。" . mysqli_connect_error());
}
mysqli_set_charset($link, "utf8mb4");
 
echo "连接成功。主机信息: " . mysqli_get_host_info($link);
 
// 关闭连接
mysqli_close($link);
?>
2.MySQLi 面向对象方式
php 复制代码
<?php
try {
    $mysqli = new mysqli("localhost", "db_user", "secure_pass", "demo");
    $mysqli->set_charset("utf8mb4");
    
    echo "连接成功。主机信息: " . $mysqli->host_info;
    
    // 关闭连接(PHP 8+ 空安全运算符,避免未定义变量错误)
    $mysqli?->close();
} catch (mysqli_sql_exception $e) {
    die("错误:无法连接。" . $e->getMessage());
}
?>
3.PDO 方式
php 复制代码
<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=demo;charset=utf8mb4", "db_user", "secure_pass");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "连接成功。主机信息: " .$pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS);
} catch (PDOException $e) {
    die("错误:无法连接。" . $e->getMessage());
}
 
// 关闭连接(释放资源)
unset($pdo);
?>

(2)PHP创建数据库

1. 过程式方式(MySQLi)
php 复制代码
<?php
/* 连接MySQL服务器 */
$host = 'localhost';
$user = 'db_admin'; // 避免使用root用户
$pass = 'secure_pass_123'; // 强制设置密码

// 建立连接
$link = mysqli_connect($host, $user, $pass);

// 检查连接(PHP 8+ 严格错误处理)
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}

// 定义创建数据库的SQL语句
$sql = "CREATE DATABASE demo";

// 执行查询
if (mysqli_query($link, $sql)) {
    echo "数据库 'demo' 创建成功";
} else {
    throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . mysqli_error($link));
}

// 关闭连接
mysqli_close($link);
?>
2. 面向对象方式(MySQLi)
php 复制代码
<?php
/* 连接MySQL服务器(PHP 8+ 异常处理) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';

try {
    // 实例化连接(PHP 8+ 连接失败会自动抛出mysqli_sql_exception)
    $mysqli = new mysqli($host, $user, $pass);

    // 定义创建数据库的SQL语句
    $sql = "CREATE DATABASE demo";

    // 执行查询
    if ($mysqli->query($sql) === true) {
        echo "数据库 'demo' 创建成功";
    } else {
        throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . $mysqli->error);
    }

    // 关闭连接
    $mysqli->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. PDO 方式

出现 操作失败:could not find driver的原因是pdo_mysql 扩展未安装或未启用

  1. 找到 PHP 安装目录下的 php.ini 配置文件(可通过 phpinfo() 中的 Loaded Configuration File 查看路径)。
  2. 打开 php.ini,搜索并取消注释(删除前面的 ;)以下行:
php 复制代码
<?php
/* 连接MySQL服务器(PHP 8+ PDO规范) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';

try {
    // 建立PDO连接(设置异常模式)
    $pdo = new PDO("mysql:host=$host", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 定义并执行创建数据库的SQL语句
    $sql = "CREATE DATABASE demo";
    $pdo->exec($sql);
    echo "数据库 'demo' 创建成功";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    // 释放连接
    unset($pdo);
}
?>

(3)PHP MySQL 创建表

1. 过程式方式(MySQLi)
php 复制代码
<?php
/* 连接MySQL并指定数据库 */
$host = 'localhost';
$user = 'db_admin'; // 专用数据库用户
$pass = 'secure_pass_123'; // 强密码
$dbname = 'demo'; // 目标数据库

// 建立连接
$link = mysqli_connect($host, $user, $pass, $dbname);

// 检查连接(PHP 8+ 严格错误处理)
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}

// 设置字符集(PHP 8+ 强制要求)
mysqli_set_charset($link, 'utf8mb4');

// 定义创建表的SQL语句(指定引擎和字符集)
$sql = "CREATE TABLE persons (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(30) NOT NULL,
    last_name VARCHAR(30) NOT NULL,
    email VARCHAR(70) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

// 执行查询
if (mysqli_query($link, $sql)) {
    echo "表 'persons' 创建成功";
} else {
    throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . mysqli_error($link));
}

// 关闭连接
mysqli_close($link);
?>
2. 面向对象方式(MySQLi)
php 复制代码
<?php
/* 连接MySQL并指定数据库(PHP 8+ 异常处理) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';
$dbname = 'demo';

try {
    // 实例化连接(自动抛出异常)
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    
    // 设置字符集
    $mysqli->set_charset('utf8mb4');

    // 定义创建表的SQL语句
    $sql = "CREATE TABLE persons (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(30) NOT NULL,
        last_name VARCHAR(30) NOT NULL,
        email VARCHAR(70) NOT NULL UNIQUE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

    // 执行查询
    if ($mysqli->query($sql) === true) {
        echo "表 'persons' 创建成功";
    } else {
        throw new mysqli_sql_exception("执行失败:" . $sql . "。错误:" . $mysqli->error);
    }

    // 关闭连接(空安全运算符避免未定义错误)
    $mysqli?->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. PDO 方式
php 复制代码
<?php
/* 连接MySQL并指定数据库(PHP 8+ PDO规范) */
$host = 'localhost';
$user = 'db_admin';
$pass = 'secure_pass_123';
$dbname = 'demo';

try {
    // 建立PDO连接(DSN指定字符集)
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user,
        $pass,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] // 直接设置异常模式
    );

    // 定义创建表的SQL语句
    $sql = "CREATE TABLE persons (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(30) NOT NULL,
        last_name VARCHAR(30) NOT NULL,
        email VARCHAR(70) NOT NULL UNIQUE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

    // 执行查询
    $pdo->exec($sql);
    echo "表 'persons' 创建成功";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    // 释放连接
    unset($pdo);
}
?>

(4)向 MySQL 表插入数据

MySQL 中通过INSERT INTO语句插入新记录。结合 PHP,可通过数据库扩展的查询方法执行该语句。推荐使用预处理语句防止 SQL 注入,同时强化错误处理。

1. 插入单条记录
a.过程式方式(MySQLi)
php 复制代码
<?php
$host = 'localhost';
$user = 'db_admin'; // 专用账户,禁止root
$pass = 'SecurePass@2024'; // 强密码
$dbname = 'demo';

// 连接数据库
$link = mysqli_connect($host, $user, $pass, $dbname);
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}
// 设置字符集
mysqli_set_charset($link, 'utf8mb4');

// 使用预处理语句(防止SQL注入)
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($link, $sql);

// 绑定参数(i=int, s=string,此处均为字符串)
mysqli_stmt_bind_param($stmt, 'sss', $firstName, $lastName, $email);

// 定义要插入的值
$firstName = 'Peter';
$lastName = 'Parker';
$email = 'peterparker@mail.com';

// 执行语句
if (mysqli_stmt_execute($stmt)) {
    echo "记录插入成功,新记录ID:" . mysqli_insert_id($link);
} else {
    throw new mysqli_sql_exception("插入失败:" . mysqli_stmt_error($stmt));
}

// 释放资源
mysqli_stmt_close($stmt);
mysqli_close($link);
?>
b.面向对象方式(MySQLi)
php 复制代码
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(PHP 8+ 自动抛异常)
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    $mysqli->set_charset('utf8mb4');

    // 预处理语句
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($sql);

    // 绑定参数
    $stmt->bind_param('sss', $firstName, $lastName, $email);

    // 赋值
    $firstName = 'Peter';
    $lastName = 'Parker';
    $email = 'peterparker@mail.com';

    // 执行
    if ($stmt->execute()) {
        echo "记录插入成功,新记录ID:" . $mysqli->insert_id;
    } else {
        throw new mysqli_sql_exception("插入失败:" . $stmt->error);
    }

    // 关闭资源
    $stmt->close();
    $mysqli->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
c.PDO 方式
php 复制代码
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(指定字符集和异常模式)
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user,
        $pass,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    // 预处理语句
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)";
    $stmt = $pdo->prepare($sql);

    // 绑定参数并执行
    $stmt->execute([
        ':first_name' => 'Peter',
        ':last_name' => 'Parker',
        ':email' => 'peterparker@mail.com'
    ]);

    echo "记录插入成功,新记录ID:" . $pdo->lastInsertId();
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    unset($pdo);
}
?>
2. 批量插入多条记录

通过单个INSERT语句插入多行,效率更高。

a.过程式方式(MySQLi)
php 复制代码
<?php
$link = mysqli_connect('localhost', 'db_admin', 'SecurePass@2024', 'demo');
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}
mysqli_set_charset($link, 'utf8mb4');

// 批量插入的SQL(使用预处理)
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($link, $sql);
mysqli_stmt_bind_param($stmt, 'sss', $first, $last, $email);

// 待插入的数据
$persons = [
    ['John', 'Rambo', 'johnrambo@mail.com'],
    ['Clark', 'Kent', 'clarkkent@mail.com'],
    ['Harry', 'Potter', 'harrypotter@mail.com']
];

// 循环执行
foreach ($persons as $p) {
    $first = $p[0];
    $last = $p[1];
    $email = $p[2];
    if (!mysqli_stmt_execute($stmt)) {
        throw new mysqli_sql_exception("插入失败:" . mysqli_stmt_error($stmt));
    }
}

echo "批量插入成功,共插入 " . count($persons) . " 条记录";

mysqli_stmt_close($stmt);
mysqli_close($link);
?>
b.PDO 方式(更简洁)
php 复制代码
<?php
try {
    $pdo = new PDO(
        "mysql:host=localhost;dbname=demo;charset=utf8mb4",
        'db_admin',
        'SecurePass@2024',
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $pdo->prepare($sql);

    $persons = [
        ['John', 'Rambo', 'johnrambo@mail.com'],
        ['Clark', 'Kent', 'clarkkent@mail.com'],
        ['Harry', 'Potter', 'harrypotter@mail.com']
    ];

    // 批量执行
    foreach ($persons as $p) {
        $stmt->execute($p);
    }

    echo "批量插入成功,共插入 " . count($persons) . " 条记录";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. 从 HTML 表单插入数据
步骤 1:创建 HTML 表单
html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>添加记录</title>
</head>
<body>
    <form action="insert.php" method="post">
        <p>
            <label>名:</label>
            <input type="text" name="first_name" required>
        </p>
        <p>
            <label>姓:</label>
            <input type="text" name="last_name" required>
        </p>
        <p>
            <label>邮箱:</label>
            <input type="email" name="email" required>
        </p>
        <input type="submit" value="提交">
    </form>
</body>
</html>
步骤 2:处理表单数据
a.MySQLi 面向对象方式(预处理)
php 复制代码
<?php
// 验证表单数据(PHP 8+ 严格验证)
if (empty($_POST['first_name']) || empty($_POST['last_name']) || empty($_POST['email'])) {
    die("错误:所有字段为必填项");
}
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    die("错误:邮箱格式无效");
}

$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    $mysqli->set_charset('utf8mb4');

    // 预处理语句(防止SQL注入)
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param(
        'sss', 
        //每个字符对应一个参数的类型,这里的 'sss' 表示:
		//第一个 s:对应第一个参数 $_POST['first_name'],类型为字符串(string)
		//第二个 s:对应第二个参数 $_POST['last_name'],类型为字符串(string)
		//第三个 s:对应第三个参数 $_POST['email'],类型为字符串(string)
        $_POST['first_name'],
        $_POST['last_name'],
        $_POST['email']
    );

    if ($stmt->execute()) {
        echo "记录插入成功,ID:" . $mysqli->insert_id;
    } else {
        throw new mysqli_sql_exception("插入失败:" . $stmt->error);
    }

    $stmt->close();
    $mysqli->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
b.PDO 方式(预处理)
php 复制代码
<?php
// 表单验证
if (!isset($_POST['first_name'], $_POST['last_name'], $_POST['email'])) {
    die("错误:缺少字段");
}
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
    die("错误:邮箱格式无效");
}

try {
    $pdo = new PDO(
        "mysql:host=localhost;dbname=demo;charset=utf8mb4",
        'db_admin',
        'SecurePass@2024',
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:fn, :ln, :em)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':fn' => $_POST['first_name'],
        ':ln' => $_POST['last_name'],
        ':em' => $email // 使用过滤后的邮箱
    ]);

    echo "记录插入成功,ID:" . $pdo->lastInsertId();
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
}
?>

防止 SQL 注入

必须使用预处理语句prepare() + execute()),替代mysqli_real_escape_string()。预处理语句会自动转义特殊字符,是最安全的方式。

(5)MySQL 获取最后插入的 ID

为什么需要获取最后插入的 ID?

当表中存在AUTO_INCREMENT类型的主键(如id列)时,MySQL 会自动为新插入的记录生成唯一 ID。在以下场景中需要获取该 ID:

  • 向主表插入记录后,需将该 ID 作为外键插入从表(如订单表与订单详情表)。
  • 插入成功后,需跳转至新记录的详情页(需用 ID 定位)。
1. MySQLi 过程式方式
php 复制代码
<?php
$host = 'localhost';
$user = 'db_admin'; 
$pass = 'SecurePass@2024'; // 强密码
$dbname = 'demo';

// 连接数据库
$link = mysqli_connect($host, $user, $pass, $dbname);
if (!$link) {
    throw new mysqli_sql_exception("连接失败:" . mysqli_connect_error());
}
// 设置字符集
mysqli_set_charset($link, 'utf8mb4');

// 使用预处理语句插入记录(推荐,防SQL注入)
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($link, $sql);
mysqli_stmt_bind_param($stmt, 'sss', $firstName, $lastName, $email);

// 赋值并执行
$firstName = 'Ron';
$lastName = 'Weasley';
$email = 'ronweasley@example.com';
mysqli_stmt_execute($stmt);

// 获取最后插入的ID
$lastId = mysqli_insert_id($link);
echo "记录插入成功,最后插入的ID:{$lastId}";

// 释放资源
mysqli_stmt_close($stmt);
mysqli_close($link);
?>
2. MySQLi 面向对象方式
php 复制代码
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(PHP 8+ 连接失败自动抛异常)
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    $mysqli->set_charset('utf8mb4');

    // 预处理插入
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('sss', $firstName, $lastName, $email);

    // 执行插入
    $firstName = 'Ron';
    $lastName = 'Weasley';
    $email = 'ronweasley@example.com';
    $stmt->execute();

    // 获取最后插入的ID(通过对象属性)
    $lastId = $mysqli->insert_id;
    echo "记录插入成功,最后插入的ID:{$lastId}";

    // 关闭资源(空安全运算符防未定义错误)
    $stmt?->close();
    $mysqli?->close();
} catch (mysqli_sql_exception $e) {
    die("操作失败:" . $e->getMessage());
}
?>
3. PDO 方式
php 复制代码
<?php
$host = 'localhost';
$user = 'db_admin';
$pass = 'SecurePass@2024';
$dbname = 'demo';

try {
    // 连接数据库(设置异常模式)
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user,
        $pass,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    // 预处理插入(使用命名占位符)
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:fn, :ln, :em)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':fn' => 'Ron',
        ':ln' => 'Weasley',
        ':em' => 'ronweasley@example.com'
    ]);

    // 获取最后插入的ID(通过lastInsertId()方法)
    $lastId = $pdo->lastInsertId();
    echo "记录插入成功,最后插入的ID:{$lastId}";
} catch (PDOException $e) {
    die("操作失败:" . $e->getMessage());
} finally {
    unset($stmt, $pdo);
}
?>

适用条件

仅当表中存在AUTO_INCREMENT类型的列(通常为主键),且插入操作成功时,才能获取到有效 ID。若插入失败(如违反唯一约束),返回值为0false(依扩展而定)。


结语

通过本文的学习,我们从 PHP 8 + 连接 MySQL 的基础语法入手,逐步掌握了数据库创建、表结构设计、数据插入(含单条 / 批量 / 表单提交)、预处理语句防注入,以及最后插入 ID 获取等核心操作。

核心要点可总结为三点:一是根据场景选择合适的连接方式(MySQLi 适合纯 MySQL 场景,PDO 适合跨库需求);二是始终以预处理语句作为数据操作的标准实践,这是防范 SQL 注入的关键;三是理解 "连接 - 建库 - 建表 - 插入" 的完整流程,为后续学习查询、更新、删除等操作打下基础。

技术的掌握离不开实践,建议你结合文中示例搭建本地环境,尝试修改参数、模拟异常场景(如重复插入、权限不足),深入理解每一步的原理。后续我们将继续探讨 MySQL 数据查询、更新与删除操作,敬请关注。

相关推荐
阿巴斯甜15 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker15 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952716 小时前
Andorid Google 登录接入文档
android
黄林晴18 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
BingoGo18 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack18 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android