【问题标题】:Get query result column value of tinyint as true/false in codeigniter在codeigniter中获取tinyint的查询结果列值为真/假
【发布时间】:2016-09-27 05:44:05
【问题描述】:

我在 my_table 中有列,其数据类型为 tinyint

CodeIgniter 模型类:

public function get_all() {
    $query = $this->db->get('my_table');
    return $query->result();
}

查询结果以字符串“0”/“1”的形式返回is_active 字段的值。我希望它是真/假。因此,该字段的 json 数据为真/假。
控制器类:

$query_result = $this->model->get_all();
echo json_encode($query_result);

我怎么得到这个?

更新: 查询结果数组为:

Array (
[0] => stdClass Object
    (
        [brand_id] => 1014
        [brand_name] => Coca Cola
        [brand_logo] => coca_cola_logo2.png
        [is_active] => 1
    )

[1] => stdClass Object
    (
        [brand_id] => 1015
        [brand_name] => Hallmark
        [brand_logo] => hallmark_logo.jpg
        [is_active] => 0
    )

[2] => stdClass Object
    (
        [brand_id] => 1016
        [brand_name] => Binjar
        [brand_logo] => binjar3.png
        [is_active] => 1
    )

)

【问题讨论】:

  • array_map(function($value) { return ($value?'true':'false');}, $query_result);

标签: php mysql json codeigniter


【解决方案1】:

答案是不需要转换。

但如果你坚持...

在 PHP 方面,除了使用 array_map() 之外,您还可以遍历结果集并将值转换为布尔值。

foreach($query_result as $result){
  $result->is_active = (bool) $result->is_active;
}

就这么简单……但毫无意义。整数 1 和 0 将使用松散比较例如评估为 TRUE 和 FALSE。

var_dump(1 == TRUE);
var_dump(0 == TRUE);

会输出

布尔真

布尔假

无论返回值是true"1",还是整数1,Javascript 也能够测试返回数据的“真实性”。

这里是一个控制器和视图测试的前提。

控制器:

<?php

class Testcase extends CI_Controller
{
  function __construct()
  {
    parent::__construct();
    $this->load->helper('form');
  }

  function index()
  {
    $this->load->view('test_view');
  }

  public function respond()
  {
    $data = array('asString' => '1', 'asBool' => TRUE, 'asInt' => 1);
    echo json_encode($data);
  }

}

查看:

<!DOCTYPE html>
<html>
  <head>
    <title>Test</title>
    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  </head>
  <body>
    <?= form_open("#", ['id' => 'form']); ?>
    <input type="submit" id="btn" value="Click Me!">
    <?= form_close(); ?>
    <div id="as-string"></div>
    <div id="as-bool"></div>
    <div id="as-int"></div>

    <script>
      $(document).ready(function () {
        $("#form").submit(function (event) {
          event.preventDefault();
          $.ajax({
            type: 'POST',
            url: 'testcase/respond',
            data: $('#form').serializeArray(),
            dataType: "json",
            success: function (data) {
              console.log(data);
              if (data.asString == true) {
                $('#as-string').text('String returned is True');
              } else {
                $('#as-string').text('String returned is False');
              }
              if (data.asBool == true) {
                $('#as-bool').text('Boolean returned is True');
              } else {
                $('#as-bool').text('Boolean returned is False');
              }
              if (data.asInt == true) {
                $('#as-int').text('Integer returned is True');
              } else {
                $('#as-int').text('Integer returned is False');
              }
            }
          });
        });
      });
    </script>
  </body>
</html>

提交表单会在浏览器中生成此结果

返回的字符串为真

返回的布尔值为 True

返回的整数为真

像这样将返回值更改为 FALSE 的各种表示,

$data = array('asString' => '0', 'asBool' => FALSE, 'asInt' => 0);
echo json_encode($data);

点击按钮会产生

返回的字符串为假

返回的布尔值是 False

返回的整数为假

请注意,javascript 使用松散相等 (==) 进行条件检查。如果您更改为严格相等 (===),结果会发生变化。

将成功函数更改为使用严格相等...

success: function (data) {
  console.log(data);
  if (data.asString === true) {
    $('#as-string').text('String returned is True');
  } else {
    $('#as-string').text('String returned is False');
  }
  if (data.asBool === true) {
    $('#as-bool').text('Boolean returned is True');
  } else {
    $('#as-bool').text('Boolean returned is False');
  }
  if (data.asInt === true) {
    $('#as-int').text('Integer returned is True');
  } else {
    $('#as-int').text('Integer returned is False');
  }
}

并从控制器返回此数据

$data = array('asString' => '1', 'asBool' => TRUE, 'asInt' => 1);

产生这个结果

返回的字符串为假

返回的布尔值为 True

返回的整数为假

使用“假”数据...

$data = array('asString' => '0', 'asBool' => FALSE, 'asInt' => 0);

结果是这样的

返回的字符串为假

返回的布尔值是 False

返回的整数为假

因此,通过使用松散相等 (==),您可以进行条件测试,而无需担心控制器返回的数据类型。

【讨论】:

  • 从整数到布尔值的转换发生在 javascript 中。但我希望它在控制器(php)类中。因此,is_active 始终设置为 true/false。
  • 但是您说“我希望它是真/假。因此,该字段的 json 数据是真/假。”和 json 数据指向 javascript 而不是 PHP。为 PHP 或 javascript 进行转换是没有意义的。使用 PHP 时,(0 == FALSE) 每次都会评估为 FALSE,(1==TRUE) 每次都会评估为 TRUE。
  • 抱歉误导了您。在某些情况下,我不需要 javascript,因为我可以在 php 中执行 json_decode()。我不想在解码/解析后转换它。我想要在编码之前。有可能吗?
  • 再次。转换是对处理的毫无意义的浪费,因为整数 1 和 0 可以被评估为布尔值,而无需任何额外的努力。但我会为我的答案添加另一个解决方案。
【解决方案2】:

使用array_map函数将0/1更改为真/假:

$query_result = $this->model->get_all();
$returnArr = array_map(function($value) { return ($value?'true':'false');}, $query_result);
echo json_encode($returnArr);

Demo


更新 1:保留其他值

将您的 array_map 更改为:

array_map(function($value) { 
    if($value === 1) {
        return 'true';
    }
    else if($value === 0){
        return 'false';
    }
    else{
        return $value;
    }
}, $query_result);

Demo

【讨论】:

  • 我在查询结果中有多个列。这个 sn-p 删除其他列,但我需要所有这些
  • @ARiF 更新!退房
  • 不起作用。仍然是 0/1。虽然,第一个解决方案有效,但删除了其他列。
  • @Thamilan 我已经更新了我的问题,您可以在其中看到查询结果的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多