You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP新增操作代码中检查数据库是否存在同名操作?

实现新增操作前检查同名的方法

你的代码目前存在两个问题:一是没做同名校验,二是直接拼接POST参数存在SQL注入风险,下面给你两种可靠的实现方式:

方法一:先查询再插入(应用层校验)

先查询数据库中是否已存在同名的operationname,确认不存在后再执行插入操作,同时改用预处理语句规避注入风险:

<?php
include('db_conn.php');

// 接收并过滤参数
$operationname = trim($_POST['operationname']);
$cost = trim($_POST['cost']);

// 1. 检查是否存在同名记录
$checkSql = "SELECT COUNT(*) FROM operation WHERE operationname = ?";
$stmt = mysqli_prepare($con, $checkSql);
mysqli_stmt_bind_param($stmt, "s", $operationname);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $count);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

if ($count > 0) {
    echo json_encode(['status' => 'failed', 'msg' => '该操作名称已存在']);
    exit;
}

// 2. 不存在则执行插入
$sql = "INSERT INTO operation(operationname,cost) VALUES(?, ?)";
$stmt = mysqli_prepare($con, $sql);
// 第二个参数"sd":s表示字符串类型,d表示数值类型(若cost是字符串则改为"ss")
mysqli_stmt_bind_param($stmt, "sd", $operationname, $cost);
$query = mysqli_stmt_execute($stmt);

if ($query) {
    echo json_encode(['status' => 'success']);
} else {
    echo json_encode(['status' => 'failed', 'msg' => '插入失败']);
}

mysqli_stmt_close($stmt);
mysqli_close($con);
?>

方法二:数据库层面加唯一约束+捕获错误(更可靠)

给operation表的operationname字段添加唯一约束,让数据库自动拦截重复插入,代码中只需捕获对应的错误即可,同样使用预处理语句:

第一步:给字段添加唯一约束

执行SQL修改表结构:

ALTER TABLE operation ADD UNIQUE INDEX idx_operationname (operationname);

第二步:修改PHP代码捕获重复错误

<?php
include('db_conn.php');

$operationname = trim($_POST['operationname']);
$cost = trim($_POST['cost']);

$sql = "INSERT INTO operation(operationname,cost) VALUES(?, ?)";
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, "sd", $operationname, $cost);
$query = mysqli_stmt_execute($stmt);

if ($query) {
    echo json_encode(['status' => 'success']);
} else {
    // 捕获MySQL唯一约束冲突错误(错误码1062)
    if (mysqli_errno($con) == 1062) {
        echo json_encode(['status' => 'failed', 'msg' => '该操作名称已存在']);
    } else {
        echo json_encode(['status' => 'failed', 'msg' => '插入失败: ' . mysqli_error($con)]);
    }
}

mysqli_stmt_close($stmt);
mysqli_close($con);
?>

注意事项

  • 优先选方法二,数据库层面的约束能避免高并发场景下的重复插入问题(比如两个请求同时检查都没查到,随后同时插入),方法一在这种场景下可能出现漏判。
  • 绝对不要直接将用户输入拼接到SQL语句中,必须用预处理语句防止SQL注入攻击。

内容的提问来源于stack exchange,提问作者FJV26

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:20:28