我有些困惑,并希望你们可以提供帮助。我正在编写一些简单的东西,它从发布的名称字段中获取值并返回它,检查事先看到它的字符串(正确)或整数(在这种情况下它会说'名称不是数字')
<?php
$number = array("1","2","3","4","5","6","7","8","9","0");
if(!isset($_POST['submit'])){
?>
<p>Enter your name</p>
<form method="post" action="action4.php">
<input type="text" name="name">
<input type="submit" name="submit">
</form>
<?php
}else{
$name = $_POST['name'];
foreach($number as $v){
$int = (int)$v;
}
if($name == $int){
print "This is a number and not a name.";
}else{
print $name;
}
}
?>
鉴于输入名称字段的每个数字都被视为字符串,我循环遍历数组并将每个数字转换为整数。然而,当在名称字段中输入一个整数时,不是得到“这是一个数字而不是一个名字”,而是获得$ name。相反,如果我输入一个字符串,我得到“这是一个数字,而不是一个名字。”
var_dumping if语句中的name和int都按预期返回:$ name as string,$ int as integer。那他们为什么比较真实呢?
答案 0 :(得分:0)
您必须使用===
来比较变量的类型和值。如果您使用==
php将在比较它们之前自动转换这两个值。
但要检查输入不是整数,应该足以用is_numeric
进行测试。
答案 1 :(得分:0)
因为除了在foreach
循环中分配变量之外什么都不做,$v
的最终值为0
。当PHP将字符串与整数进行比较时,它会将字符串转换为整数以进行比较(请参阅类型Juggling)。因此$name
变为0
。 0
等于0
所以你的if语句总是正确的。
要解决此问题,您需要比较变量类型和值(并在foreach
循环中进行比较)。这意味着使用===
比较运算符来比较类型和值,而不仅仅是==
所做的值。