PHP中的布尔问题

时间:2010-04-20 14:28:35

标签: php mysql

我在php中有关于bools的问题。我有一个存储的mysql proc,它返回一个布尔值。当在php端获取此值时,它将值显示为0或1.这对我来说似乎都很好,我在php手册中读到php会在编译时将0或1解释为false或true但是这似乎不是我的情况。我更进了一步,用(bool)输出了我的返回值,但这似乎仍然不起作用。

由于这个原因,我的if语句没有正确触发。有谁知道发生了什么?谢谢您的帮助。

4 个答案:

答案 0 :(得分:4)

MySQL没有正确的BOOLBOOLEAN数据类型。它们被声明为TINYINT(1)的同义词。您的过程将返回0或1,在非PHP的基础上将转换为PHP域中的字符串,因此在PHP中您有字符串'0''1'

然而,布尔强制转换不会将它们转换为适当的布尔值,这很奇怪。您的代码中可能还有其他一些错误。

您是否尝试从查询中转换直接结果?因为那个可能是一个数组而且:

var_dump((bool) array('0')); // true

也许这是你的问题。检查返回的结果。

答案 1 :(得分:1)

听起来布尔值是作为字符串返回的。

尝试这样的事情:

$your_bool = $field_value === "0" ? false : true;

答案 2 :(得分:1)

使用以下脚本。 (您必须在左引号内的单词“Boolean”之前添加HTML换行符,以使输出看起来像我的样本;当我这样做时,Firefox会解释它们,使格式看起来很奇怪)。

你会看到第二行产生一个空值,MySQL认为它与0或1不同;对于TINYINT,它正确存储PHP的真值,但PHP的值没有,因为空值对TINYINT没有意义。

第四行显示带有(int)的类型转换是一种确保将PHP true和false都存储到MySQL TINYINT Boolean字段的方法。将结果整数从MySQL检索到PHP变量是有效的,因为当分配给PHP布尔变量时,整数被隐式转换。

echo "Boolean true=".true;
echo "Boolean false=".false;
echo "Boolean (int)true=".(int)true;
echo "Boolean (int)false=".(int)false;

以下是PHP 5.1.1 for MySQL 5.1.41的输出:

Boolean true=1
Boolean false=
Boolean (int)true=1
Boolean (int)false=0

哦! PHP布尔文字可以全部小写或大写,结果相同......自己尝试一下。

答案 3 :(得分:0)

我使用了一个有用的函数“to_bool”来表示我不确定的类型:

function to_bool($value, $default = false)
{
    if (is_bool($value)) {
        return $value;
    }
    if (!is_scalar($value)) {
        return $default;
    }
    $value = strtolower($value);
    if (strpos(";1;t;y;yes;on;enabled;true;", ";$value;") !== false) {
        return true;
    }
    if (strpos(";0;f;n;no;off;disabled;false;null;;", ";$value;") !== false) {
        return false;
    }
    return $default;
}

然后:

if (to_bool($row['result'])) { ... }