在插入MySQL之前如何检查表中是否存在名称

bot*_*fix -4 php mysql sql mysqli

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

我尝试使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望输出为,如果区域名称存在,则打印输出“区域名称已存在”(如果未使用插入行)

Qir*_*rel 5

您可以稍微简化一下代码-最后一个选择语句是多余的,因为在查询之前您已经有了信息。您还应该使用准备好的语句,而不要使用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();
}
Run Code Online (Sandbox Code Playgroud)

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