gpt4 book ai didi

php - mysql插入冲突

转载 作者:行者123 更新时间:2023-11-29 01:43:49 24 4
gpt4 key购买 nike

我有一个包含以下列的表格:[user_id][game_id]当两个玩家加入游戏时,我需要关闭游戏。我使用了这段代码:

if(mysql_num_rows(mysql_query("SELECT user_id FROM live_games WHERE game_id = '$gid'"))<2){
mysql_query("INSERT INTO live_games (user_id, game_id) VALUES ('$uid', '$gid')");
echo "You have joined the game";
}else{
echo "Table is full";
}

该代码将只允许两个玩家注册,但有时当网站上的用户太多时,这种情况将不起作用,并且三个用户将添加到表中。我该如何解决?

最佳答案

您有几个选择:

  1. 如果使用 InnoDB 存储引擎,请使用 SELECT ... FOR UPDATE 执行锁定读取在与 INSERT 相同的交易中声明。

    使用 PDO:

    $dbh = new PDO("mysql:dbname=$dbname;charset=utf8", $username, $password);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $dbh->beginTransaction();
    $qry = $dbh->prepare('
    SELECT COUNT(*) FOR UPDATE FROM live_games WHERE game_id = ?
    ');
    $qry->execute([$gid]);

    if ($qry->fetchColumn() < 2) {
    $qry = $dbh->prepare('
    INSERT INTO live_games (user_id, game_id) VALUES (?, ?)
    ');
    $qry->execute([$uid, $gid]);
    if ($qry->rowCount() && $dbh->commit()) echo 'You have joined the game';
    } else {
    $dbh->rollBack();
    echo 'Table is full';
    }
  2. 更改表结构,使有两列,player1player2 (最初 NULL )并执行 UPDATE live_games SET player2 = ? WHERE game_id = ? AND player2 IS NULL ,然后检查受影响的行数;或者

  3. 修改表结构,增加一个playerNumber列,然后创建一个复合 UNQUE指数超过(game_id, playerNumber) .

关于php - mysql插入冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12447999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com