Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проверка переменной!


Автор: Source 2.1.2009, 23:46
Здравствуйте!

Помогите чайнику!

На примере простого, ниже следующего кода... Мне нужно проверить переменную $age на целочисленность, и на непустоту. А переменную $name на строковую и тоже на непустую...

Мне почему-то кажеться что пустота это !empty(), а строковость это is_string(). Только я незнаю как все это использовать вместе с is_numeric() в одном операторе if(is_numeric($age)).

Код

$name = $_POST['name'];
$age = $_POST['age'];

if(is_numeric($age))
{
    if($age > 13)
    {
        printf("$name Добро пожаловать! Ваш возраст $age, мы надеемся что это правда!" );
    }
        else 
        {
            printf("$name извините, но вы младше 13 лет. До свидания!" );
        }
}
else 
{
    printf("Ошибка");
}

Автор: Satana 3.1.2009, 00:06
ну сделай вот так вот:
Код

$name = $_POST['name'];
$age = $_POST['age'];
if (((is_numeric($age)) and (!empty($age)) and (!empty($name)) and (is_string($name)))
{
    if($age > 13)
    {
        printf("$name Добро пожаловать! Ваш возраст $age, мы надеемся что это правда!" );
    }
        else 
        {
            printf("$name извините, но вы младше 13 лет. До свидания!" );
        }
}
else 
{
    printf("Ошибка");
}

Автор: Source 3.1.2009, 00:15
Цитата(Satana @ 3.1.2009,  00:06)
ну сделай вот так вот:
Код

$name = $_POST['name'];
$age = $_POST['age'];
if (((is_numeric($age)) and (!empty($age)) and (!empty($name)) and (is_string($name)))
{
    if($age > 13)
    {
        printf("$name Добро пожаловать! Ваш возраст $age, мы надеемся что это правда!" );
    }
        else 
        {
            printf("$name извините, но вы младше 13 лет. До свидания!" );
        }
}
else 
{
    printf("Ошибка");
}

Satana, спасибо!

Но тут что-то не то...

в if (((is_numeric($age)) and (!empty($age)) and (!empty($name)) and (is_string($name))) после if должно быть две скобки. И (is_string($name)) нига не проверяет $name на строковость. :(

ЗЫ. Но теперь буду уметь пользоваться and! smile
 


Автор: theworldcreator 3.1.2009, 00:17
Данные переданные через POST, насколько я знаю, не бывают нестроковыми. Для чего вы проверяете имя, чтобы безопасно записать в БД? Или чтобы можно было вывести не боясь XSS? Или просто так? Советую имя проверить регулярным выражением, чтобы в нем были только английские и русские буквы, а с возрастом поступить так:
Код

$age = (int)$_POST['age'];
if($age > 13){
     //делайте что вам надо
}

Регулярка примерна такая выйдет:
Код

/^[a-zа-я]+$/i


Добавлено через 14 минут и 21 секунду
Код

$name = $_POST['name'];
$age = (int)$_POST['age'];
if(preg_match('/^[a-zа-я]+$/i', $name)){
     if($age > 13){
            echo($name."Добро пожаловать! Ваш возраст ".$age.", мы надеемся что это правда!");
     }else{
            echo($name."извините, но вы младше 14 лет. До свидания!";
     }       
}else{
     echo "Ошибка!";
}


Добавлено через 14 минут и 31 секунду
Написал "младше 14 лет", а не 13, так как у вас было условие что пришедшие должны быть старше тринадцати, и не старше или ровно тринадцать.

Автор: Source 3.1.2009, 00:36
Цитата(theworldcreator @ 3.1.2009,  00:17)
Данные переданные через POST, насколько я знаю, не бывают нестроковыми. Для чего вы проверяете имя, чтобы безопасно записать в БД? Или чтобы можно было вывести не боясь XSS? Или просто так? Советую имя проверить регулярным выражением, чтобы в нем были только английские и русские буквы, а с возрастом поступить так:
Код

$age = (int)$_POST['age'];
if($age > 13){
     //делайте что вам надо
}

Регулярка примерна такая выйдет:
Код

/^[a-zа-я]+$/i


Добавлено @ 00:32
Код

$name = $_POST['name'];
$age = (int)$_POST['age'];
if(preg_match('/^[a-zа-я]+$/i', $name)){
     if($age > 13){
            echo($name."Добро пожаловать! Ваш возраст ".$age.", мы надеемся что это правда!");
     }else{
            echo($name."извините, но вы младше 14 лет. До свидания!";
     }       
}else{
     echo "Ошибка!";
}


Добавлено @ 00:32
Написал "младше 14 лет", а не 13, так как у вас было условие что пришедшие должны быть старше тринадцати, и не старше или ровно тринадцать.

Я просто так...  smile 

Скажите, а чем отличается
Код

$age = (int)$_POST['age'];
 

от условия

Код

 (is_numeric($age))



О. Пордон. Я понял различие $age = (int)$_POST['age'] и (is_numeric($age))! Целочисленность.

Автор: theworldcreator 3.1.2009, 00:49
Цитата(Source @ 3.1.2009,  00:36)
Скажите, а чем отличается
Код

$age = (int)$_POST['age'];
 

от условия

Код

 (is_numeric($age))

Приводит переменную к стандартному десятеричному виду, в отличие от простой проверки численности. Например строка
Код

"+0123.45e6"

при использование is_numeric просто пройдет проверку, а при приведение к типу int станет числом 123. Да и ИМХО хранить числа как числа правильней чем хранить их как строки(заставляя процессор каждый раз приводить его к типу int при использование его в данном ключе).

Добавлено через 1 минуту и 22 секунды
P.S. Если нужна дробная часть приводите к типу float

Автор: Source 3.1.2009, 01:14
Цитата(theworldcreator @ 3.1.2009,  00:49)
Цитата(Source @ 3.1.2009,  00:36)
Скажите, а чем отличается
Код

$age = (int)$_POST['age'];
 

от условия

Код

 (is_numeric($age))

Приводит переменную к стандартному десятеричному виду, в отличие от простой проверки численности. Например строка
Код

"+0123.45e6"

при использование is_numeric просто пройдет проверку, а при приведение к типу int станет числом 123. Да и ИМХО хранить числа как числа правильней чем хранить их как строки(заставляя процессор каждый раз приводить его к типу int при использование его в данном ключе).

Добавлено @ 00:51
P.S. Если нужна дробная часть приводите к типу float


Понял, спасибо! 

Касательно вашего кода:
Код

$name = $_POST['name'];
$age = (int)$_POST['age'];
if(preg_match('/^[a-zа-я]+$/i', $name)){
     if($age > 13){
            echo($name."Добро пожаловать! Ваш возраст ".$age.", мы надеемся что это правда!");
     }else{
            echo($name."извините, но вы младше 14 лет. До свидания!";
     }       
}else{
     echo "Ошибка!";
}


В if(preg_match('/^[a-zа-я]+$/i', $name)) надо было оставить (!empty($age)). (!empty($name)) Естественно не нужно. 

Во всем разобрался, спасибо!

ЗЫ. if($age > 13) исправил на if($age >= 13) !


Автор: theworldcreator 3.1.2009, 01:48
Если $_POST['age'] пусто, то после приведения к int оно становиться равно числу ноль. Ноль не больше или равен 13, так что !empty($age) оставлять - избыточно.

Автор: Source 3.1.2009, 01:54
Цитата(theworldcreator @ 3.1.2009,  01:48)
Если $_POST['age'] пусто, то после приведения к int оно становиться равно числу ноль. Ноль не больше или равен 13, так что !empty($age) оставлять - избыточно.

Да, но без !empty($age) если в поле age я ничего не ввожу у меня не выскакивает echo "Ошибка!";, а мне нужно чтобы юзер заполнял и name и age!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)