【发布时间】:2015-02-21 22:21:23
【问题描述】:
我正在尝试在执行 INSERT 语句之前检查 MySQL 中的现有条目。如果用户输入数据库中已有的名称(字段设置为唯一),则应提示他们重新输入名称。
我遇到的问题是,如果新条目与任何形式的记录匹配,则会显示错误消息并且不会发生 INSERT。
例如,如果用户输入 DUMMY_NEW 并且有一条 DUMMY_OLD 记录,即使 DUMMY_NEW 在表中不存在,他们也无法添加该记录。
我已经搜索并尝试了其他答案,但似乎无法让它发挥作用。
为了清楚起见,删除了无关位的代码:
//Create connection to database using mysqli
$conn = new mysqli($dbhost, $dbuser, $dbpass, $db);
//Set variables according to user input on previous form
$Server_Name = $_POST['Server_Name'];
//Check for duplicate server name - if exists inform user else run INSERT ($stmt)
$checkdup = "SELECT * FROM dcr_table WHERE SERVER_NAME = '".$Server_Name."'";
$dupresult = $conn->query($checkdup);
if($dupresult = 1)
{
print "<br>Error! <p></p>";
echo "" . $Server_Name . " already exists in the DCR";
print "<p></p>Please check the Server Name and try again";
}
else {
//Define the INSERT statement
$stmt = "INSERT INTO dcr_master (Server_Name, Description,..., ... , ... )";
//Execute the INSERT statement
$conn->query($stmt);
//Success and return new id
echo "<br><p></p>Record Added!<p></p>";
echo "New id: " . mysqli_insert_id($conn);
//Drop the connection
$conn->close();
};
编辑: 我知道注入漏洞。 MySQL 帐户只有表的 SELECT、INSERT 和 UPDATE 权限。最终用户必须提供密码,否则提交将失败。这是目前用户访问受限的小型应用程序。 MySQL 转义字符串将在当前问题解决后实现。
编辑 2: 使用 Hobo Sapiens 方法确实可以报告现有条目,但仍会向表中添加新(空)行。记录 ID 仍然自动递增,所以我得到的是 id#300 - 记录,id#301 - 空白,id#302 - 记录。这是 INSERT 语句中 IGNORE 的结果吗?
【问题讨论】:
-
$dupresult = 1是赋值,而不是比较。您可能还想检查$conn->num_results($dupresult) > 0或类似的东西。$dupresult永远不会等于 1,因为它是 MySQLi 资源。除此之外(以及巨大的 SQL 注入),您的逻辑似乎还不错。 -
另外,$dupresult 必须是某种资源,它只是意味着查询成功了......哦,天哪,这段代码完全是垃圾,你必须彻底检查它。
-
@Halcyon 此处的代码存在缺陷,因为它引入了可能的竞争条件。这不是在 MySQl 环境中测试唯一性的方法。唯一列应该这样标记(OP 说是这样),
INSERT使用IGNORE执行,结果在affected_rows中检查