我在php中有关于bools的问题。我有一个存储的mysql proc,它返回一个布尔值。当在php端获取此值时,它将值显示为0或1.这对我来说似乎都很好,我在php手册中读到php会在编译时将0或1解释为false或true但是这似乎不是我的情况。我更进了一步,用(bool)输出了我的返回值,但这似乎仍然不起作用。
由于这个原因,我的if语句没有正确触发。有谁知道发生了什么?谢谢您的帮助。
答案 0 :(得分:4)
MySQL没有正确的BOOL
或BOOLEAN
数据类型。它们被声明为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'])) { ... }