在我正在处理的一段代码中,我需要从数据库中提取一个值并检查它是否为0
。最初,我把它写成:
if ($myVal == 0) { ...
但是当我今天再次看到它时,我意识到了一个错误:
var_dump("foo" == 0); // bool(true)
// and while we're here...
var_dump(intval("foo")); // int(0)
由于此值来自数据库,通常表示它将是一个字符串,所以我想我可以这样做:
if ($myVal === "0")
但似乎反直觉,因为我实际上想要处理一个整数,这似乎表明我们正在使用字符串。 (我希望这对你有意义。)此外,在给定字段类型的情况下,任何给定的DB访问器都会将值转换为适当的类型也不应出乎意料。
当它可以是字符串或int时,您使用什么方法来检查值0?
答案 0 :(得分:20)
简短版本:
if ("$myVal" === '0')
或
if (strval($myVal) === '0')
长版:
if ($myVal === 0 || $myVal === '0')
答案 1 :(得分:2)
我目前最好的是:
is_numeric($myVal) && $myVal == 0
答案 2 :(得分:1)
如果从数据库返回的值是字符串,但原始数据类型是整数,那么您可能希望DAO(数据访问对象,或其他任何拉动数据的东西)将内容转换为您期望的数据类型。这样,查看值的PHP代码就会查看它所期望的数据类型。
当然,问题在于数据库定义的数据类型与PHP定义的数据类型之间没有1-1对应关系。但是,在大多数情况下这不是问题,因为我们通常使用的大多数类型都有相同的类型:int,float,bool,string。
结果是,在查询数据库的位置和检查这些值的位置之间,应该将这些值强制转换为您期望的数据类型。我刚刚在包含int(10)和varchar(50)的MySQL表上使用mysql_fetch_object()进行了测试;两个字段总是被PHP作为类型“字符串”拉入。因此,如果您希望将其中一个字段视为int,则在对其执行任何操作之前将其强制转换为int。例如:
$rs = mysql_query("SELECT * FROM table");
while ($row = mysql_fetch_object($rs)) {
$RealRow->id = (int)$row->id;
$RealRow->name = $row->name;
// etc.
}
// ... later ...
if ($RealRow->status == 0) {
// do something
}
查询和RealRow的东西应该在一个类/方法中,这样它就被封装了;这样,从table
获取数据的代码的任何部分将始终获得$ RealRow对象,这将使所有内容都设置为正确的数据类型。当然,如果您更改数据类型,则需要手动编辑DAO来处理转换;也可以查询DB以获取每个字段的类型(使用“SHOW COLUMNS FROM table”),并且自动将字段转换为正确的数据类型。
答案 3 :(得分:1)
我认为你应该使用
if ($myVal == 0)
我认为不必担心$ myVal是否为“foo”。你已经说过,这个价值只会是一个数字。
换句话说,如果您遇到$ myVal为“foo”,则错误不是“foo”== 0,错误是$ myVal是“foo”,而它应该是一个数字。< / p>
答案 4 :(得分:0)
尝试使用intval()将字符串转换为int
if( intval($myVal) == 0 )
答案 5 :(得分:0)
if( ('integer' === gettype($is_anonymous) && $is_anonymous === 0 )
||
('string' === gettype($is_anonymous) && $is_anonymous === '0')
) {
echo 'matches';
}