我有一个代码,用于检查我的数据库以查看给定值是否唯一,如果是,则将其插入到数据库中。如果它不是唯一的,请重复该过程,直到找到唯一值。
do {
// Generate a new user ID (15 numbers) and check to make sure it doesn't already exist.
$new_user_id = mt_rand(1000000000, 9999999999);
// Generate a fake Login Email address and check to make sure it doesn't already exist.
$new_username = rand_str(13, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890');
$new_username_email = 'BP' . $new_username . '@web.com';
// Generate a new fake password
$new_password = rand_str(15, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()');
// Check to make sure the extremely random Username and user ID doesn't already exist in the database
// On the off chance that it does, we need to regenerate and try again.
$preparedStatement = $connection->prepare("SELECT user_id, username FROM `{$mysql_table}` WHERE user_id = :new_user_id OR username = :new_username");
$preparedStatement->execute(array(':new_user_id' => $new_user_id, ':new_username' => $new_username_email));
$result_2 = $preparedStatement->fetchAll();
//TODO Not sure if this is actually working if there is a duplicate entry
} while (!empty($result_2));
// Once it is unique, insert the values into the database
$preparedStatement = $connection->prepare(
"INSERT INTO `{$mysql_table}` (
open_id,
user_id,
username,
password
) VALUES (
:open_id_value,
:user_id_value,
:username_value,
:password_value
)");
if (!$preparedStatement->execute(array(
':open_id_value' => $_SESSION['user'],
':user_id_value' => $new_user_id,
':username_value' => $new_username_email,
':password_value' => $new_password
))) {
$arr = $preparedStatement->errorInfo();
die(print_r($arr));
} else {
// Send the new user to the account settings page, where they can set up their account information
$_SESSION['new_user'] = 1;
//echo 'You are a new user!';
header("Location: /account-settings/");
exit;
}
我得到的问题是mt_rand生成的值表明它是重复的。
Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '2147483647' for key 1 ) 1
首先,我不知道为什么我会从这段代码中得到重复错误 - 它有什么问题?其次,如果我有机会获得重复,它应该重新生成并再次尝试直到它起作用 - 但这显然不会发生。
任何线索?
答案 0 :(得分:3)
详细说明我的评论...你的脚本生成了一个随机数,大约80%的时间超过了int的最大值。您测试user_id是否已被执行的查询将返回false(mysql允许您在列的范围限制之外进行查询,它只是说没有该id的记录),但是插入查询将失败,因为数字将减少到最大INT大小。要解决此问题,请切换到BIGINT或限制随机范围。
答案 1 :(得分:0)
尝试将您的ID列更改为BIGINT与INT,因为您似乎正在尝试生成INT类型容量之上的随机数。这就是为什么它将它降低到2147483647,这是INT最大数字。
答案 2 :(得分:0)
限制mt_rand(1000000000,2147483647);
int
数据类型无法处理更多内容。
答案 3 :(得分:0)
使用auto_increment字段总是更好,因此只要用户 name 是唯一的,您就可以插入每条记录。您可以使用以下方式检索最后插入的记录的ID mysql_insert_id()如果你真的需要它。
如果你真的希望数字看起来是随机的,你可以使用一些枚举(比如xor或特定的位shuffle)来生成另一个数字,你可以随时计算回存储在数据库中的真实用户ID。 / p>