PHP/MYSQL:INSERT INTO...WHERE NOT EXISTS执行结果的成功失败校验
如何校验「仅当不存在时插入」SQL的实际执行状态
嘿,这个问题我熟!你遇到的情况其实很常见——因为这类「存在则跳过/更新,不存在则插入」的SQL语句,只要语法没问题,数据库都会返回「执行成功」的状态,但这并不代表真的有新记录被插入。关键是要去获取受影响的行数来判断实际结果,下面分两种常用的PHP数据库扩展给你讲具体怎么做:
一、使用PDO扩展的情况
PDO执行语句后,可以通过rowCount()方法获取本次操作影响的行数:
- 返回
1:说明新记录成功插入 - 返回
0:说明记录已存在,没有插入新数据
示例代码:
// 初始化PDO连接 $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 你的「不存在则插入」SQL(这里用ON DUPLICATE KEY UPDATE举例,INSERT IGNORE同理) $sql = "INSERT INTO your_table (unique_col, other_col) VALUES (?, ?) ON DUPLICATE KEY UPDATE unique_col = unique_col"; // 预处理并执行 $stmt = $pdo->prepare($sql); $stmt->execute(['your_unique_value', 'other_value']); // 获取受影响行数并判断 $affectedRows = $stmt->rowCount(); if ($affectedRows > 0) { echo "Success:新记录已插入!"; } else { echo "提示:记录已存在,未插入新数据。"; }
二、使用mysqli扩展的情况
mysqli可以通过affected_rows属性(面向对象)或mysqli_affected_rows()函数(过程化)获取受影响行数,逻辑和PDO一致:
面向对象风格示例:
// 初始化mysqli连接 $mysqli = new mysqli('localhost', 'username', 'password', 'your_db'); if ($mysqli->connect_error) { die("连接失败: " . $mysqli->connect_error); } // 执行插入SQL $sql = "INSERT INTO your_table (unique_col, other_col) VALUES ('your_unique_value', 'other_value') ON DUPLICATE KEY UPDATE unique_col = unique_col"; $mysqli->query($sql); // 判断结果 if ($mysqli->affected_rows > 0) { echo "Success:新记录已插入!"; } else { echo "提示:记录已存在,未插入新数据。"; } $mysqli->close();
过程化风格示例:
$link = mysqli_connect('localhost', 'username', 'password', 'your_db'); if (!$link) { die("连接失败: " . mysqli_connect_error()); } $sql = "INSERT INTO your_table (unique_col, other_col) VALUES ('your_unique_value', 'other_value') ON DUPLICATE KEY UPDATE unique_col = unique_col"; mysqli_query($link, $sql); if (mysqli_affected_rows($link) > 0) { echo "Success:新记录已插入!"; } else { echo "提示:记录已存在,未插入新数据。"; } mysqli_close($link);
为什么之前一直返回「Success」?
因为你的SQL语句本身没有语法错误,数据库成功处理了请求(不管是插入了新行还是跳过了重复行),所以PHP的执行函数(比如execute()或query())都会返回true。你之前的判断只检查了语句是否执行成功,而没有区分「成功执行且插入了数据」和「成功执行但没插入数据」这两种情况。
内容的提问来源于stack exchange,提问作者Philipp M
相关产品推荐
相关产品推荐

