2010-07-21 3 views
2

У меня была проблема с куском кода, который я только что разработал, и я сузил его до числа 0, которое не принимается.Число 0 не передается через

Это HTML

<input type="text" size="1" name="hs" maxlength='3'> 

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

После того, как я прошел через это, это код PHP обработки ошибок

$field = "hs"; 
    if((!$hs) || strlen($hs = trim($hs)) == 0) 
    { 
     $form->setError($field, "* Home score not entered"); 

    } 

    $field = "as"; 
    if((!$as) || strlen($as = trim($as)) == 0) 
    { 
     $form->setError($field, "* Away score not entered"); 

    } 

Я получаю эти ошибки, если я введу счет в 0. Любые идеи, почему это происходит? Это что-то из вас испытало?

БЛАГОДАРЯ

+0

Не следует 0 быть строкой? – Martin

+0

@Martin: PHP не беспокоится об этом, он пытается сделать бросок, и в этом случае он будет работать нормально. –

ответ

4

PHP интерпретирует как текстовую строку '0 ', так и номер 0 как false. Неявное преобразование типов иногда удобно и иногда раздражает. (То, что вы получаете от формы, это строка '0').

Try что-то вроде

if (strlen($hs = trim($hs)) == 0) { 
    $form->setError($field, "* Home score not entered"); 
} elseif (!is_numeric($hs)) { 
    $form->setError($field, "* Score must be a number"); 
} 
+0

Это код, который я принял, и он отлично работает, спасибо. – sark9012

+0

Я все еще умоляю вас избежать register_globals! :) – cgp

5

!0 истинна в PHP, поэтому первый if пункт выполняется.

+1

(В качестве фактического решения попробуйте использовать 'empty ($ hs)' вместо '! $ Hs'.) – Amber

+2

@Amber:« 0 »считается пустым' empty() '. – BoltClock

+0

Никогда не знал этого, но я предположил, что для вас это было очевидно, ребята, о которых я не знал. Спасибо, плохо попробуйте пусто – sark9012

0

Как уже говорилось, значение 0 интерпретируется как ложь. (так что выражение! 0 истинно)

Эй, вы не используете register_globals.

Что вы должны делать, это isset($_GET['hs']) и получить значение переменной, используя $ _GET ['hs'].

Using register_globals is a HUGE security liability.

0
if(! isset($hs) || ! is_numeric($hs) || $hs < 0) { 
    //error 
} 

лично я не знаю, почему вы хотите сделать STRLEN на него, конечно же некоторых $ == вс «» был бы достаточно?

0

Я бы предложил просто сбросить! $ Hs. Ваш strlen ($ hs) должен быть достаточным для того, что вы пытаетесь проверить. Единственное, что я могу добавить, это сделать user $ hs isset, чтобы вы не получили неопределенную ошибку.

Смежные вопросы