如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

Posted

技术标签:

【中文标题】如何在插入 MySQL 之前检查表中是不是存在名称 [重复]【英文标题】:How do I check if name exists in table before inserting into MySQL [duplicate]如何在插入 MySQL 之前检查表中是否存在名称 [重复] 【发布时间】:2019-07-24 07:30:05 【问题描述】:

我正在添加一个新区域,我想检查用户插入的名称是否已存在于区域表中。

我尝试使用 select 来检查数据,但是当我将包含插入的 if 语句嵌套在 while 循环内时,什么也没有发生,没有错误,也没有输出。

$campus_area_name = mysqli_real_escape_string($conn, $_POST["campus_area_fk"]);
$area_name = mysqli_real_escape_string($conn, $_POST["area_name"]);

$query_names = "SELECT name FROM areas WHERE idCampus = '".$campus_area_name."'";
$name_result = mysqli_query($conn, $query_names);
while ($row = mysqli_fetch_array($name_result)) 
    if($row["name"] == $area_name)
        echo "Area Name Already Exists";
     else 
        $query = "INSERT INTO areas(name, idCampus) VALUES ('".$area_name."', '".$campus_area_name."')";
        if (mysqli_query($conn, $query))
            $last_id = $conn->insert_id;
            $query_retrieve = "SELECT idareas, name FROM areas WHERE idareas = '".$last_id."'";
            $my_result = mysqli_query($conn, $query_retrieve);

            while ($rows = mysqli_fetch_array($my_result)) 
               $output["area_name_retrieve"] = $rows["name"];
               $output["area_id_retrieve"] = $rows["idareas"];
            
             echo json_encode($output);
         else 
            echo "failed" .  mysqli_error($conn);
        
    

我希望输出是,如果区域名称存在打印出“区域名称已经存在”,如果它没有使用插入行

【问题讨论】:

为什么不只有一条sql语句***.com/questions/1361340/…? 【参考方案1】:

您可以稍微简化您的代码 - 最后一个选择语句是多余的,因为您在查询之前已经有了信息。您还应该使用准备好的语句而不是使用real_escape_string()

<?php 

$stmt = $conn->prepare("SELECT name FROM areas WHERE idCampus = ?");
$stmt->bind_param("s", $_POST["campus_area_fk"]);
$stmt->execute();
$exists = $stmt->fetch();
$stmt->close();

if ($exists)
    echo "Area name already exists";
 else 
    $stmt = $conn->prepare("INSERT INTO areas (name, idCampus) VALUES (?, ?)");
    $stmt->bind_param("ss", $_POST["area_name"], $_POST["campus_area_fk"]);
    $stmt->execute();

    echo json_encode(['area_name_retrieve' => $_POST["area_name"], 'area_id_retrieve' => $stmt->insert_id]);
    $stmt->close();

请注意,这可能会导致竞争条件 - 您应该将名称作为唯一约束,并尝试在不先执行任何选择查询的情况下插入它。然后检查您返回的错误代码,看看它是否存在。

【讨论】:

感谢您的回答,这将对我有所帮助,尤其是准备好的陈述。但我不明白为什么你说第二个选择是多余的,因为它们有不同的条件,最后一个只是根据最后一个插入查看区域。但是第一个条件是基于e Campus表的外键 您的最后一个 SELECT 获取您刚刚插入的行 - 但您已经拥有该数据,因为您刚刚插入它 - 您只需要新生成的 ID,您可以从 $stmt-&gt;insert_id 属性中获取. 谢谢你的朋友,你是最好的,希望我能给一个帖子分数,但我的声誉仍然很低,非常感谢 Qirel,我刚刚实现了它,它工作得很好

以上是关于如何在插入 MySQL 之前检查表中是不是存在名称 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Mysql表中是不是存在记录[重复]

如何在将大量数据插入数据库之前检查记录是不是存在?

Mysql,检查行是不是存在,如果它确实获取值,如果不插入

mysql 数据库插入之前判断数据是不是存在

实体框架:在插入新记录之前检查记录是不是存在

在尝试在 MySQL 中创建存储过程之前,如何检查它是不是存在?