Это условие всегда верно:
if ($user_security == 0 OR 1)
Потому что 1
всегда является «истинным» значением. Не думайте о булевых выражениях с точки зрения того, как вы можете произносить их вслух, всегда думайте о них с точки зрения отдельных выражений. В этом случае у вас есть два выражения: $user_security == 0
, которое условно истинно или ложно в зависимости от переменной; и 1
, что всегда верно.
Вы, вероятно, хотите это вместо:
if ($user_security == 0 OR $user_security == 1)
Что ж, вы не прояснили все вопросы, которые я задал в моем комментарии, но я предполагаю, что вам нужна функция, которая может принимать строку из «возможных» символов и длину строка для возврата. Тщательно прокомментировано, как и требовалось, с использованием большего количества переменных, чем я обычно, для ясности:
function get_random_string($valid_chars, $length)
{
// start with an empty random string
$random_string = "";
// count the number of chars in the valid chars string so we know how many choices we have
$num_valid_chars = strlen($valid_chars);
// repeat the steps until we've created a string of the right length
for ($i = 0; $i < $length; $i++)
{
// pick a random number from 1 up to the number of valid chars
$random_pick = mt_rand(1, $num_valid_chars);
// take the random character out of the string of valid chars
// subtract 1 from $random_pick because strings are indexed starting at 0, and we started picking at 1
$random_char = $valid_chars[$random_pick-1];
// add the randomly-chosen char onto the end of our string so far
$random_string .= $random_char;
}
// return our finished random string
return $random_string;
}
Чтобы вызвать эту функцию с данными вашего примера, вы должны назвать ее примерно так:
$original_string = 'abcdefghi';
$random_string = get_random_string($original_string, 6);
Обратите внимание, что эта функция не проверяет уникальность в ему переданы действительные символы. Например, если вы вызвали его с допустимой строкой символов 'AAAB'
, было бы в три раза больше шансов выбрать A для каждой буквы в качестве B. Это можно было бы считать ошибкой или функцией. , в зависимости от ваших потребностей.
Попробуйте это
Достаточно простой!
function RandomFromCharset($charset,$length)
{
$characters = $charset; // your existing charset / defined string
$charactersLength = strlen($characters);
$random_from_charset = '';
for ($i = 0; $i < $length; $i++)
{
$random_from_charset.= $characters[rand(0, $charactersLength - 1)];
}
return random_from_charset;
}
Вызывают функцию следующим образом
RandomFromCharset($charset,$length);
, где $length будет длиной случайной строки, Вы хотите (это может быть предопределено также в функции как RandomFromCharset(charset,$length=10)
) генерировать и , $charset будет Вашей существующей строкой, которой Вы хотите ограничить символы.
вы можете создать массив символов, а затем использовать rand (), чтобы выбрать букву из массива и добавить ее в строку.
$letters = array( [0] => 'a' [1] => 'b' [2] => 'c' [3] => 'd' ... [25] = 'z');
$lengthOfString = 10;
$str = '';
while( $lengthOfString-- )
{
$str .= $letters[rand(0,25)];
}
echo $str;
* обратите внимание, что это позволяет повторять символы
Хотите создать пароль путем случайной перестановки исходных букв? Должен ли он содержать только уникальные символы?
Используйте rand
для выбора случайных букв по индексу.
function generate_random_string($name_length = 8) {
$alpha_numeric = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
return substr(str_shuffle(str_repeat($alpha_numeric, $name_length)), 0, $name_length);
}
Обновлен код в соответствии с замечательным предложением mzhang в комментариях ниже.
Объединение символов в конце должно быть более эффективным, чем повторное объединение строк.
Правка №1: Добавлено возможность избежать повторения символов.
Правка №2: Выдает исключение, чтобы избежать бесконечного цикла, если выбрано $ norepeat и $ len больше, чем кодировка для выбора.
Редактировать №3: Использует ключи массива для хранения выбранных случайных символов, когда $ norepeat выбран, так как поиск ключа ассоциативного массива выполняется быстрее, чем линейный поиск в массиве.
function rand_str($len, $norepeat = true)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$max = strlen($chars) - 1;
if ($norepeat && len > $max + 1) {
throw new Exception("Non repetitive random string can't be longer than charset");
}
$rand_chars = array();
while ($len) {
$picked = $chars[mt_rand(0, $max)];
if ($norepeat) {
if (!array_key_exists($picked, $rand_chars)) {
$rand_chars[$picked] = true;
$len--;
}
}
else {
$rand_chars[] = $picked;
$len--;
}
}
return implode('', $norepeat ? array_keys($rand_chars) : $rand_chars);
}
Если вы хотите разрешить повторение символов, вы можете использовать эту функцию:
function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
{
$str = '';
$count = strlen($charset);
while ($length--) {
$str .= $charset[mt_rand(0, $count-1)];
}
return $str;
}
Базовый алгоритм состоит в генерации < length > раз случайного числа от 0 и < количество символов > - 1 мы используем в качестве индекса для выбора символа из нашего набора и объединения этих символов. Границы 0 и < количество символов > - 1 представляют границы строки $ charset
, поскольку первый символ адресуется с помощью $ charset [0]
и последний с $ charset [count ($ charset) - 1]
.