【发布时间】:2018-09-01 20:58:34
【问题描述】:
如果用户存在,我可以先检查数据库,如果不存在,则使用插入语句。代码目前只执行 select 语句。
<?php
include_once('includes/dbconn.php');
if (isset($_POST['submitted'])) {
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$user = $_POST['user'];
$pass = $_POST['pass'];
$query_check_user = "SELECT username FROM Users WHERE username = '$user'";
$query = "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')";
if (mysqli_query($dbconn, $query_check_user)) {
echo "user already exists";
mysqli_close($dbconn);
}else{
mysqli_query($dbconn, $query);
}
}
?>
【问题讨论】:
-
mysqli_query仅在失败时返回false,而不仅仅是因为它返回一个空集。 -
请同时查看准备好的语句(您的查询容易被 SQL 注入)。
-
检查
SELECT是否存在记录是不好的,因为它不是准确的信息。当您完成检查时,另一个进程可以插入该记录,您最终可以得到 2 条相同的记录。为了解决这个问题,我们使用unique约束,我们只需插入,如果数据库报告duplicate key error,那么我们就知道存在一条记录。 -
@Flocke 这不是“它会发生”的情况,而是创建一个没有像这样的漏洞的系统的情况。它可能不会在今天、明天、6 个月后发生。如果它发生在2年内怎么办?然而,有趣的是,创建一个唯一的约束让我们更容易,因为我们必须输入方式,更少的代码。它是防弹的,永远。关于软删除,您始终可以从
(username, is_deleted)或散列(username, is_deleted)创建唯一约束并将其保存为唯一约束。