@tvoyadres

Почему то strpos работает не правильно?

PHP 7.3

$user_ip = 94301750;
if ( strpos('1334268210|3322954437', $user_ip) !== false ) {
echo 'Yes';
}

Почему оно срабатывает ни понимаю, ведь так не должно быть.
  • Вопрос задан
  • 3593 просмотра
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Коротко - не передавайте в strpos число (int), a передавайте строку (sting) и проблем не будет

Разврёнуто
Читаем документацию https://www.php.net/strpos

needle
Если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведен к строке, либо должен быть выполнен явный вызов chr().


Если прогнать ваш код то видим ошибку
Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in /in/2JE4h on line 4


Чтобы код отрабатывал как ожидается, $user_ip должен иметь тип string

так
$user_ip = (string)94301750;
или так
$user_ip = '94301750';

В противном же случае вместо "94301750" в strpos уходит результат chr(94301750) что есть строка "6"
и получается в итоге strpos('1334268210|3322954437', '6') отсюда и результат Yes
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kimono
@kimono
Web developer
https://www.php.net/manual/ru/function.strpos.php:
Если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведен к строке, либо должен быть выполнен явный вызов chr().


$user_ip = "94301750";
if ( strpos('1334268210|3322954437', $user_ip) !== false ) {
    echo 'Yes';
}
// ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы