1

我正在开发一个 PHP 脚本,我有一个这样的表:

TABLE_CODE
   code  varchar  8
   name  varchar  30

此代码列必须是使用从 A 到 Z 的随机字母和从 0 到 9 的字符的代码,并且必须是唯一的。全大写。就像是

A4RTX33Z

我已经创建了一种使用 PHP 生成此代码的方法。但这是一项繁重的任务,因为在继续之前我必须查询数据库以查看生成的代码是否唯一,并且表可能有很多记录。

因为我知道 mySQL 是一堆技巧,但现在还没有高级知识,所以我想知道是否可以在表中构建一些机制,以便每次在该表上创建新记录时运行脚本(或其他东西)用唯一值填充代码列。

谢谢


编辑:我想知道是否有一种方法可以即时创建代码,因为记录被添加到表中并且该代码是唯一的。

4

2 回答 2

1

更好地在 SQL 中生成这些代码。这是 8 个字符的随机“促销代码生成器”:

INSERT IGNORE INTO 
TABLE_CODE(name, code)
VALUES(
    UPPER(SUBSTRING(MD5(RAND()) FROM 1 FOR 8)), -- random 8 characters fixed length
    'your code name'
)

按照@JW 的建议添加字段,并UNIQUEcodePHP 中进行一些错误处理,因为有时生成的值可能不是UNIQUE,并且 MySQL 在这种情况下会引发错误。

于 2013-01-21T03:28:25.083 回答
1

在代码列上添加 UNIQUE 约束是您需要做的第一件事。然后,要插入代码,我会写一个像这样的小循环:

// INSERT IGNORE will not generate an error if the code already exists
// rather, the affected rows will be 0.
$stmt = $db->prepare('INSERT IGNORE INTO table_code (code, name) VALUES (?, ?)');
$name = 'whatever name';
do {
    $code = func_to_generate_code();
    $stmt->execute(array($code, $name));
} while (!$stmt->rowCount()); // repeat until at least one row affected

随着表的增长,循环次数可能会增加,因此如果您认为它应该只尝试 3 次,您可以将其添加为循环条件,如果发生这种情况则抛出错误。

顺便说一句,我建议使用事务来确保代码生成后是否发生错误,回滚将确保代码被删除(可以重用)。

于 2013-01-21T03:34:03.210 回答