Перейти к содержимому

Реферальная программа Мегаплана


Как проверить переменные на тип

#1 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1
0

Отправлено 30 Декабрь 2010 - 09:46

Решил попрактиковаться в РНР, заскучал уже =) Пишу по книге и своими силами магазинчик.

Из форм передаю количество заказанных единиц каждого товара. Хочу проверить введины ли цифры. Знаю что есть переменная is_numeric() но она для одной переменной, мне бы как-то записать все переменные в одну функцию.

Вышел из ситуации вот в такой способ
$tovar = array($pokr, $maslo, $svechi);
for ($i=1;$i<3;$i++) { // count($tovar) не работает, почему?
if (is_numeric($tovar[$i])) {
$flag=true;
} else {
$flag=false;
echo '<p>Вы неправильно заполнили форму';
break;
}
}


но все-таки надеюсь что есть функция is_numeric() на подобе isset()

 

 

  • 0

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 30 Декабрь 2010 - 12:20

Если надо проверить числовой ли тип к нам пришел, то правильно делаешь - функцией is_numeric() и проверяем: если то, что пришло будет числом (или числовой строкой), то подходит такое, а иначе - до свидания ;)
Функция count() работает, просто ты начинаешь счет не с первого элемента, а со второго ($i = 1), поэтому первый элемент массива и не проверяется. Так правильнее будет:
$tovar = array($pokr, $maslo, $svechi);
for ($i=0;$i<count($tovar);$i++) { // count($tovar) так проверим все элементы массива
if (is_numeric($tovar[$i])) {
$flag=true;
} else {
$flag=false;
exit('<p>Вы неправильно заполнили форму');
}
}

  • 0


#3 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 30 Декабрь 2010 - 12:23

Banderas

Как проверить переменные на тип, если их много

И какой вы хотите получить результат, если, например, покрышки ввели цифрой "12", а свечи фразой "нафих не надо"? ;)
Если переменных много, то и результатов проверки будет столько же.
И еще мне кажется, что в данном случае правильнее просто не разрешать вводить в соответствующее поле формы ничего кроме цифровых символов (0-9) или же сделать поле с селектом из цифровых вариантов.

count($tovar) не работает, почему?

Прекрасно работает, только следует иметь ввиду, что
если массив определен как $tovar = array($pokr, $maslo, $svechi);
то элементы массива будут нумероваться с 0 до 2, а count($tovar) вернет 3.
  • 0

#4 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 30 Декабрь 2010 - 14:05

а не проще через intval() пропустить, заодно и обезопасишь вводимые данные ;)
$numer = intval($_POST['numer']);

ну а если это массив, то думаю тебе не надо объяснять как его перебрать.

опят-таки надо понимать задачу целиком, для чего тебе эта проверка нужна? !!!

а до кучи есть еще settype() ;)

count($tovar) так проверим все элементы массива

нет так ты узнаешь количество элементов в массиве.

for ($i=0;$i<count($tovar);$i++)

а вот этот цикл позволит перебрать все элементы массива.

count($tovar) не работает, почему?


а кто про отладку забыл, распечатай на экран содержимое массива, определены ли у тебя переменные
$pokr, $maslo, $svechi, если нет, то массив будет пустой следовательно count() будет равняться 0 и цикл не будет работать.

надо так:
$tovar = array($pokr=>1, $maslo=>'text', $svechi=>12);

  • 0

#5 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 30 Декабрь 2010 - 14:24

count($tovar) так проверим все элементы массива
нет так ты узнаешь количество элементов в массиве.

А я и не знал что делает функция count() ;) Смотрим внимательно мой пост и пост ТС. Комментарий я написал именно так, чтобы ТС понял в чем его ошибка - в том, что перебор идет не с первого элемента (не выдираем кусок цитаты, а цитируем всю строку ;) ) ;)
А по поводу обезопасить данные... думаю, функция intval() здесь ни к чему, данные ведь передаются методом POST (не GET) и ТС их никуда не заносит (во всяком случае, об этом речи нет). Здесь просто надо проверить тип полученных данных, а НЕ ПРИВЕСТИ их к целочисленному значению, что и сделает предложенная функция.
  • 0


