【问题标题】:Boolean from MySQL to PHP - Conversion to tinyint and comparing从 MySQL 到 PHP 的布尔值 - 转换为 tinyint 并进行比较
【发布时间】:2018-12-13 14:58:15
【问题描述】:

我的数据库有多个布尔值。保存数据库后,布尔值转换为 tinyint(1)。我认为这是因为它只需要保存 1 或 0。

但是,我现在在比较 PHP 中的值时遇到了问题。我将 tinyint 保存到一个数组中,没有进行任何代码转换。该数组有多个文本和日期条目以及多个布尔值条目,例如:

array[0] is '09:45:00'
array[1] is '10:45:00'
array[2] is 1
array[3] is 0
array[4] is 0
array[5] is 1
array[6] is 'active'

现在,如果我循环遍历数组,我想检查该值是时间、文本还是真/假。

检查条目是否为真将始终返回真,因为没有条目是空的。检查条目是 1 还是 0 适用于布尔值,但是当我检查 'active' == 0 时它返回 true。为什么会这样?如果我将字符串与 tinyint 进行比较,我怎么能得到错误?

与 === 比较在任何情况下都不起作用。

【问题讨论】:

  • 1 == true0 == false,使用=== 是直接检查(所以它必须匹配类型等),使用== 会为你工作
  • 不幸的是,如果我检查 'active' == 0,它也会返回 true
  • 你做错了。日期类型是数据库设计的一部分,而不是您应该从查询结果中推断出来的东西。无论类型如何,所有列都可能包含 null,因此在这种情况下总是会崩溃
  • @apokryfos 所以我应该保存 1 并允许 NULL,而不是保存 1 或 0?我试试,谢谢!
  • 这绝对不是我说的。我说如果你有一个 NULL 你不能知道那个字段是否是一个日期,通常是字符串的数量,所以你应该知道你的字段是什么数据类型,而不是在查询后尝试推断它们

标签: php mysql mysqli boolean


【解决方案1】:

我认为你可以使用一些嵌套的 if-else 语句来做到这一点。但我很确定也有更好看的解决方案。 :)

$a=array('09:45:00','10:45:00',1,0,0,1,'active',3.12);

foreach ($a as $value) {
    $type= gettype($value);
    if ($type == "string") {
        if(strtotime ($value)){
            echo "$value is 'Time' \n";
        }
        else{
            echo "$value is 'String' \n";
        }
    } elseif ($type == "integer") {
        if($value == 0 || $value == 1){
            echo "$value is 'Boolean' \n";
        }
        else{
            echo "$value is 'Integer' \n";
        }
    } else{
        echo "$value is ($type)!";
    }
}

【讨论】:

  • 检查 if 应该比较的值 is_numeric 是否作为一种解决方法工作得很好。不过,我想知道为什么 0 == 'string' 是真的......
  • 您可以在这里找到问题的答案:stackoverflow.com/questions/6843030/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2017-03-27
  • 2020-06-04
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多