mysqli::$insert_id -- mysqli_insert_id — 返回最后一条插入语句产生的自增 ID

本文介绍了PHP中mysqli::$insert_id和mysqli_insert_id的使用,它们可返回最后一条插入语句产生的自增ID。说明了面向对象和过程化两种风格的用法,阐述了参数、返回值情况,还提到使用数据库函数LAST_INSERT_ID()可能影响返回值,并给出了范例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysqli::$insert_id

mysqli_insert_id

(PHP 5, PHP 7)

mysqli::$insert_id -- mysqli_insert_id — 返回最后一条插入语句产生的自增 ID

说明

面向对象风格

mixed $mysqli->insert_id;

过程化风格

mysqli_insert_id ( mysqli $link ) : mixed

mysqli_insert_id() 函数返回最后一个 SQL 语句(通常是 INSERT 语句) 所操作的表中设置为 AUTO_INCREMENT 的列的值。 如果最后一个 SQL 语句不是 INSERT 或者 UPDATE 语句, 或者所操作的表中没有设置为 AUTO_INCREMENT 的列, 返回值为 0。

Note:

如果在所执行的 INSERT 或者 UPDATE 语句中使用了数据库函数 LAST_INSERT_ID()。 有可能会影响 mysqli_insert_id() 函数的返回值。

参数

 

link

仅以过程化样式:由mysqli_connect() 或 mysqli_init() 返回的链接标识。

返回值

最后一条 SQL(INSERT 或者 UPDATE)所操作的表中设置为 AUTO_INCREMENT 属性的列的值。 如果指定的连接上尚未执行 SQL 语句,或者最后一条 SQL 语句所操作的表中没有设为 AUTO_INCREMENT 的列,返回 0。

Note:

如果返回值超出了 php 允许的最大整数值, mysqli_insert_id() 函数会以字符串形式返回这个值。

范例

Example #1 $mysqli->insert_id 例程

面向对象风格

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$mysqli->query("CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* 删除表 */
$mysqli->query("DROP TABLE myCity");

/* 关闭连接 */
$mysqli->close();
?>

过程化风格

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
mysqli_query($link, $query);

printf ("New Record has id %d.\n", mysqli_insert_id($link));

/* 删除表 */
mysqli_query($link, "DROP TABLE myCity");

/* 关闭连接 */
mysqli_close($link);
?>

以上例程会输出:

New Record has id 1.
<think>我们正在处理用户关于将PHP的mysql_*函数升级到PDO或MySQLi的请求。用户之前询问了如何替换字符串,但当前问题明确要求提供升级数据库操作的示例代码。根据引用,我们可以提供PDO和MySQLi两种方式的示例代码,并比较它们的特点。用户提供的引用中有一些示例代码片段,我们将整合并扩展这些示例,展示如何将常见的mysql_*函数替换为PDO或MySQLi。常见的mysql_*函数包括:mysql_connect()->连接数据库mysql_query()->执行查询mysql_fetch_array()->获取结果行mysql_error()->获取错误信息mysql_real_escape_string()->转义字符串(防止SQL注入)升级到PDO或MySQLi需要改变连接方式、执行查询和获取结果的方式。我们将分别展示PDO和MySQLi的示例,包括以下操作:1.建立连接2.执行查询(SELECT)3.执行预处理语(防止SQL注入)进行插入操作4.错误处理注意:在PDO中,我们使用try-catch来捕获异常,而MySQLi可以使用过程化或面向对象的方式,这里使用面向对象方式。另外,用户引用中提到了PDO和MySQLi的一些区别,如命名约定(蛇形vs驼峰)以及语法差异,我们会在示例中体现。我们假设原始使用mysql_*的代码为:$link=mysql_connect('localhost','user','password');mysql_select_db('testdb',$link);$result=mysql_query('SELECT*FROMusers',$link);while($row=mysql_fetch_array($result)){echo$row['username'];}升级到PDO:</think> 下面我将以清晰结构为您展示如何将 PHP 中的 `mysql_*` 函数升级为 PDO 或 MySQLi 的详细方案,并配合完整的代码示例: ### PDO 升级方案(推荐) PDO 提供统一的 API 支持多种数据库,包含预处理语可防止 SQL 注入攻击[^4]。 ```php <?php // 1. 连接数据库 try { $pdo = new PDO( 'mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] // 开启错误异常模式 ); } catch (PDOException $e) { die("连接失败: " . $e->getMessage()); } // 2. 查询数据 (替换 mysql_query) $stmt = $pdo->query('SELECT * FROM users'); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $row['name']; } // 3. 预处理插入 (替换 mysql_real_escape_string) $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)"); $stmt->execute([$name, $email]); // 自动参数绑定 $insertId = $pdo->lastInsertId(); // 获取最后插入ID ?> ``` ### MySQLi 升级方案 MySQLi 专为 MySQL 优化,支持面向对象和过程两种风格[^2]: ```php <?php // 1. 连接数据库 (替换 mysql_connect) $mysqli = new mysqli('localhost', 'user', 'password', 'testdb'); if ($mysqli->connect_error) { die("连接失败: " . $mysqli->connect_error); } // 2. 查询数据 (替换 mysql_query) if ($result = $mysqli->query('SELECT * FROM products')) { while ($row = $result->fetch_assoc()) { echo $row['product_name']; } $result->free(); // 释放结果集 } // 3. 预处理更新 (防SQL注入) $stmt = $mysqli->prepare("UPDATE orders SET status=? WHERE id=?"); $stmt->bind_param('si', $status, $orderId); // s=string, i=integer $stmt->execute(); ?> ``` ### 核心函数对比表 | 原始函数 | PDO 替代方案 | MySQLi 替代方案 | 安全改进 | |---------------------|------------------------------|----------------------------|---------------------| | `mysql_connect()` | `new PDO()` | `new mysqli()` | 支持 SSL 加密连接 | | `mysql_query()` | `PDO::query()` + `fetch()` | `mysqli::query()` | 自动过滤特殊字符 | | `mysql_fetch_array()` | `PDOStatement::fetch()` | `mysqli_result::fetch_assoc()` | 返回类型可控 | | `mysql_real_escape_string()` | 预处理语参数绑定 | `mysqli::real_escape_string()` | 彻底防止 SQL 注入 | ### 迁移注意事项 1. **错误处理**:PDO 默认静默失败,必须设置 `PDO::ERRMODE_EXCEPTION` 2. **字符集**:连接字符串中显式指定 `charset=utf8` 3. **预处理优势**:PDO 预处理支持命名参数(`:param`),MySQLi 使用位置参数(`?`) 4. **事务处理**: ```php // PDO 事务示例 $pdo->beginTransaction(); try { // 多个操作... $pdo->commit(); } catch (Exception $e) { $pdo->rollBack(); } ``` > **关键升级建议**:优先选择 PDO 以获得更好的跨数据库兼容性和更简洁的预处理语法[^1][^4]。 --- ### 相关问题 1. 如何在 PDO 中实现数据库连接池提升性能? 2. MySQLi 的多查询(`multi_query`)操作有哪些安全隐患? 3. PDO 的 `ATTR_EMULATE_PREPARES` 参数对安全有什么影响? 4. 如何实现 PDO 和 MySQLi 的数据库读写分离?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值