如何检查条目是否已经存在?

时间:2020-01-16 16:55:20

标签: php sql

我想检查$steamprofile['steamid']是否已经存在,以防止出现多个条目。

SteamID64看起来像:76561197968052866,并存储在bigint(64)中。

到目前为止,这就是我的代码:

$db = mysqli_connect($servername,$username,$password,$dbname) or die ("could not connect to database");
$user_check_steamid = "SELECT * FROM Users WHERE SteamID64";
$result = mysqli_query($db, $user_check_steamid);
$user = mysqli_fetch_assoc($result);

if($user) {
    if($user['SteamID64'] === $steamprofile['steamid']){
    //Update username
    //code don't exists right now
    echo "update username";
    } else {
    //Create new account in database
    //$sql = "INSERT INTO Users (SteamID64, Username) VALUES ('" . $steamprofile['steamid'] . "', '" . $steamprofile['personaname'] . "')";
    //if ($db->query($sql) === TRUE) { }
    echo "creating user";
    }}

我不想使用主键。

您有什么想法,我做错了什么或如何改进?`

2 个答案:

答案 0 :(得分:1)

永远不要仅依赖SELECT查询的输出来避免插入重复项。在多用户系统中,在SELECT运行到随后的INSERT运行之间,可能会在数据库中插入另一个进程,即使SELECT以前找不到一个,也会创建一个重复项。

唯一地防止重复的 方法是通过UNIQUE constraint。您可以将SELECT用作方便的前提条件,但仍然需要在所讨论的字段上创建UNIQUE约束,然后验证INSERT实际上是否成功。

虽然只能创建一个主键,但是可以创建任意数量的唯一约束。

答案 1 :(得分:-2)

您的查询有误:

"SELECT * FROM Users WHERE SteamID64"

应该是

"SELECT * FROM Users WHERE SteamID64 = :searchedtext"
$query->bindParam(':searchedtext', $steamprofile['steamid']);

然后将php变量绑定到查询中使用的mysqli参数,以尝试检索用户。

相关问题