#6 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 30 Декабрь 2010 - 14:32

данные ведь передаются методом POST (не GET) и ТС их никуда не заносит (во всяком случае, об этом речи нет).

как все запущено, можно ломать ваши самописные скрипты ;)

любые данные преступаемые из вне надо проверять и обрабатывать!!!

а чтоб понять где ошибка надо помнить об отладке
и писать грамотные комментарии к своим скриптам
  • 0

#7 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 30 Декабрь 2010 - 14:38

как все запущено, можно ломать ваши самописные скрипты smile.gif

Аналогичная реплика от меня.

любые данные преступаемые из вне надо проверять и обрабатывать!!!

А я с этим и не спорю... только любые данные, с которыми мы затем работаем.
1) Функцией is_numeric() мы как раз и проверяем поступившие данные.
2) Если данные соответствуют ожидаемому типу - ок, можем перейти к п.3, если это требуется, иначе мы с ними абсолютно ничего не делаем.
3) Если понадобится с ними что-то делать в дальнейшем, то мы их обработаем соответственно.
  • 0


#8 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 30 Декабрь 2010 - 14:43

так можно, а насколько оптимально, столько телодвижений!
опять же повторю вопрос, для чего нужна такая проверка?

сравни 2 конструкции дающей один и тот же результат, а еще загони в цикл.

// 1 вариант
$test = "text";
$test = intval ($test);
echo $test;
// 2 вариант
$test = "text";
$test = is_numeric ($test) ? intval ($test) : 0;
echo $test;


единственное я не понимаю зачем такая проверка нужна, объясните!
  • 0

#9 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 30 Декабрь 2010 - 14:52

опять же повторю вопрос, для чего нужна такая проверка?

Это уже вопрос к ТС. Задача стояла простая - проверить является ли полученное числом.
  • 0


#10 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 30 Декабрь 2010 - 15:08

ого, раздули тему))) Спасибо всем за советы. Пожалуй я обязан ответить на вопрос "зачем мне такая проверка?". Мне нужно проверить данные из формы (method=POST). Данные должны быть числом. Есть 3 поля для заполнения (type="text"). Если хотябы в одно поле введено типа "sdf2" то скрипт должен показывать сообщение об ошибке, если все верно - показывается информация о заказе.

Это все я делаю для себя, код нерациональный и даже немного извращенный. Но я вспоминаю по чуть-чуть, так что не пинайте...))
Кому интересно, вот весь код
<?php
define('pPrice', 100);
define('mPrice', 10);
define('sPrice', 4);
define('pdv', 0.2);

$pokr = $_POST['pokr-ki'];
$maslo = $_POST['maslo'];
$svechi = $_POST['svechi'];
$find = $_POST['howfind'];

$tovar = array($pokr, $maslo, $svechi);
for ($i=0;$i<count($tovar);$i++) {
if (is_numeric($tovar[$i])) {
$flag=true;
} else {
$flag=false;
echo '<p>Вы неправильно заполнили форму';
break;
}
}
if ($flag) {
$totalPrice = $pokr*pPrice+$maslo*mPrice+$svechi*sPrice;
if ($totalPrice == 0) {
echo "Вы ничего не заказали";
} else {
echo "<p>Заказ обработан в " . date("H:i:s A jS F Y");
echo "<p>покришки: $pokr на сумму " . $pokr*pPrice . "$";
echo "<br>масло: $maslo на сумму " . $maslo*mPrice . "$";
echo "<br>свечи: $svechi на сумму " . $svechi*sPrice . "$ <p>";
echo "Всего, учитывая ПДВ: $" . number_format($totalPrice*(1+pdv), 2) . "<br>";

switch($find)
{
case '01' : echo 'Поисковик'; break;
case '02' : echo 'Друг'; break;
case '03' : echo 'Каталоги'; break;
case '04' : echo 'Случайно'; break;
}
}
}

echo <<<theEnd
<form action="orderform.php" method=GET>
<input type=submit value="Страница заказа">
</form>
theEnd
?>

  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru