如何检查是否已将元值分配给任何用户?

时间:2021-01-22 作者:RealJohnDoe

在我的网站上,我自动生成一个8位数的随机数$rndnr 通过wp_rand() 并将其另存为用户元。

如何检查此号码是否已分配给任何用户?

我真的处理好了$result 从数据库读取值:

$result = $wpdb->get_var("SELECT meta_value from $wpdb->usermeta where meta_key=\'user_reference_id\' AND meta_value = \'$rndnr\'");
if(empty($result))
 return true;
但我不确定这段代码是否真的能识别重复的?

你会怎么做?

非常感谢。

1 个回复
最合适的回答,由SO网友:Paul G. 整理而成

这里有一种方法可以实现这一点。如果你有大量的用户,这是有问题的,但可以及时调整。


do {
    // 1. generate your unique random number
    $result = rand();

    // 2. check it is really unique
    $is_unique = count( get_users( array(
            \'meta_key\'   => \'user_reference_id\',
            \'meta_value\' => $result,
        ) ) ) === 0;

} while ( !$is_unique );

// 3. Store user meta $result
update_user_meta( $user_id, \'user_reference_id\', $result );
假设:

我用过rand() 但坦率地说,您应该使用UUID之类的东西,这样您就不需要这样的循环来检查您的数字是否唯一。但我提供了这种方法,因为它可能会以您当前设计的方式解决您的问题编辑:

您原来的问题一直在更改,因此我将此编辑保留为最后一次更改。

根据您的评论,我将提供代码,以便您每次使用UUID时都可以创建一个唯一的ID。UUID确保代码在设计上是唯一的,而不是通过循环来确保自定义随机代码是唯一的。

简单地说:

// 1. Generate the random ID
$rndnr = wp_generate_uuid4();

// 2. Store the ID
update_user_meta( $user_id, \'user_reference_id\', $rndnr );

// 3. Get the user meta key in the future, simply:
get_user_meta( $user_id, \'user_reference_id\' );

假设:

WordPress至少是4.7版。在您原来的问题中,您没有说明您使用的是8位代码。不知道为什么选择8,但如果您更新系统以使用UUID,则可以解决唯一性问题。

我也在使用update_user_metaget_user_meta - 现在还不清楚,当这些助手函数可用时,为什么要使用MySQL select语句。