#php #captcha
#php #captcha
Вопрос:
for ($i = 1; $i <= $numITER; $i ) {
$val = rand(2,36);
switch (TRUE) {
case ($val<=10):
$vercodeTEMP.=$val;
break;
case ($val>10):
if ($val != 25 amp;amp; $val != 19) {
$vercodeTEMP.=chr(54 $val);
} else {
$i=$i-1;
}
break;
}
}
Я в основном пытаюсь избежать 0, 1 и букв O и I. Как это может дать мне нули, когда диапазон rand равен от 2 до 36?
Комментарии:
1. Вы уверены, что rand-функция действительно выдает вам нули? Возможно ли, что они поступают откуда-то еще? Или, если вы смотрите на готовую строку vercodeTEMP, могут ли это быть числа 10, 20 и 30, которые дают вам нули в строке?
2. Бооооо за
switch
злоупотребление. Используйтеif
инструкцию, для этого она и была разработана…
Ответ №1:
Если $ val == 10, то вы добавите $ val к $vercodeTEMP.
Попробуйте:
for ($i = 1; $i <= $numITER; $i ) {
$val = rand(2,36);
if ($val<10) {
$vercodeTEMP.=$val;
} else if ($val != 25 amp;amp; $val != 19) {
$vercodeTEMP.=chr(54 $val);
} else {
$i=$i-1;
}
}
Ответ №2:
Я в основном пытаюсь избежать 0, 1 и букв O и I
Как насчет того, чтобы не возиться с магическими числами (кроме позиции) и использовать PHP range()
?
$numbers = range(2, 9);
$letters = range('a', 'z');
unset($letters[8], $letters[14]);
$letters = array_merge($letters, array_map('strtoupper', $letters));
$pool = array_merge($numbers, $letters);
shuffle($pool);
$captcha = join(array_slice($pool, 0, $numITER)); // e.g. 2ESQcnMTNy
Комментарии:
1. Довольно классное решение, но, учитывая, что я только вчера вечером изучал php, я собираюсь придерживаться чего-то, что немного больше напоминает C , к которому я привык, а не использовать что-то, что напоминает решение на основе библиотеки.