为什么我的变量没有在php-mysqli for循环中更新


Why are my variables not updating in a php mysqli for-loop?

我试图将一个表(10k行以上)排序为两个单独的表,但似乎遇到了一个我无法解决的无意义错误。当我注释掉mysqli insert语句时,变量会正确地打印出来,并根据需要进行更新。即使在循环表中的所有值时,我也可以看到具有正确键和值的所有数据。

然而,当我添加insert语句并将其放在mysqli_query中时,我突然收到了大量的mysqli错误,说突然出现了重复的主键,但根据之前的测试,没有重复的主键。其他时候,它似乎只循环一次,然后停止(或者循环正确的次数,但每次都不做任何事情。我打印出了mysql语句,在尝试查询之前能够看到它们都是正确的,但在实际运行时仍然会引起问题。下面包含了完整的代码,但我无法弄清楚问题出在哪里。

$sql = "SELECT * FROM originalTable ORDER BY port LIMIT 20";
$result = mysqli_query($conn, $sql);
$num_Rows = mysqli_num_rows($result);
echo $num_Rows."<br/>";
// gets data for each row in the table
for($i=0; $i<$num_Rows; $i++){
    $row = mysqli_fetch_assoc($result);
    $ID = $row["ID"];
    echo $ID."<br/>";
    $IP = $row["IP"];
    echo $IP."<br/>";
    $port = $row["port"];
    echo $port."<br/>";
    $running = $row["running"];
    echo $running."<br/>";
    $afk = $row["afk"];
    echo $afk."<br/>";
    $gamemode = $row["gamemode"];
    echo $gamemode."<br/>";
    $maxplayers = $row["maxplayers"];
    echo $maxplayers."<br/>";
    $spawnprotection = $row["spawnprotection"];
    echo $spawnprotection."<br/>";
    $whitelist = $row["whitelist"];
    echo $whitelist."<br/>";
    $enablequery = $row["enablequery"];
    echo $enablequery."<br/>";
    $enablercon = $row["enablercon"];
    echo $enablercon."<br/>";
    $rconpassword = $row["rconpassword"];
    echo $rconpassword."<br/>";
    $motd = $row["motd"];
    echo $motd."<br/>";
    $announceachieve = $row["announceplayerachievements"];
    $allowflight = $row["allowflight"];
    $spawnanimals = $row["spawnanimals"];
    $spawnmobs = $row["spawnmobs"];
    $forcegamemode = $row["forcegamemode"];
    $hardcore = $row["hardcore"];
    $pvp = $row["pvp"];
    $difficulty = $row["difficulty"];
    $generatorsettings = $row["generatorsettings"];
    $levelname = $row["levelname"];
    $levelseed = $row["levelseed"];
    $leveltype = $row["leveltype"];
    $autosave = $row["autosave"];
    if($IP == $server1){
        $server = "server1table";
        $sql1 = "INSERT INTO server1table (id, ip, port, running, afk, gamemode, maxplayers, spawnprotection,
              whitelist, enablequery, enablercon, rconpassword, motd, announceplayerachievements,
              allowflight, spawnanimals, spawnmobs, forcegamemode, hardcore, pvp, difficulty,
              generatorsettings, levelname, levelseed, leveltype, autosave) VALUES ('$ID', '$IP',
              '$port', '$running', '$afk', '$gamemode', '$maxplayers', '$spawnprotection', '$whitelist',
              '$enablequery', '$enablercon', '$rconpassword', '$motd', '$announceachieve', '$allowflight', '$spawnanimals',
              '$spawnmobs', '$forcegamemode', '$hardcore', '$pvp', '$difficulty', '$generatorsettings', '$levelname',
              '$levelseed', '$leveltype', '$autosave')";
        echo $sql1;
        $result = mysqli_query($conn, $sql1);
        echo "Server 1<br/>";
        if($result){
            echo "Success?";
        }
        else{
            echo "Failure = " . $conn->error;
        }
    } else if ($IP == $Server2){
        $server = "server2table";
        $sql2 = "INSERT INTO server2table (id, ip, port, running, afk, gamemode, maxplayers, spawnprotection,
              whitelist, enablequery, enablercon, rconpassword, motd, announceplayerachievements,
              allowflight, spawnanimals, spawnmobs, forcegamemode, hardcore, pvp, difficulty,
              generatorsettings, levelname, levelseed, leveltype, autosave) VALUES ('$ID', '$IP',
              '$port', '$running', '$afk', '$gamemode', '$maxplayers', '$spawnprotection', '$whitelist',
              '$enablequery', '$enablercon', '$rconpassword', '$motd', '$announceachieve', '$allowflight', '$spawnanimals',
              '$spawnmobs', '$forcegamemode', '$hardcore', '$pvp', '$difficulty', '$generatorsettings', '$levelname',
              '$levelseed', '$leveltype', '$autosave')";
        echo $sql2;
        $result = mysqli_query($conn, $sql2);
        echo "Server 2<br/>";
        if($result){
            echo "Success?";
        }
        else{
            echo "Failure = " . $conn->error;
        }
    }

EDIT:上表中的ID不是表ID字段或主键。它代表玩家的ID。端口是表的主键

澄清:在该代码的一次迭代中,它将所有内容都发送到服务器1,没有任何问题,但它完全忽略了服务器2。此后,我测试并确保split(if语句)按预期工作,它打印正确的服务器名称,并将$sql设置为预期值(打印时)。它只会移动表的第一列,然后将其他所有内容设置为空,将ID设置为0,并发送一堆重复的主错误。

我认为不应该插入ID,这可能是您与表主键和auto_increment斗争的地方。只需从插件中删除id,就可以了。取决于您如何设置表结构。一般来说,您不需要保留ID,这只是为了唯一性和索引内务等。