У меня есть требование генерировать уникальную строку 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 в качестве столбца?