如何在插入 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->insert_id
属性中获取.
谢谢你的朋友,你是最好的,希望我能给一个帖子分数,但我的声誉仍然很低,非常感谢 Qirel,我刚刚实现了它,它工作得很好以上是关于如何在插入 MySQL 之前检查表中是不是存在名称 [重复]的主要内容,如果未能解决你的问题,请参考以下文章