Генерация случайной строки Alphanumeri c при регистрации учетной записи пользователя - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть требование генерировать уникальную строку alphanumeri c для каждого пользователя, когда он регистрируется на нашем сайте Wordpress.

Я добавил следующий код в функции моей дочерней темы. php file и он работает нормально - он хранит 10-символьную строку как "token_id" в таблице "usermeta".

function generate_token_id($length = 10) {
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $result = '';
    for ($i = 0; $i < $length; ++$i) {
        $result .= $characters[mt_rand(0, strlen($characters) - 1)];
        }
    return $result;
}

add_action('user_register', 'save_token_id', 10, 2);

function save_token_id($user_id) {
    $meta_key = "token_id";
    $key = generate_token_id();
    update_user_meta($user_id, $meta_key, $key);
}

Проблема, с которой я столкнулся, заключается в том, что вторая функция не проверяет, присутствует ли уже созданная строка в базе данных, и потенциально может привести к дублированию.

Я обновил функцию, добавив do / while l oop ниже для проверки, однако это действительно расширяет мои знания, и мне просто нужно немного опытных глаза, чтобы сказать мне, если я правильно выполнил процедуру do / while / sql.

function generate_token_id($length = 10) {
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $result = '';
    for ($i = 0; $i < $length; ++$i) {
        $result .= $characters[mt_rand(0, strlen($characters) - 1)];
        }
    return $result;
}

add_action('user_register', 'save_token_id', 10, 2);

function save_token_id($user_id) {
    $meta_key = "token_id";
    do {
        $key = generate_token_id();
        $keycheck = $wpdb->get_results("select count(*) from `usermeta` where `meta_value` like '"$key"'");
    } while ($keycheck > 0);
    update_user_meta($user_id, $meta_key, $key);
}

ОБНОВЛЕНИЕ: Итак, я объявил "global $ wpdb;" внутри функции, и я изменил синтаксис SQL, поэтому теперь он выглядит так:

function save_token_id($user_id) {
    global $wpdb;
    $meta_key = "token_id";
    do {
        $key = generate_token_id();
        $keycheck = $wpdb->get_results("select count(*) from $wpdb->usermeta where meta_value = " . $key);
    } while ($keycheck > 0);
    update_user_meta($user_id, $meta_key, $key);
}

Однако в журнале PHP DEBUG полно SQL ошибок.

WordPress database error: [Unknown column '74TTW1PIPP' in 'where clause']
select count(*) from wp_usermeta where meta_value = 74TTW1PIPP

WordPress database error: [Unknown column 'CST10WY8EQ' in 'where clause']
select count(*) from wp_usermeta where meta_value = CST10WY8EQ

WordPress database error: [Unknown column 'M3GSGAHD5J' in 'where clause']
select count(*) from wp_usermeta where meta_value = M3GSGAHD5J

Я проверил запрос SQL в phpMyAdmin, однако я не могу получить его правильно в функции PHP. Столбец meta_value четко объявлен, почему он использует переменную $ key в качестве столбца?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Я не думаю, поэтому вам нужно дополнительно проверить наличие сгенерированного дублированного ключа в базе данных, если вы используете любую функцию, которая может генерировать криптографически безопасную хешированную строку. Например, вы можете рассмотреть следующую функцию, передав свой $user_id функции, чтобы получить уникальный хешированный ключ.

<?php
/**
 * Generate cryptographically secure hashed string
 *
 * @param int|string $user_id
 * @param int $length
 * @param string $hash Any cryptographically secure hash
 * For example: 'gost-crypto', 'whirlpool', 'ripemd128' and for more
 * checkout https://www.php.net/manual/en/function.hash-algos.php
 *
 * @param int $iterations The number of internal iterations to perform for the derivation
 * @return string
 */
function generate_unique_id($user_id, $length = 20, $hash = 'ripemd128', $iterations = 10000) {
    // Generate a random IV
    if (version_compare(PHP_VERSION, '7.0.0', '<')) {
        $salt = openssl_random_pseudo_bytes(16);
    } else {
        $salt = random_bytes(16);
    }

    return hash_pbkdf2($hash, $user_id, $salt, $iterations, $length);
}

// Assuming 1 is the user ID
echo generate_unique_id(1);
0 голосов
/ 07 февраля 2020

Вместо $ wpdb-> get_results использование $ wpdb-> get_var ()

 $keycheck = $wpdb->get_var("select count(*) from `usermeta` where `meta_value` like '"$key"'");
}
...