> 技术文档 > PHP 与 MySQL 详解实战入门(1)

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,程序化方式
$link = mysqli_connect(\"hostname\", \"username\", \"password\", \"database\");// PHP 8+ 必须显式设置字符集mysqli_set_charset($link, \"utf8mb4\");
b.语法:MySQLi,面向对象的方式
$mysqli = new mysqli(\"hostname\", \"username\", \"password\", \"database\");// PHP 8+ 连接失败会自动抛出mysqli_sql_exception$mysqli->set_charset(\"utf8mb4\");
c.语法:PHP 数据对象 (PDO) 方式
$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/* 尝试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/* 尝试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/* 尝试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$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 面向对象方式
<?phptry { $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 方式
<?phptry { $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/* 连接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/* 连接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/* 连接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/* 连接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/* 连接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/* 连接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$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$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$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$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 方式(更简洁)
<?phptry { $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 表单
<!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 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// 表单验证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$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$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$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 数据查询、更新与删除操作,敬请关注。