php查询学号no是否存在,如何在PHP中生成学生证学号?怎么避免使用goto函数?

如何在PHP中生成学生证学号?怎么避免使用goto函数?

问题描述:

我想生成一个唯一的学生证学号。我想要的格式是年份的最后两位数字,再加上5位数字。例如:2000001、2000002、2000003 等。

以下是我的php代码:$pre = substr(strval(date("Y")),2);

$num = 1;

include "dbh.inc.php";

$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

}

}

}

}

我觉是上面代码需要改进:

1.使用goto,我不想用这个函数.

2.每次代码开始,绑定,执行等在每个循环中查询数据库带来很大的性能开销,显然很慢。

是否有更好的方法呢?

回答:

1.可以在MySQL端生成新的学生证ID。include "dbh.inc.php";

$sql =

"SELECT CONCAT("

. "DATE_FORMAT(CURDATE(), '%y'), "

. "LPAD(COALESCE(MAX(RIGHT(id, 5)) + 1, 1), 5, '0')"

. ") AS new_id "

. "FROM students";

$result = $conn->query($sql);

if ($result) {

if ($row = $result->fetch_assoc()) {

// insert student here using $row['new_id']

}

}

2.使用触发器,在插入数据时创建触发器。DELIMITER //

CREATE TRIGGER students_tr_bi BEFORE INSERT ON students

FOR EACH ROW

BEGIN

SET NEW.id = (

SELECT CONCAT(

DATE_FORMAT(CURDATE(), '%y'),

LPAD(COALESCE(MAX(RIGHT(id, 5)) + 1, 1), 5, '0')

) FROM students

);

END//

DELIMITER ;

-- Usage:

INSERT INTO students (name) VALUES ('John');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值