如何最好地与PHP中的0进行比较?

时间:2009-05-18 00:44:36

标签: php mysql comparison

在我正在处理的一段代码中,我需要从数据库中提取一个值并检查它是否为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?

6 个答案:

答案 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';
}