【问题标题】:PHP/CI3 - Type Casting Not Working As Expected with BooleanPHP/CI3 - 类型转换无法按预期使用布尔值
【发布时间】:2018-10-13 20:51:56
【问题描述】:

我将所有网站设置保存在一个名为 mh_settings 的表中。 mh_setting表有2个字段,分别是name varchar(255)和type varchar(255)。

在核心文件夹和构造函数中的 MY_Controller.php 中,我将名称和密钥读入 config_item(),如下所示:

    $appConfigOptions = $this->MH_settings_model->mh_get_configurations();

    if($appConfigOptions) {

        foreach($appConfigOptions as $appConfigOption)
            {
            $this->config->set_item($appConfigOption->key,$appConfigOption->value);
            }

    }

模型获取配置项如下:

 class MH_settings_model extends CI_Model {

 protected $table;

 public function __construct() {
            $this->table = 'mh_settings';
 }

 public function mh_get_configurations() {
        $query = $this->db->get($this->table);
        return $query->result();
 }

 }

出于某种原因,即使我在 FALSE 的数据库中键入带有值的 cast mh_site_up_public,它似乎总是将其变为字符串。

    if(((boolean) $this->config->item('mh_site_up_public')) ==  FALSE) {
        show_error($this->config->item('mh_site_down_public_message'));
    }

我尝试使用 (bool) 而不是 (boolean)。

我试着玩弄 == 和 ===

有什么想法吗?

【问题讨论】:

  • mh_site_up_public 的实际值是多少?如果它是一个字符串,上面写着FALSE,那么它就是真的。只有空字符串(或带有0 的字符串)是虚假的,并将被转换为实际的false。演示:3v4l.org/7t5dc
  • 在数据库中为 FALSE。当我回显 $this->config_item('mh_site_up_public');在视图中,我也得到了 FALSE。

标签: php codeigniter


【解决方案1】:

由于表格列是一个 varchar,mh_site_up_public 将是一个带有文字文本 FALSE 的字符串。
非空字符串(或者如果它们只包含“0”)将被认为是真的。

例子:

var_dump((bool) '');
// false

var_dump((bool) '0');
// false

var_dump((bool) 'any other content, including FALSE');
// true

演示:https://3v4l.org/aD0QY

您可以在the manual 中了解有关布尔值的更多信息。

【讨论】:

  • 我希望我将大小写 TRUE 和 FALSE 从字符串输入到布尔值。我将表格条目更改为 0 并按照 Magnus Eriksson 的建议进行类型转换,它可以工作。谢谢。
【解决方案2】:

字符串“FALSE”与布尔值 FALSE 不同。

包含 anything 的字符串的计算结果为 TRUE,因此类型转换按预期工作。

您可以将字段更改为使用 INT(0 表示假,1 表示真),在这种情况下,您可以将代码更改为:

if(!$this->config->item('mh_site_up_public')) {
    show_error($this->config->item('mh_site_down_public_message'));
}

或者,如果您选择继续使用 VARCHAR,则必须将代码更改为

if($this->config->item('mh_site_up_public') === 'FALSE') {
    show_error($this->config->item('mh_site_down_public_message'));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多