it-blog.club
88 не тоже самое что 88 и 88 тоже самое что 88 в PHP

88 не тоже самое что 88 и 88 тоже самое что 88 в PHP

Многие знают, по крайней мере должны знать, что 88 и '88' это совершенно разные типы значений, и выходит, что наше приложение может совершенно по разному отреагировать например при сложении таких значений. Ну вот вам обычный пример на JS.


var intOne = 1;
var intTwo = '1';
var sum = intOne + intTwo;
alert(sum);

При исполнении данного скрипта у нас получится: 11. Так как произошло сложение строк. Данный пример можно описать ещё вот так: var sum = 'a' + 'b'; В итоге sum у нас получится ab. Произошло это по той причине, что вторую единицы мы заключили в кавычки и сделав это значение строкой.

Но это всё самые азы и все мы должны это знать и так. Как вы поняли речь сейчас должна пойти про PHP и если вы хоть как то знакомы с данным языком программирования, то должны знать, что он не имеет жёсткой типизации отсюда следует, что 88 и '88' по сути одно и тоже и одновременно нет. 88 - число и '88' - строка.

Вот пример который хорошо покажет как работает жёсткое сравнение в PHP


//Сравнение 1
$a = 1;
$b = '1';
if ($a == $b) {
echo 'Этот текст появится на экране!';
}
//Сравнение 2
if ($a === $b) {
echo 'А вот этот текст вы не увидите!';
}
//Сравнение 3
if ($a !== $b) {
echo 'Эти слова отобразятся на странице!';
}

Данный пример отлично показывает, что жёсткое сравнение переменных (===) проверяет не только их значение, но и тип.

Возможно многим покажется, что данная статья не имеет смысла. Но вот например на днях, мне в работу пришла срочная правка. Сайт разрабатывался не нашей компанией и пришлось "покавыряться" в чужом коде чтобы понять в чём заключается проблема.

Разумеется всю историю я вам рассказывать не буду, только то, что была проблема с формой авторизации, которая работала как по email так и по телефону. Мы получали телефон, проверяли его и отправляли смс пользователю. Если мы получали email, то искали пользователя в БД, доставали его телефон и отправляли смс.

Вот как раз на этапе проверки телефона бывший разработчик и допустил ошибку. Он сначала проверял телефон и только потом, при помощи filter_var() проверял email. Хотя можно было сначала проверить переменную на содержание адреса электронной почты, а только потом делать манипуляции по проверки переменной на номер телефона. Ну не суть.

Проблема была в том, что реально зарегистрированный пользователь, вводил свой email получал ошибку об отправке смс. Вот немного скрипта обработчика, может вы сами даже поймёте в чём проблема:


$userPhone = preg_replace('/\s|\+|-|\(|\)/', '', $_POST['AUTH_LOGIN']);
if (strlen($userPhone) >= 10) {
//отправляем смс и т.д.
}
//Далее проверка на email и т.д.

Т.е. мы убираем лишние символы из переменной и проверяем длину строки. Но если я введу admin@it-blog.club, то, убрав лишние символы, я так же пройду проверку длинны и то что я ввел будет отправлено в смс сервис.

Есть много способов для решения подобной проблемы, но я скажу только о двух.

  1. Сначала проверить email. В условие if поставить filter_var($_POST['AUTH_LOGIN'], FILTER_VALIDATE_EMAIL) и только если проверка не пройдена проверять на содержание переменной номера телефона
  2. Второй способ НУЖНО СКОМБИНИРОВАТЬ с первым. Потому что если мы не пройдём проверку на email, но опять же может пройти прошлую проверку номера по причине того, что введём например "qqqqqqqqqqq", в таком случае проверка удастся. Но! Если мы к условию проверки длинны добавим проверку на число, то всё пройдёт как надо.

Да сейчас речь пойдёт о переменной is_numeric() Её суть в том, что она проверяет переменную на содержание числа. Т.е. значения она будет видеть следующим образом:

123 - Число
'123' - Число
e123 - Число
'e123' - Число
'qwe123ewq' - Не число.

Почему нужно использовать is_numberic()

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

Так что пример выше может выглядеть следующим образом:


$userPhone = preg_replace('/\s|\+|-|\(|\)/', '', $_POST['AUTH_LOGIN']);
if (strlen($userPhone) >= 10 && is_numberic($userPhone)) {
//отправляем смс и т.д.
}
//Далее проверка на email и т.д.

Собственно всё!


it-blog.club 277
Автор: Ярослав Хмель


Если Вам понравилась статья, то можете поддержать блог переведя N сумму на кофе авторам или оплату хостинга!
В любом случае спасибо! А так же не забывайте про группу в ВК
ПОИСК ПО САЙТУ
Поддержать