当前位置: 首页 > news >正文

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 面向对象方式
<?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
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
/* 连接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 方式(更简洁)
<?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 表单
<!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 数据查询、更新与删除操作,敬请关注。

http://www.lryc.cn/news/605754.html

相关文章:

  • PHP 5.5 Action Management with Parameters (English Version)
  • 通义千问Qwen3-30B-A3B-Thinking-2507技术解析:推理模型的工程实践突破
  • 常见的中间件漏洞如tomcat,weblogic,jboss,apache靶场攻略
  • 基于瑞芯微SoC的产品开发流程详解
  • 18650圆柱电池自动面垫机:自动化生产的效率革命
  • 人工智能之数学基础:频率和概率之间的关系
  • Java项目:基于SSM框架实现的小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告+任务书+远程部署】
  • JS常见问题
  • BatchNorm 一般放在哪里?
  • InfluxDB 与 Python 框架结合:Django 应用案例(二)
  • DoRA详解:从LoRA到权重分解的进化
  • 小杰数据结构(three day)——静以修身,俭以养德。
  • 【Linux系统】库的制作与原理
  • 【数据结构】算法代码
  • 渗透RCE
  • TS 常用类型与语法
  • Cesium 快速入门(六)实体类型介绍
  • Jmeter 性能测试常用图表、服务器资源监控
  • C语言指针(三):数组传参本质、冒泡排序与二级指针详解
  • FISCO BCOS Gin调用WeBASE-Front接口发请求
  • [硬件电路-111]:滤波的分类:模拟滤波与数字滤波; 无源滤波与有源滤波;低通、带通、带阻、高通滤波;时域滤波与频域滤波;低价滤波与高阶滤波。
  • 操作系统数据格式相关(AI回答)
  • 无人船 | 图解基于LQR控制的路径跟踪算法(以欠驱动无人艇Otter为例)
  • 学习笔记《区块链技术与应用》第4天 比特币脚本语言
  • Docker部署Seata
  • Linux核心转储(Core Dump)原理、配置与调试实践
  • 前端-移动Web-day2
  • 野生动物巡查系统(H题)--2025 年全国大学生电子设计竞赛试题
  • ENSP防火墙部署
  • 快速理解RTOS中的pendsv中断和systick中断