我想检查$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";
}}
我不想使用主键。
您有什么想法,我做错了什么或如何改进?`
答案 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参数,以尝试检索用户。