我有以下情况:
<select name="n">
<option>Please fill</option>
<option value="0">0</option>
<option value="1">1</option>
</select>
现在,我使用Ajax传递序列化表单。我在控制台的POST面板中正确地看到了这一点:
[...]&n=0&[...]
我的php验证脚本会检查字段是否已填写,并且出于安全考虑,它是一个数字:
parse_str($_REQUEST['data'], $values);
if (!ctype_digit($values['n'])) {
array_push($err, 'n');
}
有人可以解释为什么如果我传递值0这个检查总是失败?如果我通过任何其他选择选项的数字不是0,它让我... 我也尝试使用is_numeric而不是ctype_digit(只是为了尝试),它也失败了。但这没有任何意义......因为0既是数字又是数字!
更新
如果我var_dump($values['n'])
,我知道它是空的......那么parse_str($_REQUEST['data'], $values)
是否有任何问题?
答案 0 :(得分:3)
0
和'0'
(作为整数和字符串)都被视为false
。因此!$values['n']
是true
。 ctype_digit
工作得很好。您可能想要检查!isset($values['n'])
而不是!$values['n']
。