如何在PHP中生成学生ID?如何避免跳槽?

如何在PHP中生成学生ID?如何避免跳槽?,php,mysqli,Php,Mysqli,我想生成一个唯一的学生ID。我想要的格式是当前年份的最后两位数加上之后的5位数。例如:2000001、2000002、2000003。。等这是我现在的代码摘录 $pre = substr(strval(date("Y")),2); $num = 1; include "dbh.inc.php"; // this file merely creates the $conn variable that connects to mysql database. $

我想生成一个唯一的学生ID。我想要的格式是当前年份的最后两位数加上之后的5位数。例如:2000001、2000002、2000003。。等这是我现在的代码摘录

$pre = substr(strval(date("Y")),2);
$num = 1;
include "dbh.inc.php"; // this file merely creates the $conn variable that connects to mysql database.
$sql_cmd = "SELECT id FROM students WHERE id=?;";
$stmt = $conn->stmt_init();
if ($stmt) {
    $prepare = $stmt->prepare($sql_cmd);
    if ($prepare) {
        bind:
        $studentid = $pre . str_repeat('0', (4 - strlen($num)) ) . strval($num);
        $bind = $stmt->bind_param('s', $studentid);
        if ($bind) {
            $result = $stmt->execute();
            if ($result) {
                $num++;
                goto bind;
            }
            else {
                // insert student here using $studentid
            }
        }
    }
}
但我需要改进这一点,因为:

它使用goto我想避免它 每次准备、绑定、执行等并在每次循环中查询数据库,似乎有些过分。 这显然很慢。
如果有更好的方法,请告诉我。

您可以在MySQL端生成新id:

包括dbh.inc.php;//此文件仅创建连接到mysql数据库的$conn变量。 $sql= 选择CONCAT . 日期\u FORMATCURDATE,“%y”, . LPADCalesceMaxRightId,5+1,1,5,'0' . 作为新身份证 . 来自学生; $result=$conn->query$sql; 如果$result{ 如果$row=$result->fetch\u assoc{ //使用$row['new_id']在此处插入学生 } } 或者另一个选项是在插入时创建触发器:

分隔符// 在插入学生之前创建触发学生\u tr\u bi 每行 开始 SET NEW.id= 选择CONCAT 日期\u FORMATCURDATE,“%y”, LPADCalesceMaxRightId,5+1,1,5,'0' 来自学生 ; 结束// 定界符; -用法: 在学生姓名中插入“John”值;
好主意您可能应该为OP添加更多关于如何创建初始ID的详细信息。它是自动递增的吗?在这种情况下,标识符不是自动递增的。它可以通过具有类似查询的触发器生成。这只是一个问题,但这会有冲突的风险吗?如果两个或多个用户同时点击此脚本,它是否会返回相同的MAXid编号,从而为所有用户生成相同的下一个id?@Waterlomatt,在插入此脚本时触发。id仍然是主键。@user14717238 tq。我需要先研究你的答案。我对mysql不是很在行。。我假设对于触发器,我只是将它们括在引号中,从CREATE trigger开始,到END结束,然后分配给一个变量?5个数字每年最多只能给您99999行。您确定要将自己限制在这一范围内吗?您可以使用普通的自动递增字段,只需使用触发器添加前缀20、21、22等。每年的学生人数并不多。前两位数将始终更改为当前年份。所以这不是一个问题。如果我使用AI,我如何用零填充它?使用LPAD填充0。@Omatt您给我的链接提供了另一个选项。干杯