MAX ID计数仅每隔一次有效

时间:2018-11-16 09:27:29

标签: php mysqli

问题: 我想从数据库中获取最大的“ SID”并添加一个。我通过我通过HTTP Post方法提交的表单来处理输入。我从数据库中获取当前的MAX“ SID”,然后将值放入HTML输入字段并添加一个。由于某种原因,它每隔一段时间就会起作用。所以我得到的输出是:

  1. 尝试= 1
  2. 尝试= 1
  3. 尝试= 2
  4. 尝试= 2

,依此类推。如果有人能指出我正确的方向,那就太好了。

PHP获得MAX(ID):

    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "soccer";

    $conn = mysqli_connect($servername, $username, $password, $dbname);

    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }
    echo "Connected successfully";

    $sql = "SELECT MAX(SID) FROM spieler";
    $result = mysqli_query($conn, $sql);

    if(mysqli_num_rows($result) > 0)
    {
        while($row = mysqli_fetch_assoc($result))
        {
            $lastID = $row["MAX(SID)"];
        }
    }

    mysqli_close($conn);

PHP插入数据库中

        $servername = "localhost";
        $username = "root";
        $password = "";
        $dbname = "soccer";

        $conn = mysqli_connect($servername, $username, $password, $dbname);

        if (!$conn) {
            die("Connection failed: " . mysqli_connect_error());
        }
        echo "Connected successfully";

        ?><br><?php

        $sql = "INSERT INTO spieler VALUES ('$sid', '$name', '$verein', 
        '$position', '$einsaetze', '$startelf', '$tore',
        '$torschuesse', '$eigentore', '$vorlagen', '$elfmeter', 
        '$verwandelt', '$gegentore', '$gelb',
        '$rot', '$fouls', '$zweikampf', '$pass', '$note')";

        if(mysqli_query($conn, $sql)){
            echo "Success";
        }else{
            echo "Failed" . mysqli_error($conn);
        }

        mysqli_close($conn);

HTML和PHP输入字段:

 <tr>
     <td><input id="SID" name="SID" readonly value="<?php echo $lastID += 1; 
     ?>"></td>
 </tr>

页面的屏幕截图:

Screenshot 在“ Spieler ID:”段落中放置“ SID”,以便每次页面加载时,下一个空闲ID都会自动加载到输入字段中。

1 个答案:

答案 0 :(得分:1)

  

我想从数据库中获取MAX“ SID”并添加一个

不。你不知道你真的,真的不是。

这是the XY Problem.

您可以通过运行系统范围的锁和自主事务来做到这一点。将最后分配的值(或下一个)作为状态变量保留在表中比轮询分配的值更安全,更有效。但是,这仍然忽略了以下事实:您将尽力将规则分配给替代标识符,因此不包含任何有意义的数据。它还极大地限制了容量,并带来了意外和故意拒绝服务的重大风险。

为使错误进一步复杂化,MySQL提供了一种机制,可以使用auto-increment ids来避免所有此类麻烦

虽然有人可能会争辩说它们不是可移植的,所以追求另一种解决方案可能是有好处的,但显然这里并不适用,因为您的代码没有来自底层DBMS的其他抽象。